[APPC-44] APPC Lifecycle Management refactor
[appc.git] / appc-lifecycle-management / appc-lifecycle-management-core / src / main / java / org / openecomp / appc / lifecyclemanager / impl / LifecycleManagerImpl.java
diff --git a/appc-lifecycle-management/appc-lifecycle-management-core/src/main/java/org/openecomp/appc/lifecyclemanager/impl/LifecycleManagerImpl.java b/appc-lifecycle-management/appc-lifecycle-management-core/src/main/java/org/openecomp/appc/lifecyclemanager/impl/LifecycleManagerImpl.java
new file mode 100644 (file)
index 0000000..890218e
--- /dev/null
@@ -0,0 +1,102 @@
+/*-\r
+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Copyright (C) 2017 Amdocs\r
+ * =============================================================================\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0\r
+ * 
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ * 
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * ============LICENSE_END=========================================================\r
+ */\r
+\r
+package org.openecomp.appc.lifecyclemanager.impl;\r
+\r
+import com.att.eelf.configuration.EELFLogger;\r
+import com.att.eelf.configuration.EELFManager;\r
+import com.att.eelf.i18n.EELFResourceManager;\r
+import org.openecomp.appc.exceptions.InvalidInputException;\r
+import org.openecomp.appc.i18n.Msg;\r
+import org.openecomp.appc.lifecyclemanager.LifecycleManager;\r
+import org.openecomp.appc.lifecyclemanager.objects.LifecycleException;\r
+import org.openecomp.appc.lifecyclemanager.objects.NoTransitionDefinedException;\r
+import org.openecomp.appc.statemachine.StateMachine;\r
+import org.openecomp.appc.statemachine.StateMetaDataReader;\r
+import org.openecomp.appc.statemachine.impl.StateMachineFactory;\r
+import org.openecomp.appc.statemachine.impl.readers.AppcOamMetaDataReader;\r
+import org.openecomp.appc.statemachine.impl.readers.VnfMetaDataReader;\r
+import org.openecomp.appc.statemachine.objects.*;\r
+\r
+import java.util.Map;\r
+import java.util.concurrent.ConcurrentHashMap;\r
+\r
+public class LifecycleManagerImpl implements LifecycleManager{\r
+\r
+    private StateMetaDataReader metadataReader;\r
+    private static Map<String,StateMachine> stateMachineMap = new ConcurrentHashMap<>();\r
+    private final EELFLogger logger = EELFManager.getInstance().getLogger(LifecycleManagerImpl.class);\r
+    private final EELFLogger errorLogger = EELFManager.getInstance().getErrorLogger();\r
+\r
+    @Override\r
+    public String getNextState(String vnfType, String currentState, String event) throws NoTransitionDefinedException,LifecycleException{\r
+        if (logger.isTraceEnabled()) {\r
+            logger.trace("Entering to getNextState with vnfType = "+ vnfType +    ", currentState = " + currentState + ", event = " + event);\r
+        }\r
+\r
+        State nextState;\r
+        StateMachine machine;\r
+        StateMachineResponse response;\r
+        try {\r
+            machine = this.getStateMachine(vnfType);\r
+            response = machine.handleEvent(new State(currentState),new Event(event));\r
+            if(Response.NO_TRANSITION_DEFINED.equals(response.getResponse())){\r
+                errorLogger.error(EELFResourceManager.format(Msg.VF_ILLEGAL_COMMAND, vnfType,event,currentState));\r
+                throw new NoTransitionDefinedException("No Transition Defined for currentState = " +  currentState + ", event = " + event,currentState,event);\r
+            }\r
+            nextState = response.getNextState();\r
+        } catch (InvalidInputException e) {\r
+            logger.error(e.getMessage());\r
+            throw new LifecycleException(e,currentState,event);\r
+        }\r
+        if (logger.isTraceEnabled()) {\r
+            logger.trace("Exiting from getNextState with (nextState = " + nextState.getStateName() + ")");\r
+        }\r
+        return nextState.getStateName();\r
+    }\r
+\r
+    private StateMachine getStateMachine(String vnfType){\r
+        if (logger.isTraceEnabled()) {\r
+            logger.trace("Entering to getNextState with vnfType = "+ vnfType);\r
+        }\r
+        if(vnfType == null){\r
+            vnfType = "DEFAULT";\r
+        }\r
+        StateMachine machine = stateMachineMap.get(vnfType);\r
+        if(machine == null){\r
+            metadataReader = getMetadataReader(vnfType);\r
+            StateMachineMetadata metadata = metadataReader.readMetadata();\r
+            machine = StateMachineFactory.getStateMachine(metadata);\r
+            stateMachineMap.put(vnfType,machine);\r
+        }\r
+\r
+        logger.trace("Exiting getStateMachine with StateMachine = " + stateMachineMap.get(vnfType).toString());\r
+        return stateMachineMap.get(vnfType);\r
+    }\r
+\r
+    private StateMetaDataReader getMetadataReader(String vnfType) {\r
+        return vnfType.equals("APPC") ? new AppcOamMetaDataReader() : new VnfMetaDataReader();\r
+    }\r
+\r
+}\r