diff options
Diffstat (limited to 'src/main/java/org/onap/a1pesimulator/service/cell/RanCellStateService.java')
-rw-r--r-- | src/main/java/org/onap/a1pesimulator/service/cell/RanCellStateService.java | 125 |
1 files changed, 125 insertions, 0 deletions
diff --git a/src/main/java/org/onap/a1pesimulator/service/cell/RanCellStateService.java b/src/main/java/org/onap/a1pesimulator/service/cell/RanCellStateService.java new file mode 100644 index 0000000..d69629e --- /dev/null +++ b/src/main/java/org/onap/a1pesimulator/service/cell/RanCellStateService.java @@ -0,0 +1,125 @@ +/* + * Copyright (C) 2021 Samsung Electronics + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package org.onap.a1pesimulator.service.cell; + +import java.util.Optional; +import org.onap.a1pesimulator.data.cell.CellDetails; +import org.onap.a1pesimulator.data.cell.state.CellStateEnum; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.messaging.simp.SimpMessagingTemplate; +import org.springframework.stereotype.Service; + +@Service +public class RanCellStateService { + + private static final Logger log = LoggerFactory.getLogger(RanCellStateService.class); + + private final RanCellsHolder cellsHolder; + private final SimpMessagingTemplate messagingTemplate; + + public static final String TOPIC_CELL = "/topic/cellStatus"; + + public RanCellStateService(RanCellsHolder cellsHolder, SimpMessagingTemplate messagingTemplate) { + this.cellsHolder = cellsHolder; + this.messagingTemplate = messagingTemplate; + } + + public void activateState(String identifier) { + Optional<CellDetails> cellDetails = getCell(identifier); + if (cellExist(cellDetails, identifier, "Activate")) { + boolean changed = nextStateIfPossible(cellDetails.get(), CellStateEnum.INACTIVE); + if (changed) { + sendCellNotification(cellDetails.get()); + } + } + } + + public void failingState(String identifier) { + Optional<CellDetails> cellDetails = getCell(identifier); + if (cellExist(cellDetails, identifier, "Failing")) { + boolean changed = nextStateIfPossible(cellDetails.get(), CellStateEnum.ACTIVE); + if (changed) { + sendCellNotification(cellDetails.get()); + } + } + } + + public void stopState(String identifier) { + Optional<CellDetails> cellDetails = getCell(identifier); + if (cellExist(cellDetails, identifier, "Stop")) { + boolean changed = previousStateIfPossible(cellDetails.get()); + if (changed) { + sendCellNotification(cellDetails.get()); + } + } + } + + private boolean cellExist(Optional<CellDetails> cellDetails, String identifier, String actionName) { + if (cellDetails.isEmpty()) { + log.info("Cell not found for {} identifier! '{}' action won't be executed!", identifier, actionName); + return false; + } + + return true; + } + + private boolean previousStateIfPossible(CellDetails cell) { + + CellStateEnum state = cell.getCellStateMachine().getState(); + if (state == CellStateEnum.SLEEPING || state == CellStateEnum.GOING_TO_SLEEP || state == CellStateEnum.ACTIVE) { + cell.previousState(); + } else { + log.info("Cell {} is in {} state! The changing of the state isn't allowed." + + "Supported states are: GOING_TO_SLEEP, SLEEPING, ACTIVE.", cell.getId(), + cell.getCellStateMachine().getState().value); + return false; + } + + return true; + } + + private boolean nextStateIfPossible(CellDetails cellDetails, CellStateEnum shouldBe) { + + if (cellDetails.getCellStateMachine().getState() == shouldBe) { + cellDetails.nextState(); + } else { + log.info( + "Cell {} is in {} state. The changing of the state isn't allowed. " + "The supported state is: {}!", + cellDetails.getId(), cellDetails.getCellStateMachine().getState().value, shouldBe.value); + return false; + } + + return true; + } + + private Optional<CellDetails> getCell(String identifier) { + CellDetails cell = null; + try { + cell = cellsHolder.getCellById(identifier); + } catch (RuntimeException e) { + log.info("Exception was thrown: ", e); + } + + if (cell == null) { + return Optional.empty(); + } + + return Optional.of(cell); + } + + private void sendCellNotification(CellDetails cellDetails) { + messagingTemplate.convertAndSend(TOPIC_CELL, cellDetails); + } +} |