Merge "Reorder modifiers"
[so.git] / bpmn / MSOCommonBPMN / src / main / java / org / openecomp / mso / client / appc / ApplicationControllerClient.java
index c383408..c9e2e88 100644 (file)
@@ -26,9 +26,7 @@ import java.time.Instant;
 import java.util.Map;
 import java.util.Properties;
 import java.util.UUID;
-
-import org.openecomp.mso.bpmn.core.PropertyConfiguration;
-import org.springframework.beans.factory.annotation.Autowired;
+import java.util.concurrent.ConcurrentHashMap;
 
 import org.onap.appc.client.lcm.api.AppcClientServiceFactoryProvider;
 import org.onap.appc.client.lcm.api.AppcLifeCycleManagerServiceFactory;
@@ -44,11 +42,16 @@ import org.onap.appc.client.lcm.model.Flags.Mode;
 import org.onap.appc.client.lcm.model.Payload;
 import org.onap.appc.client.lcm.model.Status;
 import org.onap.appc.client.lcm.model.ZULU;
+import org.openecomp.mso.bpmn.core.PropertyConfiguration;
+import org.springframework.beans.factory.annotation.Autowired;
+
 import com.att.eelf.configuration.EELFLogger;
 import com.att.eelf.configuration.EELFLogger.Level;
 import com.att.eelf.configuration.EELFManager;
 
 public class ApplicationControllerClient {
+       
+       public static final String DEFAULT_CONTROLLER_TYPE = "SDNC";
 
        private static final String CLIENT_NAME = "MSO";
 
@@ -60,18 +63,75 @@ public class ApplicationControllerClient {
        @Autowired
        public ApplicationControllerSupport appCSupport;
 
-       private static LifeCycleManagerStateful client;
+       // APPC gave us an API where the controllerType is configured in the
+       // client object, which is not what we asked for. We asked for an API
+       // in which the client would have additional methods that could take
+       // the controllerType as a parameter, so that we would not need to
+       // maintain multiple client objects.  This map should be removed when
+       // the (hopefully short-term) controllerType becomes obsolete.
+
+       private final String controllerType;
 
+       private static ConcurrentHashMap<String, LifeCycleManagerStateful> appCClients = new ConcurrentHashMap<>();
+
+       /**
+        * Creates an ApplicationControllerClient for communication with APP-C.
+        */
        public ApplicationControllerClient() {
+               this(DEFAULT_CONTROLLER_TYPE);
+       }
+       
+       /**
+        * Creates an ApplicationControllerClient for the specified controller type.
+        * @param controllerType the controller type: "appc" or "sdnc".
+        */
+       public ApplicationControllerClient(String controllerType) {
+               if (controllerType == null) {
+                       controllerType = DEFAULT_CONTROLLER_TYPE;
+               }
+               this.controllerType = controllerType.toUpperCase();
                appCSupport = new ApplicationControllerSupport();
-               client = this.getAppCClient();
+       }
+       
+       /**
+        * Gets the controller type.
+        * @return the controllertype
+        */
+       public String getControllerType() {
+               return controllerType;
        }
 
-       public Status runCommand(Action action, org.onap.appc.client.lcm.model.ActionIdentifiers actionIdentifiers, org.onap.appc.client.lcm.model.Payload payload, String requestID)
+       /**
+        * Returns the AppC client object associated with this ApplicationControllerClient.
+        * AppC client objects are shared objects.  One is created if it does not exist.
+        * @return the client object, or null if creation failed
+        */
+       public LifeCycleManagerStateful getAppCClient() {
+               return appCClients.computeIfAbsent(controllerType, k -> createAppCClient(k));
+       }
+
+       protected LifeCycleManagerStateful createAppCClient(String controllerType) {
+               try {
+                       if (controllerType == null) {
+                               controllerType = DEFAULT_CONTROLLER_TYPE;
+                       }
+                       controllerType = controllerType.toUpperCase();
+                       return AppcClientServiceFactoryProvider.getFactory(AppcLifeCycleManagerServiceFactory.class)
+                                       .createLifeCycleManagerStateful(new ApplicationContext(), getLCMProperties(controllerType));
+               } catch (AppcClientException e) {
+                       auditLogger.log(Level.ERROR, "Error in getting LifeCycleManagerStateful: ", e, e.getMessage());
+                       // This null value will cause NullPointerException when used later.
+                       // Error handling could certainly be improved here.
+                       return null;
+               }
+       }
+
+       public Status runCommand(Action action, org.onap.appc.client.lcm.model.ActionIdentifiers actionIdentifiers,
+                       org.onap.appc.client.lcm.model.Payload payload, String requestID)
                        throws ApplicationControllerOrchestratorException {
-               Object requestObject;
-               requestObject = createRequest(action, actionIdentifiers, payload, requestID);
+               Object requestObject = createRequest(action, actionIdentifiers, payload, requestID);
                appCSupport.logLCMMessage(requestObject);
+               LifeCycleManagerStateful client = getAppCClient();
                Method lcmMethod = appCSupport.getAPIMethod(action.name(), client, false);
                try {
                        Object response = lcmMethod.invoke(client, requestObject);
@@ -81,31 +141,27 @@ public class ApplicationControllerClient {
                }
        }
 
-       public LifeCycleManagerStateful getAppCClient() {
-               if (client == null)
-                       try {
-                               client = AppcClientServiceFactoryProvider.getFactory(AppcLifeCycleManagerServiceFactory.class)
-                                               .createLifeCycleManagerStateful(new ApplicationContext(), getLCMProperties());
-                       } catch (AppcClientException e) {
-                               auditLogger.log(Level.ERROR, "Error in getting LifeCycleManagerStateful: ", e, e.getMessage());
-                       }
-               return client;
-       }
-
        protected Properties getLCMProperties() {
+               return getLCMProperties("appc");
+       }
+       
+       protected Properties getLCMProperties(String controllerType) {
                Properties properties = new Properties();
                Map<String, String> globalProperties = PropertyConfiguration.getInstance()
                                .getProperties("mso.bpmn.urn.properties");
-
-               properties.put("topic.read", globalProperties.get("appc.topic.read"));
-               properties.put("topic.read.timeout", globalProperties.get("appc.topic.read.timeout"));
+               
+               properties.put("topic.read", globalProperties.get("appc.client.topic.read"));
+               properties.put("topic.write", globalProperties.get("appc.client.topic.write"));
+               properties.put("SDNC-topic.read", globalProperties.get("appc.client.topic.sdnc.read"));
+               properties.put("SDNC-topic.write", globalProperties.get("appc.client.topic.sdnc.write"));
+               properties.put("topic.read.timeout", globalProperties.get("appc.client.topic.read.timeout"));
                properties.put("client.response.timeout", globalProperties.get("appc.client.response.timeout"));
-               properties.put("topic.write", globalProperties.get("appc.topic.write"));
-               properties.put("poolMembers", globalProperties.get("appc.poolMembers"));
+               properties.put("poolMembers", globalProperties.get("appc.client.poolMembers"));
+               properties.put("controllerType", controllerType);
                properties.put("client.key", globalProperties.get("appc.client.key"));
                properties.put("client.secret", globalProperties.get("appc.client.secret"));
                properties.put("client.name", CLIENT_NAME);
-               properties.put("service", globalProperties.get("appc.service"));
+               properties.put("service", globalProperties.get("appc.client.service"));
                return properties;
        }