Allow handling of legact model artifacts 77/5577/1
authorBlimkie, Steven (sb787e) <steven.blimkie@amdocs.com>
Tue, 27 Jun 2017 18:08:37 +0000 (21:08 +0300)
committerBlimkie, Steven (sb787e) <steven.blimkie@amdocs.com>
Tue, 27 Jun 2017 18:10:57 +0000 (21:10 +0300)
Change-Id: I3d4c5e51140d4d05b3fd871d58c2590421c0e9db
Signed-off-by: Blimkie, Steven (sb787e) <steven.blimkie@amdocs.com>
40 files changed:
Readme.md
src/main/java/org/openecomp/modelloader/entity/Artifact.java
src/main/java/org/openecomp/modelloader/entity/ArtifactType.java
src/main/java/org/openecomp/modelloader/entity/catalog/VnfCatalogArtifact.java
src/main/java/org/openecomp/modelloader/entity/model/AbstractModelArtifact.java [new file with mode: 0644]
src/main/java/org/openecomp/modelloader/entity/model/IModelParser.java [new file with mode: 0644]
src/main/java/org/openecomp/modelloader/entity/model/ModelArtifact.java
src/main/java/org/openecomp/modelloader/entity/model/ModelArtifactHandler.java
src/main/java/org/openecomp/modelloader/entity/model/ModelArtifactParser.java
src/main/java/org/openecomp/modelloader/entity/model/ModelParserFactory.java [new file with mode: 0644]
src/main/java/org/openecomp/modelloader/entity/model/ModelSorter.java
src/main/java/org/openecomp/modelloader/entity/model/ModelV8Artifact.java [new file with mode: 0644]
src/main/java/org/openecomp/modelloader/entity/model/ModelV8ArtifactParser.java [new file with mode: 0644]
src/main/java/org/openecomp/modelloader/entity/model/NamedQueryArtifact.java [new file with mode: 0644]
src/main/java/org/openecomp/modelloader/entity/model/NamedQueryArtifactParser.java [new file with mode: 0644]
src/main/java/org/openecomp/modelloader/notification/EventCallback.java
src/main/java/org/openecomp/modelloader/restclient/AaiRestClient.java
src/test/java/org/openecomp/modelloader/entity/model/ModelArtifactParserTest.java
src/test/java/org/openecomp/modelloader/entity/model/ModelParserFactoryTest.java [new file with mode: 0644]
src/test/java/org/openecomp/modelloader/entity/model/ModelSorterTest.java
src/test/java/org/openecomp/modelloader/entity/model/ModelV8ArtifactParserTest.java [new file with mode: 0644]
src/test/java/org/openecomp/modelloader/entity/model/NamedQueryArtifactParserTest.java [new file with mode: 0644]
src/test/java/org/openecomp/modelloader/restclient/AaiRestClientTest.java
src/test/resources/logback-test.xml
src/test/resources/model-loader-empty-auth-password.properties
src/test/resources/model-loader-no-auth-password.properties
src/test/resources/model-loader.properties
src/test/resources/models/AAI-Testvsp..vmme_cinder..module-1-resource-1.xml
src/test/resources/models/AAI-Testvsp..vmme_small_ecomp..module-0-resource-1.xml
src/test/resources/models/AAI-VL-resource-1.xml
src/test/resources/models/AAI-stellService-service-1.xml
src/test/resources/models/AAI-testvsp-resource-1.xml
src/test/resources/models/complete-model.xml [deleted file]
src/test/resources/models/incomplete-model.xml
src/test/resources/models/incomplete-models.xml [deleted file]
src/test/resources/models/invalid-model.xml
src/test/resources/models/l3-network-widget.xml
src/test/resources/models/named-query-wan-connector.xml
src/test/resources/models/v8-wan-connector-model.xml [new file with mode: 0644]
src/test/resources/vnfcatalogexample.xml

index 758b3a7..fc66fa8 100644 (file)
--- a/Readme.md
+++ b/Readme.md
@@ -16,32 +16,115 @@ The Model Loader:
 ## Compiling Model Loader
 
 Model Loader can be compiled by running `mvn clean install`
+A Model Loader docker image can be created by running `docker build -t openecomp/model-loader target`
 
 ## Running Model Loader 
 
-### Create a config file with the following key/values:
+### Deploying The Micro Service 
 
-```
-DISTR_CLIENT_ASDC_ADDRESS=<SDC_ADDRESS>
-DISTR_CLIENT_CONSUMER_GROUP=<UEB_CONSUMER_GROUP>  ;;  Uniquely identiy this group of model loaders.
-DISTR_CLIENT_CONSUMER_ID=<UEB_CONSUMER_GROUP_ID>  ;;  Uniquely identiythis model loader.
-DISTR_CLIENT_ENVIRONMENT_NAME=<ENVIRONMENT_NAME>  ;;  Environment name configured on the SDC
-DISTR_CLIENT_PASSWORD=<DISTR_PASSWORD>            ;;  Password to connect to SDC
-DISTR_CLIENT_USER=<USER_ID>                       ;;  User name to connect to SDC
-                    
-APP_SERVER_BASE_URL=https://<aai-address>:8443    ;; AAI Address (URL)
-APP_SERVER_AUTH_USER=<USER_ID>                    ;; User name to connect to AAI
-APP_SERVER_AUTH_PASSWORD=<PASSWORD>               ;; Password to connect to AAi
+Push the Docker image that you have built to your Docker repository and pull it down to the location that you will be running the search service from.
 
-```
+**Create the following directories on the host machine:**
 
-### Docker 
+    ./logs
+    ./opt/app/model-loader/appconfig
+    ./opt/app/model-loader/appconfig/auth
+    
+You will be mounting these as data volumes when you start the Docker container.  For examples of the files required in these directories, see the aai/test/config repository (https://gerrit.onap.org/r/#/admin/projects/aai/test-config)
 
-#### Build your own Model Loader docker image and create docker containers
-1. mvn clean package docker:build                 ;; Build a docker image of Model Loader
-2. sudo docker images                             ;; list docker images and check if the image you build is listed.
-3. sudo docker run --env-file <config-filename> <model-loader-image> /opt/jetty/jetty*/bin/startup.sh
+**Populate these directories as follows:**
 
+##### Contents of /opt/app/model-loader/appconfig
 
-#### Retrieve logs from stopped container
-* docker cp <container-id>:/opt/jetty/jetty-distribution-9.3.9.v20160517/logs/AAI-ML/error.log /tmp/
+The following file must be present in this directory on the host machine:
+    
+_model-loader.properties_  
+    # Always false.  TLS Auth currently not supported 
+    ml.distribution.ACTIVE_SERVER_TLS_AUTH=false
+    
+    # Address/port of the SDC
+    ml.distribution.ASDC_ADDRESS=<SDC-Hostname>:8443
+    
+    # DMaaP consumer group.  
+    ml.distribution.CONSUMER_GROUP=aai-ml-group
+    
+    # DMaaP consumer ID
+    ml.distribution.CONSUMER_ID=aai-ml
+    
+    # SDC Environment Name.  This must match the environment name configured on the SDC
+    ml.distribution.ENVIRONMENT_NAME=<Environment Name>
+    
+    # Currently not used
+    ml.distribution.KEYSTORE_PASSWORD=
+    
+    # Currently not used
+    ml.distribution.KEYSTORE_FILE=
+    
+    # Obfuscated password to connect to the SDC.  To obtain this value, use the following Jetty library to 
+    # obfuscate the cleartext password:  http://www.eclipse.org/jetty/documentation/9.4.x/configuring-security-secure-passwords.html
+    ml.distribution.PASSWORD=OBF:<password>
+    
+    # How often (in seconds) to poll the DMaaP cluster for new model events
+    ml.distribution.POLLING_INTERVAL=<integer>
+    
+    # Timeout value (in seconds) when polling DMaaP for new model events
+    ml.distribution.POLLING_TIMEOUT=<integer>
+    
+    # Username to use when connecting to the SDC
+    ml.distribution.USER=<username>
+    
+    # Artifact type we want to download from the SDC (the values below will typically suffice)
+    ml.distribution.ARTIFACT_TYPES=MODEL_INVENTORY_PROFILE,MODEL_QUERY_SPEC,VNF_CATALOG
+
+    # URL of the A&AI
+    ml.aai.BASE_URL=https://<AAI-Hostname>:8443
+    
+    # A&AI endpoint to post models
+    ml.aai.MODEL_URL=/aai/v*/service-design-and-creation/models/model/
+    
+    # A&AI endpoint to post named queries
+    ml.aai.NAMED_QUERY_URL=/aai/v*/service-design-and-creation/named-queries/named-query/
+    
+    # A&AI endpoint to post vnf images
+    ml.aai.VNF_IMAGE_URL=/aai/v8/service-design-and-creation/vnf-images
+    
+    # Name of certificate to use in connecting to the A&AI
+    ml.aai.KEYSTORE_FILE=aai-os-cert.p12
+    
+    # Obfuscated keystore password to connect to the A&AI.  This is only required if using 2-way SSL (not basic auth).
+    # To obtain this value, use the following Jetty library to obfuscate the cleartext password:
+    # http://www.eclipse.org/jetty/documentation/9.4.x/configuring-security-secure-passwords.html
+    ml.aai.KEYSTORE_PASSWORD=OBF:<password>
+    
+    # Name of user to use when connecting to the A&AI.  This is only required if using basic auth (not 2-way SSL).
+    ml.aai.AUTH_USER=<username>
+    
+    # Obfuscated password to connect to the A&AI.  This is only required if using basic auth (not 2-way SSL).
+    # To obtain this value, use the following Jetty library to obfuscate the cleartext password:
+    # http://www.eclipse.org/jetty/documentation/9.4.x/configuring-security-secure-passwords.html
+    ml.aai.AUTH_PASSWORD=OBF:<password>
+    
+
+
+##### Contents of the /opt/app/model-loader/app-config/auth Directory
+
+The following files must be present in this directory on the host machine:
+
+_aai-os-cert.p12_
+
+The certificate used to connected to the A&AI
+
+**Start the service:**
+
+You can now start the Docker container for the _Search Data Service_, in the following manner:
+
+       docker run -d \
+               -e CONFIG_HOME=/opt/app/model-loader/config/ \
+           -v /logs:/logs \
+           -v /opt/app/model-loader/appconfig:/opt/app/model-loader/config \
+           --name model-loader \
+           {{your docker repo}}/model-loader
+    
+Where,
+
+    {{your docker repo}} = The Docker repository you have published your image to.
index 30709ae..88c75eb 100644 (file)
@@ -1,46 +1,46 @@
-/**\r
- * ============LICENSE_START=======================================================\r
- * Model Loader\r
- * ================================================================================\r
- * Copyright © 2017 AT&T Intellectual Property.\r
- * Copyright © 2017 Amdocs\r
- * All rights reserved.\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
- * ============LICENSE_END=========================================================\r
- *\r
- * ECOMP and OpenECOMP are trademarks\r
- * and service marks of AT&T Intellectual Property.\r
- */\r
-package org.openecomp.modelloader.entity;\r
-\r
-public abstract class Artifact {\r
-\r
-  private String payload;\r
-  private ArtifactType type;\r
-\r
-  public ArtifactType getType() {\r
-    return type;\r
-  }\r
-\r
-  public void setType(ArtifactType type) {\r
-    this.type = type;\r
-  }\r
-\r
-  public String getPayload() {\r
-    return payload;\r
-  }\r
-\r
-  public void setPayload(String payload) {\r
-    this.payload = payload;\r
-  }\r
-\r
-}\r
+/**
+ * ============LICENSE_START=======================================================
+ * Model Loader
+ * ================================================================================
+ * Copyright © 2017 AT&T Intellectual Property.
+ * Copyright © 2017 Amdocs
+ * All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ *
+ * ECOMP and OpenECOMP are trademarks
+ * and service marks of AT&T Intellectual Property.
+ */
+package org.openecomp.modelloader.entity;
+
+public abstract class Artifact {
+
+  private String payload;
+  private ArtifactType type;
+
+  public Artifact(ArtifactType type) {
+    this.type = type;
+  }
+  
+  public ArtifactType getType() {
+    return type;
+  }
+
+  public String getPayload() {
+    return payload;
+  }
+
+  public void setPayload(String payload) {
+    this.payload = payload;
+  }
+
+}
index ae556bc..381733b 100644 (file)
@@ -1,27 +1,30 @@
-/**\r
- * ============LICENSE_START=======================================================\r
- * Model Loader\r
- * ================================================================================\r
- * Copyright © 2017 AT&T Intellectual Property.\r
- * Copyright © 2017 Amdocs\r
- * All rights reserved.\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
- * ============LICENSE_END=========================================================\r
- *\r
- * ECOMP and OpenECOMP are trademarks\r
- * and service marks of AT&T Intellectual Property.\r
- */\r
-package org.openecomp.modelloader.entity;\r
-\r
-public enum ArtifactType {\r
-  MODEL, NAMED_QUERY, VNF_CATALOG;\r
-}\r
+/**
+ * ============LICENSE_START=======================================================
+ * Model Loader
+ * ================================================================================
+ * Copyright © 2017 AT&T Intellectual Property.
+ * Copyright © 2017 Amdocs
+ * All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ *
+ * ECOMP and OpenECOMP are trademarks
+ * and service marks of AT&T Intellectual Property.
+ */
+package org.openecomp.modelloader.entity;
+
+public enum ArtifactType {
+  MODEL,
+  MODEL_V8,
+  NAMED_QUERY, 
+  VNF_CATALOG;
+}
index a15ed3c..9b4c587 100644 (file)
@@ -1,33 +1,33 @@
-/**\r
- * ============LICENSE_START=======================================================\r
- * Model Loader\r
- * ================================================================================\r
- * Copyright © 2017 AT&T Intellectual Property.\r
- * Copyright © 2017 Amdocs\r
- * All rights reserved.\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
- * ============LICENSE_END=========================================================\r
- *\r
- * ECOMP and OpenECOMP are trademarks\r
- * and service marks of AT&T Intellectual Property.\r
- */\r
-package org.openecomp.modelloader.entity.catalog;\r
-\r
-import org.openecomp.modelloader.entity.Artifact;\r
-import org.openecomp.modelloader.entity.ArtifactType;\r
-\r
-public class VnfCatalogArtifact extends Artifact {\r
-  public VnfCatalogArtifact(String payload) {\r
-    setPayload(payload);\r
-    setType(ArtifactType.VNF_CATALOG);\r
-  }\r
-}\r
+/**
+ * ============LICENSE_START=======================================================
+ * Model Loader
+ * ================================================================================
+ * Copyright © 2017 AT&T Intellectual Property.
+ * Copyright © 2017 Amdocs
+ * All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ *
+ * ECOMP and OpenECOMP are trademarks
+ * and service marks of AT&T Intellectual Property.
+ */
+package org.openecomp.modelloader.entity.catalog;
+
+import org.openecomp.modelloader.entity.Artifact;
+import org.openecomp.modelloader.entity.ArtifactType;
+
+public class VnfCatalogArtifact extends Artifact {
+  public VnfCatalogArtifact(String payload) {
+    super(ArtifactType.VNF_CATALOG);
+    setPayload(payload);
+  }
+}
diff --git a/src/main/java/org/openecomp/modelloader/entity/model/AbstractModelArtifact.java b/src/main/java/org/openecomp/modelloader/entity/model/AbstractModelArtifact.java
new file mode 100644 (file)
index 0000000..2add53e
--- /dev/null
@@ -0,0 +1,85 @@
+/**
+ * ============LICENSE_START=======================================================
+ * Model Loader
+ * ================================================================================
+ * Copyright © 2017 AT&T Intellectual Property.
+ * Copyright © 2017 Amdocs
+ * All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ *
+ * ECOMP and OpenECOMP are trademarks
+ * and service marks of AT&T Intellectual Property.
+ */
+package org.openecomp.modelloader.entity.model;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.openecomp.modelloader.config.ModelLoaderConfig;
+import org.openecomp.modelloader.entity.Artifact;
+import org.openecomp.modelloader.entity.ArtifactType;
+import org.openecomp.modelloader.restclient.AaiRestClient;
+
+public abstract class AbstractModelArtifact extends Artifact {
+                
+  private String modelNamespace;
+  private String modelNamespaceVersion;
+       private Set<String> referencedModelIds = new HashSet<String>(); 
+
+       public AbstractModelArtifact(ArtifactType type) {
+         super(type);
+       }
+       
+       public Set<String> getDependentModelIds() {
+               return referencedModelIds;
+       }
+       
+       public void addDependentModelId(String dependentModelId) {
+               this.referencedModelIds.add(dependentModelId);
+       }
+       
+  public String getModelNamespace() {
+    return modelNamespace;
+  }
+  
+  public void setModelNamespace(String modelNamespace) {
+    this.modelNamespace = modelNamespace;
+    
+    // Get the version from the namespace (in format 'http://org.openecomp.aai.inventory/v9')
+    String[] parts = modelNamespace.split("/");
+    modelNamespaceVersion = parts[parts.length-1].trim();
+  }
+  
+  public String getModelNamespaceVersion() {
+    return modelNamespaceVersion;
+  }
+  
+  public abstract String getUniqueIdentifier();
+  
+  public abstract boolean push(AaiRestClient aaiClient, ModelLoaderConfig config, String distId, List<AbstractModelArtifact> addedModels);
+  
+  public abstract void rollbackModel(AaiRestClient aaiClient, ModelLoaderConfig config, String distId);
+  
+       public String toString() {
+               StringBuilder sb = new StringBuilder();
+               sb.append("\nType=" + getType().toString() +"\nId=" + getUniqueIdentifier() +"\nVersion=" + getModelNamespaceVersion() + "\nDependant models: ");
+               for (String dep : referencedModelIds) {
+                       sb.append(dep + "  ");
+               }
+               
+               return sb.toString();
+       }
+       
+       
+}
diff --git a/src/main/java/org/openecomp/modelloader/entity/model/IModelParser.java b/src/main/java/org/openecomp/modelloader/entity/model/IModelParser.java
new file mode 100644 (file)
index 0000000..3a31756
--- /dev/null
@@ -0,0 +1,31 @@
+/**
+ * ============LICENSE_START=======================================================
+ * Model Loader
+ * ================================================================================
+ * Copyright © 2017 AT&T Intellectual Property.
+ * Copyright © 2017 Amdocs
+ * All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ *
+ * ECOMP and OpenECOMP are trademarks
+ * and service marks of AT&T Intellectual Property.
+ */
+package org.openecomp.modelloader.entity.model;
+
+import java.util.List;
+
+import org.openecomp.modelloader.entity.Artifact;
+
+public interface IModelParser {
+  public List<Artifact> parse(byte[] artifactPayload, String artifactName);
+}
index 432e442..f316e28 100644 (file)
  */
 package org.openecomp.modelloader.entity.model;
 
-import org.openecomp.modelloader.entity.Artifact;
-import org.w3c.dom.Node;
+import java.io.StringWriter;
+import java.util.List;
 
-import java.util.HashSet;
-import java.util.Set;
-
-public class ModelArtifact extends Artifact {
-
-       String modelVerId;
-       String modelInvariantId;
-       String nameVersionId;
-       String modelVerModelVersionId;
-       String modelModelInvariantId;
-       String modelNamespace;
-       String modelNamespaceVersion;
-       Set<String> referencedModelIds = new HashSet<String>(); 
-       Node modelVer;
-       boolean isV9Artifact = true;
-       
-       public boolean isV9Artifact() {
-               return isV9Artifact;
-       }
-       
-       public void setV9Artifact(boolean isV9Artifact) {
-               this.isV9Artifact = isV9Artifact;
-       }
+import javax.ws.rs.core.Response;
+import javax.xml.transform.OutputKeys;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
 
-       public String getModelVerModelVersionId() {
-               return modelVerModelVersionId;
-       }
-       
-       public void setModelVerModelVersionId(String modelVerModelVersionId) {
-               this.modelVerModelVersionId = modelVerModelVersionId;
-       }
-       
-       public String getModelModelInvariantId() {
-               return modelModelInvariantId;
-       }
-       
-       public void setModelModelInvariantId(String modelModelInvariantId) {
-               this.modelModelInvariantId = modelModelInvariantId;
-       }
-       
-       public String getNameVersionId() {
-               return nameVersionId;
-       }
-
-       public void setNameVersionId(String nameVersionId) {
-               this.nameVersionId = nameVersionId;
-       }
-       
-       public String getModelNamespace() {
-               return modelNamespace;
-       }
-       
-       public void setModelNamespace(String modelNamespace) {
-               this.modelNamespace = modelNamespace;
-               
-               // Get the version from the namespace (in format 'http://org.openecomp.aai.inventory/v9')
-               String[] parts = modelNamespace.split("/");
-               modelNamespaceVersion = parts[parts.length-1].trim();
-       }
-       
-       public String getModelNamespaceVersion() {
-         return modelNamespaceVersion;
-       }
+import org.openecomp.cl.api.Logger;
+import org.openecomp.cl.eelf.LoggerFactory;
+import org.openecomp.modelloader.config.ModelLoaderConfig;
+import org.openecomp.modelloader.entity.ArtifactType;
+import org.openecomp.modelloader.restclient.AaiRestClient;
+import org.openecomp.modelloader.service.ModelLoaderMsgs;
+import org.w3c.dom.Node;
 
-       public Set<String> getDependentModelIds() {
-               return referencedModelIds;
-       }
+import com.sun.jersey.api.client.ClientResponse;
 
-       public void addDependentModelId(String dependentModelId) {
-               this.referencedModelIds.add(dependentModelId);
-       }
+public class ModelArtifact extends AbstractModelArtifact {
 
-       @Override
-       public String toString() {
-               StringBuilder sb = new StringBuilder();
-               sb.append("ModelInvariantId=" + modelInvariantId + "(" + getType().toString() + ") ==> ");
-               for (String dep : referencedModelIds) {
-                       sb.append(dep + "  ");
-               }
+  private static final String AAI_MODEL_VER_SUB_URL = "/model-vers/model-ver";
+  
+  private static Logger logger = LoggerFactory.getInstance().getLogger(ModelArtifact.class.getName());
+  
+  private String modelVerId;
+       private String modelInvariantId;
+       private Node modelVer;
+       private boolean firstVersionOfModel = false;
 
-               return sb.toString();
+       public ModelArtifact() {
+         super(ArtifactType.MODEL);
        }
 
        public String getModelVerId() {
-               return modelVerId;
+         return modelVerId;
        }
        
        public void setModelVerId(String modelVerId) {
@@ -131,11 +81,130 @@ public class ModelArtifact extends Artifact {
        public void setModelVer(Node modelVer) {
                this.modelVer = modelVer;
        }
-       
-       public String getModelModelVerCombinedKey() {
-         if ( (getModelInvariantId() == null) && (getModelVerId() == null) ) {
-           return getNameVersionId();
-         }
-               return getModelInvariantId() + "|" + getModelVerId();
-       }
+
+  @Override
+  public String getUniqueIdentifier() {
+    return getModelInvariantId() + "|" + getModelVerId();
+  }
+
+  @Override
+  public boolean push(AaiRestClient aaiClient, ModelLoaderConfig config, String distId, List<AbstractModelArtifact> addedModels) {
+    ClientResponse getResponse  = aaiClient.getResource(getModelUrl(config), distId, AaiRestClient.MimeType.XML);
+    if ( (getResponse == null) || (getResponse.getStatus() != Response.Status.OK.getStatusCode()) ) {
+      // Only attempt the PUT if the model doesn't already exist
+      ClientResponse putResponse = aaiClient.putResource(getModelUrl(config), getPayload(), distId, AaiRestClient.MimeType.XML);
+      if ( (putResponse != null) && (putResponse.getStatus() == Response.Status.CREATED.getStatusCode()) ) {
+        addedModels.add(this);
+        
+        // Flag this as the first version of the model that has been added.
+        firstVersionOfModel = true;
+        
+        logger.info(ModelLoaderMsgs.DISTRIBUTION_EVENT, getType().toString() + " " + getUniqueIdentifier() + " successfully ingested.");
+      }
+      else {
+        logger.error(ModelLoaderMsgs.DISTRIBUTION_EVENT_ERROR, "Ingestion failed for " + getType().toString() + " " + getUniqueIdentifier() +
+            ". Rolling back distribution.");
+        return false;
+      }
+    }
+    else {
+      logger.info(ModelLoaderMsgs.DISTRIBUTION_EVENT, getType().toString() + " " + getModelInvariantId() + " already exists.  Skipping ingestion.");
+      getResponse  = aaiClient.getResource(getModelVerUrl(config), distId, AaiRestClient.MimeType.XML);
+      if ( (getResponse == null) || (getResponse.getStatus() != Response.Status.OK.getStatusCode()) ) {
+        // Only attempt the PUT if the model-ver doesn't already exist
+        ClientResponse putResponse = null;
+
+        try {
+          putResponse = aaiClient.putResource(getModelVerUrl(config), nodeToString(getModelVer()), distId, AaiRestClient.MimeType.XML);
+        } catch (TransformerException e) {
+          logger.error(ModelLoaderMsgs.DISTRIBUTION_EVENT_ERROR, "Ingestion failed for " + getType().toString() + " " + getUniqueIdentifier() 
+            + ": " + e.getMessage() + ". Rolling back distribution.");
+          return false;
+        }
+        if ( (putResponse != null) && (putResponse.getStatus() == Response.Status.CREATED.getStatusCode()) ) {
+          addedModels.add(this);
+          logger.info(ModelLoaderMsgs.DISTRIBUTION_EVENT, getType().toString() + " " + getUniqueIdentifier() + " successfully ingested.");
+        }
+        else {
+          logger.error(ModelLoaderMsgs.DISTRIBUTION_EVENT_ERROR, "Ingestion failed for " + getType().toString() + " " 
+              + getUniqueIdentifier() + ". Rolling back distribution.");
+          return false;
+        }
+      }
+      else {
+        logger.info(ModelLoaderMsgs.DISTRIBUTION_EVENT, getType().toString() + " " + getUniqueIdentifier() + " already exists.  Skipping ingestion.");
+      }
+    }
+    
+    return true;
+  }
+  
+  @Override
+  public void rollbackModel(AaiRestClient aaiClient, ModelLoaderConfig config, String distId) {
+    String url = getModelVerUrl(config);
+    if (firstVersionOfModel) {
+      // If this was the first version of the model which was added, we want to remove the entire
+      // model rather than just the version.
+      url = getModelUrl(config);
+    }
+    
+    // Best effort to delete.  Nothing we can do in the event this fails.
+    aaiClient.getAndDeleteResource(url, distId);
+  }
+  
+  private String getModelUrl(ModelLoaderConfig config) {
+    String baseURL = config.getAaiBaseUrl().trim();
+    String subURL = null;
+    String instance = null;
+
+    subURL = config.getAaiModelUrl(getModelNamespaceVersion()).trim();
+    instance = getModelInvariantId();
+
+    if ( (!baseURL.endsWith("/")) && (!subURL.startsWith("/")) ) {
+      baseURL = baseURL + "/";
+    }
+
+    if ( baseURL.endsWith("/") && subURL.startsWith("/") ) {
+      baseURL = baseURL.substring(0, baseURL.length()-1);
+    }
+
+    if (!subURL.endsWith("/")) {
+      subURL = subURL + "/";
+    }
+
+    String url = baseURL + subURL + instance;
+    return url;
+  }
+
+  private String getModelVerUrl(ModelLoaderConfig config) {
+    String baseURL = config.getAaiBaseUrl().trim();
+    String subURL = null;
+    String instance = null;
+
+    subURL = config.getAaiModelUrl(getModelNamespaceVersion()).trim() + getModelInvariantId() + AAI_MODEL_VER_SUB_URL;
+    instance = getModelVerId();
+
+    if ( (!baseURL.endsWith("/")) && (!subURL.startsWith("/")) ) {
+      baseURL = baseURL + "/";
+    }
+
+    if ( baseURL.endsWith("/") && subURL.startsWith("/") ) {
+      baseURL = baseURL.substring(0, baseURL.length()-1);
+    }
+
+    if (!subURL.endsWith("/")) {
+      subURL = subURL + "/";
+    }
+
+    String url = baseURL + subURL + instance;
+    return url;
+  }
+  
+  private String nodeToString(Node node) throws TransformerException {
+    StringWriter sw = new StringWriter();
+    Transformer t = TransformerFactory.newInstance().newTransformer();
+    t.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
+    t.transform(new DOMSource(node), new StreamResult(sw));
+    return sw.toString();
+  }
 }
index 19b69cf..13ef1b1 100644 (file)
  */
 package org.openecomp.modelloader.entity.model;
 
-import com.sun.jersey.api.client.ClientResponse;
-
 import org.openecomp.cl.api.Logger;
 import org.openecomp.cl.eelf.LoggerFactory;
 import org.openecomp.modelloader.config.ModelLoaderConfig;
 import org.openecomp.modelloader.entity.Artifact;
 import org.openecomp.modelloader.entity.ArtifactHandler;
-import org.openecomp.modelloader.entity.ArtifactType;
 import org.openecomp.modelloader.restclient.AaiRestClient;
 import org.openecomp.modelloader.service.ModelLoaderMsgs;
 
-import org.w3c.dom.Node;
-
-import java.io.StringWriter;
 import java.util.ArrayList;
 import java.util.List;
 
-import javax.ws.rs.core.Response;
-import javax.xml.transform.OutputKeys;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerException;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.dom.DOMSource;
-import javax.xml.transform.stream.StreamResult;
-
 
 public class ModelArtifactHandler extends ArtifactHandler {
 
-  private static final String AAI_MODEL_VER = "/model-vers/model-ver";
-  private static Logger logger = LoggerFactory.getInstance().getLogger(ArtifactHandler.class.getName());
-
-
+  private static Logger logger = LoggerFactory.getInstance().getLogger(ModelArtifactHandler.class.getName());
+  
   public ModelArtifactHandler(ModelLoaderConfig config) {
     super(config);
   }
@@ -61,166 +45,34 @@ public class ModelArtifactHandler extends ArtifactHandler {
   @Override
   public boolean pushArtifacts(List<Artifact> artifacts, String distributionID) {
     ModelSorter modelSorter = new ModelSorter();
-    List<Artifact> sortedModelArtifacts = modelSorter.sort(artifacts);
-
+    List<Artifact> sortedModelArtifacts; 
+    try {
+      sortedModelArtifacts = modelSorter.sort(artifacts);
+    }
+    catch (RuntimeException ex) {
+      logger.error(ModelLoaderMsgs.DISTRIBUTION_EVENT_ERROR, "Unable to resolve models: " + ex.getMessage());
+      return false;
+    }
+    
     // Push the ordered list of model artifacts to A&AI.  If one fails, we need to roll back
     // the changes.
-    List<ModelArtifact> completedModels = new ArrayList<ModelArtifact>();
+    List<AbstractModelArtifact> completedModels = new ArrayList<AbstractModelArtifact>();
     AaiRestClient aaiClient = new AaiRestClient(config);
 
     for (Artifact art : sortedModelArtifacts) {
-      ModelArtifact model = (ModelArtifact)art;
-
-      boolean version = model.isV9Artifact();
-      //Non - V9 version for models
-      if(version == false){
-        ClientResponse getResponse = aaiClient.getResource(getModelVerURL(model), distributionID, AaiRestClient.MimeType.XML);
-        if ( (getResponse == null) || (getResponse.getStatus() != Response.Status.OK.getStatusCode()) ) {
-          logger.error(ModelLoaderMsgs.DISTRIBUTION_EVENT_ERROR, " Artifact format not valid for " + 
-              model.getType().toString() + "- model-invariant-id[model-id]: " + 
-              model.getModelInvariantId() + " and model-version-id[model-name-version-id]: "+ 
-              model.getModelVerId()+ " . Rolling back distribution.");
-          return false;
+      AbstractModelArtifact model = (AbstractModelArtifact)art;
+      if (model.push(aaiClient, config, distributionID, completedModels) != true) {
+        for (AbstractModelArtifact modelToDelete : completedModels) {
+          modelToDelete.rollbackModel(aaiClient, config, distributionID);
         }
-        else{
-          completedModels.add(model);
-          logger.info(ModelLoaderMsgs.DISTRIBUTION_EVENT, model.getType().toString() + 
-              " " + model.getModelInvariantId() + " successfully ingested.");
-        }
-      }
-      else
-      {
-        ClientResponse getResponse  = aaiClient.getResource(getURL(model), distributionID, AaiRestClient.MimeType.XML);
-        if ( (getResponse == null) || (getResponse.getStatus() != Response.Status.OK.getStatusCode()) ) {
-          // Only attempt the PUT if the model doesn't already exist
-          ClientResponse putResponse = aaiClient.putResource(getURL(model), model.getPayload(), distributionID, AaiRestClient.MimeType.XML);
-          if ( (putResponse != null) && (putResponse.getStatus() == Response.Status.CREATED.getStatusCode()) ) {
-            completedModels.add(model);
-            logger.info(ModelLoaderMsgs.DISTRIBUTION_EVENT, model.getType().toString() + 
-                " " + model.getModelInvariantId() + " successfully ingested.");
-          }
-          else {
-            logger.error(ModelLoaderMsgs.DISTRIBUTION_EVENT_ERROR, "Ingestion failed for " + 
-                model.getType().toString() + " " + model.getModelInvariantId() + ". Rolling back distribution.");
 
-            for (ModelArtifact modelToDelete : completedModels) {
-              // Best effort to delete.  Nothing we can do in the event this fails.
-              aaiClient.getAndDeleteResource(getURL(modelToDelete), distributionID);
-            }
-
-            return false;
-          }
-        }
-        else {
-          logger.info(ModelLoaderMsgs.DISTRIBUTION_EVENT, model.getType().toString() + " " + model.getModelInvariantId() + 
-              " already exists.  Skipping ingestion.");
-          getResponse  = aaiClient.getResource(getModelVerURL(model), distributionID, AaiRestClient.MimeType.XML);
-          if ( (getResponse == null) || (getResponse.getStatus() != Response.Status.OK.getStatusCode()) ) {
-            // Only attempt the PUT if the model-ver doesn't already exist
-            ClientResponse putResponse = null;
-
-            try {
-              putResponse = aaiClient.putResource(getModelVerURL(model), nodeToString(model.getModelVer()), distributionID, AaiRestClient.MimeType.XML);
-            } catch (TransformerException e) {
-              // TODO Auto-generated catch block
-              e.printStackTrace();
-            }
-            if ( (putResponse != null) && (putResponse.getStatus() == Response.Status.CREATED.getStatusCode()) ) {
-              completedModels.add(model);
-              logger.info(ModelLoaderMsgs.DISTRIBUTION_EVENT, model.getType().toString() + " " + 
-                  model.getNameVersionId() + " successfully ingested.");
-            }
-            else {
-              logger.error(ModelLoaderMsgs.DISTRIBUTION_EVENT_ERROR, "Ingestion failed for " + 
-                  model.getType().toString() + " " + model.getNameVersionId() + ". Rolling back distribution.");
-
-              for (ModelArtifact modelToDelete : completedModels) {
-                // Best effort to delete.  Nothing we can do in the event this fails.
-                aaiClient.getAndDeleteResource(getModelVerURL(modelToDelete), distributionID);
-              }
-
-              return false;
-            }
-          }
-          else {
-            logger.info(ModelLoaderMsgs.DISTRIBUTION_EVENT, model.getType().toString() + " " + 
-                model.getModelInvariantId() + " already exists.  Skipping ingestion.");
-          }
-        }
+        return false;
       }
     }
 
     return true;
   }
 
-
-  private String nodeToString(Node node) throws TransformerException {
-    StringWriter sw = new StringWriter();
-    Transformer t = TransformerFactory.newInstance().newTransformer();
-    t.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
-    t.transform(new DOMSource(node), new StreamResult(sw));
-    System.out.println(sw.toString());
-    return sw.toString();
-  }
-
-  private String getURL(ModelArtifact model) {
-    String baseURL = config.getAaiBaseUrl().trim();
-    String subURL = null;
-    String instance = null;
-    if (model.getType().equals(ArtifactType.MODEL)) {
-      subURL = config.getAaiModelUrl(model.getModelNamespaceVersion()).trim();
-      instance = model.getModelInvariantId();
-    }
-    else {
-      subURL = config.getAaiNamedQueryUrl(model.getModelNamespaceVersion()).trim();
-      instance = model.getNameVersionId();
-    }
-
-    if ( (!baseURL.endsWith("/")) && (!subURL.startsWith("/")) ) {
-      baseURL = baseURL + "/";
-    }
-
-    if ( baseURL.endsWith("/") && subURL.startsWith("/") ) {
-      baseURL = baseURL.substring(0, baseURL.length()-1);
-    }
-
-    if (!subURL.endsWith("/")) {
-      subURL = subURL + "/";
-    }
-
-    String url = baseURL + subURL + instance;
-    return url;
-  }
-
-  private String getModelVerURL(ModelArtifact model) {
-    String baseURL = config.getAaiBaseUrl().trim();
-    String subURL = null;
-    String instance = null;
-    if (model.getType().equals(ArtifactType.MODEL)) {
-      subURL = config.getAaiModelUrl(model.getModelNamespaceVersion()).trim() + model.getModelInvariantId() + AAI_MODEL_VER;
-      instance = model.getModelVerId();
-    }
-    else {
-      subURL = config.getAaiNamedQueryUrl(model.getModelNamespaceVersion()).trim();
-      instance = model.getNameVersionId();
-    }
-
-    if ( (!baseURL.endsWith("/")) && (!subURL.startsWith("/")) ) {
-      baseURL = baseURL + "/";
-    }
-
-    if ( baseURL.endsWith("/") && subURL.startsWith("/") ) {
-      baseURL = baseURL.substring(0, baseURL.length()-1);
-    }
-
-    if (!subURL.endsWith("/")) {
-      subURL = subURL + "/";
-    }
-
-    String url = baseURL + subURL + instance;
-    return url;
-  }
-
   // This method is used for the test REST interface to load models without an ASDC
   public void loadModelTest(byte[] payload) {
     List<Artifact> modelArtifacts = new ArrayList<Artifact>();
index 1bd77c8..d81539c 100644 (file)
@@ -25,9 +25,7 @@ package org.openecomp.modelloader.entity.model;
 import org.openecomp.cl.api.Logger;
 import org.openecomp.cl.eelf.LoggerFactory;
 import org.openecomp.modelloader.entity.Artifact;
-import org.openecomp.modelloader.entity.ArtifactType;
 import org.openecomp.modelloader.service.ModelLoaderMsgs;
-import org.openecomp.modelloader.util.JsonXmlConverter;
 
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
@@ -36,32 +34,20 @@ import org.w3c.dom.NodeList;
 import org.xml.sax.InputSource;
 
 import java.io.StringReader;
-import java.io.StringWriter;
 import java.util.ArrayList;
 import java.util.List;
 
 import javax.xml.XMLConstants;
 import javax.xml.parsers.DocumentBuilder;
 import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.transform.OutputKeys;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerException;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.dom.DOMSource;
-import javax.xml.transform.stream.StreamResult;
 
 
-public class ModelArtifactParser {
+public class ModelArtifactParser implements IModelParser {
 
-       private static String MODELS_ELEMENT = "models";
-       private static String MODEL_ELEMENT = "model";
-       private static String NAMED_QUERIES_ELEMENT = "named-queries";
-       private static String NAMED_QUERY_ELEMENT = "named-query";
-       private static String MODEL_NAME_VERSION_ID = "model-name-version-id";
        private static String MODEL_VER = "model-ver";
        private static String MODEL_VERSION_ID = "model-version-id";
        private static String MODEL_INVARIANT_ID = "model-invariant-id";
-       private static String NAMED_QUERY_VERSION_ID = "named-query-uuid";
+       private static String RELATIONSHIP = "relationship";
        private static String RELATIONSHIP_DATA = "relationship-data";
        private static String RELATIONSHIP_KEY = "relationship-key";
        private static String RELATIONSHIP_VALUE = "relationship-value";
@@ -75,54 +61,22 @@ public class ModelArtifactParser {
          List<Artifact> modelList = new ArrayList<Artifact>();
 
          try {
-           // Artifact could be JSON or XML
-           if (JsonXmlConverter.isValidJson(payload)) {
-             payload = JsonXmlConverter.convertJsonToXml(payload);
-           }
-
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            InputSource is = new InputSource(new StringReader(payload));
            Document doc = builder.parse(is);
 
-           if ( (doc.getDocumentElement().getNodeName().equalsIgnoreCase(MODEL_ELEMENT)) || 
-               (doc.getDocumentElement().getNodeName().equalsIgnoreCase(NAMED_QUERY_ELEMENT)) ) {
-
-             ModelArtifact model = parseModel(doc.getDocumentElement(), payload);
+           ModelArtifact model = parseModel(doc.getDocumentElement(), payload);
 
-             if (model != null) {
-               if ( ArtifactType.MODEL.equals(model.getType())) {
-                 logger.info( ModelLoaderMsgs.DISTRIBUTION_EVENT, "Model parsed =====>>>> "
-                     + "Model-invariant-Id: "+ model.getModelInvariantId()
-                     + " Model-Version-Id: "+ model.getModelVerId());
-               }
-               modelList.add(model);
-             }
-             else {
-               logger.error(ModelLoaderMsgs.ARTIFACT_PARSE_ERROR, "Unable to parse artifact " + artifactName);
-               return null;
-             }
+           if (model != null) {
+             logger.info( ModelLoaderMsgs.DISTRIBUTION_EVENT, "Model parsed =====>>>> "
+                 + "Model-invariant-Id: "+ model.getModelInvariantId()
+                 + " Model-Version-Id: "+ model.getModelVerId());
+             modelList.add(model);
            }
-           else if ( (doc.getDocumentElement().getNodeName().equalsIgnoreCase(MODELS_ELEMENT)) ||
-               (doc.getDocumentElement().getNodeName().equalsIgnoreCase(NAMED_QUERIES_ELEMENT)) ) {
-             // The complete set of models/named-queries were contained in this artifact
-             NodeList nodeList = doc.getDocumentElement().getChildNodes();
-             for (int i = 0; i < nodeList.getLength(); i++) {
-               Node childNode = nodeList.item(i);
-               if ( (childNode.getNodeName().equalsIgnoreCase(MODEL_ELEMENT)) || 
-                   (childNode.getNodeName().equalsIgnoreCase(NAMED_QUERY_ELEMENT)) ) {
-                 String modelPayload = nodeToString(childNode);
-                 ModelArtifact model = parseModel(childNode, modelPayload);
-                 if (model != null) {
-                   modelList.add(model);
-                 }
-                 else {
-                   logger.error(ModelLoaderMsgs.ARTIFACT_PARSE_ERROR, "Unable to parse artifact " + artifactName);
-                   modelList.clear();
-                   break;
-                 }
-               }
-             }
+           else {
+             logger.error(ModelLoaderMsgs.ARTIFACT_PARSE_ERROR, "Unable to parse artifact " + artifactName);
+             return null;
            }
          }
          catch (Exception ex) {
@@ -132,28 +86,16 @@ public class ModelArtifactParser {
          return modelList;
        }
 
-       private void printDetails(Node modelVer) throws TransformerException {
-         logger.info(ModelLoaderMsgs.DISTRIBUTION_EVENT, nodeToString(modelVer));
-       }
-
        private ModelArtifact parseModel(Node modelNode, String payload) {
          ModelArtifact model = new ModelArtifact();
          model.setPayload(payload);
 
-         if (modelNode.getNodeName().equalsIgnoreCase(MODEL_ELEMENT)) {
-           //compare with Model-ver
-           model.setType(ArtifactType.MODEL);
-         }
-         else {
-           model.setType(ArtifactType.NAMED_QUERY);
-         }
-
          Element e = (Element)modelNode;
          model.setModelNamespace(e.getAttribute("xmlns"));
 
          parseNode(modelNode, model);
 
-         if (model.getModelInvariantId() == null  && model.getNameVersionId() == null) {
+         if ( (model.getModelInvariantId() == null) || (model.getModelVerId() == null) ){
            return null;
          }
 
@@ -161,36 +103,19 @@ public class ModelArtifactParser {
        }
 
        private void parseNode(Node node, ModelArtifact model) {
-
-         if(node.getNodeName().equalsIgnoreCase(MODEL_NAME_VERSION_ID)){
-           model.setModelVerId(node.getTextContent().trim());
-           model.setV9Artifact(false);
-         }
-         else if(node.getNodeName().equalsIgnoreCase("model-id")){
-           model.setModelInvariantId(node.getTextContent().trim());
-           model.setV9Artifact(false);
-         }
-
-         else if (node.getNodeName().equalsIgnoreCase(MODEL_INVARIANT_ID)) {
+         if (node.getNodeName().equalsIgnoreCase(MODEL_INVARIANT_ID)) {
            model.setModelInvariantId(node.getTextContent().trim());
          }
          else if (node.getNodeName().equalsIgnoreCase(MODEL_VERSION_ID)) {
            model.setModelVerId(node.getTextContent().trim());
-           //Change to Model Invariant Id
-         }
-         else if (node.getNodeName().equalsIgnoreCase(NAMED_QUERY_VERSION_ID)) {
-           model.setNameVersionId(node.getTextContent().trim());
          }
-         else if (node.getNodeName().equalsIgnoreCase(RELATIONSHIP_DATA)) {
-           parseRelationshipNode(node, model);
-           if(model.getModelModelInvariantId()!=null && model.getModelVerModelVersionId()!=null && !model.getModelModelInvariantId().isEmpty() && !model.getModelVerModelVersionId().isEmpty()){
-             model.addDependentModelId(model.getModelModelInvariantId() + "|" + model.getModelVerModelVersionId());
-             model.setModelModelInvariantId("");
-             model.setModelVerModelVersionId("");
+         else if (node.getNodeName().equalsIgnoreCase(RELATIONSHIP)) {
+           String dependentModelKey = parseRelationshipNode(node, model);
+           if (dependentModelKey != null) {
+             model.addDependentModelId(dependentModelKey);
            }
          }
          else {
-
            if (node.getNodeName().equalsIgnoreCase(MODEL_VER)) {
              model.setModelVer(node);
              if ( (model.getModelNamespace() != null) && (!model.getModelNamespace().isEmpty()) ) {
@@ -208,57 +133,62 @@ public class ModelArtifactParser {
          }
        }
 
-       private void parseRelationshipNode(Node node, ModelArtifact model) {
-
-         //invariant-id comes before model-version-id .. create a list of values
-         String key = null;
-         String value = null;
-         String modelVersionIdKey=null;
-         String modelInvariantIdIdKey=null;
-         String modelVersionIdValue=null;
-         String modelInvariantIdIdValue=null;
+       private String parseRelationshipNode(Node node, ModelArtifact model) {
+         String currentKey = null;
+         String currentValue = null;
+         String modelVersionIdValue = null;
+         String modelInvariantIdValue = null;
 
          NodeList nodeList = node.getChildNodes();
          for (int i = 0; i < nodeList.getLength(); i++) {
            Node childNode = nodeList.item(i);
-
-
-           if (childNode.getNodeName().equalsIgnoreCase(RELATIONSHIP_KEY)) {
-             key = childNode.getTextContent().trim();
-             if(key.equalsIgnoreCase(MODEL_VER_ELEMENT_RELATIONSHIP_KEY)){
-               modelVersionIdKey = key;
-             }
-             else if(key.equalsIgnoreCase(MODEL_ELEMENT_RELATIONSHIP_KEY)){
-               modelInvariantIdIdKey = key;
-             }
-           }
-           else if (childNode.getNodeName().equalsIgnoreCase(RELATIONSHIP_VALUE)) {
-             value = childNode.getTextContent().trim();
-             if(modelVersionIdKey!=null){
-               modelVersionIdValue = value;
-               model.setModelVerModelVersionId(modelVersionIdValue);
+           
+           if (childNode.getNodeName().equalsIgnoreCase(RELATIONSHIP_DATA)) {
+             NodeList relDataChildList = childNode.getChildNodes();
+             
+             for (int j = 0; j < relDataChildList.getLength(); j++) {
+               Node relDataChildNode = relDataChildList.item(j);
+               
+               if (relDataChildNode.getNodeName().equalsIgnoreCase(RELATIONSHIP_KEY)) {
+                 currentKey = relDataChildNode.getTextContent().trim();
+
+                 if (currentValue != null) {
+                   if (currentKey.equalsIgnoreCase(MODEL_VER_ELEMENT_RELATIONSHIP_KEY)) {
+                     modelVersionIdValue = currentValue;
+                   }
+                   else if (currentKey.equalsIgnoreCase(MODEL_ELEMENT_RELATIONSHIP_KEY)) {
+                     modelInvariantIdValue = currentValue;
+                   }
+                   
+                   currentKey = null;
+                   currentValue = null;
+                 }
+               }
+               else if (relDataChildNode.getNodeName().equalsIgnoreCase(RELATIONSHIP_VALUE)) {
+                 currentValue = relDataChildNode.getTextContent().trim();
+
+                 if (currentKey != null) {
+              if (currentKey.equalsIgnoreCase(MODEL_VER_ELEMENT_RELATIONSHIP_KEY)) {
+                modelVersionIdValue = currentValue;
+              }
+              else if (currentKey.equalsIgnoreCase(MODEL_ELEMENT_RELATIONSHIP_KEY)) {
+                modelInvariantIdValue = currentValue;
+              }
+              
+              currentKey = null;
+              currentValue = null;
+                 }
+               }
              }
-             else if(modelInvariantIdIdKey!=null){
-               modelInvariantIdIdValue = value;
-               model.setModelModelInvariantId(modelInvariantIdIdValue);
-             } 
-
            }
          }
-
-         if ( (key != null) && (key.equalsIgnoreCase(MODEL_ELEMENT_RELATIONSHIP_KEY )) && 
-             (model.isV9Artifact == false ||ArtifactType.NAMED_QUERY.equals(model.getType())) ) {
-           if (value != null) {
-             model.addDependentModelId(value);
-           }
+         
+         if ( (modelVersionIdValue != null) && (modelInvariantIdValue != null) ) {
+           return modelInvariantIdValue + "|" + modelVersionIdValue;
          }
-       }
+         
+         return null;
 
-       private String nodeToString(Node node) throws TransformerException {
-         StringWriter sw = new StringWriter();
-         Transformer t = TransformerFactory.newInstance().newTransformer();
-         t.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
-         t.transform(new DOMSource(node), new StreamResult(sw));
-         return sw.toString();
        }
+
 }
diff --git a/src/main/java/org/openecomp/modelloader/entity/model/ModelParserFactory.java b/src/main/java/org/openecomp/modelloader/entity/model/ModelParserFactory.java
new file mode 100644 (file)
index 0000000..aa3283f
--- /dev/null
@@ -0,0 +1,87 @@
+/**
+ * ============LICENSE_START=======================================================
+ * Model Loader
+ * ================================================================================
+ * Copyright © 2017 AT&T Intellectual Property.
+ * Copyright © 2017 Amdocs
+ * All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ *
+ * ECOMP and OpenECOMP are trademarks
+ * and service marks of AT&T Intellectual Property.
+ */
+package org.openecomp.modelloader.entity.model;
+
+import java.io.StringReader;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+
+import org.openecomp.cl.api.Logger;
+import org.openecomp.cl.eelf.LoggerFactory;
+import org.openecomp.modelloader.service.ModelLoaderMsgs;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.xml.sax.InputSource;
+
+public class ModelParserFactory {
+  private static Logger logger = LoggerFactory.getInstance().getLogger(ModelParserFactory.class.getName());
+  
+  private static String MODEL_ELEMENT = "model";
+  private static String NAMED_QUERY_ELEMENT = "named-query";
+  
+       public static IModelParser createModelParser(byte[] artifactPayload, String artifactName) {
+         Document doc = null;
+
+         try {
+           String payload = new String(artifactPayload);
+           DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+           DocumentBuilder builder;
+           builder = factory.newDocumentBuilder();
+           InputSource is = new InputSource(new StringReader(payload));
+           doc = builder.parse(is);
+         } catch (Exception e) {
+           logger.error(ModelLoaderMsgs.ARTIFACT_PARSE_ERROR, "Unable to parse artifact " + artifactName);
+           return null;
+         }
+
+    if (doc.getDocumentElement().getNodeName().equalsIgnoreCase(NAMED_QUERY_ELEMENT)) {
+      return new NamedQueryArtifactParser();
+    }
+    
+    if (!doc.getDocumentElement().getNodeName().equalsIgnoreCase(MODEL_ELEMENT)) {
+      logger.error(ModelLoaderMsgs.ARTIFACT_PARSE_ERROR, "Unable to parse artifact " + artifactName 
+          + ": Invalid root element: " + doc.getDocumentElement().getNodeName());
+      return null;
+    }
+    
+    Element e = doc.getDocumentElement();
+    String ns = e.getAttribute("xmlns");
+    String[] parts = ns.split("/");
+    
+    if (parts.length < 1) {
+      logger.error(ModelLoaderMsgs.ARTIFACT_PARSE_ERROR, "Unable to parse artifact " + artifactName 
+          + ": Could not parse namespace version");
+      return null;
+    }
+    
+    String modelNamespaceVersion = parts[parts.length-1].trim().replace("v", "");
+    int version = Integer.parseInt(modelNamespaceVersion);
+    
+    if (version > 8) {
+      return new ModelArtifactParser();
+    }
+    
+    return new ModelV8ArtifactParser(); 
+       }
+}
index 7f99414..274b18f 100644 (file)
@@ -44,11 +44,11 @@ public class ModelSorter {
    * Wraps a Model object to form dependencies other Models using Edges.
    */
   static class Node {
-    private final ModelArtifact model;
+    private final AbstractModelArtifact model;
     private final HashSet<Edge> inEdges;
     private final HashSet<Edge> outEdges;
 
-    public Node(ModelArtifact model) {
+    public Node(AbstractModelArtifact model) {
       this.model = model;
       inEdges = new HashSet<Edge>();
       outEdges = new HashSet<Edge>();
@@ -63,36 +63,18 @@ public class ModelSorter {
 
     @Override
     public String toString() {
-      if (model.getModelInvariantId() == null) {
-        return model.getNameVersionId();
-      }
-      
-      return model.getModelInvariantId();
+      return model.getUniqueIdentifier();
     }
 
     @Override
     public boolean equals(Object other) {
-      ModelArtifact otherModel = ((Node) other).model;
-      String modelId1 = this.model.getModelInvariantId();
-      if (modelId1 == null) {
-        modelId1 = this.model.getNameVersionId();
-      }
-      
-      String modelId2 = otherModel.getModelInvariantId();
-      if (modelId2 == null) {
-        modelId2 = otherModel.getNameVersionId();
-      }
-      
-      return modelId1.equals(modelId2);
+      AbstractModelArtifact otherModel = ((Node) other).model;      
+      return this.model.getUniqueIdentifier().equals(otherModel.getUniqueIdentifier());
     }
 
     @Override
     public int hashCode() {
-      if (this.model.getModelInvariantId() == null) {
-        return this.model.getNameVersionId().hashCode();
-      }
-      
-      return this.model.getModelInvariantId().hashCode();
+      return this.model.getUniqueIdentifier().hashCode();
     }
   }
 
@@ -150,24 +132,24 @@ public class ModelSorter {
 
     // load list of models into a map, so we can later replace referenceIds with
     // real Models
-    HashMap<String, ModelArtifact> versionIdToModelMap = new HashMap<String, ModelArtifact>();
+    HashMap<String, AbstractModelArtifact> versionIdToModelMap = new HashMap<String, AbstractModelArtifact>();
     for (Artifact art : models) {
-      ModelArtifact ma = (ModelArtifact) art;
-      versionIdToModelMap.put(ma.getModelModelVerCombinedKey(), ma);
+      AbstractModelArtifact ma = (AbstractModelArtifact) art;
+      versionIdToModelMap.put(ma.getUniqueIdentifier(), ma);
     }
 
     HashMap<String, Node> nodes = new HashMap<String, Node>();
     // create a node for each model and its referenced models
     for (Artifact art : models) {
 
-      ModelArtifact model = (ModelArtifact) art;
+      AbstractModelArtifact model = (AbstractModelArtifact) art;
       
       // node might have been created by another model referencing it
-      Node node = nodes.get(model.getModelModelVerCombinedKey());
+      Node node = nodes.get(model.getUniqueIdentifier());
 
       if (null == node) {
         node = new Node(model);
-        nodes.put(model.getModelModelVerCombinedKey(), node);
+        nodes.put(model.getUniqueIdentifier(), node);
       }
 
       for (String referencedModelId : model.getDependentModelIds()) {
@@ -176,7 +158,7 @@ public class ModelSorter {
 
         if (null == referencedNode) {
           // create node
-          ModelArtifact referencedModel = versionIdToModelMap.get(referencedModelId);
+          AbstractModelArtifact referencedModel = versionIdToModelMap.get(referencedModelId);
           if (referencedModel == null) {
             Log.debug("ignoring " + referencedModelId);
             continue; // referenced model not supplied, no need to sort it
diff --git a/src/main/java/org/openecomp/modelloader/entity/model/ModelV8Artifact.java b/src/main/java/org/openecomp/modelloader/entity/model/ModelV8Artifact.java
new file mode 100644 (file)
index 0000000..847f880
--- /dev/null
@@ -0,0 +1,122 @@
+/**
+ * ============LICENSE_START=======================================================
+ * Model Loader
+ * ================================================================================
+ * Copyright © 2017 AT&T Intellectual Property.
+ * Copyright © 2017 Amdocs
+ * All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ *
+ * ECOMP and OpenECOMP are trademarks
+ * and service marks of AT&T Intellectual Property.
+ */
+package org.openecomp.modelloader.entity.model;
+
+import java.util.List;
+
+import javax.ws.rs.core.Response;
+
+import org.openecomp.cl.api.Logger;
+import org.openecomp.cl.eelf.LoggerFactory;
+import org.openecomp.modelloader.config.ModelLoaderConfig;
+import org.openecomp.modelloader.entity.Artifact;
+import org.openecomp.modelloader.entity.ArtifactType;
+import org.openecomp.modelloader.restclient.AaiRestClient;
+import org.openecomp.modelloader.service.ModelLoaderMsgs;
+
+import com.sun.jersey.api.client.ClientResponse;
+
+public class ModelV8Artifact extends AbstractModelArtifact {
+  private static String AAI_CONVERSION_URL = "/aai/tools/modeltransform";      
+
+  private static Logger logger = LoggerFactory.getInstance().getLogger(ModelArtifact.class.getName());
+
+  private String modelNameVersionId; 
+       private ModelArtifact translatedModel;
+
+       public ModelV8Artifact() {
+         super(ArtifactType.MODEL_V8);
+       }
+
+       public String getModelNameVersionId() {
+         return modelNameVersionId;
+       }
+       
+       public void setModelNameVersionId(String modelNameVersionId) {
+               this.modelNameVersionId = modelNameVersionId;
+       }
+       
+  @Override
+  public String getUniqueIdentifier() {
+    return getModelNameVersionId();
+  }    
+       
+  @Override
+  public boolean push(AaiRestClient aaiClient, ModelLoaderConfig config, String distId, List<AbstractModelArtifact> addedModels) {
+    // For a legacy model (version <= v8), we need to call out to an A&AI endpoint to convert to the proper format
+    ClientResponse response  = aaiClient.postResource(getConversionUrl(config), constructTransformPayload(), distId, AaiRestClient.MimeType.XML);
+    if ( (response == null) || (response.getStatus() != Response.Status.OK.getStatusCode()) ) {
+      logger.error(ModelLoaderMsgs.DISTRIBUTION_EVENT_ERROR, "Ingestion failed for " + 
+          getType().toString() + " " + getModelNameVersionId() + ". Unable to convert model.  Rolling back distribution.");
+      return false;
+    }
+    
+    String translatedPayload = response.getEntity(String.class);
+    
+    logger.info(ModelLoaderMsgs.DISTRIBUTION_EVENT, "Translated artifact payload:\n" + translatedPayload);
+    
+    ModelArtifactParser parser = new ModelArtifactParser();
+    
+    List<Artifact> parsedArtifacts = parser.parse(translatedPayload.getBytes(), "translated-payload");
+    if (parsedArtifacts == null || parsedArtifacts.isEmpty()) {
+      return false;
+    } 
+    
+    translatedModel = (ModelArtifact)parsedArtifacts.get(0);
+    return translatedModel.push(aaiClient, config, distId, addedModels);
+  }
+
+  @Override
+  public void rollbackModel(AaiRestClient aaiClient, ModelLoaderConfig config, String distId) {
+    if (translatedModel != null) {
+      translatedModel.rollbackModel(aaiClient, config, distId);
+    }
+  }
+  
+
+  private String constructTransformPayload() {
+    // A&AI requires that to transform a legacy model, we need to use the v8 namespace (even 
+    // if the version < 8)
+    return getPayload().replaceFirst("aai.inventory/v.", "aai.inventory/v8");
+  }
+  
+  private String getConversionUrl(ModelLoaderConfig config) {
+    String baseUrl = config.getAaiBaseUrl().trim();
+    String subUrl = AAI_CONVERSION_URL;
+
+    if ( (!baseUrl.endsWith("/")) && (!subUrl.startsWith("/")) ) {
+      baseUrl = baseUrl + "/";
+    }
+
+    if ( baseUrl.endsWith("/") && subUrl.startsWith("/") ) {
+      baseUrl = baseUrl.substring(0, baseUrl.length()-1);
+    }
+
+    if (!subUrl.endsWith("/")) {
+      subUrl = subUrl + "/";
+    }
+
+    String url = baseUrl + subUrl;
+    return url;
+  }
+}
diff --git a/src/main/java/org/openecomp/modelloader/entity/model/ModelV8ArtifactParser.java b/src/main/java/org/openecomp/modelloader/entity/model/ModelV8ArtifactParser.java
new file mode 100644 (file)
index 0000000..f5ecb2b
--- /dev/null
@@ -0,0 +1,136 @@
+/**
+ * ============LICENSE_START=======================================================
+ * Model Loader
+ * ================================================================================
+ * Copyright © 2017 AT&T Intellectual Property.
+ * Copyright © 2017 Amdocs
+ * All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ *
+ * ECOMP and OpenECOMP are trademarks
+ * and service marks of AT&T Intellectual Property.
+ */
+package org.openecomp.modelloader.entity.model;
+
+import org.openecomp.cl.api.Logger;
+import org.openecomp.cl.eelf.LoggerFactory;
+import org.openecomp.modelloader.entity.Artifact;
+import org.openecomp.modelloader.service.ModelLoaderMsgs;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.InputSource;
+
+import java.io.StringReader;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+
+
+public class ModelV8ArtifactParser implements IModelParser {
+
+       private static String MODEL_NAME_VERSION_ID = "model-name-version-id";
+       private static String RELATIONSHIP_DATA = "relationship-data";
+       private static String RELATIONSHIP_KEY = "relationship-key";
+       private static String RELATIONSHIP_VALUE = "relationship-value";
+  private static String MODEL_ELEMENT_RELATIONSHIP_KEY = "model.model-name-version-id";
+
+       
+       private  static Logger logger = LoggerFactory.getInstance().getLogger(ModelV8ArtifactParser.class.getName());
+       
+       public List<Artifact> parse(byte[] artifactPayload, String artifactName) {
+         String payload = new String(artifactPayload);
+         List<Artifact> modelList = new ArrayList<Artifact>();
+
+         try {
+           DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
+           DocumentBuilder builder = factory.newDocumentBuilder();
+           InputSource is = new InputSource(new StringReader(payload));
+           Document doc = builder.parse(is);
+
+           ModelV8Artifact model = parseModel(doc.getDocumentElement(), payload);
+
+           if (model != null) {
+             logger.info(ModelLoaderMsgs.DISTRIBUTION_EVENT, "Model parsed =====>>>> " + "Model-Named-Version-Id: "+ model.getModelNameVersionId());
+             modelList.add(model);
+           }
+           else {
+             logger.error(ModelLoaderMsgs.ARTIFACT_PARSE_ERROR, "Unable to parse legacy model artifact " + artifactName);
+             return null;
+           }
+         }
+         catch (Exception ex) {
+           logger.error(ModelLoaderMsgs.ARTIFACT_PARSE_ERROR, "Unable to parse legacy model artifact " + artifactName + ": " + ex.getLocalizedMessage());
+         }
+
+         return modelList;
+       }
+
+       private ModelV8Artifact parseModel(Node modelNode, String payload) {
+         ModelV8Artifact model = new ModelV8Artifact();
+         model.setPayload(payload);
+
+         Element e = (Element)modelNode;
+         model.setModelNamespace(e.getAttribute("xmlns"));
+
+         parseNode(modelNode, model);
+
+    if (model.getModelNameVersionId() == null) {
+      return null;
+    }
+
+         return model;
+       }
+
+       private void parseNode(Node node, ModelV8Artifact model) {
+         if (node.getNodeName().equalsIgnoreCase(MODEL_NAME_VERSION_ID)) {
+           model.setModelNameVersionId(node.getTextContent().trim());
+         }
+         else if (node.getNodeName().equalsIgnoreCase(RELATIONSHIP_DATA)) {
+           parseRelationshipNode(node, model);
+         }
+         else {
+           NodeList nodeList = node.getChildNodes();
+           for (int i = 0; i < nodeList.getLength(); i++) {
+             Node childNode = nodeList.item(i);
+             parseNode(childNode, model);
+           }
+         }
+       }
+
+       private void parseRelationshipNode(Node node, ModelV8Artifact model) {
+    String key = null;
+    String value = null;
+    
+    NodeList nodeList = node.getChildNodes();
+    for (int i = 0; i < nodeList.getLength(); i++) {
+      Node childNode = nodeList.item(i);
+      if (childNode.getNodeName().equalsIgnoreCase(RELATIONSHIP_KEY)) {
+        key = childNode.getTextContent().trim();
+      }
+      else if (childNode.getNodeName().equalsIgnoreCase(RELATIONSHIP_VALUE)) {
+        value = childNode.getTextContent().trim();
+      }
+    }
+    
+    if ( (key != null) && (key.equalsIgnoreCase(MODEL_ELEMENT_RELATIONSHIP_KEY )) ) {
+      if (value != null) {
+        model.addDependentModelId(value);
+      }
+    }
+       }
+}
diff --git a/src/main/java/org/openecomp/modelloader/entity/model/NamedQueryArtifact.java b/src/main/java/org/openecomp/modelloader/entity/model/NamedQueryArtifact.java
new file mode 100644 (file)
index 0000000..1a4ceaa
--- /dev/null
@@ -0,0 +1,113 @@
+/**
+ * ============LICENSE_START=======================================================
+ * Model Loader
+ * ================================================================================
+ * Copyright © 2017 AT&T Intellectual Property.
+ * Copyright © 2017 Amdocs
+ * All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ *
+ * ECOMP and OpenECOMP are trademarks
+ * and service marks of AT&T Intellectual Property.
+ */
+package org.openecomp.modelloader.entity.model;
+
+import java.util.List;
+
+import javax.ws.rs.core.Response;
+
+import org.openecomp.cl.api.Logger;
+import org.openecomp.cl.eelf.LoggerFactory;
+import org.openecomp.modelloader.config.ModelLoaderConfig;
+import org.openecomp.modelloader.entity.ArtifactType;
+import org.openecomp.modelloader.restclient.AaiRestClient;
+import org.openecomp.modelloader.service.ModelLoaderMsgs;
+
+import com.sun.jersey.api.client.ClientResponse;
+
+public class NamedQueryArtifact extends AbstractModelArtifact {
+               
+  private Logger logger = LoggerFactory.getInstance().getLogger(NamedQueryArtifact.class.getName());
+  
+       private String namedQueryUuid; 
+       
+       public NamedQueryArtifact() {
+         super(ArtifactType.NAMED_QUERY);
+       }
+       
+       public String getNamedQueryUuid() {
+               return namedQueryUuid;
+       }
+       
+       public void setNamedQueryUuid(String namedQueryUuid) {
+               this.namedQueryUuid = namedQueryUuid;
+       }
+       
+  @Override
+  public String getUniqueIdentifier() {
+    return getNamedQueryUuid();
+  }    
+
+  @Override
+  public boolean push(AaiRestClient aaiClient, ModelLoaderConfig config, String distId, List<AbstractModelArtifact> addedModels) {
+    ClientResponse getResponse  = aaiClient.getResource(getNamedQueryUrl(config), distId, AaiRestClient.MimeType.XML);
+    if ( (getResponse == null) || (getResponse.getStatus() != Response.Status.OK.getStatusCode()) ) {
+      // Only attempt the PUT if the model doesn't already exist
+      ClientResponse putResponse = aaiClient.putResource(getNamedQueryUrl(config), getPayload(), distId, AaiRestClient.MimeType.XML);
+      if ( (putResponse != null) && (putResponse.getStatus() == Response.Status.CREATED.getStatusCode()) ) {
+        addedModels.add(this);
+        logger.info(ModelLoaderMsgs.DISTRIBUTION_EVENT, getType().toString() + " " + getUniqueIdentifier() + " successfully ingested.");
+      }
+      else {
+        logger.error(ModelLoaderMsgs.DISTRIBUTION_EVENT_ERROR, "Ingestion failed for " + getType().toString() + " " + getUniqueIdentifier() +
+            ". Rolling back distribution.");
+        return false;
+      }
+    }
+    else {
+      logger.info(ModelLoaderMsgs.DISTRIBUTION_EVENT, getType().toString() + " " + getUniqueIdentifier() + " already exists.  Skipping ingestion.");
+    }
+    
+    return true;
+  }
+
+  @Override
+  public void rollbackModel(AaiRestClient aaiClient, ModelLoaderConfig config, String distId) {
+    // Best effort to delete.  Nothing we can do in the event this fails.
+    aaiClient.getAndDeleteResource(getNamedQueryUrl(config), distId);
+  }
+
+  private String getNamedQueryUrl(ModelLoaderConfig config) {
+    String baseURL = config.getAaiBaseUrl().trim();
+    String subURL = null;
+    String instance = null;
+
+    subURL = config.getAaiNamedQueryUrl(getModelNamespaceVersion()).trim();
+    instance = this.getNamedQueryUuid();
+
+    if ( (!baseURL.endsWith("/")) && (!subURL.startsWith("/")) ) {
+      baseURL = baseURL + "/";
+    }
+
+    if ( baseURL.endsWith("/") && subURL.startsWith("/") ) {
+      baseURL = baseURL.substring(0, baseURL.length()-1);
+    }
+
+    if (!subURL.endsWith("/")) {
+      subURL = subURL + "/";
+    }
+
+    String url = baseURL + subURL + instance;
+    return url;
+  }
+}
diff --git a/src/main/java/org/openecomp/modelloader/entity/model/NamedQueryArtifactParser.java b/src/main/java/org/openecomp/modelloader/entity/model/NamedQueryArtifactParser.java
new file mode 100644 (file)
index 0000000..3643f18
--- /dev/null
@@ -0,0 +1,136 @@
+/**
+ * ============LICENSE_START=======================================================
+ * Model Loader
+ * ================================================================================
+ * Copyright © 2017 AT&T Intellectual Property.
+ * Copyright © 2017 Amdocs
+ * All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ *
+ * ECOMP and OpenECOMP are trademarks
+ * and service marks of AT&T Intellectual Property.
+ */
+package org.openecomp.modelloader.entity.model;
+
+import org.openecomp.cl.api.Logger;
+import org.openecomp.cl.eelf.LoggerFactory;
+import org.openecomp.modelloader.entity.Artifact;
+import org.openecomp.modelloader.service.ModelLoaderMsgs;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.InputSource;
+
+import java.io.StringReader;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+
+
+public class NamedQueryArtifactParser implements IModelParser {
+
+  private static String NAMED_QUERY_VERSION_ID = "named-query-uuid";
+       private static String RELATIONSHIP_DATA = "relationship-data";
+       private static String RELATIONSHIP_KEY = "relationship-key";
+       private static String RELATIONSHIP_VALUE = "relationship-value";
+  private static String MODEL_ELEMENT_RELATIONSHIP_KEY = "model.model-invariant-id";
+
+       
+       private  static Logger logger = LoggerFactory.getInstance().getLogger(NamedQueryArtifactParser.class.getName());
+       
+       public List<Artifact> parse(byte[] artifactPayload, String artifactName) {
+         String payload = new String(artifactPayload);
+         List<Artifact> modelList = new ArrayList<Artifact>();
+
+         try {
+           DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
+           DocumentBuilder builder = factory.newDocumentBuilder();
+           InputSource is = new InputSource(new StringReader(payload));
+           Document doc = builder.parse(is);
+
+           NamedQueryArtifact model = parseModel(doc.getDocumentElement(), payload);
+
+           if (model != null) {
+             logger.info(ModelLoaderMsgs.DISTRIBUTION_EVENT, "Named-Query parsed =====>>>> " + "Named-Query-UUID: "+ model.getNamedQueryUuid());
+             modelList.add(model);
+           }
+           else {
+             logger.error(ModelLoaderMsgs.ARTIFACT_PARSE_ERROR, "Unable to parse named-query artifact " + artifactName);
+             return null;
+           }
+         }
+         catch (Exception ex) {
+           logger.error(ModelLoaderMsgs.ARTIFACT_PARSE_ERROR, "Unable to parse named-query artifact " + artifactName + ": " + ex.getLocalizedMessage());
+         }
+
+         return modelList;
+       }
+
+       private NamedQueryArtifact parseModel(Node modelNode, String payload) {
+         NamedQueryArtifact model = new NamedQueryArtifact();
+         model.setPayload(payload);
+
+         Element e = (Element)modelNode;
+         model.setModelNamespace(e.getAttribute("xmlns"));
+
+         parseNode(modelNode, model);
+
+    if (model.getNamedQueryUuid() == null) {
+      return null;
+    }
+
+         return model;
+       }
+
+       private void parseNode(Node node, NamedQueryArtifact model) {
+         if (node.getNodeName().equalsIgnoreCase(NAMED_QUERY_VERSION_ID)) {
+           model.setNamedQueryUuid(node.getTextContent().trim());
+         }
+         else if (node.getNodeName().equalsIgnoreCase(RELATIONSHIP_DATA)) {
+           parseRelationshipNode(node, model);
+         }
+         else {
+           NodeList nodeList = node.getChildNodes();
+           for (int i = 0; i < nodeList.getLength(); i++) {
+             Node childNode = nodeList.item(i);
+             parseNode(childNode, model);
+           }
+         }
+       }
+
+       private void parseRelationshipNode(Node node, NamedQueryArtifact model) {
+    String key = null;
+    String value = null;
+    
+    NodeList nodeList = node.getChildNodes();
+    for (int i = 0; i < nodeList.getLength(); i++) {
+      Node childNode = nodeList.item(i);
+      if (childNode.getNodeName().equalsIgnoreCase(RELATIONSHIP_KEY)) {
+        key = childNode.getTextContent().trim();
+      }
+      else if (childNode.getNodeName().equalsIgnoreCase(RELATIONSHIP_VALUE)) {
+        value = childNode.getTextContent().trim();
+      }
+    }
+    
+    if ( (key != null) && (key.equalsIgnoreCase(MODEL_ELEMENT_RELATIONSHIP_KEY )) ) {
+      if (value != null) {
+        model.addDependentModelId(value);
+      }
+    }
+       }
+}
index 8634741..059964e 100644 (file)
-/**\r
- * ============LICENSE_START=======================================================\r
- * Model Loader\r
- * ================================================================================\r
- * Copyright © 2017 AT&T Intellectual Property.\r
- * Copyright © 2017 Amdocs\r
- * All rights reserved.\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
- * ============LICENSE_END=========================================================\r
- *\r
- * ECOMP and OpenECOMP are trademarks\r
- * and service marks of AT&T Intellectual Property.\r
- */\r
-package org.openecomp.modelloader.notification;\r
-\r
-import org.openecomp.sdc.api.IDistributionClient;\r
-import org.openecomp.sdc.api.consumer.IDistributionStatusMessage;\r
-import org.openecomp.sdc.api.consumer.INotificationCallback;\r
-import org.openecomp.sdc.api.notification.IArtifactInfo;\r
-import org.openecomp.sdc.api.notification.INotificationData;\r
-import org.openecomp.sdc.api.notification.IResourceInstance;\r
-import org.openecomp.sdc.api.results.IDistributionClientDownloadResult;\r
-import org.openecomp.sdc.api.results.IDistributionClientResult;\r
-import org.openecomp.sdc.utils.ArtifactTypeEnum;\r
-import org.openecomp.sdc.utils.DistributionActionResultEnum;\r
-import org.openecomp.sdc.utils.DistributionStatusEnum;\r
-\r
-import org.openecomp.cl.api.Logger;\r
-import org.openecomp.cl.eelf.LoggerFactory;\r
-import org.openecomp.cl.mdc.MdcContext;\r
-import org.openecomp.cl.mdc.MdcOverride;\r
-import org.openecomp.modelloader.config.ModelLoaderConfig;\r
-import org.openecomp.modelloader.entity.Artifact;\r
-import org.openecomp.modelloader.entity.catalog.VnfCatalogArtifact;\r
-import org.openecomp.modelloader.entity.catalog.VnfCatalogArtifactHandler;\r
-import org.openecomp.modelloader.entity.model.ModelArtifactHandler;\r
-import org.openecomp.modelloader.entity.model.ModelArtifactParser;\r
-import org.openecomp.modelloader.service.ModelLoaderMsgs;\r
-import org.slf4j.MDC;\r
-\r
-import java.text.SimpleDateFormat;\r
-import java.util.ArrayList;\r
-import java.util.List;\r
-\r
-public class EventCallback implements INotificationCallback {\r
-\r
-  private IDistributionClient client;\r
-  private ModelLoaderConfig config;\r
-  private static Logger logger = LoggerFactory.getInstance()\r
-      .getLogger(EventCallback.class.getName());\r
-  private static Logger auditLogger = LoggerFactory.getInstance()\r
-      .getAuditLogger(EventCallback.class.getName());\r
-  private static Logger metricsLogger = LoggerFactory.getInstance()\r
-      .getMetricsLogger(EventCallback.class.getName());\r
-\r
-  private static SimpleDateFormat dateFormatter = new SimpleDateFormat(\r
-      "yyyy-MM-dd'T'HH:mm:ss.SSSXXX");\r
-\r
-  public EventCallback(IDistributionClient client, ModelLoaderConfig config) {\r
-    this.client = client;\r
-    this.config = config;\r
-  }\r
-\r
-  @Override\r
-  public void activateCallback(INotificationData data) {\r
-    // Init MDC\r
-    MdcContext.initialize(data.getDistributionID(), "ModelLoader", "", "Event-Bus", "");\r
-\r
-    logger.info(ModelLoaderMsgs.DISTRIBUTION_EVENT,\r
-        "Received distribution " + data.getDistributionID());\r
-\r
-    boolean success = true;\r
-    List<IArtifactInfo> artifacts = getArtifacts(data);\r
-    List<Artifact> modelArtifacts = new ArrayList<Artifact>();\r
-    List<Artifact> catalogArtifacts = new ArrayList<Artifact>();\r
-    ModelArtifactParser modelArtParser = new ModelArtifactParser();\r
-\r
-    for (IArtifactInfo artifact : artifacts) {\r
-      // Grab the current time so we can measure the download time for the\r
-      // metrics log\r
-      long startTimeInMs = System.currentTimeMillis();\r
-      MdcOverride override = new MdcOverride();\r
-      override.addAttribute(MdcContext.MDC_START_TIME, dateFormatter.format(startTimeInMs));\r
-\r
-      // Download Artifact\r
-      IDistributionClientDownloadResult downloadResult = client.download(artifact);\r
-\r
-      // Generate metrics log\r
-      metricsLogger.info(ModelLoaderMsgs.DOWNLOAD_COMPLETE, null, override,\r
-          artifact.getArtifactName(), downloadResult.getDistributionActionResult().toString());\r
-\r
-      if (downloadResult.getDistributionActionResult() != DistributionActionResultEnum.SUCCESS) {\r
-        publishDownloadFailure(data, artifact, downloadResult.getDistributionMessageResult());\r
-        success = false;\r
-        break;\r
-      }\r
-\r
-      logger.info(ModelLoaderMsgs.DISTRIBUTION_EVENT,\r
-               "Downloaded artifact: " + artifact.getArtifactName() + "  Payload:\n" + new String(downloadResult.getArtifactPayload()));\r
-      \r
-      publishDownloadSuccess(data, artifact, downloadResult);\r
-\r
-      if ((artifact.getArtifactType()\r
-          .compareToIgnoreCase(ArtifactTypeEnum.MODEL_INVENTORY_PROFILE.toString()) == 0)\r
-          || (artifact.getArtifactType()\r
-              .compareToIgnoreCase(ArtifactTypeEnum.MODEL_QUERY_SPEC.toString()) == 0)) {\r
-        List<Artifact> parsedArtifacts = modelArtParser.parse(downloadResult.getArtifactPayload(), downloadResult.getArtifactName());\r
-        if (parsedArtifacts != null && !parsedArtifacts.isEmpty()) {\r
-          modelArtifacts.addAll(parsedArtifacts);\r
-        } else {\r
-          success = false;\r
-          publishDeployFailure(data, artifact);\r
-          break;\r
-        }\r
-      } else if (artifact.getArtifactType()\r
-          .compareToIgnoreCase(ArtifactTypeEnum.VNF_CATALOG.toString()) == 0) {\r
-        catalogArtifacts\r
-            .add(new VnfCatalogArtifact(new String(downloadResult.getArtifactPayload())));\r
-      }\r
-    }\r
-\r
-    String statusString = "SUCCESS";\r
-    if (success) {\r
-      ModelArtifactHandler modelHandler = new ModelArtifactHandler(config);\r
-      boolean modelDeploySuccess = modelHandler.pushArtifacts(modelArtifacts,\r
-          data.getDistributionID());\r
-\r
-      VnfCatalogArtifactHandler catalogHandler = new VnfCatalogArtifactHandler(config);\r
-      boolean catalogDeploySuccess = catalogHandler.pushArtifacts(catalogArtifacts,\r
-          data.getDistributionID());\r
-\r
-      for (IArtifactInfo artifact : artifacts) {\r
-        if ((artifact.getArtifactType()\r
-            .compareToIgnoreCase(ArtifactTypeEnum.MODEL_INVENTORY_PROFILE.toString()) == 0)\r
-            || (artifact.getArtifactType()\r
-                .compareToIgnoreCase(ArtifactTypeEnum.MODEL_QUERY_SPEC.toString()) == 0)) {\r
-          if (modelDeploySuccess) {\r
-            publishDeploySuccess(data, artifact);\r
-          } else {\r
-            publishDeployFailure(data, artifact);\r
-            statusString = "FAILURE";\r
-          }\r
-        } else if (artifact.getArtifactType()\r
-            .compareToIgnoreCase(ArtifactTypeEnum.VNF_CATALOG.toString()) == 0) {\r
-          if (catalogDeploySuccess) {\r
-            publishDeploySuccess(data, artifact);\r
-          } else {\r
-            publishDeployFailure(data, artifact);\r
-            statusString = "FAILURE";\r
-          }\r
-        }\r
-      }\r
-    } else {\r
-      statusString = "FAILURE";\r
-    }\r
-\r
-    auditLogger.info(ModelLoaderMsgs.DISTRIBUTION_EVENT,\r
-        "Processed distribution " + data.getDistributionID() + "  (" + statusString + ")");\r
-    MDC.clear();\r
-  }\r
-\r
-  private List<IArtifactInfo> getArtifacts(INotificationData data) {\r
-    List<IArtifactInfo> artifacts = new ArrayList<IArtifactInfo>();\r
-    List<IResourceInstance> resources = data.getResources();\r
-\r
-    if (data.getServiceArtifacts() != null) {\r
-      artifacts.addAll(data.getServiceArtifacts());\r
-    }\r
-\r
-    if (resources != null) {\r
-      for (IResourceInstance resource : resources) {\r
-        if (resource.getArtifacts() != null) {\r
-          artifacts.addAll(resource.getArtifacts());\r
-        }\r
-      }\r
-    }\r
-\r
-    return artifacts;\r
-  }\r
-\r
-  private void publishDownloadFailure(INotificationData data, IArtifactInfo artifact,\r
-      String errorMessage) {\r
-    // Grab the current time so we can measure the download time for the metrics\r
-    // log\r
-    long startTimeInMs = System.currentTimeMillis();\r
-    MdcOverride override = new MdcOverride();\r
-    override.addAttribute(MdcContext.MDC_START_TIME, dateFormatter.format(startTimeInMs));\r
-\r
-    IDistributionClientResult sendDownloadStatus = client.sendDownloadStatus(\r
-        buildStatusMessage(client, data, artifact, DistributionStatusEnum.DOWNLOAD_ERROR));\r
-    metricsLogger.info(ModelLoaderMsgs.EVENT_PUBLISHED, null, override, "download failure",\r
-        artifact.getArtifactName(), sendDownloadStatus.getDistributionActionResult().toString());\r
-\r
-    if (sendDownloadStatus.getDistributionActionResult() != DistributionActionResultEnum.SUCCESS) {\r
-      logger.error(ModelLoaderMsgs.DISTRIBUTION_EVENT_ERROR,\r
-          "Failed to publish download failure status: "\r
-              + sendDownloadStatus.getDistributionMessageResult());\r
-    }\r
-\r
-    logger.error(ModelLoaderMsgs.DISTRIBUTION_EVENT_ERROR,\r
-        "Failed to download artifact " + artifact.getArtifactName() + ": " + errorMessage);\r
-  }\r
-\r
-  private void publishDownloadSuccess(INotificationData data, IArtifactInfo artifact,\r
-      IDistributionClientDownloadResult downloadResult) {\r
-    // Grab the current time so we can measure the download time for the metrics\r
-    // log\r
-    long startTimeInMs = System.currentTimeMillis();\r
-    MdcOverride override = new MdcOverride();\r
-    override.addAttribute(MdcContext.MDC_START_TIME, dateFormatter.format(startTimeInMs));\r
-\r
-    IDistributionClientResult sendDownloadStatus = client.sendDownloadStatus(\r
-        buildStatusMessage(client, data, artifact, DistributionStatusEnum.DOWNLOAD_OK));\r
-    metricsLogger.info(ModelLoaderMsgs.EVENT_PUBLISHED, null, override, "download success",\r
-        artifact.getArtifactName(), sendDownloadStatus.getDistributionActionResult().toString());\r
-\r
-    if (sendDownloadStatus.getDistributionActionResult() != DistributionActionResultEnum.SUCCESS) {\r
-      logger.error(ModelLoaderMsgs.DISTRIBUTION_EVENT_ERROR,\r
-          "Failed to publish download success status: "\r
-              + sendDownloadStatus.getDistributionMessageResult());\r
-    }\r
-\r
-    if (logger.isDebugEnabled()) {\r
-      StringBuilder sb = new StringBuilder();\r
-      sb.append("Downloaded artifact:\n");\r
-      sb.append("ArtInfo_Art_Name: " + artifact.getArtifactName());\r
-      sb.append("\nArtInfo_Art_description: " + artifact.getArtifactDescription());\r
-      sb.append("\nArtInfo_Art_CheckSum: " + artifact.getArtifactChecksum());\r
-      sb.append("\nArtInfo_Art_Url: " + artifact.getArtifactURL());\r
-      sb.append("\nArtInfo_Art_Type: " + artifact.getArtifactType());\r
-      sb.append("\nArtInfo_Serv_description: " + data.getServiceDescription());\r
-      sb.append("\nArtInfo_Serv_Name: " + data.getServiceName());\r
-      sb.append("\nGet_serviceVersion: " + data.getServiceVersion());\r
-      sb.append("\nGet_Service_UUID: " + data.getServiceUUID());\r
-      sb.append("\nArtInfo_DistributionId: " + data.getDistributionID());\r
-      logger.debug(sb.toString());\r
-    }\r
-  }\r
-\r
-  private void publishDeployFailure(INotificationData data, IArtifactInfo artifact) {\r
-    // Grab the current time so we can measure the download time for the metrics\r
-    // log\r
-    long startTimeInMs = System.currentTimeMillis();\r
-    MdcOverride override = new MdcOverride();\r
-    override.addAttribute(MdcContext.MDC_START_TIME, dateFormatter.format(startTimeInMs));\r
-\r
-    IDistributionClientResult sendStatus = client.sendDeploymentStatus(\r
-        buildStatusMessage(client, data, artifact, DistributionStatusEnum.DEPLOY_ERROR));\r
-    metricsLogger.info(ModelLoaderMsgs.EVENT_PUBLISHED, null, override, "deploy failure",\r
-        artifact.getArtifactName(), sendStatus.getDistributionActionResult().toString());\r
-\r
-    if (sendStatus.getDistributionActionResult() != DistributionActionResultEnum.SUCCESS) {\r
-      logger.error(ModelLoaderMsgs.DISTRIBUTION_EVENT_ERROR,\r
-          "Failed to publish deploy failure status: " + sendStatus.getDistributionMessageResult());\r
-    }\r
-  }\r
-\r
-  private void publishDeploySuccess(INotificationData data, IArtifactInfo artifact) {\r
-    // Grab the current time so we can measure the download time for the metrics\r
-    // log\r
-    long startTimeInMs = System.currentTimeMillis();\r
-    MdcOverride override = new MdcOverride();\r
-    override.addAttribute(MdcContext.MDC_START_TIME, dateFormatter.format(startTimeInMs));\r
-\r
-    IDistributionClientResult sendStatus = client.sendDownloadStatus(\r
-        buildStatusMessage(client, data, artifact, DistributionStatusEnum.DEPLOY_OK));\r
-    metricsLogger.info(ModelLoaderMsgs.EVENT_PUBLISHED, null, override, "deploy success",\r
-        artifact.getArtifactName(), sendStatus.getDistributionActionResult().toString());\r
-\r
-    if (sendStatus.getDistributionActionResult() != DistributionActionResultEnum.SUCCESS) {\r
-      logger.error(ModelLoaderMsgs.DISTRIBUTION_EVENT_ERROR,\r
-          "Failed to publish deploy success status: " + sendStatus.getDistributionMessageResult());\r
-    }\r
-  }\r
-\r
-  private IDistributionStatusMessage buildStatusMessage(IDistributionClient client,\r
-      INotificationData data, IArtifactInfo artifact, DistributionStatusEnum status) {\r
-    IDistributionStatusMessage statusMessage = new DistributionStatusMsg(status,\r
-        data.getDistributionID(), client.getConfiguration().getConsumerID(),\r
-        artifact.getArtifactURL());\r
-\r
-    return statusMessage;\r
-  }\r
-\r
-}\r
+/**
+ * ============LICENSE_START=======================================================
+ * Model Loader
+ * ================================================================================
+ * Copyright © 2017 AT&T Intellectual Property.
+ * Copyright © 2017 Amdocs
+ * All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ *
+ * ECOMP and OpenECOMP are trademarks
+ * and service marks of AT&T Intellectual Property.
+ */
+package org.openecomp.modelloader.notification;
+
+import org.openecomp.sdc.api.IDistributionClient;
+import org.openecomp.sdc.api.consumer.IDistributionStatusMessage;
+import org.openecomp.sdc.api.consumer.INotificationCallback;
+import org.openecomp.sdc.api.notification.IArtifactInfo;
+import org.openecomp.sdc.api.notification.INotificationData;
+import org.openecomp.sdc.api.notification.IResourceInstance;
+import org.openecomp.sdc.api.results.IDistributionClientDownloadResult;
+import org.openecomp.sdc.api.results.IDistributionClientResult;
+import org.openecomp.sdc.utils.ArtifactTypeEnum;
+import org.openecomp.sdc.utils.DistributionActionResultEnum;
+import org.openecomp.sdc.utils.DistributionStatusEnum;
+
+import org.openecomp.cl.api.Logger;
+import org.openecomp.cl.eelf.LoggerFactory;
+import org.openecomp.cl.mdc.MdcContext;
+import org.openecomp.cl.mdc.MdcOverride;
+import org.openecomp.modelloader.config.ModelLoaderConfig;
+import org.openecomp.modelloader.entity.Artifact;
+import org.openecomp.modelloader.entity.catalog.VnfCatalogArtifact;
+import org.openecomp.modelloader.entity.catalog.VnfCatalogArtifactHandler;
+import org.openecomp.modelloader.entity.model.IModelParser;
+import org.openecomp.modelloader.entity.model.ModelArtifactHandler;
+import org.openecomp.modelloader.entity.model.ModelParserFactory;
+import org.openecomp.modelloader.service.ModelLoaderMsgs;
+import org.slf4j.MDC;
+
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.List;
+
+public class EventCallback implements INotificationCallback {
+
+  private IDistributionClient client;
+  private ModelLoaderConfig config;
+  private static Logger logger = LoggerFactory.getInstance()
+      .getLogger(EventCallback.class.getName());
+  private static Logger auditLogger = LoggerFactory.getInstance()
+      .getAuditLogger(EventCallback.class.getName());
+  private static Logger metricsLogger = LoggerFactory.getInstance()
+      .getMetricsLogger(EventCallback.class.getName());
+
+  private static SimpleDateFormat dateFormatter = new SimpleDateFormat(
+      "yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
+
+  public EventCallback(IDistributionClient client, ModelLoaderConfig config) {
+    this.client = client;
+    this.config = config;
+  }
+
+  @Override
+  public void activateCallback(INotificationData data) {
+    // Init MDC
+    MdcContext.initialize(data.getDistributionID(), "ModelLoader", "", "Event-Bus", "");
+
+    logger.info(ModelLoaderMsgs.DISTRIBUTION_EVENT,
+        "Received distribution " + data.getDistributionID());
+
+    boolean success = true;
+    List<IArtifactInfo> artifacts = getArtifacts(data);
+    List<Artifact> modelArtifacts = new ArrayList<Artifact>();
+    List<Artifact> catalogArtifacts = new ArrayList<Artifact>();
+
+    for (IArtifactInfo artifact : artifacts) {
+      // Grab the current time so we can measure the download time for the
+      // metrics log
+      long startTimeInMs = System.currentTimeMillis();
+      MdcOverride override = new MdcOverride();
+      override.addAttribute(MdcContext.MDC_START_TIME, dateFormatter.format(startTimeInMs));
+
+      // Download Artifact
+      IDistributionClientDownloadResult downloadResult = client.download(artifact);
+
+      // Generate metrics log
+      metricsLogger.info(ModelLoaderMsgs.DOWNLOAD_COMPLETE, null, override,
+          artifact.getArtifactName(), downloadResult.getDistributionActionResult().toString());
+
+      if (downloadResult.getDistributionActionResult() != DistributionActionResultEnum.SUCCESS) {
+        publishDownloadFailure(data, artifact, downloadResult.getDistributionMessageResult());
+        success = false;
+        break;
+      }
+
+      logger.info(ModelLoaderMsgs.DISTRIBUTION_EVENT,
+               "Downloaded artifact: " + artifact.getArtifactName() + "  Payload:\n" + new String(downloadResult.getArtifactPayload()));
+      
+      publishDownloadSuccess(data, artifact, downloadResult);
+
+      if ((artifact.getArtifactType().compareToIgnoreCase(ArtifactTypeEnum.MODEL_INVENTORY_PROFILE.toString()) == 0)
+          || (artifact.getArtifactType().compareToIgnoreCase(ArtifactTypeEnum.MODEL_QUERY_SPEC.toString()) == 0)) {
+        IModelParser parser = ModelParserFactory.createModelParser(downloadResult.getArtifactPayload(), downloadResult.getArtifactName());
+        List<Artifact> parsedArtifacts = parser.parse(downloadResult.getArtifactPayload(), downloadResult.getArtifactName());
+        if (parsedArtifacts != null && !parsedArtifacts.isEmpty()) {
+          modelArtifacts.addAll(parsedArtifacts);
+        } else {
+          success = false;
+          publishDeployFailure(data, artifact);
+          break;
+        }
+      } else if (artifact.getArtifactType()
+          .compareToIgnoreCase(ArtifactTypeEnum.VNF_CATALOG.toString()) == 0) {
+        catalogArtifacts
+            .add(new VnfCatalogArtifact(new String(downloadResult.getArtifactPayload())));
+      }
+    }
+
+    String statusString = "SUCCESS";
+    if (success) {
+      ModelArtifactHandler modelHandler = new ModelArtifactHandler(config);
+      boolean modelDeploySuccess = modelHandler.pushArtifacts(modelArtifacts,
+          data.getDistributionID());
+
+      VnfCatalogArtifactHandler catalogHandler = new VnfCatalogArtifactHandler(config);
+      boolean catalogDeploySuccess = catalogHandler.pushArtifacts(catalogArtifacts,
+          data.getDistributionID());
+
+      for (IArtifactInfo artifact : artifacts) {
+        if ((artifact.getArtifactType()
+            .compareToIgnoreCase(ArtifactTypeEnum.MODEL_INVENTORY_PROFILE.toString()) == 0)
+            || (artifact.getArtifactType()
+                .compareToIgnoreCase(ArtifactTypeEnum.MODEL_QUERY_SPEC.toString()) == 0)) {
+          if (modelDeploySuccess) {
+            publishDeploySuccess(data, artifact);
+          } else {
+            publishDeployFailure(data, artifact);
+            statusString = "FAILURE";
+          }
+        } else if (artifact.getArtifactType()
+            .compareToIgnoreCase(ArtifactTypeEnum.VNF_CATALOG.toString()) == 0) {
+          if (catalogDeploySuccess) {
+            publishDeploySuccess(data, artifact);
+          } else {
+            publishDeployFailure(data, artifact);
+            statusString = "FAILURE";
+          }
+        }
+      }
+    } else {
+      statusString = "FAILURE";
+    }
+
+    auditLogger.info(ModelLoaderMsgs.DISTRIBUTION_EVENT,
+        "Processed distribution " + data.getDistributionID() + "  (" + statusString + ")");
+    MDC.clear();
+  }
+
+  private List<IArtifactInfo> getArtifacts(INotificationData data) {
+    List<IArtifactInfo> artifacts = new ArrayList<IArtifactInfo>();
+    List<IResourceInstance> resources = data.getResources();
+
+    if (data.getServiceArtifacts() != null) {
+      artifacts.addAll(data.getServiceArtifacts());
+    }
+
+    if (resources != null) {
+      for (IResourceInstance resource : resources) {
+        if (resource.getArtifacts() != null) {
+          artifacts.addAll(resource.getArtifacts());
+        }
+      }
+    }
+
+    return artifacts;
+  }
+
+  private void publishDownloadFailure(INotificationData data, IArtifactInfo artifact,
+      String errorMessage) {
+    // Grab the current time so we can measure the download time for the metrics
+    // log
+    long startTimeInMs = System.currentTimeMillis();
+    MdcOverride override = new MdcOverride();
+    override.addAttribute(MdcContext.MDC_START_TIME, dateFormatter.format(startTimeInMs));
+
+    IDistributionClientResult sendDownloadStatus = client.sendDownloadStatus(
+        buildStatusMessage(client, data, artifact, DistributionStatusEnum.DOWNLOAD_ERROR));
+    metricsLogger.info(ModelLoaderMsgs.EVENT_PUBLISHED, null, override, "download failure",
+        artifact.getArtifactName(), sendDownloadStatus.getDistributionActionResult().toString());
+
+    if (sendDownloadStatus.getDistributionActionResult() != DistributionActionResultEnum.SUCCESS) {
+      logger.error(ModelLoaderMsgs.DISTRIBUTION_EVENT_ERROR,
+          "Failed to publish download failure status: "
+              + sendDownloadStatus.getDistributionMessageResult());
+    }
+
+    logger.error(ModelLoaderMsgs.DISTRIBUTION_EVENT_ERROR,
+        "Failed to download artifact " + artifact.getArtifactName() + ": " + errorMessage);
+  }
+
+  private void publishDownloadSuccess(INotificationData data, IArtifactInfo artifact,
+      IDistributionClientDownloadResult downloadResult) {
+    // Grab the current time so we can measure the download time for the metrics
+    // log
+    long startTimeInMs = System.currentTimeMillis();
+    MdcOverride override = new MdcOverride();
+    override.addAttribute(MdcContext.MDC_START_TIME, dateFormatter.format(startTimeInMs));
+
+    IDistributionClientResult sendDownloadStatus = client.sendDownloadStatus(
+        buildStatusMessage(client, data, artifact, DistributionStatusEnum.DOWNLOAD_OK));
+    metricsLogger.info(ModelLoaderMsgs.EVENT_PUBLISHED, null, override, "download success",
+        artifact.getArtifactName(), sendDownloadStatus.getDistributionActionResult().toString());
+
+    if (sendDownloadStatus.getDistributionActionResult() != DistributionActionResultEnum.SUCCESS) {
+      logger.error(ModelLoaderMsgs.DISTRIBUTION_EVENT_ERROR,
+          "Failed to publish download success status: "
+              + sendDownloadStatus.getDistributionMessageResult());
+    }
+
+    if (logger.isDebugEnabled()) {
+      StringBuilder sb = new StringBuilder();
+      sb.append("Downloaded artifact:\n");
+      sb.append("ArtInfo_Art_Name: " + artifact.getArtifactName());
+      sb.append("\nArtInfo_Art_description: " + artifact.getArtifactDescription());
+      sb.append("\nArtInfo_Art_CheckSum: " + artifact.getArtifactChecksum());
+      sb.append("\nArtInfo_Art_Url: " + artifact.getArtifactURL());
+      sb.append("\nArtInfo_Art_Type: " + artifact.getArtifactType());
+      sb.append("\nArtInfo_Serv_description: " + data.getServiceDescription());
+      sb.append("\nArtInfo_Serv_Name: " + data.getServiceName());
+      sb.append("\nGet_serviceVersion: " + data.getServiceVersion());
+      sb.append("\nGet_Service_UUID: " + data.getServiceUUID());
+      sb.append("\nArtInfo_DistributionId: " + data.getDistributionID());
+      logger.debug(sb.toString());
+    }
+  }
+
+  private void publishDeployFailure(INotificationData data, IArtifactInfo artifact) {
+    // Grab the current time so we can measure the download time for the metrics
+    // log
+    long startTimeInMs = System.currentTimeMillis();
+    MdcOverride override = new MdcOverride();
+    override.addAttribute(MdcContext.MDC_START_TIME, dateFormatter.format(startTimeInMs));
+
+    IDistributionClientResult sendStatus = client.sendDeploymentStatus(
+        buildStatusMessage(client, data, artifact, DistributionStatusEnum.DEPLOY_ERROR));
+    metricsLogger.info(ModelLoaderMsgs.EVENT_PUBLISHED, null, override, "deploy failure",
+        artifact.getArtifactName(), sendStatus.getDistributionActionResult().toString());
+
+    if (sendStatus.getDistributionActionResult() != DistributionActionResultEnum.SUCCESS) {
+      logger.error(ModelLoaderMsgs.DISTRIBUTION_EVENT_ERROR,
+          "Failed to publish deploy failure status: " + sendStatus.getDistributionMessageResult());
+    }
+  }
+
+  private void publishDeploySuccess(INotificationData data, IArtifactInfo artifact) {
+    // Grab the current time so we can measure the download time for the metrics
+    // log
+    long startTimeInMs = System.currentTimeMillis();
+    MdcOverride override = new MdcOverride();
+    override.addAttribute(MdcContext.MDC_START_TIME, dateFormatter.format(startTimeInMs));
+
+    IDistributionClientResult sendStatus = client.sendDownloadStatus(
+        buildStatusMessage(client, data, artifact, DistributionStatusEnum.DEPLOY_OK));
+    metricsLogger.info(ModelLoaderMsgs.EVENT_PUBLISHED, null, override, "deploy success",
+        artifact.getArtifactName(), sendStatus.getDistributionActionResult().toString());
+
+    if (sendStatus.getDistributionActionResult() != DistributionActionResultEnum.SUCCESS) {
+      logger.error(ModelLoaderMsgs.DISTRIBUTION_EVENT_ERROR,
+          "Failed to publish deploy success status: " + sendStatus.getDistributionMessageResult());
+    }
+  }
+
+  private IDistributionStatusMessage buildStatusMessage(IDistributionClient client,
+      INotificationData data, IArtifactInfo artifact, DistributionStatusEnum status) {
+    IDistributionStatusMessage statusMessage = new DistributionStatusMsg(status,
+        data.getDistributionID(), client.getConfiguration().getConsumerID(),
+        artifact.getArtifactURL());
+
+    return statusMessage;
+  }
+
+}
index d4ee738..4d5e487 100644 (file)
-/**\r
- * ============LICENSE_START=======================================================\r
- * Model Loader\r
- * ================================================================================\r
- * Copyright © 2017 AT&T Intellectual Property.\r
- * Copyright © 2017 Amdocs\r
- * All rights reserved.\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
- * ============LICENSE_END=========================================================\r
- *\r
- * ECOMP and OpenECOMP are trademarks\r
- * and service marks of AT&T Intellectual Property.\r
- */\r
-package org.openecomp.modelloader.restclient;\r
-\r
-import com.sun.jersey.api.client.Client;\r
-import com.sun.jersey.api.client.ClientResponse;\r
-import com.sun.jersey.api.client.config.ClientConfig;\r
-import com.sun.jersey.api.client.config.DefaultClientConfig;\r
-import com.sun.jersey.api.client.filter.LoggingFilter;\r
-import com.sun.jersey.client.urlconnection.HTTPSProperties;\r
-import org.openecomp.cl.api.LogFields;\r
-import org.openecomp.cl.api.LogLine;\r
-import org.openecomp.cl.api.Logger;\r
-import org.openecomp.cl.eelf.LoggerFactory;\r
-import org.openecomp.cl.mdc.MdcContext;\r
-import org.openecomp.cl.mdc.MdcOverride;\r
-import org.openecomp.modelloader.config.ModelLoaderConfig;\r
-import org.openecomp.modelloader.service.ModelLoaderMsgs;\r
-import org.w3c.dom.Document;\r
-import org.w3c.dom.Node;\r
-import org.w3c.dom.NodeList;\r
-import org.xml.sax.InputSource;\r
-import org.xml.sax.SAXException;\r
-\r
-import java.io.ByteArrayOutputStream;\r
-import java.io.FileInputStream;\r
-import java.io.IOException;\r
-import java.io.PrintStream;\r
-import java.io.StringReader;\r
-import java.security.GeneralSecurityException;\r
-import java.security.KeyStore;\r
-import java.security.cert.X509Certificate;\r
-import java.text.SimpleDateFormat;\r
-\r
-import javax.net.ssl.HostnameVerifier;\r
-import javax.net.ssl.HttpsURLConnection;\r
-import javax.net.ssl.KeyManagerFactory;\r
-import javax.net.ssl.SSLContext;\r
-import javax.net.ssl.SSLSession;\r
-import javax.net.ssl.TrustManager;\r
-import javax.net.ssl.X509TrustManager;\r
-import javax.ws.rs.core.Response;\r
-import javax.xml.parsers.DocumentBuilder;\r
-import javax.xml.parsers.DocumentBuilderFactory;\r
-import javax.xml.parsers.ParserConfigurationException;\r
-\r
-public class AaiRestClient {\r
-  public enum MimeType {\r
-    XML("application/xml"), JSON("application/json");\r
-\r
-    private String httpType;\r
-\r
-    MimeType(String httpType) {\r
-      this.httpType = httpType;\r
-    }\r
-\r
-    String getHttpHeaderType() {\r
-      return httpType;\r
-    }\r
-  }\r
-\r
-  private static String HEADER_TRANS_ID = "X-TransactionId";\r
-  private static String HEADER_FROM_APP_ID = "X-FromAppId";\r
-  private static String HEADER_AUTHORIZATION = "Authorization";\r
-  private static String ML_APP_NAME = "ModelLoader";\r
-  private static String RESOURCE_VERSION_PARAM = "resource-version";\r
-\r
-  private static SimpleDateFormat dateFormatter = new SimpleDateFormat(\r
-      "yyyy-MM-dd'T'HH:mm:ss.SSSXXX");\r
-\r
-  private static Logger logger = LoggerFactory.getInstance()\r
-      .getLogger(AaiRestClient.class.getName());\r
-  private static Logger metricsLogger = LoggerFactory.getInstance()\r
-      .getMetricsLogger(AaiRestClient.class.getName());\r
-\r
-  private ModelLoaderConfig config = null;\r
-\r
-  public AaiRestClient(ModelLoaderConfig config) {\r
-    this.config = config;\r
-  }\r
-\r
-  /**\r
-   * Send a PUT request to the A&AI.\r
-   *\r
-   * @param url\r
-   *          - the url\r
-   * @param transId\r
-   *          - transaction ID\r
-   * @param payload\r
-   *          - the XML or JSON payload for the request\r
-   * @param mimeType\r
-   *          - the content type (XML or JSON)\r
-   * @return ClientResponse\r
-   */\r
-  public ClientResponse putResource(String url, String payload, String transId, MimeType mimeType) {\r
-    ClientResponse result = null;\r
-    ByteArrayOutputStream baos = new ByteArrayOutputStream();\r
-    long startTimeInMs = 0;\r
-    MdcOverride override = new MdcOverride();\r
-\r
-    try {\r
-      Client client = setupClient();\r
-\r
-      baos = new ByteArrayOutputStream();\r
-      PrintStream ps = new PrintStream(baos);\r
-      if (logger.isDebugEnabled()) {\r
-        client.addFilter(new LoggingFilter(ps));\r
-      }\r
-\r
-      // Grab the current time so that we can use it for metrics purposes later.\r
-      startTimeInMs = System.currentTimeMillis();\r
-      override.addAttribute(MdcContext.MDC_START_TIME, dateFormatter.format(startTimeInMs));\r
-\r
-      if (useBasicAuth()) {\r
-        result = client.resource(url).header(HEADER_TRANS_ID, transId)\r
-            .header(HEADER_FROM_APP_ID, ML_APP_NAME)\r
-            .header(HEADER_AUTHORIZATION, getAuthenticationCredentials())\r
-            .type(mimeType.getHttpHeaderType()).put(ClientResponse.class, payload);\r
-      } else {\r
-        result = client.resource(url).header(HEADER_TRANS_ID, transId)\r
-            .header(HEADER_FROM_APP_ID, ML_APP_NAME).type(mimeType.getHttpHeaderType())\r
-            .put(ClientResponse.class, payload);\r
-      }\r
-    } catch (Exception ex) {\r
-      logger.error(ModelLoaderMsgs.AAI_REST_REQUEST_ERROR, "PUT", url, ex.getLocalizedMessage());\r
-      return null;\r
-    } finally {\r
-      if (logger.isDebugEnabled()) {\r
-        logger.debug(baos.toString());\r
-      }\r
-    }\r
-\r
-    if ((result != null) && ((result.getStatus() == Response.Status.CREATED.getStatusCode())\r
-        || (result.getStatus() == Response.Status.OK.getStatusCode()))) {\r
-      logger.info(ModelLoaderMsgs.AAI_REST_REQUEST_SUCCESS, "PUT", url,\r
-          Integer.toString(result.getStatus()));\r
-      metricsLogger.info(ModelLoaderMsgs.AAI_REST_REQUEST_SUCCESS,\r
-          new LogFields().setField(LogLine.DefinedFields.RESPONSE_CODE, result.getStatus())\r
-              .setField(LogLine.DefinedFields.RESPONSE_DESCRIPTION,\r
-                  result.getResponseStatus().toString()),\r
-          override, "PUT", url, Integer.toString(result.getStatus()));\r
-    } else {\r
-      // If response is not 200 OK, then additionally log the reason\r
-      String respMsg = result.getEntity(String.class);\r
-      if (respMsg == null) {\r
-        respMsg = result.getStatusInfo().getReasonPhrase();\r
-      }\r
-      logger.info(ModelLoaderMsgs.AAI_REST_REQUEST_UNSUCCESSFUL, "PUT", url,\r
-          Integer.toString(result.getStatus()), respMsg);\r
-      metricsLogger.info(ModelLoaderMsgs.AAI_REST_REQUEST_UNSUCCESSFUL,\r
-          new LogFields().setField(LogLine.DefinedFields.RESPONSE_CODE, result.getStatus())\r
-              .setField(LogLine.DefinedFields.RESPONSE_DESCRIPTION,\r
-                  result.getResponseStatus().toString()),\r
-          override, "PUT", url, Integer.toString(result.getStatus()), respMsg);\r
-    }\r
-\r
-    return result;\r
-  }\r
-\r
-  /**\r
-   * Send a DELETE request to the A&AI.\r
-   *\r
-   * @param url\r
-   *          - the url\r
-   * @param resourceVersion\r
-   *          - the resource-version of the model to delete\r
-   * @param transId\r
-   *          - transaction ID\r
-   * @return ClientResponse\r
-   */\r
-  public ClientResponse deleteResource(String url, String resourceVersion, String transId) {\r
-    ClientResponse result = null;\r
-    ByteArrayOutputStream baos = new ByteArrayOutputStream();\r
-    long startTimeInMs = 0;\r
-    MdcOverride override = new MdcOverride();\r
-\r
-    try {\r
-      Client client = setupClient();\r
-\r
-      baos = new ByteArrayOutputStream();\r
-      PrintStream ps = new PrintStream(baos);\r
-      if (logger.isDebugEnabled()) {\r
-        client.addFilter(new LoggingFilter(ps));\r
-      }\r
-\r
-      // Grab the current time so that we can use it for metrics purposes later.\r
-      startTimeInMs = System.currentTimeMillis();\r
-      override.addAttribute(MdcContext.MDC_START_TIME, dateFormatter.format(startTimeInMs));\r
-\r
-      if (useBasicAuth()) {\r
-        result = client.resource(url).queryParam(RESOURCE_VERSION_PARAM, resourceVersion)\r
-            .header(HEADER_TRANS_ID, transId).header(HEADER_FROM_APP_ID, ML_APP_NAME)\r
-            .header(HEADER_AUTHORIZATION, getAuthenticationCredentials())\r
-            .delete(ClientResponse.class);\r
-      } else {\r
-        result = client.resource(url).queryParam(RESOURCE_VERSION_PARAM, resourceVersion)\r
-            .header(HEADER_TRANS_ID, transId).header(HEADER_FROM_APP_ID, ML_APP_NAME)\r
-            .delete(ClientResponse.class);\r
-      }\r
-    } catch (Exception ex) {\r
-      logger.error(ModelLoaderMsgs.AAI_REST_REQUEST_ERROR, "DELETE", url, ex.getLocalizedMessage());\r
-      return null;\r
-    } finally {\r
-      if (logger.isDebugEnabled()) {\r
-        logger.debug(baos.toString());\r
-      }\r
-    }\r
-\r
-    logger.info(ModelLoaderMsgs.AAI_REST_REQUEST_SUCCESS, "DELETE", url,\r
-        Integer.toString(result.getStatus()));\r
-    metricsLogger.info(ModelLoaderMsgs.AAI_REST_REQUEST_SUCCESS,\r
-        new LogFields().setField(LogLine.DefinedFields.RESPONSE_CODE, result.getStatus()).setField(\r
-            LogLine.DefinedFields.RESPONSE_DESCRIPTION, result.getResponseStatus().toString()),\r
-        override, "DELETE", url, Integer.toString(result.getStatus()));\r
-\r
-    return result;\r
-  }\r
-\r
-  /**\r
-   * Send a GET request to the A&AI for a resource.\r
-   *\r
-   * @param url\r
-   *          - the url to use\r
-   * @param transId\r
-   *          - transaction ID\r
-   * @return ClientResponse\r
-   */\r
-  public ClientResponse getResource(String url, String transId, MimeType mimeType) {\r
-    ClientResponse result = null;\r
-    ByteArrayOutputStream baos = new ByteArrayOutputStream();\r
-    long startTimeInMs = 0;\r
-    MdcOverride override = new MdcOverride();\r
-\r
-    try {\r
-      Client client = setupClient();\r
-\r
-      baos = new ByteArrayOutputStream();\r
-      PrintStream ps = new PrintStream(baos);\r
-      if (logger.isDebugEnabled()) {\r
-        client.addFilter(new LoggingFilter(ps));\r
-      }\r
-\r
-      // Grab the current time so that we can use it for metrics purposes later.\r
-      startTimeInMs = System.currentTimeMillis();\r
-      override.addAttribute(MdcContext.MDC_START_TIME, dateFormatter.format(startTimeInMs));\r
-\r
-      if (useBasicAuth()) {\r
-        result = client.resource(url).header(HEADER_TRANS_ID, transId)\r
-            .header(HEADER_FROM_APP_ID, ML_APP_NAME).accept(mimeType.getHttpHeaderType())\r
-            .header(HEADER_AUTHORIZATION, getAuthenticationCredentials()).get(ClientResponse.class);\r
-      } else {\r
-        result = client.resource(url).header(HEADER_TRANS_ID, transId)\r
-            .header(HEADER_FROM_APP_ID, ML_APP_NAME).accept(mimeType.getHttpHeaderType())\r
-            .get(ClientResponse.class);\r
-\r
-      }\r
-    } catch (Exception ex) {\r
-      logger.error(ModelLoaderMsgs.AAI_REST_REQUEST_ERROR, "GET", url, ex.getLocalizedMessage());\r
-      return null;\r
-    } finally {\r
-      if (logger.isDebugEnabled()) {\r
-        logger.debug(baos.toString());\r
-      }\r
-    }\r
-\r
-    logger.info(ModelLoaderMsgs.AAI_REST_REQUEST_SUCCESS, "GET", url,\r
-        Integer.toString(result.getStatus()));\r
-    metricsLogger.info(ModelLoaderMsgs.AAI_REST_REQUEST_SUCCESS,\r
-        new LogFields().setField(LogLine.DefinedFields.RESPONSE_CODE, result.getStatus()).setField(\r
-            LogLine.DefinedFields.RESPONSE_DESCRIPTION, result.getResponseStatus().toString()),\r
-        override, "GET", url, Integer.toString(result.getStatus()));\r
-\r
-    return result;\r
-  }\r
-\r
-  /**\r
-   * Does a GET on a resource to retrieve the resource version, and then DELETE\r
-   * that version.\r
-   *\r
-   * @param url\r
-   *          - the url\r
-   * @param transId\r
-   *          - transaction ID\r
-   * @return ClientResponse\r
-   */\r
-  public ClientResponse getAndDeleteResource(String url, String transId) {\r
-    // First, GET the model\r
-    ClientResponse getResponse = getResource(url, transId, MimeType.XML);\r
-    if ((getResponse == null) || (getResponse.getStatus() != Response.Status.OK.getStatusCode())) {\r
-      return getResponse;\r
-    }\r
-\r
-    // Delete the model using the resource version in the response\r
-    String resVersion = null;\r
-    try {\r
-      resVersion = getResourceVersion(getResponse);\r
-    } catch (Exception e) {\r
-      logger.error(ModelLoaderMsgs.AAI_REST_REQUEST_ERROR, "GET", url, e.getLocalizedMessage());\r
-      return null;\r
-    }\r
-\r
-    return deleteResource(url, resVersion, transId);\r
-  }\r
-\r
-  private Client setupClient() throws IOException, GeneralSecurityException {\r
-    ClientConfig clientConfig = new DefaultClientConfig();\r
-\r
-    HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {\r
-      @Override\r
-      public boolean verify(String string, SSLSession ssls) {\r
-        return true;\r
-      }\r
-    });\r
-\r
-    // Create a trust manager that does not validate certificate chains\r
-    TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {\r
-      @Override\r
-      public X509Certificate[] getAcceptedIssuers() {\r
-        return null;\r
-      }\r
-\r
-      @Override\r
-      public void checkClientTrusted(X509Certificate[] certs, String authType) {}\r
-\r
-      @Override\r
-      public void checkServerTrusted(X509Certificate[] certs, String authType) {}\r
-    } };\r
-\r
-    SSLContext ctx = SSLContext.getInstance("TLS");\r
-    KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");\r
-    FileInputStream fin = new FileInputStream(config.getAaiKeyStorePath());\r
-    KeyStore ks = KeyStore.getInstance("PKCS12");\r
-    char[] pwd = config.getAaiKeyStorePassword().toCharArray();\r
-    ks.load(fin, pwd);\r
-    kmf.init(ks, pwd);\r
-\r
-    ctx.init(kmf.getKeyManagers(), trustAllCerts, null);\r
-    clientConfig.getProperties().put(HTTPSProperties.PROPERTY_HTTPS_PROPERTIES,\r
-        new HTTPSProperties(new HostnameVerifier() {\r
-          @Override\r
-          public boolean verify(String theString, SSLSession sslSession) {\r
-            return true;\r
-          }\r
-        }, ctx));\r
-\r
-    Client client = Client.create(clientConfig);\r
-\r
-    return client;\r
-  }\r
-\r
-  private String getResourceVersion(ClientResponse response)\r
-      throws ParserConfigurationException, SAXException, IOException {\r
-    String respData = response.getEntity(String.class);\r
-\r
-    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();\r
-    DocumentBuilder builder = factory.newDocumentBuilder();\r
-    InputSource is = new InputSource(new StringReader(respData));\r
-    Document doc = builder.parse(is);\r
-\r
-    NodeList nodeList = doc.getDocumentElement().getChildNodes();\r
-    for (int i = 0; i < nodeList.getLength(); i++) {\r
-      Node currentNode = nodeList.item(i);\r
-      if (currentNode.getNodeName().equals(RESOURCE_VERSION_PARAM)) {\r
-        return currentNode.getTextContent();\r
-      }\r
-    }\r
-\r
-    return null;\r
-  }\r
-\r
-  private String getAuthenticationCredentials() {\r
-\r
-    String usernameAndPassword = config.getAaiAuthenticationUser() + ":"\r
-        + config.getAaiAuthenticationPassword();\r
-    return "Basic " + java.util.Base64.getEncoder().encodeToString(usernameAndPassword.getBytes());\r
-  }\r
-\r
-  public boolean useBasicAuth() {\r
-    return (config.getAaiAuthenticationUser() != null)\r
-        && (config.getAaiAuthenticationPassword() != null);\r
-  }\r
-}\r
+/**
+ * ============LICENSE_START=======================================================
+ * Model Loader
+ * ================================================================================
+ * Copyright © 2017 AT&T Intellectual Property.
+ * Copyright © 2017 Amdocs
+ * All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ *
+ * ECOMP and OpenECOMP are trademarks
+ * and service marks of AT&T Intellectual Property.
+ */
+package org.openecomp.modelloader.restclient;
+
+import com.sun.jersey.api.client.Client;
+import com.sun.jersey.api.client.ClientResponse;
+import com.sun.jersey.api.client.config.ClientConfig;
+import com.sun.jersey.api.client.config.DefaultClientConfig;
+import com.sun.jersey.api.client.filter.LoggingFilter;
+import com.sun.jersey.client.urlconnection.HTTPSProperties;
+import org.openecomp.cl.api.LogFields;
+import org.openecomp.cl.api.LogLine;
+import org.openecomp.cl.api.Logger;
+import org.openecomp.cl.eelf.LoggerFactory;
+import org.openecomp.cl.mdc.MdcContext;
+import org.openecomp.cl.mdc.MdcOverride;
+import org.openecomp.modelloader.config.ModelLoaderConfig;
+import org.openecomp.modelloader.service.ModelLoaderMsgs;
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+
+import java.io.ByteArrayOutputStream;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.PrintStream;
+import java.io.StringReader;
+import java.security.GeneralSecurityException;
+import java.security.KeyStore;
+import java.security.cert.X509Certificate;
+import java.text.SimpleDateFormat;
+
+import javax.net.ssl.HostnameVerifier;
+import javax.net.ssl.HttpsURLConnection;
+import javax.net.ssl.KeyManagerFactory;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLSession;
+import javax.net.ssl.TrustManager;
+import javax.net.ssl.X509TrustManager;
+import javax.ws.rs.core.Response;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+
+public class AaiRestClient {
+  public enum MimeType {
+    XML("application/xml"), JSON("application/json");
+
+    private String httpType;
+
+    MimeType(String httpType) {
+      this.httpType = httpType;
+    }
+
+    String getHttpHeaderType() {
+      return httpType;
+    }
+  }
+
+  private static String HEADER_TRANS_ID = "X-TransactionId";
+  private static String HEADER_FROM_APP_ID = "X-FromAppId";
+  private static String HEADER_AUTHORIZATION = "Authorization";
+  private static String ML_APP_NAME = "ModelLoader";
+  private static String RESOURCE_VERSION_PARAM = "resource-version";
+
+  private static SimpleDateFormat dateFormatter = new SimpleDateFormat(
+      "yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
+
+  private static Logger logger = LoggerFactory.getInstance()
+      .getLogger(AaiRestClient.class.getName());
+  private static Logger metricsLogger = LoggerFactory.getInstance()
+      .getMetricsLogger(AaiRestClient.class.getName());
+
+  private ModelLoaderConfig config = null;
+
+  public AaiRestClient(ModelLoaderConfig config) {
+    this.config = config;
+  }
+
+  /**
+   * Send a PUT request to the A&AI.
+   *
+   * @param url
+   *          - the url
+   * @param transId
+   *          - transaction ID
+   * @param payload
+   *          - the XML or JSON payload for the request
+   * @param mimeType
+   *          - the content type (XML or JSON)
+   * @return ClientResponse
+   */
+  public ClientResponse putResource(String url, String payload, String transId, MimeType mimeType) {
+    ClientResponse result = null;
+    ByteArrayOutputStream baos = new ByteArrayOutputStream();
+    long startTimeInMs = 0;
+    MdcOverride override = new MdcOverride();
+
+    try {
+      Client client = setupClient();
+
+      baos = new ByteArrayOutputStream();
+      PrintStream ps = new PrintStream(baos);
+      if (logger.isDebugEnabled()) {
+        client.addFilter(new LoggingFilter(ps));
+      }
+
+      // Grab the current time so that we can use it for metrics purposes later.
+      startTimeInMs = System.currentTimeMillis();
+      override.addAttribute(MdcContext.MDC_START_TIME, dateFormatter.format(startTimeInMs));
+
+      if (useBasicAuth()) {
+        result = client.resource(url).header(HEADER_TRANS_ID, transId)
+            .header(HEADER_FROM_APP_ID, ML_APP_NAME)
+            .header(HEADER_AUTHORIZATION, getAuthenticationCredentials())
+            .type(mimeType.getHttpHeaderType()).put(ClientResponse.class, payload);
+      } else {
+        result = client.resource(url).header(HEADER_TRANS_ID, transId)
+            .header(HEADER_FROM_APP_ID, ML_APP_NAME).type(mimeType.getHttpHeaderType())
+            .put(ClientResponse.class, payload);
+      }
+    } catch (Exception ex) {
+      logger.error(ModelLoaderMsgs.AAI_REST_REQUEST_ERROR, "PUT", url, ex.getLocalizedMessage());
+      return null;
+    } finally {
+      if (logger.isDebugEnabled()) {
+        logger.debug(baos.toString());
+      }
+    }
+
+    if ((result != null) && ((result.getStatus() == Response.Status.CREATED.getStatusCode())
+        || (result.getStatus() == Response.Status.OK.getStatusCode()))) {
+      logger.info(ModelLoaderMsgs.AAI_REST_REQUEST_SUCCESS, "PUT", url,
+          Integer.toString(result.getStatus()));
+      metricsLogger.info(ModelLoaderMsgs.AAI_REST_REQUEST_SUCCESS,
+          new LogFields().setField(LogLine.DefinedFields.RESPONSE_CODE, result.getStatus())
+              .setField(LogLine.DefinedFields.RESPONSE_DESCRIPTION,
+                  result.getResponseStatus().toString()),
+          override, "PUT", url, Integer.toString(result.getStatus()));
+    } else {
+      // If response is not 200 OK, then additionally log the reason
+      String respMsg = result.getEntity(String.class);
+      if (respMsg == null) {
+        respMsg = result.getStatusInfo().getReasonPhrase();
+      }
+      logger.info(ModelLoaderMsgs.AAI_REST_REQUEST_UNSUCCESSFUL, "PUT", url,
+          Integer.toString(result.getStatus()), respMsg);
+      metricsLogger.info(ModelLoaderMsgs.AAI_REST_REQUEST_UNSUCCESSFUL,
+          new LogFields().setField(LogLine.DefinedFields.RESPONSE_CODE, result.getStatus())
+              .setField(LogLine.DefinedFields.RESPONSE_DESCRIPTION,
+                  result.getResponseStatus().toString()),
+          override, "PUT", url, Integer.toString(result.getStatus()), respMsg);
+    }
+
+    return result;
+  }
+
+  /**
+   * Send a DELETE request to the A&AI.
+   *
+   * @param url
+   *          - the url
+   * @param resourceVersion
+   *          - the resource-version of the model to delete
+   * @param transId
+   *          - transaction ID
+   * @return ClientResponse
+   */
+  public ClientResponse deleteResource(String url, String resourceVersion, String transId) {
+    ClientResponse result = null;
+    ByteArrayOutputStream baos = new ByteArrayOutputStream();
+    long startTimeInMs = 0;
+    MdcOverride override = new MdcOverride();
+
+    try {
+      Client client = setupClient();
+
+      baos = new ByteArrayOutputStream();
+      PrintStream ps = new PrintStream(baos);
+      if (logger.isDebugEnabled()) {
+        client.addFilter(new LoggingFilter(ps));
+      }
+
+      // Grab the current time so that we can use it for metrics purposes later.
+      startTimeInMs = System.currentTimeMillis();
+      override.addAttribute(MdcContext.MDC_START_TIME, dateFormatter.format(startTimeInMs));
+
+      if (useBasicAuth()) {
+        result = client.resource(url).queryParam(RESOURCE_VERSION_PARAM, resourceVersion)
+            .header(HEADER_TRANS_ID, transId).header(HEADER_FROM_APP_ID, ML_APP_NAME)
+            .header(HEADER_AUTHORIZATION, getAuthenticationCredentials())
+            .delete(ClientResponse.class);
+      } else {
+        result = client.resource(url).queryParam(RESOURCE_VERSION_PARAM, resourceVersion)
+            .header(HEADER_TRANS_ID, transId).header(HEADER_FROM_APP_ID, ML_APP_NAME)
+            .delete(ClientResponse.class);
+      }
+    } catch (Exception ex) {
+      logger.error(ModelLoaderMsgs.AAI_REST_REQUEST_ERROR, "DELETE", url, ex.getLocalizedMessage());
+      return null;
+    } finally {
+      if (logger.isDebugEnabled()) {
+        logger.debug(baos.toString());
+      }
+    }
+
+    logger.info(ModelLoaderMsgs.AAI_REST_REQUEST_SUCCESS, "DELETE", url,
+        Integer.toString(result.getStatus()));
+    metricsLogger.info(ModelLoaderMsgs.AAI_REST_REQUEST_SUCCESS,
+        new LogFields().setField(LogLine.DefinedFields.RESPONSE_CODE, result.getStatus()).setField(
+            LogLine.DefinedFields.RESPONSE_DESCRIPTION, result.getResponseStatus().toString()),
+        override, "DELETE", url, Integer.toString(result.getStatus()));
+
+    return result;
+  }
+
+  /**
+   * Send a GET request to the A&AI for a resource.
+   *
+   * @param url
+   *          - the url to use
+   * @param transId
+   *          - transaction ID
+   * @return ClientResponse
+   */
+  public ClientResponse getResource(String url, String transId, MimeType mimeType) {
+    ClientResponse result = null;
+    ByteArrayOutputStream baos = new ByteArrayOutputStream();
+    long startTimeInMs = 0;
+    MdcOverride override = new MdcOverride();
+
+    try {
+      Client client = setupClient();
+
+      baos = new ByteArrayOutputStream();
+      PrintStream ps = new PrintStream(baos);
+      if (logger.isDebugEnabled()) {
+        client.addFilter(new LoggingFilter(ps));
+      }
+
+      // Grab the current time so that we can use it for metrics purposes later.
+      startTimeInMs = System.currentTimeMillis();
+      override.addAttribute(MdcContext.MDC_START_TIME, dateFormatter.format(startTimeInMs));
+
+      if (useBasicAuth()) {
+        result = client.resource(url).header(HEADER_TRANS_ID, transId)
+            .header(HEADER_FROM_APP_ID, ML_APP_NAME).accept(mimeType.getHttpHeaderType())
+            .header(HEADER_AUTHORIZATION, getAuthenticationCredentials()).get(ClientResponse.class);
+      } else {
+        result = client.resource(url).header(HEADER_TRANS_ID, transId)
+            .header(HEADER_FROM_APP_ID, ML_APP_NAME).accept(mimeType.getHttpHeaderType())
+            .get(ClientResponse.class);
+
+      }
+    } catch (Exception ex) {
+      logger.error(ModelLoaderMsgs.AAI_REST_REQUEST_ERROR, "GET", url, ex.getLocalizedMessage());
+      return null;
+    } finally {
+      if (logger.isDebugEnabled()) {
+        logger.debug(baos.toString());
+      }
+    }
+
+    logger.info(ModelLoaderMsgs.AAI_REST_REQUEST_SUCCESS, "GET", url,
+        Integer.toString(result.getStatus()));
+    metricsLogger.info(ModelLoaderMsgs.AAI_REST_REQUEST_SUCCESS,
+        new LogFields().setField(LogLine.DefinedFields.RESPONSE_CODE, result.getStatus()).setField(
+            LogLine.DefinedFields.RESPONSE_DESCRIPTION, result.getResponseStatus().toString()),
+        override, "GET", url, Integer.toString(result.getStatus()));
+
+    return result;
+  }
+
+  /**
+   * Send a POST request to the A&AI.
+   *
+   * @param url
+   *          - the url
+   * @param transId
+   *          - transaction ID
+   * @param payload
+   *          - the XML or JSON payload for the request
+   * @param mimeType
+   *          - the content type (XML or JSON)
+   * @return ClientResponse
+   */
+  public ClientResponse postResource(String url, String payload, String transId, MimeType mimeType) {
+    ClientResponse result = null;
+    ByteArrayOutputStream baos = new ByteArrayOutputStream();
+    long startTimeInMs = 0;
+    MdcOverride override = new MdcOverride();
+
+    try {
+      Client client = setupClient();
+
+      baos = new ByteArrayOutputStream();
+      PrintStream ps = new PrintStream(baos);
+      if (logger.isDebugEnabled()) {
+        client.addFilter(new LoggingFilter(ps));
+      }
+
+      // Grab the current time so that we can use it for metrics purposes later.
+      startTimeInMs = System.currentTimeMillis();
+      override.addAttribute(MdcContext.MDC_START_TIME, dateFormatter.format(startTimeInMs));
+
+      if (useBasicAuth()) {
+        result = client.resource(url).header(HEADER_TRANS_ID, transId)
+            .header(HEADER_FROM_APP_ID, ML_APP_NAME)
+            .header(HEADER_AUTHORIZATION, getAuthenticationCredentials())
+            .type(mimeType.getHttpHeaderType()).post(ClientResponse.class, payload);
+      } else {
+        result = client.resource(url).header(HEADER_TRANS_ID, transId)
+            .header(HEADER_FROM_APP_ID, ML_APP_NAME).type(mimeType.getHttpHeaderType())
+            .post(ClientResponse.class, payload);
+      }
+    } catch (Exception ex) {
+      logger.error(ModelLoaderMsgs.AAI_REST_REQUEST_ERROR, "POST", url, ex.getLocalizedMessage());
+      return null;
+    } finally {
+      if (logger.isDebugEnabled()) {
+        logger.debug(baos.toString());
+      }
+    }
+
+    if ((result != null) && ((result.getStatus() == Response.Status.CREATED.getStatusCode())
+        || (result.getStatus() == Response.Status.OK.getStatusCode()))) {
+      logger.info(ModelLoaderMsgs.AAI_REST_REQUEST_SUCCESS, "POST", url,
+          Integer.toString(result.getStatus()));
+      metricsLogger.info(ModelLoaderMsgs.AAI_REST_REQUEST_SUCCESS,
+          new LogFields().setField(LogLine.DefinedFields.RESPONSE_CODE, result.getStatus())
+              .setField(LogLine.DefinedFields.RESPONSE_DESCRIPTION,
+                  result.getResponseStatus().toString()),
+          override, "POST", url, Integer.toString(result.getStatus()));
+    } else {
+      // If response is not 200 OK, then additionally log the reason
+      String respMsg = result.getEntity(String.class);
+      if (respMsg == null) {
+        respMsg = result.getStatusInfo().getReasonPhrase();
+      }
+      logger.info(ModelLoaderMsgs.AAI_REST_REQUEST_UNSUCCESSFUL, "POST", url,
+          Integer.toString(result.getStatus()), respMsg);
+      metricsLogger.info(ModelLoaderMsgs.AAI_REST_REQUEST_UNSUCCESSFUL,
+          new LogFields().setField(LogLine.DefinedFields.RESPONSE_CODE, result.getStatus())
+              .setField(LogLine.DefinedFields.RESPONSE_DESCRIPTION,
+                  result.getResponseStatus().toString()),
+          override, "POST", url, Integer.toString(result.getStatus()), respMsg);
+    }
+
+    return result;
+  }
+  
+  /**
+   * Does a GET on a resource to retrieve the resource version, and then DELETE
+   * that version.
+   *
+   * @param url
+   *          - the url
+   * @param transId
+   *          - transaction ID
+   * @return ClientResponse
+   */
+  public ClientResponse getAndDeleteResource(String url, String transId) {
+    // First, GET the model
+    ClientResponse getResponse = getResource(url, transId, MimeType.XML);
+    if ((getResponse == null) || (getResponse.getStatus() != Response.Status.OK.getStatusCode())) {
+      return getResponse;
+    }
+
+    // Delete the model using the resource version in the response
+    String resVersion = null;
+    try {
+      resVersion = getResourceVersion(getResponse);
+    } catch (Exception e) {
+      logger.error(ModelLoaderMsgs.AAI_REST_REQUEST_ERROR, "GET", url, e.getLocalizedMessage());
+      return null;
+    }
+
+    return deleteResource(url, resVersion, transId);
+  }
+
+  private Client setupClient() throws IOException, GeneralSecurityException {
+    ClientConfig clientConfig = new DefaultClientConfig();
+
+    HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
+      @Override
+      public boolean verify(String string, SSLSession ssls) {
+        return true;
+      }
+    });
+
+    // Create a trust manager that does not validate certificate chains
+    TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
+      @Override
+      public X509Certificate[] getAcceptedIssuers() {
+        return null;
+      }
+
+      @Override
+      public void checkClientTrusted(X509Certificate[] certs, String authType) {}
+
+      @Override
+      public void checkServerTrusted(X509Certificate[] certs, String authType) {}
+    } };
+
+    SSLContext ctx = SSLContext.getInstance("TLS");
+    KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
+    FileInputStream fin = new FileInputStream(config.getAaiKeyStorePath());
+    KeyStore ks = KeyStore.getInstance("PKCS12");
+    char[] pwd = config.getAaiKeyStorePassword().toCharArray();
+    ks.load(fin, pwd);
+    kmf.init(ks, pwd);
+
+    ctx.init(kmf.getKeyManagers(), trustAllCerts, null);
+    clientConfig.getProperties().put(HTTPSProperties.PROPERTY_HTTPS_PROPERTIES,
+        new HTTPSProperties(new HostnameVerifier() {
+          @Override
+          public boolean verify(String theString, SSLSession sslSession) {
+            return true;
+          }
+        }, ctx));
+
+    Client client = Client.create(clientConfig);
+
+    return client;
+  }
+
+  private String getResourceVersion(ClientResponse response)
+      throws ParserConfigurationException, SAXException, IOException {
+    String respData = response.getEntity(String.class);
+
+    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+    DocumentBuilder builder = factory.newDocumentBuilder();
+    InputSource is = new InputSource(new StringReader(respData));
+    Document doc = builder.parse(is);
+
+    NodeList nodeList = doc.getDocumentElement().getChildNodes();
+    for (int i = 0; i < nodeList.getLength(); i++) {
+      Node currentNode = nodeList.item(i);
+      if (currentNode.getNodeName().equals(RESOURCE_VERSION_PARAM)) {
+        return currentNode.getTextContent();
+      }
+    }
+
+    return null;
+  }
+
+  private String getAuthenticationCredentials() {
+
+    String usernameAndPassword = config.getAaiAuthenticationUser() + ":"
+        + config.getAaiAuthenticationPassword();
+    return "Basic " + java.util.Base64.getEncoder().encodeToString(usernameAndPassword.getBytes());
+  }
+
+  public boolean useBasicAuth() {
+    return (config.getAaiAuthenticationUser() != null)
+        && (config.getAaiAuthenticationPassword() != null);
+  }
+}
index 994c4db..ac32f58 100644 (file)
-/**\r
- * ============LICENSE_START=======================================================\r
- * Model Loader\r
- * ================================================================================\r
- * Copyright © 2017 AT&T Intellectual Property.\r
- * Copyright © 2017 Amdocs\r
- * All rights reserved.\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
- * ============LICENSE_END=========================================================\r
- *\r
- * ECOMP and OpenECOMP are trademarks\r
- * and service marks of AT&T Intellectual Property.\r
- */\r
-package org.openecomp.modelloader.entity.model;\r
-\r
-import static org.junit.Assert.assertTrue;\r
-\r
-import java.nio.file.Files;\r
-import java.nio.file.Paths;\r
-import java.util.List;\r
-\r
-import org.junit.Test;\r
-import org.openecomp.modelloader.entity.Artifact;\r
-\r
-public class ModelArtifactParserTest {\r
-\r
-       @Test\r
-       public void testParseModelFileNoDeps() throws Exception {\r
-               final String MODEL_FILE = "src/test/resources/models/l3-network-widget.xml";\r
-\r
-               try {\r
-                       byte[] xmlBytes = Files.readAllBytes(Paths.get(MODEL_FILE));\r
-\r
-                       ModelArtifactParser parser = new ModelArtifactParser();\r
-                       List<Artifact> modelList = parser.parse(xmlBytes, "test-artifact");\r
-\r
-                       assertTrue(modelList.size() == 1);\r
-\r
-                       ModelArtifact model = (ModelArtifact) modelList.get(0);\r
-                       System.out.println(model.toString());\r
-\r
-                       assertTrue(model.getModelInvariantId().equalsIgnoreCase("3d560d81-57d0-438b-a2a1-5334dba0651a"));\r
-                       assertTrue(model.getType().toString().equalsIgnoreCase("MODEL"));\r
-                       System.out.println(model.getDependentModelIds().size());\r
-                       assertTrue(model.getDependentModelIds().size() == 0);\r
-               } catch (Exception e) {\r
-                       e.printStackTrace();\r
-                       assertTrue(false);\r
-               }\r
-       }\r
-\r
-       @Test\r
-       public void testParseModelFileDeps() throws Exception {\r
-               final String MODEL_FILE = "src/test/resources/models/AAI-stellService-service-1.xml";\r
-\r
-               try {\r
-                       byte[] xmlBytes = Files.readAllBytes(Paths.get(MODEL_FILE));\r
-\r
-                       ModelArtifactParser parser = new ModelArtifactParser();\r
-                       List<Artifact> modelList = parser.parse(xmlBytes, "test-artifact");\r
-\r
-                       assertTrue(modelList.size() == 1);\r
-\r
-                       ModelArtifact model = (ModelArtifact) modelList.get(0);\r
-                       System.out.println(model.toString());\r
-\r
-                       assertTrue(model.getModelInvariantId().equalsIgnoreCase("fedf9da3-6a74-4813-8fa2-221a98b0e7ad"));\r
-                       assertTrue(model.getModelVerId().equalsIgnoreCase("e0373537-7f66-4094-9939-e2f5de6ff5f6"));\r
-                       assertTrue(model.getType().toString().equalsIgnoreCase("MODEL"));\r
-                       assertTrue(model.getDependentModelIds().size() == 3);\r
-                       assertTrue(model.getDependentModelIds().contains("5c12984d-db0f-4300-a0e0-9791775cc40f|88bdbadf-db8a-490f-881e-c8effcbc3f66"));\r
-                       assertTrue(model.getDependentModelIds().contains("959b7c09-9f34-4e5f-8b63-505381db176e|374d0899-bbc2-4403-9320-fe9bebef75c6"));\r
-               } catch (Exception e) {\r
-                       e.printStackTrace();\r
-                       assertTrue(false);\r
-               }\r
-       }\r
-\r
-       @Test\r
-       public void testParseCompleteModel() throws Exception {\r
-               final String MODEL_FILE = "src/test/resources/models/complete-model.xml";\r
-\r
-               try {\r
-                       byte[] xmlBytes = Files.readAllBytes(Paths.get(MODEL_FILE));\r
-\r
-                       ModelArtifactParser parser = new ModelArtifactParser();\r
-                       List<Artifact> modelList = parser.parse(xmlBytes, "test-artifact");\r
-\r
-                       for (Artifact art : modelList) {\r
-                               ModelArtifact model = (ModelArtifact) art;\r
-                               System.out.println(model.toString());\r
-                       }\r
-\r
-                       assertTrue(modelList.size() == 5);\r
-\r
-                       ModelArtifact model1 = (ModelArtifact)modelList.get(0);\r
-                       assertTrue(model1.getModelVerId().equalsIgnoreCase("88bdbadf-db8a-490f-881e-c8effcbc3f66"));\r
-                       assertTrue(model1.getType().toString().equalsIgnoreCase("MODEL"));\r
-                       assertTrue(model1.getDependentModelIds().size() == 1);\r
-                       assertTrue(model1.getDependentModelIds().contains("3d560d81-57d0-438b-a2a1-5334dba0651a|9111f20f-e680-4001-b83f-19a2fc23bfc1"));\r
-\r
-                       ModelArtifact model4 = (ModelArtifact)modelList.get(4);\r
-                       assertTrue(model4.getModelInvariantId().equalsIgnoreCase("fedf9da3-6a74-4813-8fa2-221a98b0e7ad"));\r
-                       assertTrue(model4.getType().toString().equalsIgnoreCase("MODEL"));\r
-                       assertTrue(model4.getDependentModelIds().size() == 3);\r
-                       assertTrue(model4.getDependentModelIds().contains("5c12984d-db0f-4300-a0e0-9791775cc40f|88bdbadf-db8a-490f-881e-c8effcbc3f66"));\r
-                       assertTrue(model4.getDependentModelIds().contains("82194af1-3c2c-485a-8f44-420e22a9eaa4|46b92144-923a-4d20-b85a-3cbd847668a9"));\r
-               } catch (Exception e) {\r
-                       e.printStackTrace();\r
-                       assertTrue(false);\r
-               }\r
-       }\r
-\r
-       @Test\r
-       public void testParseNamedQuery() throws Exception {\r
-               final String MODEL_FILE = "src/test/resources/models/named-query-wan-connector.xml";\r
-\r
-               try {\r
-                       byte[] xmlBytes = Files.readAllBytes(Paths.get(MODEL_FILE));\r
-\r
-                       ModelArtifactParser parser = new ModelArtifactParser();\r
-                       List<Artifact> modelList = parser.parse(xmlBytes, "test-artifact");\r
-\r
-                       assertTrue(modelList.size() == 1);\r
-\r
-                       ModelArtifact model = (ModelArtifact) modelList.get(0);\r
-                       System.out.println(model.toString());\r
-\r
-                       assertTrue(model.getNameVersionId().equalsIgnoreCase("94cac189-8d88-4d63-a194-f44214e080ff"));\r
-                       assertTrue(model.getType().toString().equalsIgnoreCase("NAMED_QUERY"));\r
-                       assertTrue(model.getDependentModelIds().size() == 4);\r
-                       assertTrue(model.getDependentModelIds().contains("d09dd9da-0148-46cd-a947-591afc844d24"));\r
-                       assertTrue(model.getDependentModelIds().contains("997fc7-fca1-451f-b953-9a1e6197b4d6"));\r
-                       assertTrue(model.getDependentModelIds().contains("897df7ea-8938-42b0-bc57-46e913a4d93b"));\r
-                       assertTrue(model.getDependentModelIds().contains("f2b24d95-c582-48d5-b2d6-c5b3a94ce812"));\r
-               } catch (Exception e) {\r
-                       e.printStackTrace();\r
-                       assertTrue(false);\r
-               }\r
-       }\r
-\r
-       @Test\r
-       public void testParseModelFileInvalidArtifact() throws Exception {\r
-               final String MODEL_FILE = "src/test/resources/models/invalid-model.xml";\r
-\r
-               try {\r
-                       byte[] xmlBytes = Files.readAllBytes(Paths.get(MODEL_FILE));            \r
-\r
-                       ModelArtifactParser parser = new ModelArtifactParser();\r
-                       List<Artifact> modelList = parser.parse(xmlBytes, "test-artifact");\r
-\r
-                       assertTrue(modelList == null || modelList.isEmpty());\r
-               }\r
-               catch (Exception e) {\r
-                       e.printStackTrace();\r
-                       assertTrue(false);\r
-               }\r
-       }\r
-\r
-       @Test\r
-       public void testParseModelFileIncompleteArtifact() throws Exception {\r
-               final String MODEL_FILE = "src/test/resources/models/incomplete-model.xml";\r
-\r
-               try {\r
-                       byte[] xmlBytes = Files.readAllBytes(Paths.get(MODEL_FILE));            \r
-\r
-                       ModelArtifactParser parser = new ModelArtifactParser();\r
-                       List<Artifact> modelList = parser.parse(xmlBytes, "test-artifact");\r
-\r
-                       assertTrue(modelList == null || modelList.isEmpty());\r
-               }\r
-               catch (Exception e) {\r
-                       e.printStackTrace();\r
-                       assertTrue(false);\r
-               }\r
-       }\r
-\r
-       @Test\r
-       public void testParseModelFileIncompleteArtifacts() throws Exception {\r
-               final String MODEL_FILE = "src/test/resources/models/incomplete-models.xml";\r
-\r
-               try {\r
-                       byte[] xmlBytes = Files.readAllBytes(Paths.get(MODEL_FILE));            \r
-\r
-                       ModelArtifactParser parser = new ModelArtifactParser();\r
-                       List<Artifact> modelList = parser.parse(xmlBytes, "test-artifact");\r
-\r
-                       assertTrue(modelList == null || modelList.isEmpty());\r
-               }\r
-               catch (Exception e) {\r
-                       e.printStackTrace();\r
-                       assertTrue(false);\r
-               }\r
-       }\r
-\r
-}\r
+/**
+ * ============LICENSE_START=======================================================
+ * Model Loader
+ * ================================================================================
+ * Copyright © 2017 AT&T Intellectual Property.
+ * Copyright © 2017 Amdocs
+ * All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ *
+ * ECOMP and OpenECOMP are trademarks
+ * and service marks of AT&T Intellectual Property.
+ */
+package org.openecomp.modelloader.entity.model;
+
+import static org.junit.Assert.assertTrue;
+
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.List;
+
+import org.junit.Test;
+import org.openecomp.modelloader.entity.Artifact;
+
+public class ModelArtifactParserTest {
+
+       @Test
+       public void testParseModelFileNoDeps() throws Exception {
+               final String MODEL_FILE = "src/test/resources/models/l3-network-widget.xml";
+
+               try {
+                       byte[] xmlBytes = Files.readAllBytes(Paths.get(MODEL_FILE));
+
+                       ModelArtifactParser parser = new ModelArtifactParser();
+                       List<Artifact> modelList = parser.parse(xmlBytes, "test-artifact");
+
+                       assertTrue(modelList.size() == 1);
+
+                       ModelArtifact model = (ModelArtifact) modelList.get(0);
+                       System.out.println(model.toString());
+
+                       assertTrue(model.getModelInvariantId().equalsIgnoreCase("3d560d81-57d0-438b-a2a1-5334dba0651a"));
+                       assertTrue(model.getModelNamespace().equalsIgnoreCase("http://org.openecomp.aai.inventory/v9"));
+                       assertTrue(model.getModelNamespaceVersion().equalsIgnoreCase("v9"));
+                       assertTrue(model.getType().toString().equalsIgnoreCase("MODEL"));
+                       System.out.println(model.getDependentModelIds().size());
+                       assertTrue(model.getDependentModelIds().size() == 0);
+               } catch (Exception e) {
+                       e.printStackTrace();
+                       assertTrue(false);
+               }
+       }
+
+       @Test
+       public void testParseModelFileDeps() throws Exception {
+               final String MODEL_FILE = "src/test/resources/models/AAI-stellService-service-1.xml";
+
+               try {
+                       byte[] xmlBytes = Files.readAllBytes(Paths.get(MODEL_FILE));
+
+                       ModelArtifactParser parser = new ModelArtifactParser();
+                       List<Artifact> modelList = parser.parse(xmlBytes, "test-artifact");
+
+                       assertTrue(modelList.size() == 1);
+
+                       ModelArtifact model = (ModelArtifact) modelList.get(0);
+                       System.out.println(model.toString());
+
+                       assertTrue(model.getModelInvariantId().equalsIgnoreCase("fedf9da3-6a74-4813-8fa2-221a98b0e7ad"));
+                       assertTrue(model.getModelVerId().equalsIgnoreCase("e0373537-7f66-4094-9939-e2f5de6ff5f6"));
+                       assertTrue(model.getType().toString().equalsIgnoreCase("MODEL"));
+                       assertTrue(model.getDependentModelIds().size() == 3);
+                       assertTrue(model.getDependentModelIds().contains("5c12984d-db0f-4300-a0e0-9791775cc40f|88bdbadf-db8a-490f-881e-c8effcbc3f66"));
+                       assertTrue(model.getDependentModelIds().contains("959b7c09-9f34-4e5f-8b63-505381db176e|374d0899-bbc2-4403-9320-fe9bebef75c6"));
+               } catch (Exception e) {
+                       e.printStackTrace();
+                       assertTrue(false);
+               }
+       }
+
+       @Test
+       public void testParseModelFileInvalidArtifact() throws Exception {
+               final String MODEL_FILE = "src/test/resources/models/invalid-model.xml";
+
+               try {
+                       byte[] xmlBytes = Files.readAllBytes(Paths.get(MODEL_FILE));            
+
+                       ModelArtifactParser parser = new ModelArtifactParser();
+                       List<Artifact> modelList = parser.parse(xmlBytes, "test-artifact");
+
+                       assertTrue(modelList == null || modelList.isEmpty());
+               }
+               catch (Exception e) {
+                       e.printStackTrace();
+                       assertTrue(false);
+               }
+       }
+
+       @Test
+       public void testParseModelFileIncompleteArtifact() throws Exception {
+               final String MODEL_FILE = "src/test/resources/models/incomplete-model.xml";
+
+               try {
+                       byte[] xmlBytes = Files.readAllBytes(Paths.get(MODEL_FILE));            
+
+                       ModelArtifactParser parser = new ModelArtifactParser();
+                       List<Artifact> modelList = parser.parse(xmlBytes, "test-artifact");
+
+                       assertTrue(modelList == null || modelList.isEmpty());
+               }
+               catch (Exception e) {
+                       e.printStackTrace();
+                       assertTrue(false);
+               }
+       }
+}
diff --git a/src/test/java/org/openecomp/modelloader/entity/model/ModelParserFactoryTest.java b/src/test/java/org/openecomp/modelloader/entity/model/ModelParserFactoryTest.java
new file mode 100644 (file)
index 0000000..46db11a
--- /dev/null
@@ -0,0 +1,58 @@
+/**
+ * ============LICENSE_START=======================================================
+ * Model Loader
+ * ================================================================================
+ * Copyright © 2017 AT&T Intellectual Property.
+ * Copyright © 2017 Amdocs
+ * All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ *
+ * ECOMP and OpenECOMP are trademarks
+ * and service marks of AT&T Intellectual Property.
+ */
+package org.openecomp.modelloader.entity.model;
+
+import static org.junit.Assert.assertTrue;
+
+import java.nio.file.Files;
+import java.nio.file.Paths;
+
+import org.junit.Test;
+
+public class ModelParserFactoryTest {
+
+       @Test
+       public void testParserFactory() throws Exception {
+               final String MODEL_FILE_V8 = "src/test/resources/models/v8-wan-connector-model.xml";
+               final String MODEL_FILE_V9 = "src/test/resources/models/AAI-VL-resource-1.xml";
+               final String MODEL_FILE_NAMED_QUERY = "src/test/resources/models/named-query-wan-connector.xml";
+
+               
+               try {
+                       byte[] xmlBytes = Files.readAllBytes(Paths.get(MODEL_FILE_V8));
+                       IModelParser parser = ModelParserFactory.createModelParser(xmlBytes, "v8-wan-connector-model.xml");
+                       assertTrue(parser instanceof ModelV8ArtifactParser);
+                       
+                       xmlBytes = Files.readAllBytes(Paths.get(MODEL_FILE_V9));
+      parser = ModelParserFactory.createModelParser(xmlBytes, "AAI-VL-resource-1.xml");
+      assertTrue(parser instanceof ModelArtifactParser);
+      
+      xmlBytes = Files.readAllBytes(Paths.get(MODEL_FILE_NAMED_QUERY));
+      parser = ModelParserFactory.createModelParser(xmlBytes, "named-query-wan-connector.xml");
+      assertTrue(parser instanceof NamedQueryArtifactParser);
+               } catch (Exception e) {
+      e.printStackTrace();
+      assertTrue(false);
+    }
+       }
+}
index 03eaa39..fdc81da 100644 (file)
@@ -54,8 +54,9 @@ public class ModelSorterTest {
     List<Artifact> modelList = new ArrayList<Artifact>();
 
     ModelArtifact model = new ModelArtifact();
-    model.setNameVersionId("aaaaa");
-    model.addDependentModelId("xyz");
+    model.setModelInvariantId("aaa");
+    model.setModelVerId("111");
+    model.addDependentModelId("xyz|123");
     modelList.add(model);
 
     ModelSorter sorter = new ModelSorter();
@@ -82,17 +83,17 @@ public class ModelSorterTest {
 
     ModelArtifact aaaa = new ModelArtifact();
     aaaa.setModelInvariantId("aaaa");
-       aaaa.setModelVerId("mvaaaa");
-       aaaa.addDependentModelId("cccc|mvcccc");
+    aaaa.setModelVerId("mvaaaa");
+    aaaa.addDependentModelId("cccc|mvcccc");
 
     ModelArtifact bbbb = new ModelArtifact();
     bbbb.setModelInvariantId("bbbb");
-       bbbb.setModelVerId("mvbbbb");
-       bbbb.addDependentModelId("aaaa|mvaaaa");
+    bbbb.setModelVerId("mvbbbb");
+    bbbb.addDependentModelId("aaaa|mvaaaa");
 
     ModelArtifact cccc = new ModelArtifact();
     cccc.setModelInvariantId("cccc");
-       cccc.setModelVerId("mvcccc");
+    cccc.setModelVerId("mvcccc");
 
     modelList.add(aaaa);
     modelList.add(bbbb);
@@ -109,19 +110,89 @@ public class ModelSorterTest {
     assertEquals(aaaa, sortedList.get(1));
     assertEquals(bbbb, sortedList.get(2));
   }
+  
+  @Test
+  public void multipleModelsV8() {
+
+    List<Artifact> modelList = new ArrayList<Artifact>();
+
+    ModelV8Artifact aaaa = new ModelV8Artifact();
+    aaaa.setModelNameVersionId("aaaa");
+    aaaa.addDependentModelId("cccc");
+
+    ModelV8Artifact bbbb = new ModelV8Artifact();
+    bbbb.setModelNameVersionId("bbbb");
+    bbbb.addDependentModelId("aaaa");
+
+    ModelV8Artifact cccc = new ModelV8Artifact();
+    cccc.setModelNameVersionId("cccc");
+
+    modelList.add(aaaa);
+    modelList.add(bbbb);
+    modelList.add(cccc);
 
+    ModelSorter sorter = new ModelSorter();
+    sorter = new ModelSorter();
+
+    List<Artifact> sortedList = sorter.sort(modelList);
+    assertNotNull(sortedList);
+    assertEquals(3, sortedList.size());
+
+    assertEquals(cccc, sortedList.get(0));
+    assertEquals(aaaa, sortedList.get(1));
+    assertEquals(bbbb, sortedList.get(2));
+  }
+    
+  @Test
+  public void multipleModelsAndNamedQueries() {
+
+    List<Artifact> modelList = new ArrayList<Artifact>();
+
+    ModelArtifact aaaa = new ModelArtifact();
+    aaaa.setModelInvariantId("aaaa");
+    aaaa.setModelVerId("1111");
+    aaaa.addDependentModelId("cccc|2222");
+    
+    NamedQueryArtifact nq1 = new NamedQueryArtifact();
+    nq1.setNamedQueryUuid("nq1");
+    nq1.addDependentModelId("aaaa|1111");
+    
+    NamedQueryArtifact nq2 = new NamedQueryArtifact();
+    nq2.setNamedQueryUuid("nq2");
+    nq2.addDependentModelId("existing-model");
+    
+
+    modelList.add(nq1);
+    modelList.add(nq2);
+    modelList.add(aaaa);
+
+    ModelSorter sorter = new ModelSorter();
+    sorter = new ModelSorter();
+
+    List<Artifact> sortedList = sorter.sort(modelList);
+    assertNotNull(sortedList);
+    assertEquals(3, sortedList.size());
+
+    System.out.println(sortedList.get(0) + "-" + sortedList.get(1) + "-" + sortedList.get(2));
+    assertEquals(aaaa, sortedList.get(0));
+    assertEquals(nq2, sortedList.get(1));
+    assertEquals(nq1, sortedList.get(2));
+  }
+  
   @Test(expected = RuntimeException.class)
   public void circularDependency() {
 
     List<Artifact> modelList = new ArrayList<Artifact>();
 
     ModelArtifact aaaa = new ModelArtifact();
-    aaaa.setNameVersionId("aaaa");
-    aaaa.addDependentModelId("bbbb");
+    aaaa.setModelInvariantId("aaaa");
+    aaaa.setModelVerId("1111");
+    aaaa.addDependentModelId("bbbb|1111");
 
     ModelArtifact bbbb = new ModelArtifact();
-    bbbb.setNameVersionId("bbbb");
-    bbbb.addDependentModelId("aaaa");
+    bbbb.setModelInvariantId("bbbb");
+    bbbb.setModelVerId("1111");
+    bbbb.addDependentModelId("aaaa|1111");
 
     modelList.add(aaaa);
     modelList.add(bbbb);
diff --git a/src/test/java/org/openecomp/modelloader/entity/model/ModelV8ArtifactParserTest.java b/src/test/java/org/openecomp/modelloader/entity/model/ModelV8ArtifactParserTest.java
new file mode 100644 (file)
index 0000000..098bc8c
--- /dev/null
@@ -0,0 +1,104 @@
+/**
+ * ============LICENSE_START=======================================================
+ * Model Loader
+ * ================================================================================
+ * Copyright © 2017 AT&T Intellectual Property.
+ * Copyright © 2017 Amdocs
+ * All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ *
+ * ECOMP and OpenECOMP are trademarks
+ * and service marks of AT&T Intellectual Property.
+ */
+package org.openecomp.modelloader.entity.model;
+
+import static org.junit.Assert.assertTrue;
+
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.List;
+
+import org.junit.Test;
+import org.openecomp.modelloader.entity.Artifact;
+
+public class ModelV8ArtifactParserTest {
+
+  @Test
+  public void testParseModelFile() throws Exception {
+    final String MODEL_FILE = "src/test/resources/models/v8-wan-connector-model.xml";
+
+    try {
+      byte[] xmlBytes = Files.readAllBytes(Paths.get(MODEL_FILE));
+
+      ModelV8ArtifactParser parser = new ModelV8ArtifactParser();
+      List<Artifact> modelList = parser.parse(xmlBytes, "test-artifact");
+
+      assertTrue(modelList.size() == 1);
+
+      ModelV8Artifact model = (ModelV8Artifact) modelList.get(0);
+      System.out.println(model.toString());
+
+      assertTrue(model.getModelNameVersionId().equalsIgnoreCase("93d9d45d-7eec-4371-9083-675e4c353de3"));
+      assertTrue(model.getModelNamespace().equalsIgnoreCase("http://com.att.aai.inventory/v7"));
+      assertTrue(model.getModelNamespaceVersion().equalsIgnoreCase("v7"));                     
+      assertTrue(model.getType().toString().equalsIgnoreCase("MODEL_V8"));
+      assertTrue(model.getDependentModelIds().size() == 7);
+      assertTrue(model.getDependentModelIds().contains("d09dd9da-0148-46cd-a947-591afc844d24"));
+      assertTrue(model.getDependentModelIds().contains("997fc7-fca1-451f-b953-9a1e6197b4d6"));
+      assertTrue(model.getDependentModelIds().contains("ae16244f-4d29-4801-a559-e25f2db2a4c3"));
+      assertTrue(model.getDependentModelIds().contains("759dbd4a-2473-46f3-a932-48d987c9b4a1"));
+      assertTrue(model.getDependentModelIds().contains("a6d9de88-4046-4b78-a59e-5691243d292a"));
+      assertTrue(model.getDependentModelIds().contains("35be1acf-1298-48c6-a128-66850083b8bd"));
+    } catch (Exception e) {
+      e.printStackTrace();
+      assertTrue(false);
+    }
+  }
+
+  @Test
+  public void testParseModelFileInvalidArtifact() throws Exception {
+    final String MODEL_FILE = "src/test/resources/models/invalid-model.xml";
+
+    try {
+      byte[] xmlBytes = Files.readAllBytes(Paths.get(MODEL_FILE));             
+
+      ModelV8ArtifactParser parser = new ModelV8ArtifactParser();
+      List<Artifact> modelList = parser.parse(xmlBytes, "test-artifact");
+
+      assertTrue(modelList == null || modelList.isEmpty());
+    }
+    catch (Exception e) {
+      e.printStackTrace();
+      assertTrue(false);
+    }
+  }
+
+  @Test
+  public void testParseModelFileIncompleteArtifact() throws Exception {
+    final String MODEL_FILE = "src/test/resources/models/incomplete-model.xml";
+
+    try {
+      byte[] xmlBytes = Files.readAllBytes(Paths.get(MODEL_FILE));             
+
+      ModelV8ArtifactParser parser = new ModelV8ArtifactParser();
+      List<Artifact> modelList = parser.parse(xmlBytes, "test-artifact");
+
+      assertTrue(modelList == null || modelList.isEmpty());
+    }
+    catch (Exception e) {
+      e.printStackTrace();
+      assertTrue(false);
+    }
+  }
+
+}
diff --git a/src/test/java/org/openecomp/modelloader/entity/model/NamedQueryArtifactParserTest.java b/src/test/java/org/openecomp/modelloader/entity/model/NamedQueryArtifactParserTest.java
new file mode 100644 (file)
index 0000000..cc9d615
--- /dev/null
@@ -0,0 +1,64 @@
+/**
+ * ============LICENSE_START=======================================================
+ * Model Loader
+ * ================================================================================
+ * Copyright © 2017 AT&T Intellectual Property.
+ * Copyright © 2017 Amdocs
+ * All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ *
+ * ECOMP and OpenECOMP are trademarks
+ * and service marks of AT&T Intellectual Property.
+ */
+package org.openecomp.modelloader.entity.model;
+
+import static org.junit.Assert.assertTrue;
+
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.List;
+
+import org.junit.Test;
+import org.openecomp.modelloader.entity.Artifact;
+
+public class NamedQueryArtifactParserTest {
+
+       @Test
+       public void testParseNamedQuery() throws Exception {
+               final String MODEL_FILE = "src/test/resources/models/named-query-wan-connector.xml";
+
+               try {
+                       byte[] xmlBytes = Files.readAllBytes(Paths.get(MODEL_FILE));
+
+                       NamedQueryArtifactParser parser = new NamedQueryArtifactParser();
+                       List<Artifact> modelList = parser.parse(xmlBytes, "test-artifact");
+
+                       assertTrue(modelList.size() == 1);
+
+                       NamedQueryArtifact model = (NamedQueryArtifact) modelList.get(0);
+                       System.out.println(model.toString());
+
+                       assertTrue(model.getNamedQueryUuid().equalsIgnoreCase("94cac189-8d88-4d63-a194-f44214e080ff"));
+                       assertTrue(model.getType().toString().equalsIgnoreCase("NAMED_QUERY"));
+                       assertTrue(model.getDependentModelIds().size() == 4);
+                       assertTrue(model.getDependentModelIds().contains("d09dd9da-0148-46cd-a947-591afc844d24"));
+                       assertTrue(model.getDependentModelIds().contains("997fc7-fca1-451f-b953-9a1e6197b4d6"));
+                       assertTrue(model.getDependentModelIds().contains("897df7ea-8938-42b0-bc57-46e913a4d93b"));
+                       assertTrue(model.getDependentModelIds().contains("f2b24d95-c582-48d5-b2d6-c5b3a94ce812"));
+               } catch (Exception e) {
+                       e.printStackTrace();
+                       assertTrue(false);
+               }
+       }
+
+}
index 5d9edc9..08a429a 100644 (file)
@@ -115,7 +115,7 @@ public class AaiRestClientTest {
       subURL = subURL + "/";
     }
 
-    String url = baseURL + subURL + model.getNameVersionId();
+    String url = baseURL + subURL + model.getUniqueIdentifier();
     return url;
   }
 }
index 3f0fb7a..aef38e6 100644 (file)
@@ -1,37 +1,17 @@
-<!--\r
-  ============LICENSE_START=======================================================
-  MODEL LOADER SERVICE
-  ================================================================================
-  Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
-  ================================================================================
-  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
-  \r
-       http://www.apache.org/licenses/LICENSE-2.0\r
-  \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.
-  ============LICENSE_END=========================================================\r
-  -->\r
-\r
-<configuration debug="false">\r
-\r
-       <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">\r
-               <!-- encoders are by default assigned the type ch.qos.logback.classic.encoder.PatternLayoutEncoder -->\r
-               <encoder>\r
-                       <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>\r
-               </encoder>\r
-       </appender>\r
-\r
-       <logger name="com.att.eelf" level="DEBUG" additivity="false">\r
-               <appender-ref ref="STDOUT" />\r
-       </logger>\r
-\r
-       <root level="debug">\r
-               <appender-ref ref="STDOUT" />\r
-       </root>\r
-</configuration>\r
+<configuration debug="false">
+
+       <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+               <!-- encoders are by default assigned the type ch.qos.logback.classic.encoder.PatternLayoutEncoder -->
+               <encoder>
+                       <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
+               </encoder>
+       </appender>
+
+       <logger name="com.att.eelf" level="DEBUG" additivity="false">
+               <appender-ref ref="STDOUT" />
+       </logger>
+
+       <root level="debug">
+               <appender-ref ref="STDOUT" />
+       </root>
+</configuration>
index 34432a4..91fd527 100644 (file)
@@ -1,43 +1,23 @@
-###\r
-# ============LICENSE_START=======================================================
-# MODEL LOADER SERVICE
-# ================================================================================
-# Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
-# ================================================================================
-# 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
-# \r
-#      http://www.apache.org/licenses/LICENSE-2.0\r
-# \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.
-# ============LICENSE_END=========================================================\r
-###\r
-\r
-# Model Loader Distribution Client Configuration\r
-ml.distribution.ACTIVE_SERVER_TLS_AUTH=false\r
-ml.distribution.ASDC_ADDRESS=\r
-ml.distribution.CONSUMER_GROUP=aai-ml-group-test\r
-ml.distribution.CONSUMER_ID=aai-ml-id-test\r
-ml.distribution.ENVIRONMENT_NAME=\r
-ml.distribution.KEYSTORE_PASSWORD=\r
-ml.distribution.KEYSTORE_FILE=asdc-client.jks\r
-ml.distribution.PASSWORD=\r
-ml.distribution.POLLING_INTERVAL=30\r
-ml.distribution.POLLING_TIMEOUT=20\r
-ml.distribution.USER=ci\r
-ml.distribution.ARTIFACT_TYPES=MODEL_INVENTORY_PROFILE,MODEL_QUERY_SPEC,VNF_CATALOG\r
-\r
-# Model Loader AAI REST Client Configuration\r
-ml.aai.BASE_URL=\r
-ml.aai.MODEL_URL=/aai/v8/service-design-and-creation/models/model/\r
-ml.aai.NAMED_QUERY_URL=/aai/v8/service-design-and-creation/named-queries/named-query/\r
-ml.aai.VNF_IMAGE_URL=/aai/v8/service-design-and-creation/vnf-images\r
-ml.aai.KEYSTORE_FILE=aai-client-cert.p12\r
-ml.aai.KEYSTORE_PASSWORD=\r
-ml.aai.AUTH_USER=ModelLoader\r
-ml.aai.AUTH_PASSWORD=\r
+# Model Loader Distribution Client Configuration
+ml.distribution.ACTIVE_SERVER_TLS_AUTH=false
+ml.distribution.ASDC_ADDRESS=
+ml.distribution.CONSUMER_GROUP=aai-ml-group-test
+ml.distribution.CONSUMER_ID=aai-ml-id-test
+ml.distribution.ENVIRONMENT_NAME=
+ml.distribution.KEYSTORE_PASSWORD=
+ml.distribution.KEYSTORE_FILE=asdc-client.jks
+ml.distribution.PASSWORD=
+ml.distribution.POLLING_INTERVAL=30
+ml.distribution.POLLING_TIMEOUT=20
+ml.distribution.USER=ci
+ml.distribution.ARTIFACT_TYPES=MODEL_INVENTORY_PROFILE,MODEL_QUERY_SPEC,VNF_CATALOG
+
+# Model Loader AAI REST Client Configuration
+ml.aai.BASE_URL=
+ml.aai.MODEL_URL=/aai/v8/service-design-and-creation/models/model/
+ml.aai.NAMED_QUERY_URL=/aai/v8/service-design-and-creation/named-queries/named-query/
+ml.aai.VNF_IMAGE_URL=/aai/v8/service-design-and-creation/vnf-images
+ml.aai.KEYSTORE_FILE=aai-client-cert.p12
+ml.aai.KEYSTORE_PASSWORD=
+ml.aai.AUTH_USER=ModelLoader
+ml.aai.AUTH_PASSWORD=
index 035d3e8..2f36934 100644 (file)
@@ -1,41 +1,21 @@
-###\r
-# ============LICENSE_START=======================================================
-# MODEL LOADER SERVICE
-# ================================================================================
-# Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
-# ================================================================================
-# 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
-# \r
-#      http://www.apache.org/licenses/LICENSE-2.0\r
-# \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.
-# ============LICENSE_END=========================================================\r
-###\r
-\r
-# Model Loader Distribution Client Configuration\r
-ml.distribution.ACTIVE_SERVER_TLS_AUTH=false\r
-ml.distribution.ASDC_ADDRESS=\r
-ml.distribution.CONSUMER_GROUP=aai-ml-group-test\r
-ml.distribution.CONSUMER_ID=aai-ml-id-test\r
-ml.distribution.ENVIRONMENT_NAME=\r
-ml.distribution.KEYSTORE_PASSWORD=\r
-ml.distribution.KEYSTORE_FILE=asdc-client.jks\r
-ml.distribution.PASSWORD=\r
-ml.distribution.POLLING_INTERVAL=30\r
-ml.distribution.POLLING_TIMEOUT=20\r
-ml.distribution.USER=ci\r
-ml.distribution.ARTIFACT_TYPES=MODEL_INVENTORY_PROFILE,MODEL_QUERY_SPEC,VNF_CATALOG\r
-\r
-# Model Loader AAI REST Client Configuration\r
-ml.aai.BASE_URL=\r
-ml.aai.MODEL_URL=/aai/v8/service-design-and-creation/models/model/\r
-ml.aai.NAMED_QUERY_URL=/aai/v8/service-design-and-creation/named-queries/named-query/\r
-ml.aai.VNF_IMAGE_URL=/aai/v8/service-design-and-creation/vnf-images\r
-ml.aai.KEYSTORE_FILE=aai-client-cert.p12\r
-ml.aai.KEYSTORE_PASSWORD=\r
+# Model Loader Distribution Client Configuration
+ml.distribution.ACTIVE_SERVER_TLS_AUTH=false
+ml.distribution.ASDC_ADDRESS=
+ml.distribution.CONSUMER_GROUP=aai-ml-group-test
+ml.distribution.CONSUMER_ID=aai-ml-id-test
+ml.distribution.ENVIRONMENT_NAME=
+ml.distribution.KEYSTORE_PASSWORD=
+ml.distribution.KEYSTORE_FILE=asdc-client.jks
+ml.distribution.PASSWORD=
+ml.distribution.POLLING_INTERVAL=30
+ml.distribution.POLLING_TIMEOUT=20
+ml.distribution.USER=ci
+ml.distribution.ARTIFACT_TYPES=MODEL_INVENTORY_PROFILE,MODEL_QUERY_SPEC,VNF_CATALOG
+
+# Model Loader AAI REST Client Configuration
+ml.aai.BASE_URL=
+ml.aai.MODEL_URL=/aai/v8/service-design-and-creation/models/model/
+ml.aai.NAMED_QUERY_URL=/aai/v8/service-design-and-creation/named-queries/named-query/
+ml.aai.VNF_IMAGE_URL=/aai/v8/service-design-and-creation/vnf-images
+ml.aai.KEYSTORE_FILE=aai-client-cert.p12
+ml.aai.KEYSTORE_PASSWORD=
index 34432a4..91fd527 100644 (file)
@@ -1,43 +1,23 @@
-###\r
-# ============LICENSE_START=======================================================
-# MODEL LOADER SERVICE
-# ================================================================================
-# Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
-# ================================================================================
-# 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
-# \r
-#      http://www.apache.org/licenses/LICENSE-2.0\r
-# \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.
-# ============LICENSE_END=========================================================\r
-###\r
-\r
-# Model Loader Distribution Client Configuration\r
-ml.distribution.ACTIVE_SERVER_TLS_AUTH=false\r
-ml.distribution.ASDC_ADDRESS=\r
-ml.distribution.CONSUMER_GROUP=aai-ml-group-test\r
-ml.distribution.CONSUMER_ID=aai-ml-id-test\r
-ml.distribution.ENVIRONMENT_NAME=\r
-ml.distribution.KEYSTORE_PASSWORD=\r
-ml.distribution.KEYSTORE_FILE=asdc-client.jks\r
-ml.distribution.PASSWORD=\r
-ml.distribution.POLLING_INTERVAL=30\r
-ml.distribution.POLLING_TIMEOUT=20\r
-ml.distribution.USER=ci\r
-ml.distribution.ARTIFACT_TYPES=MODEL_INVENTORY_PROFILE,MODEL_QUERY_SPEC,VNF_CATALOG\r
-\r
-# Model Loader AAI REST Client Configuration\r
-ml.aai.BASE_URL=\r
-ml.aai.MODEL_URL=/aai/v8/service-design-and-creation/models/model/\r
-ml.aai.NAMED_QUERY_URL=/aai/v8/service-design-and-creation/named-queries/named-query/\r
-ml.aai.VNF_IMAGE_URL=/aai/v8/service-design-and-creation/vnf-images\r
-ml.aai.KEYSTORE_FILE=aai-client-cert.p12\r
-ml.aai.KEYSTORE_PASSWORD=\r
-ml.aai.AUTH_USER=ModelLoader\r
-ml.aai.AUTH_PASSWORD=\r
+# Model Loader Distribution Client Configuration
+ml.distribution.ACTIVE_SERVER_TLS_AUTH=false
+ml.distribution.ASDC_ADDRESS=
+ml.distribution.CONSUMER_GROUP=aai-ml-group-test
+ml.distribution.CONSUMER_ID=aai-ml-id-test
+ml.distribution.ENVIRONMENT_NAME=
+ml.distribution.KEYSTORE_PASSWORD=
+ml.distribution.KEYSTORE_FILE=asdc-client.jks
+ml.distribution.PASSWORD=
+ml.distribution.POLLING_INTERVAL=30
+ml.distribution.POLLING_TIMEOUT=20
+ml.distribution.USER=ci
+ml.distribution.ARTIFACT_TYPES=MODEL_INVENTORY_PROFILE,MODEL_QUERY_SPEC,VNF_CATALOG
+
+# Model Loader AAI REST Client Configuration
+ml.aai.BASE_URL=
+ml.aai.MODEL_URL=/aai/v8/service-design-and-creation/models/model/
+ml.aai.NAMED_QUERY_URL=/aai/v8/service-design-and-creation/named-queries/named-query/
+ml.aai.VNF_IMAGE_URL=/aai/v8/service-design-and-creation/vnf-images
+ml.aai.KEYSTORE_FILE=aai-client-cert.p12
+ml.aai.KEYSTORE_PASSWORD=
+ml.aai.AUTH_USER=ModelLoader
+ml.aai.AUTH_PASSWORD=
index 7bd1073..6ec4fb3 100644 (file)
@@ -1,52 +1,32 @@
-<!--\r
-  ============LICENSE_START=======================================================
-  MODEL LOADER SERVICE
-  ================================================================================
-  Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
-  ================================================================================
-  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
-  \r
-       http://www.apache.org/licenses/LICENSE-2.0\r
-  \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.
-  ============LICENSE_END=========================================================\r
-  -->\r
-\r
-<model xmlns="http://org.openecomp.aai.inventory/v9">\r
-    <model-invariant-id>5a2aac99-ffe8-415f-9242-420ed10da23e</model-invariant-id>\r
-    <model-type>resource</model-type>\r
-    <model-vers>\r
-        <model-ver>\r
-            <model-version-id>29d3fc43-4ff2-4e5c-acd0-7370f5b2715a</model-version-id>\r
-            <model-name>Testvsp..vmme_cinder..module-1</model-name>\r
-            <model-version>1</model-version>\r
-            <model-description></model-description>\r
-            <model-elements>\r
-                <model-element>\r
-                    <new-data-del-flag>F</new-data-del-flag>\r
-                    <cardinality>unbounded</cardinality>\r
-                    <model-elements/>\r
-                    <relationship-list>\r
-                        <relationship>\r
-                            <related-to>model-ver</related-to>\r
-                            <relationship-data>\r
-                                <relationship-key>model-ver.model-version-id</relationship-key>\r
-                                <relationship-value>c00563ae-812b-4e62-8330-7c4d0f47088a</relationship-value>\r
-                            </relationship-data>\r
-                            <relationship-data>\r
-                                <relationship-key>model.model-invariant-id</relationship-key>\r
-                                <relationship-value>ef86f9c5-2165-44f3-8fc3-96018b609ea5</relationship-value>\r
-                            </relationship-data>\r
-                        </relationship>\r
-                    </relationship-list>\r
-                </model-element>\r
-            </model-elements>\r
-        </model-ver>\r
-    </model-vers>\r
-</model>\r
+<model xmlns="http://org.openecomp.aai.inventory/v9">
+    <model-invariant-id>5a2aac99-ffe8-415f-9242-420ed10da23e</model-invariant-id>
+    <model-type>resource</model-type>
+    <model-vers>
+        <model-ver>
+            <model-version-id>29d3fc43-4ff2-4e5c-acd0-7370f5b2715a</model-version-id>
+            <model-name>Testvsp..vmme_cinder..module-1</model-name>
+            <model-version>1</model-version>
+            <model-description></model-description>
+            <model-elements>
+                <model-element>
+                    <new-data-del-flag>F</new-data-del-flag>
+                    <cardinality>unbounded</cardinality>
+                    <model-elements/>
+                    <relationship-list>
+                        <relationship>
+                            <related-to>model-ver</related-to>
+                            <relationship-data>
+                                <relationship-key>model-ver.model-version-id</relationship-key>
+                                <relationship-value>c00563ae-812b-4e62-8330-7c4d0f47088a</relationship-value>
+                            </relationship-data>
+                            <relationship-data>
+                                <relationship-key>model.model-invariant-id</relationship-key>
+                                <relationship-value>ef86f9c5-2165-44f3-8fc3-96018b609ea5</relationship-value>
+                            </relationship-data>
+                        </relationship>
+                    </relationship-list>
+                </model-element>
+            </model-elements>
+        </model-ver>
+    </model-vers>
+</model>
\ No newline at end of file
index 8fe5319..ee436ba 100644 (file)
-<!--\r
-  ============LICENSE_START=======================================================
-  MODEL LOADER SERVICE
-  ================================================================================
-  Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
-  ================================================================================
-  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
-  \r
-       http://www.apache.org/licenses/LICENSE-2.0\r
-  \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.
-  ============LICENSE_END=========================================================\r
-  -->\r
-\r
-<model xmlns="http://org.openecomp.aai.inventory/v9">\r
-    <model-invariant-id>1e8fdfc0-03cf-4742-b060-dab818954d67</model-invariant-id>\r
-    <model-type>resource</model-type>\r
-    <model-vers>\r
-        <model-ver>\r
-            <model-version-id>da6769f0-aa58-4e90-b2c9-664c2630d131</model-version-id>\r
-            <model-name>Testvsp..vmme_small_ecomp..module-0</model-name>\r
-            <model-version>1</model-version>\r
-            <model-description></model-description>\r
-            <model-elements>\r
-                <model-element>\r
-                    <new-data-del-flag>F</new-data-del-flag>\r
-                    <cardinality>unbounded</cardinality>\r
-                    <model-elements>\r
-                        <model-element>\r
-                            <new-data-del-flag>F</new-data-del-flag>\r
-                            <cardinality>unbounded</cardinality>\r
-                            <model-elements>\r
-                                <model-element>\r
-                                    <new-data-del-flag>F</new-data-del-flag>\r
-                                    <cardinality>unbounded</cardinality>\r
-                                    <model-elements/>\r
-                                    <relationship-list>\r
-                                        <relationship>\r
-                                            <related-to>model-ver</related-to>\r
-                                            <relationship-data>\r
-                                                <relationship-key>model-ver.model-version-id</relationship-key>\r
-                                                <relationship-value>f6a038c2-820c-42ba-8c2b-375e24e8f932</relationship-value>\r
-                                            </relationship-data>\r
-                                            <relationship-data>\r
-                                                <relationship-key>model.model-invariant-id</relationship-key>\r
-                                                <relationship-value>3f4c7204-739b-4bbb-87a7-8a6856439c90</relationship-value>\r
-                                            </relationship-data>\r
-                                        </relationship>\r
-                                    </relationship-list>\r
-                                </model-element>\r
-                                <model-element>\r
-                                    <new-data-del-flag>F</new-data-del-flag>\r
-                                    <cardinality>unbounded</cardinality>\r
-                                    <model-elements/>\r
-                                    <relationship-list>\r
-                                        <relationship>\r
-                                            <related-to>model-ver</related-to>\r
-                                            <relationship-data>\r
-                                                <relationship-key>model-ver.model-version-id</relationship-key>\r
-                                                <relationship-value>abcc54bc-bb74-49dc-9043-7f7171707545</relationship-value>\r
-                                            </relationship-data>\r
-                                            <relationship-data>\r
-                                                <relationship-key>model.model-invariant-id</relationship-key>\r
-                                                <relationship-value>97c26c99-6870-44c1-8a07-1d900d3f4ce6</relationship-value>\r
-                                            </relationship-data>\r
-                                        </relationship>\r
-                                    </relationship-list>\r
-                                </model-element>\r
-                                <model-element>\r
-                                    <new-data-del-flag>F</new-data-del-flag>\r
-                                    <cardinality>unbounded</cardinality>\r
-                                    <model-elements/>\r
-                                    <relationship-list>\r
-                                        <relationship>\r
-                                            <related-to>model-ver</related-to>\r
-                                            <relationship-data>\r
-                                                <relationship-key>model-ver.model-version-id</relationship-key>\r
-                                                <relationship-value>36200fb5-f251-4f5d-a520-7c5ad5c2cd4b</relationship-value>\r
-                                            </relationship-data>\r
-                                            <relationship-data>\r
-                                                <relationship-key>model.model-invariant-id</relationship-key>\r
-                                                <relationship-value>bace8d1c-a261-4041-9e37-823117415d0f</relationship-value>\r
-                                            </relationship-data>\r
-                                        </relationship>\r
-                                    </relationship-list>\r
-                                </model-element>\r
-                                <model-element>\r
-                                    <new-data-del-flag>F</new-data-del-flag>\r
-                                    <cardinality>unbounded</cardinality>\r
-                                    <model-elements/>\r
-                                    <relationship-list>\r
-                                        <relationship>\r
-                                            <related-to>model-ver</related-to>\r
-                                            <relationship-data>\r
-                                                <relationship-key>model-ver.model-version-id</relationship-key>\r
-                                                <relationship-value>a32613fd-18b9-459e-aab8-fffb3912966a</relationship-value>\r
-                                            </relationship-data>\r
-                                            <relationship-data>\r
-                                                <relationship-key>model.model-invariant-id</relationship-key>\r
-                                                <relationship-value>cea0a982-8d55-4093-921e-418fbccf7060</relationship-value>\r
-                                            </relationship-data>\r
-                                        </relationship>\r
-                                    </relationship-list>\r
-                                </model-element>\r
-                                <model-element>\r
-                                    <new-data-del-flag>F</new-data-del-flag>\r
-                                    <cardinality>unbounded</cardinality>\r
-                                    <model-elements/>\r
-                                    <relationship-list>\r
-                                        <relationship>\r
-                                            <related-to>model-ver</related-to>\r
-                                            <relationship-data>\r
-                                                <relationship-key>model-ver.model-version-id</relationship-key>\r
-                                                <relationship-value>5761e0a7-c6df-4d8a-9ebd-b8f445054dec</relationship-value>\r
-                                            </relationship-data>\r
-                                            <relationship-data>\r
-                                                <relationship-key>model.model-invariant-id</relationship-key>\r
-                                                <relationship-value>96129eb9-f0de-4e05-8af2-73146473f766</relationship-value>\r
-                                            </relationship-data>\r
-                                        </relationship>\r
-                                    </relationship-list>\r
-                                </model-element>\r
-                            </model-elements>\r
-                            <relationship-list>\r
-                                <relationship>\r
-                                    <related-to>model-ver</related-to>\r
-                                    <relationship-data>\r
-                                        <relationship-key>model-ver.model-version-id</relationship-key>\r
-                                        <relationship-value>8ecb2c5d-7176-4317-a255-26274edfdd53</relationship-value>\r
-                                    </relationship-data>\r
-                                    <relationship-data>\r
-                                        <relationship-key>model.model-invariant-id</relationship-key>\r
-                                        <relationship-value>ff69d4e0-a8e8-4108-bdb0-dd63217e63c7</relationship-value>\r
-                                    </relationship-data>\r
-                                </relationship>\r
-                            </relationship-list>\r
-                        </model-element>\r
-                        <model-element>\r
-                            <new-data-del-flag>F</new-data-del-flag>\r
-                            <cardinality>unbounded</cardinality>\r
-                            <model-elements/>\r
-                            <relationship-list>\r
-                                <relationship>\r
-                                    <related-to>model-ver</related-to>\r
-                                    <relationship-data>\r
-                                        <relationship-key>model-ver.model-version-id</relationship-key>\r
-                                        <relationship-value>9111f20f-e680-4001-b83f-19a2fc23bfc1</relationship-value>\r
-                                    </relationship-data>\r
-                                    <relationship-data>\r
-                                        <relationship-key>model.model-invariant-id</relationship-key>\r
-                                        <relationship-value>3d560d81-57d0-438b-a2a1-5334dba0651a</relationship-value>\r
-                                    </relationship-data>\r
-                                </relationship>\r
-                            </relationship-list>\r
-                        </model-element>\r
-                    </model-elements>\r
-                    <relationship-list>\r
-                        <relationship>\r
-                            <related-to>model-ver</related-to>\r
-                            <relationship-data>\r
-                                <relationship-key>model-ver.model-version-id</relationship-key>\r
-                                <relationship-value>c00563ae-812b-4e62-8330-7c4d0f47088a</relationship-value>\r
-                            </relationship-data>\r
-                            <relationship-data>\r
-                                <relationship-key>model.model-invariant-id</relationship-key>\r
-                                <relationship-value>ef86f9c5-2165-44f3-8fc3-96018b609ea5</relationship-value>\r
-                            </relationship-data>\r
-                        </relationship>\r
-                    </relationship-list>\r
-                </model-element>\r
-            </model-elements>\r
-        </model-ver>\r
-    </model-vers>\r
-</model>\r
+<model xmlns="http://org.openecomp.aai.inventory/v9">
+    <model-invariant-id>1e8fdfc0-03cf-4742-b060-dab818954d67</model-invariant-id>
+    <model-type>resource</model-type>
+    <model-vers>
+        <model-ver>
+            <model-version-id>da6769f0-aa58-4e90-b2c9-664c2630d131</model-version-id>
+            <model-name>Testvsp..vmme_small_ecomp..module-0</model-name>
+            <model-version>1</model-version>
+            <model-description></model-description>
+            <model-elements>
+                <model-element>
+                    <new-data-del-flag>F</new-data-del-flag>
+                    <cardinality>unbounded</cardinality>
+                    <model-elements>
+                        <model-element>
+                            <new-data-del-flag>F</new-data-del-flag>
+                            <cardinality>unbounded</cardinality>
+                            <model-elements>
+                                <model-element>
+                                    <new-data-del-flag>F</new-data-del-flag>
+                                    <cardinality>unbounded</cardinality>
+                                    <model-elements/>
+                                    <relationship-list>
+                                        <relationship>
+                                            <related-to>model-ver</related-to>
+                                            <relationship-data>
+                                                <relationship-key>model-ver.model-version-id</relationship-key>
+                                                <relationship-value>f6a038c2-820c-42ba-8c2b-375e24e8f932</relationship-value>
+                                            </relationship-data>
+                                            <relationship-data>
+                                                <relationship-key>model.model-invariant-id</relationship-key>
+                                                <relationship-value>3f4c7204-739b-4bbb-87a7-8a6856439c90</relationship-value>
+                                            </relationship-data>
+                                        </relationship>
+                                    </relationship-list>
+                                </model-element>
+                                <model-element>
+                                    <new-data-del-flag>F</new-data-del-flag>
+                                    <cardinality>unbounded</cardinality>
+                                    <model-elements/>
+                                    <relationship-list>
+                                        <relationship>
+                                            <related-to>model-ver</related-to>
+                                            <relationship-data>
+                                                <relationship-key>model-ver.model-version-id</relationship-key>
+                                                <relationship-value>abcc54bc-bb74-49dc-9043-7f7171707545</relationship-value>
+                                            </relationship-data>
+                                            <relationship-data>
+                                                <relationship-key>model.model-invariant-id</relationship-key>
+                                                <relationship-value>97c26c99-6870-44c1-8a07-1d900d3f4ce6</relationship-value>
+                                            </relationship-data>
+                                        </relationship>
+                                    </relationship-list>
+                                </model-element>
+                                <model-element>
+                                    <new-data-del-flag>F</new-data-del-flag>
+                                    <cardinality>unbounded</cardinality>
+                                    <model-elements/>
+                                    <relationship-list>
+                                        <relationship>
+                                            <related-to>model-ver</related-to>
+                                            <relationship-data>
+                                                <relationship-key>model-ver.model-version-id</relationship-key>
+                                                <relationship-value>36200fb5-f251-4f5d-a520-7c5ad5c2cd4b</relationship-value>
+                                            </relationship-data>
+                                            <relationship-data>
+                                                <relationship-key>model.model-invariant-id</relationship-key>
+                                                <relationship-value>bace8d1c-a261-4041-9e37-823117415d0f</relationship-value>
+                                            </relationship-data>
+                                        </relationship>
+                                    </relationship-list>
+                                </model-element>
+                                <model-element>
+                                    <new-data-del-flag>F</new-data-del-flag>
+                                    <cardinality>unbounded</cardinality>
+                                    <model-elements/>
+                                    <relationship-list>
+                                        <relationship>
+                                            <related-to>model-ver</related-to>
+                                            <relationship-data>
+                                                <relationship-key>model-ver.model-version-id</relationship-key>
+                                                <relationship-value>a32613fd-18b9-459e-aab8-fffb3912966a</relationship-value>
+                                            </relationship-data>
+                                            <relationship-data>
+                                                <relationship-key>model.model-invariant-id</relationship-key>
+                                                <relationship-value>cea0a982-8d55-4093-921e-418fbccf7060</relationship-value>
+                                            </relationship-data>
+                                        </relationship>
+                                    </relationship-list>
+                                </model-element>
+                                <model-element>
+                                    <new-data-del-flag>F</new-data-del-flag>
+                                    <cardinality>unbounded</cardinality>
+                                    <model-elements/>
+                                    <relationship-list>
+                                        <relationship>
+                                            <related-to>model-ver</related-to>
+                                            <relationship-data>
+                                                <relationship-key>model-ver.model-version-id</relationship-key>
+                                                <relationship-value>5761e0a7-c6df-4d8a-9ebd-b8f445054dec</relationship-value>
+                                            </relationship-data>
+                                            <relationship-data>
+                                                <relationship-key>model.model-invariant-id</relationship-key>
+                                                <relationship-value>96129eb9-f0de-4e05-8af2-73146473f766</relationship-value>
+                                            </relationship-data>
+                                        </relationship>
+                                    </relationship-list>
+                                </model-element>
+                            </model-elements>
+                            <relationship-list>
+                                <relationship>
+                                    <related-to>model-ver</related-to>
+                                    <relationship-data>
+                                        <relationship-key>model-ver.model-version-id</relationship-key>
+                                        <relationship-value>8ecb2c5d-7176-4317-a255-26274edfdd53</relationship-value>
+                                    </relationship-data>
+                                    <relationship-data>
+                                        <relationship-key>model.model-invariant-id</relationship-key>
+                                        <relationship-value>ff69d4e0-a8e8-4108-bdb0-dd63217e63c7</relationship-value>
+                                    </relationship-data>
+                                </relationship>
+                            </relationship-list>
+                        </model-element>
+                        <model-element>
+                            <new-data-del-flag>F</new-data-del-flag>
+                            <cardinality>unbounded</cardinality>
+                            <model-elements/>
+                            <relationship-list>
+                                <relationship>
+                                    <related-to>model-ver</related-to>
+                                    <relationship-data>
+                                        <relationship-key>model-ver.model-version-id</relationship-key>
+                                        <relationship-value>9111f20f-e680-4001-b83f-19a2fc23bfc1</relationship-value>
+                                    </relationship-data>
+                                    <relationship-data>
+                                        <relationship-key>model.model-invariant-id</relationship-key>
+                                        <relationship-value>3d560d81-57d0-438b-a2a1-5334dba0651a</relationship-value>
+                                    </relationship-data>
+                                </relationship>
+                            </relationship-list>
+                        </model-element>
+                    </model-elements>
+                    <relationship-list>
+                        <relationship>
+                            <related-to>model-ver</related-to>
+                            <relationship-data>
+                                <relationship-key>model-ver.model-version-id</relationship-key>
+                                <relationship-value>c00563ae-812b-4e62-8330-7c4d0f47088a</relationship-value>
+                            </relationship-data>
+                            <relationship-data>
+                                <relationship-key>model.model-invariant-id</relationship-key>
+                                <relationship-value>ef86f9c5-2165-44f3-8fc3-96018b609ea5</relationship-value>
+                            </relationship-data>
+                        </relationship>
+                    </relationship-list>
+                </model-element>
+            </model-elements>
+        </model-ver>
+    </model-vers>
+</model>
\ No newline at end of file
index 98941ad..e80d4f3 100644 (file)
@@ -1,52 +1,32 @@
-<!--\r
-  ============LICENSE_START=======================================================
-  MODEL LOADER SERVICE
-  ================================================================================
-  Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
-  ================================================================================
-  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
-  \r
-       http://www.apache.org/licenses/LICENSE-2.0\r
-  \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.
-  ============LICENSE_END=========================================================\r
-  -->\r
-\r
-<model xmlns="http://org.openecomp.aai.inventory/v9">\r
-    <model-invariant-id>5c12984d-db0f-4300-a0e0-9791775cc40f</model-invariant-id>\r
-    <model-type>resource</model-type>\r
-    <model-vers>\r
-        <model-ver>\r
-            <model-version-id>88bdbadf-db8a-490f-881e-c8effcbc3f66</model-version-id>\r
-            <model-name>VL</model-name>\r
-            <model-version>1</model-version>\r
-            <model-description> Virtual link (VL) describes the basic topology of the connectivity as well as other required parameters (e.g. bandwidth and QoS class). </model-description>\r
-            <model-elements>\r
-                <model-element>\r
-                    <new-data-del-flag>F</new-data-del-flag>\r
-                    <cardinality>unbounded</cardinality>\r
-                    <model-elements/>\r
-                    <relationship-list>\r
-                        <relationship>\r
-                            <related-to>model-ver</related-to>\r
-                            <relationship-data>\r
-                                <relationship-key>model-ver.model-version-id</relationship-key>\r
-                                <relationship-value>9111f20f-e680-4001-b83f-19a2fc23bfc1</relationship-value>\r
-                            </relationship-data>\r
-                            <relationship-data>\r
-                                <relationship-key>model.model-invariant-id</relationship-key>\r
-                                <relationship-value>3d560d81-57d0-438b-a2a1-5334dba0651a</relationship-value>\r
-                            </relationship-data>\r
-                        </relationship>\r
-                    </relationship-list>\r
-                </model-element>\r
-            </model-elements>\r
-        </model-ver>\r
-    </model-vers>\r
-</model>\r
+<model xmlns="http://org.openecomp.aai.inventory/v9">
+    <model-invariant-id>5c12984d-db0f-4300-a0e0-9791775cc40f</model-invariant-id>
+    <model-type>resource</model-type>
+    <model-vers>
+        <model-ver>
+            <model-version-id>88bdbadf-db8a-490f-881e-c8effcbc3f66</model-version-id>
+            <model-name>VL</model-name>
+            <model-version>1</model-version>
+            <model-description> Virtual link (VL) describes the basic topology of the connectivity as well as other required parameters (e.g. bandwidth and QoS class). </model-description>
+            <model-elements>
+                <model-element>
+                    <new-data-del-flag>F</new-data-del-flag>
+                    <cardinality>unbounded</cardinality>
+                    <model-elements/>
+                    <relationship-list>
+                        <relationship>
+                            <related-to>model-ver</related-to>
+                            <relationship-data>
+                                <relationship-key>model-ver.model-version-id</relationship-key>
+                                <relationship-value>9111f20f-e680-4001-b83f-19a2fc23bfc1</relationship-value>
+                            </relationship-data>
+                            <relationship-data>
+                                <relationship-key>model.model-invariant-id</relationship-key>
+                                <relationship-value>3d560d81-57d0-438b-a2a1-5334dba0651a</relationship-value>
+                            </relationship-data>
+                        </relationship>
+                    </relationship-list>
+                </model-element>
+            </model-elements>
+        </model-ver>
+    </model-vers>
+</model>
\ No newline at end of file
index 378b09e..20cfd11 100644 (file)
@@ -1,89 +1,69 @@
-<!--\r
-  ============LICENSE_START=======================================================
-  MODEL LOADER SERVICE
-  ================================================================================
-  Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
-  ================================================================================
-  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
-  \r
-       http://www.apache.org/licenses/LICENSE-2.0\r
-  \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.
-  ============LICENSE_END=========================================================\r
-  -->\r
-\r
-<model xmlns="http://org.openecomp.aai.inventory/v9">\r
-    <model-invariant-id>fedf9da3-6a74-4813-8fa2-221a98b0e7ad</model-invariant-id>\r
-    <model-type>service</model-type>\r
-    <model-vers>\r
-        <model-ver>\r
-            <model-version-id>e0373537-7f66-4094-9939-e2f5de6ff5f6</model-version-id>\r
-            <model-name>stellService</model-name>\r
-            <model-version>1</model-version>\r
-            <model-description>fd</model-description>\r
-            <model-elements>\r
-                <model-element>\r
-                    <new-data-del-flag>F</new-data-del-flag>\r
-                    <cardinality>unbounded</cardinality>\r
-                    <model-elements>\r
-                        <model-element>\r
-                            <new-data-del-flag>F</new-data-del-flag>\r
-                            <cardinality>unbounded</cardinality>\r
-                            <model-elements/>\r
-                            <relationship-list>\r
-                                <relationship>\r
-                                    <related-to>model-ver</related-to>\r
-                                    <relationship-data>\r
-                                        <relationship-key>model-ver.model-version-id</relationship-key>\r
-                                        <relationship-value>88bdbadf-db8a-490f-881e-c8effcbc3f66</relationship-value>\r
-                                    </relationship-data>\r
-                                    <relationship-data>\r
-                                        <relationship-key>model.model-invariant-id</relationship-key>\r
-                                        <relationship-value>5c12984d-db0f-4300-a0e0-9791775cc40f</relationship-value>\r
-                                    </relationship-data>\r
-                                </relationship>\r
-                            </relationship-list>\r
-                        </model-element>\r
-                        <model-element>\r
-                            <new-data-del-flag>F</new-data-del-flag>\r
-                            <cardinality>unbounded</cardinality>\r
-                            <model-elements/>\r
-                            <relationship-list>\r
-                                <relationship>\r
-                                    <related-to>model-ver</related-to>\r
-                                    <relationship-data>\r
-                                        <relationship-key>model-ver.model-version-id</relationship-key>\r
-                                        <relationship-value>374d0899-bbc2-4403-9320-fe9bebef75c6</relationship-value>\r
-                                    </relationship-data>\r
-                                    <relationship-data>\r
-                                        <relationship-key>model.model-invariant-id</relationship-key>\r
-                                        <relationship-value>959b7c09-9f34-4e5f-8b63-505381db176e</relationship-value>\r
-                                    </relationship-data>\r
-                                </relationship>\r
-                            </relationship-list>\r
-                        </model-element>\r
-                    </model-elements>\r
-                    <relationship-list>\r
-                        <relationship>\r
-                            <related-to>model-ver</related-to>\r
-                            <relationship-data>\r
-                                <relationship-key>model-ver.model-version-id</relationship-key>\r
-                                <relationship-value>46b92144-923a-4d20-b85a-3cbd847668a9</relationship-value>\r
-                            </relationship-data>\r
-                            <relationship-data>\r
-                                <relationship-key>model.model-invariant-id</relationship-key>\r
-                                <relationship-value>82194af1-3c2c-485a-8f44-420e22a9eaa4</relationship-value>\r
-                            </relationship-data>\r
-                        </relationship>\r
-                    </relationship-list>\r
-                </model-element>\r
-            </model-elements>\r
-        </model-ver>\r
-    </model-vers>\r
-</model>\r
+<model xmlns="http://org.openecomp.aai.inventory/v9">
+    <model-invariant-id>fedf9da3-6a74-4813-8fa2-221a98b0e7ad</model-invariant-id>
+    <model-type>service</model-type>
+    <model-vers>
+        <model-ver>
+            <model-version-id>e0373537-7f66-4094-9939-e2f5de6ff5f6</model-version-id>
+            <model-name>stellService</model-name>
+            <model-version>1</model-version>
+            <model-description>fd</model-description>
+            <model-elements>
+                <model-element>
+                    <new-data-del-flag>F</new-data-del-flag>
+                    <cardinality>unbounded</cardinality>
+                    <model-elements>
+                        <model-element>
+                            <new-data-del-flag>F</new-data-del-flag>
+                            <cardinality>unbounded</cardinality>
+                            <model-elements/>
+                            <relationship-list>
+                                <relationship>
+                                    <related-to>model-ver</related-to>
+                                    <relationship-data>
+                                        <relationship-key>model-ver.model-version-id</relationship-key>
+                                        <relationship-value>88bdbadf-db8a-490f-881e-c8effcbc3f66</relationship-value>
+                                    </relationship-data>
+                                    <relationship-data>
+                                        <relationship-key>model.model-invariant-id</relationship-key>
+                                        <relationship-value>5c12984d-db0f-4300-a0e0-9791775cc40f</relationship-value>
+                                    </relationship-data>
+                                </relationship>
+                            </relationship-list>
+                        </model-element>
+                        <model-element>
+                            <new-data-del-flag>F</new-data-del-flag>
+                            <cardinality>unbounded</cardinality>
+                            <model-elements/>
+                            <relationship-list>
+                                <relationship>
+                                    <related-to>model-ver</related-to>
+                                    <relationship-data>
+                                        <relationship-key>model-ver.model-version-id</relationship-key>
+                                        <relationship-value>374d0899-bbc2-4403-9320-fe9bebef75c6</relationship-value>
+                                    </relationship-data>
+                                    <relationship-data>
+                                        <relationship-key>model.model-invariant-id</relationship-key>
+                                        <relationship-value>959b7c09-9f34-4e5f-8b63-505381db176e</relationship-value>
+                                    </relationship-data>
+                                </relationship>
+                            </relationship-list>
+                        </model-element>
+                    </model-elements>
+                    <relationship-list>
+                        <relationship>
+                            <related-to>model-ver</related-to>
+                            <relationship-data>
+                                <relationship-key>model-ver.model-version-id</relationship-key>
+                                <relationship-value>46b92144-923a-4d20-b85a-3cbd847668a9</relationship-value>
+                            </relationship-data>
+                            <relationship-data>
+                                <relationship-key>model.model-invariant-id</relationship-key>
+                                <relationship-value>82194af1-3c2c-485a-8f44-420e22a9eaa4</relationship-value>
+                            </relationship-data>
+                        </relationship>
+                    </relationship-list>
+                </model-element>
+            </model-elements>
+        </model-ver>
+    </model-vers>
+</model>
\ No newline at end of file
index c9a70ff..bafecfb 100644 (file)
@@ -1,89 +1,69 @@
-<!--\r
-  ============LICENSE_START=======================================================
-  MODEL LOADER SERVICE
-  ================================================================================
-  Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
-  ================================================================================
-  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
-  \r
-       http://www.apache.org/licenses/LICENSE-2.0\r
-  \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.
-  ============LICENSE_END=========================================================\r
-  -->\r
-\r
-<model xmlns="http://org.openecomp.aai.inventory/v9">\r
-    <model-invariant-id>959b7c09-9f34-4e5f-8b63-505381db176e</model-invariant-id>\r
-    <model-type>resource</model-type>\r
-    <model-vers>\r
-        <model-ver>\r
-            <model-version-id>374d0899-bbc2-4403-9320-fe9bebef75c6</model-version-id>\r
-            <model-name>testvsp</model-name>\r
-            <model-version>1</model-version>\r
-            <model-description>nkjlkl</model-description>\r
-            <model-elements>\r
-                <model-element>\r
-                    <new-data-del-flag>F</new-data-del-flag>\r
-                    <cardinality>unbounded</cardinality>\r
-                    <model-elements>\r
-                        <model-element>\r
-                            <new-data-del-flag>F</new-data-del-flag>\r
-                            <cardinality>unbounded</cardinality>\r
-                            <model-elements/>\r
-                            <relationship-list>\r
-                                <relationship>\r
-                                    <related-to>model-ver</related-to>\r
-                                    <relationship-data>\r
-                                        <relationship-key>model-ver.model-version-id</relationship-key>\r
-                                        <relationship-value>da6769f0-aa58-4e90-b2c9-664c2630d131</relationship-value>\r
-                                    </relationship-data>\r
-                                    <relationship-data>\r
-                                        <relationship-key>model.model-invariant-id</relationship-key>\r
-                                        <relationship-value>1e8fdfc0-03cf-4742-b060-dab818954d67</relationship-value>\r
-                                    </relationship-data>\r
-                                </relationship>\r
-                            </relationship-list>\r
-                        </model-element>\r
-                        <model-element>\r
-                            <new-data-del-flag>F</new-data-del-flag>\r
-                            <cardinality>unbounded</cardinality>\r
-                            <model-elements/>\r
-                            <relationship-list>\r
-                                <relationship>\r
-                                    <related-to>model-ver</related-to>\r
-                                    <relationship-data>\r
-                                        <relationship-key>model-ver.model-version-id</relationship-key>\r
-                                        <relationship-value>29d3fc43-4ff2-4e5c-acd0-7370f5b2715a</relationship-value>\r
-                                    </relationship-data>\r
-                                    <relationship-data>\r
-                                        <relationship-key>model.model-invariant-id</relationship-key>\r
-                                        <relationship-value>5a2aac99-ffe8-415f-9242-420ed10da23e</relationship-value>\r
-                                    </relationship-data>\r
-                                </relationship>\r
-                            </relationship-list>\r
-                        </model-element>\r
-                    </model-elements>\r
-                    <relationship-list>\r
-                        <relationship>\r
-                            <related-to>model-ver</related-to>\r
-                            <relationship-data>\r
-                                <relationship-key>model-ver.model-version-id</relationship-key>\r
-                                <relationship-value>93a6166f-b3d5-4f06-b4ba-aed48d009ad9</relationship-value>\r
-                            </relationship-data>\r
-                            <relationship-data>\r
-                                <relationship-key>model.model-invariant-id</relationship-key>\r
-                                <relationship-value>acc6edd8-a8d4-4b93-afaa-0994068be14c</relationship-value>\r
-                            </relationship-data>\r
-                        </relationship>\r
-                    </relationship-list>\r
-                </model-element>\r
-            </model-elements>\r
-        </model-ver>\r
-    </model-vers>\r
-</model>\r
+<model xmlns="http://org.openecomp.aai.inventory/v9">
+    <model-invariant-id>959b7c09-9f34-4e5f-8b63-505381db176e</model-invariant-id>
+    <model-type>resource</model-type>
+    <model-vers>
+        <model-ver>
+            <model-version-id>374d0899-bbc2-4403-9320-fe9bebef75c6</model-version-id>
+            <model-name>testvsp</model-name>
+            <model-version>1</model-version>
+            <model-description>nkjlkl</model-description>
+            <model-elements>
+                <model-element>
+                    <new-data-del-flag>F</new-data-del-flag>
+                    <cardinality>unbounded</cardinality>
+                    <model-elements>
+                        <model-element>
+                            <new-data-del-flag>F</new-data-del-flag>
+                            <cardinality>unbounded</cardinality>
+                            <model-elements/>
+                            <relationship-list>
+                                <relationship>
+                                    <related-to>model-ver</related-to>
+                                    <relationship-data>
+                                        <relationship-key>model-ver.model-version-id</relationship-key>
+                                        <relationship-value>da6769f0-aa58-4e90-b2c9-664c2630d131</relationship-value>
+                                    </relationship-data>
+                                    <relationship-data>
+                                        <relationship-key>model.model-invariant-id</relationship-key>
+                                        <relationship-value>1e8fdfc0-03cf-4742-b060-dab818954d67</relationship-value>
+                                    </relationship-data>
+                                </relationship>
+                            </relationship-list>
+                        </model-element>
+                        <model-element>
+                            <new-data-del-flag>F</new-data-del-flag>
+                            <cardinality>unbounded</cardinality>
+                            <model-elements/>
+                            <relationship-list>
+                                <relationship>
+                                    <related-to>model-ver</related-to>
+                                    <relationship-data>
+                                        <relationship-key>model-ver.model-version-id</relationship-key>
+                                        <relationship-value>29d3fc43-4ff2-4e5c-acd0-7370f5b2715a</relationship-value>
+                                    </relationship-data>
+                                    <relationship-data>
+                                        <relationship-key>model.model-invariant-id</relationship-key>
+                                        <relationship-value>5a2aac99-ffe8-415f-9242-420ed10da23e</relationship-value>
+                                    </relationship-data>
+                                </relationship>
+                            </relationship-list>
+                        </model-element>
+                    </model-elements>
+                    <relationship-list>
+                        <relationship>
+                            <related-to>model-ver</related-to>
+                            <relationship-data>
+                                <relationship-key>model-ver.model-version-id</relationship-key>
+                                <relationship-value>93a6166f-b3d5-4f06-b4ba-aed48d009ad9</relationship-value>
+                            </relationship-data>
+                            <relationship-data>
+                                <relationship-key>model.model-invariant-id</relationship-key>
+                                <relationship-value>acc6edd8-a8d4-4b93-afaa-0994068be14c</relationship-value>
+                            </relationship-data>
+                        </relationship>
+                    </relationship-list>
+                </model-element>
+            </model-elements>
+        </model-ver>
+    </model-vers>
+</model>
\ No newline at end of file
diff --git a/src/test/resources/models/complete-model.xml b/src/test/resources/models/complete-model.xml
deleted file mode 100644 (file)
index 394c073..0000000
+++ /dev/null
@@ -1,384 +0,0 @@
-<!--\r
-  ============LICENSE_START=======================================================
-  MODEL LOADER SERVICE
-  ================================================================================
-  Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
-  ================================================================================
-  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
-  \r
-       http://www.apache.org/licenses/LICENSE-2.0\r
-  \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.
-  ============LICENSE_END=========================================================\r
-  -->\r
-\r
-<models xmlns="http://org.openecomp.aai.inventory/v9">\r
-  <model>\r
-    <model-invariant-id>5c12984d-db0f-4300-a0e0-9791775cc40f</model-invariant-id>\r
-    <model-type>resource</model-type>\r
-    <model-vers>\r
-        <model-ver>\r
-            <model-version-id>88bdbadf-db8a-490f-881e-c8effcbc3f66</model-version-id>\r
-            <model-name>VL</model-name>\r
-            <model-version>1</model-version>\r
-            <model-description> Virtual link (VL) describes the basic topology of the connectivity as well as other required parameters (e.g. bandwidth and QoS class). </model-description>\r
-            <model-elements>\r
-                <model-element>\r
-                    <new-data-del-flag>F</new-data-del-flag>\r
-                    <cardinality>unbounded</cardinality>\r
-                    <model-elements/>\r
-                    <relationship-list>\r
-                        <relationship>\r
-                            <related-to>model-ver</related-to>\r
-                            <relationship-data>\r
-                                <relationship-key>model-ver.model-version-id</relationship-key>\r
-                                <relationship-value>9111f20f-e680-4001-b83f-19a2fc23bfc1</relationship-value>\r
-                            </relationship-data>\r
-                            <relationship-data>\r
-                                <relationship-key>model.model-invariant-id</relationship-key>\r
-                                <relationship-value>3d560d81-57d0-438b-a2a1-5334dba0651a</relationship-value>\r
-                            </relationship-data>\r
-                        </relationship>\r
-                    </relationship-list>\r
-                </model-element>\r
-            </model-elements>\r
-        </model-ver>\r
-    </model-vers>\r
-</model>\r
-<model>\r
-    <model-invariant-id>1e8fdfc0-03cf-4742-b060-dab818954d67</model-invariant-id>\r
-    <model-type>resource</model-type>\r
-    <model-vers>\r
-        <model-ver>\r
-            <model-version-id>da6769f0-aa58-4e90-b2c9-664c2630d131</model-version-id>\r
-            <model-name>Testvsp..vmme_small_ecomp..module-0</model-name>\r
-            <model-version>1</model-version>\r
-            <model-description></model-description>\r
-            <model-elements>\r
-                <model-element>\r
-                    <new-data-del-flag>F</new-data-del-flag>\r
-                    <cardinality>unbounded</cardinality>\r
-                    <model-elements>\r
-                        <model-element>\r
-                            <new-data-del-flag>F</new-data-del-flag>\r
-                            <cardinality>unbounded</cardinality>\r
-                            <model-elements>\r
-                                <model-element>\r
-                                    <new-data-del-flag>F</new-data-del-flag>\r
-                                    <cardinality>unbounded</cardinality>\r
-                                    <model-elements/>\r
-                                    <relationship-list>\r
-                                        <relationship>\r
-                                            <related-to>model-ver</related-to>\r
-                                            <relationship-data>\r
-                                                <relationship-key>model-ver.model-version-id</relationship-key>\r
-                                                <relationship-value>f6a038c2-820c-42ba-8c2b-375e24e8f932</relationship-value>\r
-                                            </relationship-data>\r
-                                            <relationship-data>\r
-                                                <relationship-key>model.model-invariant-id</relationship-key>\r
-                                                <relationship-value>3f4c7204-739b-4bbb-87a7-8a6856439c90</relationship-value>\r
-                                            </relationship-data>\r
-                                        </relationship>\r
-                                    </relationship-list>\r
-                                </model-element>\r
-                                <model-element>\r
-                                    <new-data-del-flag>F</new-data-del-flag>\r
-                                    <cardinality>unbounded</cardinality>\r
-                                    <model-elements/>\r
-                                    <relationship-list>\r
-                                        <relationship>\r
-                                            <related-to>model-ver</related-to>\r
-                                            <relationship-data>\r
-                                                <relationship-key>model-ver.model-version-id</relationship-key>\r
-                                                <relationship-value>abcc54bc-bb74-49dc-9043-7f7171707545</relationship-value>\r
-                                            </relationship-data>\r
-                                            <relationship-data>\r
-                                                <relationship-key>model.model-invariant-id</relationship-key>\r
-                                                <relationship-value>97c26c99-6870-44c1-8a07-1d900d3f4ce6</relationship-value>\r
-                                            </relationship-data>\r
-                                        </relationship>\r
-                                    </relationship-list>\r
-                                </model-element>\r
-                                <model-element>\r
-                                    <new-data-del-flag>F</new-data-del-flag>\r
-                                    <cardinality>unbounded</cardinality>\r
-                                    <model-elements/>\r
-                                    <relationship-list>\r
-                                        <relationship>\r
-                                            <related-to>model-ver</related-to>\r
-                                            <relationship-data>\r
-                                                <relationship-key>model-ver.model-version-id</relationship-key>\r
-                                                <relationship-value>36200fb5-f251-4f5d-a520-7c5ad5c2cd4b</relationship-value>\r
-                                            </relationship-data>\r
-                                            <relationship-data>\r
-                                                <relationship-key>model.model-invariant-id</relationship-key>\r
-                                                <relationship-value>bace8d1c-a261-4041-9e37-823117415d0f</relationship-value>\r
-                                            </relationship-data>\r
-                                        </relationship>\r
-                                    </relationship-list>\r
-                                </model-element>\r
-                                <model-element>\r
-                                    <new-data-del-flag>F</new-data-del-flag>\r
-                                    <cardinality>unbounded</cardinality>\r
-                                    <model-elements/>\r
-                                    <relationship-list>\r
-                                        <relationship>\r
-                                            <related-to>model-ver</related-to>\r
-                                            <relationship-data>\r
-                                                <relationship-key>model-ver.model-version-id</relationship-key>\r
-                                                <relationship-value>a32613fd-18b9-459e-aab8-fffb3912966a</relationship-value>\r
-                                            </relationship-data>\r
-                                            <relationship-data>\r
-                                                <relationship-key>model.model-invariant-id</relationship-key>\r
-                                                <relationship-value>cea0a982-8d55-4093-921e-418fbccf7060</relationship-value>\r
-                                            </relationship-data>\r
-                                        </relationship>\r
-                                    </relationship-list>\r
-                                </model-element>\r
-                                <model-element>\r
-                                    <new-data-del-flag>F</new-data-del-flag>\r
-                                    <cardinality>unbounded</cardinality>\r
-                                    <model-elements/>\r
-                                    <relationship-list>\r
-                                        <relationship>\r
-                                            <related-to>model-ver</related-to>\r
-                                            <relationship-data>\r
-                                                <relationship-key>model-ver.model-version-id</relationship-key>\r
-                                                <relationship-value>5761e0a7-c6df-4d8a-9ebd-b8f445054dec</relationship-value>\r
-                                            </relationship-data>\r
-                                            <relationship-data>\r
-                                                <relationship-key>model.model-invariant-id</relationship-key>\r
-                                                <relationship-value>96129eb9-f0de-4e05-8af2-73146473f766</relationship-value>\r
-                                            </relationship-data>\r
-                                        </relationship>\r
-                                    </relationship-list>\r
-                                </model-element>\r
-                            </model-elements>\r
-                            <relationship-list>\r
-                                <relationship>\r
-                                    <related-to>model-ver</related-to>\r
-                                    <relationship-data>\r
-                                        <relationship-key>model-ver.model-version-id</relationship-key>\r
-                                        <relationship-value>8ecb2c5d-7176-4317-a255-26274edfdd53</relationship-value>\r
-                                    </relationship-data>\r
-                                    <relationship-data>\r
-                                        <relationship-key>model.model-invariant-id</relationship-key>\r
-                                        <relationship-value>ff69d4e0-a8e8-4108-bdb0-dd63217e63c7</relationship-value>\r
-                                    </relationship-data>\r
-                                </relationship>\r
-                            </relationship-list>\r
-                        </model-element>\r
-                        <model-element>\r
-                            <new-data-del-flag>F</new-data-del-flag>\r
-                            <cardinality>unbounded</cardinality>\r
-                            <model-elements/>\r
-                            <relationship-list>\r
-                                <relationship>\r
-                                    <related-to>model-ver</related-to>\r
-                                    <relationship-data>\r
-                                        <relationship-key>model-ver.model-version-id</relationship-key>\r
-                                        <relationship-value>9111f20f-e680-4001-b83f-19a2fc23bfc1</relationship-value>\r
-                                    </relationship-data>\r
-                                    <relationship-data>\r
-                                        <relationship-key>model.model-invariant-id</relationship-key>\r
-                                        <relationship-value>3d560d81-57d0-438b-a2a1-5334dba0651a</relationship-value>\r
-                                    </relationship-data>\r
-                                </relationship>\r
-                            </relationship-list>\r
-                        </model-element>\r
-                    </model-elements>\r
-                    <relationship-list>\r
-                        <relationship>\r
-                            <related-to>model-ver</related-to>\r
-                            <relationship-data>\r
-                                <relationship-key>model-ver.model-version-id</relationship-key>\r
-                                <relationship-value>c00563ae-812b-4e62-8330-7c4d0f47088a</relationship-value>\r
-                            </relationship-data>\r
-                            <relationship-data>\r
-                                <relationship-key>model.model-invariant-id</relationship-key>\r
-                                <relationship-value>ef86f9c5-2165-44f3-8fc3-96018b609ea5</relationship-value>\r
-                            </relationship-data>\r
-                        </relationship>\r
-                    </relationship-list>\r
-                </model-element>\r
-            </model-elements>\r
-        </model-ver>\r
-    </model-vers>\r
-</model>\r
-<model>\r
-    <model-invariant-id>5a2aac99-ffe8-415f-9242-420ed10da23e</model-invariant-id>\r
-    <model-type>resource</model-type>\r
-    <model-vers>\r
-        <model-ver>\r
-            <model-version-id>29d3fc43-4ff2-4e5c-acd0-7370f5b2715a</model-version-id>\r
-            <model-name>Testvsp..vmme_cinder..module-1</model-name>\r
-            <model-version>1</model-version>\r
-            <model-description></model-description>\r
-            <model-elements>\r
-                <model-element>\r
-                    <new-data-del-flag>F</new-data-del-flag>\r
-                    <cardinality>unbounded</cardinality>\r
-                    <model-elements/>\r
-                    <relationship-list>\r
-                        <relationship>\r
-                            <related-to>model-ver</related-to>\r
-                            <relationship-data>\r
-                                <relationship-key>model-ver.model-version-id</relationship-key>\r
-                                <relationship-value>c00563ae-812b-4e62-8330-7c4d0f47088a</relationship-value>\r
-                            </relationship-data>\r
-                            <relationship-data>\r
-                                <relationship-key>model.model-invariant-id</relationship-key>\r
-                                <relationship-value>ef86f9c5-2165-44f3-8fc3-96018b609ea5</relationship-value>\r
-                            </relationship-data>\r
-                        </relationship>\r
-                    </relationship-list>\r
-                </model-element>\r
-            </model-elements>\r
-        </model-ver>\r
-    </model-vers>\r
-</model>\r
-<model>\r
-    <model-invariant-id>959b7c09-9f34-4e5f-8b63-505381db176e</model-invariant-id>\r
-    <model-type>resource</model-type>\r
-    <model-vers>\r
-        <model-ver>\r
-            <model-version-id>374d0899-bbc2-4403-9320-fe9bebef75c6</model-version-id>\r
-            <model-name>testvsp</model-name>\r
-            <model-version>1</model-version>\r
-            <model-description>nkjlkl</model-description>\r
-            <model-elements>\r
-                <model-element>\r
-                    <new-data-del-flag>F</new-data-del-flag>\r
-                    <cardinality>unbounded</cardinality>\r
-                    <model-elements>\r
-                        <model-element>\r
-                            <new-data-del-flag>F</new-data-del-flag>\r
-                            <cardinality>unbounded</cardinality>\r
-                            <model-elements/>\r
-                            <relationship-list>\r
-                                <relationship>\r
-                                    <related-to>model-ver</related-to>\r
-                                    <relationship-data>\r
-                                        <relationship-key>model-ver.model-version-id</relationship-key>\r
-                                        <relationship-value>da6769f0-aa58-4e90-b2c9-664c2630d131</relationship-value>\r
-                                    </relationship-data>\r
-                                    <relationship-data>\r
-                                        <relationship-key>model.model-invariant-id</relationship-key>\r
-                                        <relationship-value>1e8fdfc0-03cf-4742-b060-dab818954d67</relationship-value>\r
-                                    </relationship-data>\r
-                                </relationship>\r
-                            </relationship-list>\r
-                        </model-element>\r
-                        <model-element>\r
-                            <new-data-del-flag>F</new-data-del-flag>\r
-                            <cardinality>unbounded</cardinality>\r
-                            <model-elements/>\r
-                            <relationship-list>\r
-                                <relationship>\r
-                                    <related-to>model-ver</related-to>\r
-                                    <relationship-data>\r
-                                        <relationship-key>model-ver.model-version-id</relationship-key>\r
-                                        <relationship-value>29d3fc43-4ff2-4e5c-acd0-7370f5b2715a</relationship-value>\r
-                                    </relationship-data>\r
-                                    <relationship-data>\r
-                                        <relationship-key>model.model-invariant-id</relationship-key>\r
-                                        <relationship-value>5a2aac99-ffe8-415f-9242-420ed10da23e</relationship-value>\r
-                                    </relationship-data>\r
-                                </relationship>\r
-                            </relationship-list>\r
-                        </model-element>\r
-                    </model-elements>\r
-                    <relationship-list>\r
-                        <relationship>\r
-                            <related-to>model-ver</related-to>\r
-                            <relationship-data>\r
-                                <relationship-key>model-ver.model-version-id</relationship-key>\r
-                                <relationship-value>93a6166f-b3d5-4f06-b4ba-aed48d009ad9</relationship-value>\r
-                            </relationship-data>\r
-                            <relationship-data>\r
-                                <relationship-key>model.model-invariant-id</relationship-key>\r
-                                <relationship-value>acc6edd8-a8d4-4b93-afaa-0994068be14c</relationship-value>\r
-                            </relationship-data>\r
-                        </relationship>\r
-                    </relationship-list>\r
-                </model-element>\r
-            </model-elements>\r
-        </model-ver>\r
-    </model-vers>\r
-</model>\r
-<model>\r
-    <model-invariant-id>fedf9da3-6a74-4813-8fa2-221a98b0e7ad</model-invariant-id>\r
-    <model-type>service</model-type>\r
-    <model-vers>\r
-        <model-ver>\r
-            <model-version-id>e0373537-7f66-4094-9939-e2f5de6ff5f6</model-version-id>\r
-            <model-name>stellService</model-name>\r
-            <model-version>1</model-version>\r
-            <model-description>fd</model-description>\r
-            <model-elements>\r
-                <model-element>\r
-                    <new-data-del-flag>F</new-data-del-flag>\r
-                    <cardinality>unbounded</cardinality>\r
-                    <model-elements>\r
-                        <model-element>\r
-                            <new-data-del-flag>F</new-data-del-flag>\r
-                            <cardinality>unbounded</cardinality>\r
-                            <model-elements/>\r
-                            <relationship-list>\r
-                                <relationship>\r
-                                    <related-to>model-ver</related-to>\r
-                                    <relationship-data>\r
-                                        <relationship-key>model-ver.model-version-id</relationship-key>\r
-                                        <relationship-value>88bdbadf-db8a-490f-881e-c8effcbc3f66</relationship-value>\r
-                                    </relationship-data>\r
-                                    <relationship-data>\r
-                                        <relationship-key>model.model-invariant-id</relationship-key>\r
-                                        <relationship-value>5c12984d-db0f-4300-a0e0-9791775cc40f</relationship-value>\r
-                                    </relationship-data>\r
-                                </relationship>\r
-                            </relationship-list>\r
-                        </model-element>\r
-                        <model-element>\r
-                            <new-data-del-flag>F</new-data-del-flag>\r
-                            <cardinality>unbounded</cardinality>\r
-                            <model-elements/>\r
-                            <relationship-list>\r
-                                <relationship>\r
-                                    <related-to>model-ver</related-to>\r
-                                    <relationship-data>\r
-                                        <relationship-key>model-ver.model-version-id</relationship-key>\r
-                                        <relationship-value>374d0899-bbc2-4403-9320-fe9bebef75c6</relationship-value>\r
-                                    </relationship-data>\r
-                                    <relationship-data>\r
-                                        <relationship-key>model.model-invariant-id</relationship-key>\r
-                                        <relationship-value>959b7c09-9f34-4e5f-8b63-505381db176e</relationship-value>\r
-                                    </relationship-data>\r
-                                </relationship>\r
-                            </relationship-list>\r
-                        </model-element>\r
-                    </model-elements>\r
-                    <relationship-list>\r
-                        <relationship>\r
-                            <related-to>model-ver</related-to>\r
-                            <relationship-data>\r
-                                <relationship-key>model-ver.model-version-id</relationship-key>\r
-                                <relationship-value>46b92144-923a-4d20-b85a-3cbd847668a9</relationship-value>\r
-                            </relationship-data>\r
-                            <relationship-data>\r
-                                <relationship-key>model.model-invariant-id</relationship-key>\r
-                                <relationship-value>82194af1-3c2c-485a-8f44-420e22a9eaa4</relationship-value>\r
-                            </relationship-data>\r
-                        </relationship>\r
-                    </relationship-list>\r
-                </model-element>\r
-            </model-elements>\r
-        </model-ver>\r
-    </model-vers>\r
-  </model>\r
-</models>\r
index b30d4d7..5bc0581 100644 (file)
@@ -1,37 +1,17 @@
-<!--\r
-  ============LICENSE_START=======================================================
-  MODEL LOADER SERVICE
-  ================================================================================
-  Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
-  ================================================================================
-  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
-  \r
-       http://www.apache.org/licenses/LICENSE-2.0\r
-  \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.
-  ============LICENSE_END=========================================================\r
-  -->\r
-\r
-<model xmlns="http://org.openecomp.aai.inventory/v9">\r
-    <model-type>resource</model-type>\r
-    <model-vers>\r
-        <model-ver>\r
-            <model-name>VL</model-name>\r
-            <model-version>1</model-version>\r
-            <model-description> Virtual link (VL) describes the basic topology of the connectivity as well as other required parameters (e.g. bandwidth and QoS class). </model-description>\r
-            <model-elements>\r
-                <model-element>\r
-                    <new-data-del-flag>F</new-data-del-flag>\r
-                    <cardinality>unbounded</cardinality>\r
-                    <model-elements/>\r
-                </model-element>\r
-            </model-elements>\r
-        </model-ver>\r
-    </model-vers>\r
-</model>\r
+<model xmlns="http://org.openecomp.aai.inventory/v9">
+    <model-type>resource</model-type>
+    <model-vers>
+        <model-ver>
+            <model-name>VL</model-name>
+            <model-version>1</model-version>
+            <model-description> Virtual link (VL) describes the basic topology of the connectivity as well as other required parameters (e.g. bandwidth and QoS class). </model-description>
+            <model-elements>
+                <model-element>
+                    <new-data-del-flag>F</new-data-del-flag>
+                    <cardinality>unbounded</cardinality>
+                    <model-elements/>
+                </model-element>
+            </model-elements>
+        </model-ver>
+    </model-vers>
+</model>
\ No newline at end of file
diff --git a/src/test/resources/models/incomplete-models.xml b/src/test/resources/models/incomplete-models.xml
deleted file mode 100644 (file)
index 56b10de..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-<!--\r
-  ============LICENSE_START=======================================================
-  MODEL LOADER SERVICE
-  ================================================================================
-  Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
-  ================================================================================
-  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
-  \r
-       http://www.apache.org/licenses/LICENSE-2.0\r
-  \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.
-  ============LICENSE_END=========================================================\r
-  -->\r
-\r
-<models xmlns="http://org.openecomp.aai.inventory/v9">\r
-<model>\r
-   <model-invariant-id>3d560d81-57d0-438b-a2a1-5334dba0651a</model-invariant-id>\r
-       <model-type>widget</model-type>\r
-       <model-vers>\r
-               <model-ver>\r
-                       <model-version-id>9111f20f-e680-4001-b83f-19a2fc23bfc1</model-version-id>\r
-                       <model-version>1.0</model-version>\r
-                       <model-name>l3-network</model-name>\r
-               </model-ver>\r
-       </model-vers>\r
-</model>\r
-<model>\r
-    <model-type>resource</model-type>\r
-    <model-vers>\r
-        <model-ver>\r
-            <model-name>VL</model-name>\r
-            <model-version>1</model-version>\r
-            <model-description> Virtual link (VL) describes the basic topology of the connectivity as well as other required parameters (e.g. bandwidth and QoS class). </model-description>\r
-            <model-elements>\r
-                <model-element>\r
-                    <new-data-del-flag>F</new-data-del-flag>\r
-                    <cardinality>unbounded</cardinality>\r
-                    <model-elements/>\r
-                </model-element>\r
-            </model-elements>\r
-        </model-ver>\r
-    </model-vers>\r
-</model>\r
-</models>\r
index 906cd21..865f5d3 100644 (file)
@@ -1,51 +1,31 @@
-<!--\r
-  ============LICENSE_START=======================================================
-  MODEL LOADER SERVICE
-  ================================================================================
-  Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
-  ================================================================================
-  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
-  \r
-       http://www.apache.org/licenses/LICENSE-2.0\r
-  \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.
-  ============LICENSE_END=========================================================\r
-  -->\r
-\r
-<model xmlns="http://org.openecomp.aai.inventory/v9">\r
-    <model-invariant-id>5c12984d-db0f-4300-a0e0-9791775cc40f</model-invariant-id>\r
-    <model-type>resource</model-type>\r
-    <model-vers>\r
-        <model-ver>\r
-            <model-version-id>88bdbadf-db8a-490f-881e-c8effcbc3f66</model-version-id>\r
-            <model-name>VL</model-name>\r
-            <model-version>1</model-version>\r
-            <model-description> Virtual link (VL) describes the basic topology of the connectivity as well as other required parameters (e.g. bandwidth and QoS class). </model-description>\r
-            <model-elements>\r
-                <model-element>\r
-                    <new-data-del-flag>F</new-data-del-flag>\r
-                    <cardinality>unbounded</cardinality>\r
-                    <model-elements/>\r
-                    <relationship-list>\r
-                        <relationship>\r
-                            <related-to>model-ver</related-to>\r
-                            <relationship-data>\r
-                                <relationship-key>model-ver.model-version-id</relationship-key>\r
-                                <relationship-value>9111f20f-e680-4001-b83f-19a2fc23bfc1</relationship-value>\r
-                            </relationship-data>\r
-                            <relationship-data>\r
-                                <relationship-key>model.model-invariant-id</relationship-key>\r
-                                <relationship-value>3d560d81-57d0-438b-a2a1-5334dba0651a</relationship-value>\r
-                            </relationship-data>\r
-                        </relationship>\r
-                    </relationship-list>\r
-                </model-element>\r
-            </model-elements>\r
-        </model-ver>\r
-    </model-vers>\r
+<model xmlns="http://org.openecomp.aai.inventory/v9">
+    <model-invariant-id>5c12984d-db0f-4300-a0e0-9791775cc40f</model-invariant-id>
+    <model-type>resource</model-type>
+    <model-vers>
+        <model-ver>
+            <model-version-id>88bdbadf-db8a-490f-881e-c8effcbc3f66</model-version-id>
+            <model-name>VL</model-name>
+            <model-version>1</model-version>
+            <model-description> Virtual link (VL) describes the basic topology of the connectivity as well as other required parameters (e.g. bandwidth and QoS class). </model-description>
+            <model-elements>
+                <model-element>
+                    <new-data-del-flag>F</new-data-del-flag>
+                    <cardinality>unbounded</cardinality>
+                    <model-elements/>
+                    <relationship-list>
+                        <relationship>
+                            <related-to>model-ver</related-to>
+                            <relationship-data>
+                                <relationship-key>model-ver.model-version-id</relationship-key>
+                                <relationship-value>9111f20f-e680-4001-b83f-19a2fc23bfc1</relationship-value>
+                            </relationship-data>
+                            <relationship-data>
+                                <relationship-key>model.model-invariant-id</relationship-key>
+                                <relationship-value>3d560d81-57d0-438b-a2a1-5334dba0651a</relationship-value>
+                            </relationship-data>
+                        </relationship>
+                    </relationship-list>
+                </model-element>
+            </model-elements>
+        </model-ver>
+    </model-vers>
index 1e50300..1d0240b 100644 (file)
@@ -1,31 +1,11 @@
-<!--\r
-  ============LICENSE_START=======================================================
-  MODEL LOADER SERVICE
-  ================================================================================
-  Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
-  ================================================================================
-  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
-  \r
-       http://www.apache.org/licenses/LICENSE-2.0\r
-  \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.
-  ============LICENSE_END=========================================================\r
-  -->\r
-\r
-<model xmlns="http://org.openecomp.aai.inventory/v9">\r
-   <model-invariant-id>3d560d81-57d0-438b-a2a1-5334dba0651a</model-invariant-id>\r
-       <model-type>widget</model-type>\r
-       <model-vers>\r
-               <model-ver>\r
-                       <model-version-id>9111f20f-e680-4001-b83f-19a2fc23bfc1</model-version-id>\r
-                       <model-version>1.0</model-version>\r
-                       <model-name>l3-network</model-name>\r
-               </model-ver>\r
-       </model-vers>\r
-</model>\r
+<model xmlns="http://org.openecomp.aai.inventory/v9">
+   <model-invariant-id>3d560d81-57d0-438b-a2a1-5334dba0651a</model-invariant-id>
+       <model-type>widget</model-type>
+       <model-vers>
+               <model-ver>
+                       <model-version-id>9111f20f-e680-4001-b83f-19a2fc23bfc1</model-version-id>
+                       <model-version>1.0</model-version>
+                       <model-name>l3-network</model-name>
+               </model-ver>
+       </model-vers>
+</model>
\ No newline at end of file
index 51047df..55d8fda 100644 (file)
@@ -1,90 +1,70 @@
-<!--\r
-  ============LICENSE_START=======================================================
-  MODEL LOADER SERVICE
-  ================================================================================
-  Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
-  ================================================================================
-  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
-  \r
-       http://www.apache.org/licenses/LICENSE-2.0\r
-  \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.
-  ============LICENSE_END=========================================================\r
-  -->\r
-\r
-<named-query xmlns="http://org.openecomp.aai.inventory/v7">\r
-       <named-query-uuid>94cac189-8d88-4d63-a194-f44214e080ff\r
-       </named-query-uuid>\r
-       <named-query-name>wan-connector</named-query-name>\r
-       <named-query-version>v1.0</named-query-version>\r
-       <description>Named Query - Wan Connector</description>\r
-       <named-query-elements>\r
-               <named-query-element>\r
-                       <relationship-list>\r
-                               <relationship>\r
-                                       <related-to>model</related-to>\r
-                                       <relationship-data>\r
-                                               <!-- connector -->\r
-                                               <relationship-key>model.model-invariant-id</relationship-key>\r
-                                               <relationship-value>d09dd9da-0148-46cd-a947-591afc844d24\r
-                                               </relationship-value>\r
-                                       </relationship-data>\r
-                               </relationship>\r
-                       </relationship-list>\r
-                       <named-query-elements>\r
-                               <named-query-element>\r
-                                       <relationship-list>\r
-                                               <relationship>\r
-                                                       <related-to>model</related-to>\r
-                                                       <relationship-data>\r
-                                                               <!-- vdc -->\r
-                                                               <relationship-key>model.model-invariant-id</relationship-key>\r
-                                                               <relationship-value>997fc7-fca1-451f-b953-9a1e6197b4d6\r
-                                                               </relationship-value>\r
-                                                       </relationship-data>\r
-                                               </relationship>\r
-                                       </relationship-list>\r
-                                       <named-query-elements>\r
-                                               <named-query-element>\r
-                                                       <relationship-list>\r
-                                                               <relationship>\r
-                                                                       <related-to>model</related-to>\r
-                                                                       <relationship-data>\r
-                                                                               <!-- logical-link -->\r
-                                                                               <relationship-key>model.model-invariant-id\r
-                                                                               </relationship-key>\r
-                                                                               <relationship-value>897df7ea-8938-42b0-bc57-46e913a4d93b\r
-                                                                               </relationship-value>\r
-                                                                       </relationship-data>\r
-                                                               </relationship>\r
-                                                       </relationship-list>\r
-                                                       <named-query-elements>\r
-                                                               <named-query-element>\r
-                                                                       <relationship-list>\r
-                                                                               <relationship>\r
-                                                                                       <related-to>model</related-to>\r
-                                                                                       <relationship-data>\r
-                                                                                               <!-- pserver -->\r
-                                                                                               <relationship-key>model.model-invariant-id\r
-                                                                                               </relationship-key>\r
-                                                                                               <relationship-value>f2b24d95-c582-48d5-b2d6-c5b3a94ce812\r
-                                                                                               </relationship-value>\r
-                                                                                       </relationship-data>\r
-                                                                               </relationship>\r
-                                                                       </relationship-list>\r
-                                                               </named-query-element>\r
-                                                       </named-query-elements>\r
-                                               </named-query-element>\r
-                                       </named-query-elements>\r
-                               </named-query-element>\r
-                       </named-query-elements>\r
-               </named-query-element>\r
-       </named-query-elements>\r
-</named-query>\r
-\r
+<named-query xmlns="http://org.openecomp.aai.inventory/v7">
+       <named-query-uuid>94cac189-8d88-4d63-a194-f44214e080ff
+       </named-query-uuid>
+       <named-query-name>wan-connector</named-query-name>
+       <named-query-version>v1.0</named-query-version>
+       <description>Named Query - Wan Connector</description>
+       <named-query-elements>
+               <named-query-element>
+                       <relationship-list>
+                               <relationship>
+                                       <related-to>model</related-to>
+                                       <relationship-data>
+                                               <!-- connector -->
+                                               <relationship-key>model.model-invariant-id</relationship-key>
+                                               <relationship-value>d09dd9da-0148-46cd-a947-591afc844d24
+                                               </relationship-value>
+                                       </relationship-data>
+                               </relationship>
+                       </relationship-list>
+                       <named-query-elements>
+                               <named-query-element>
+                                       <relationship-list>
+                                               <relationship>
+                                                       <related-to>model</related-to>
+                                                       <relationship-data>
+                                                               <!-- vdc -->
+                                                               <relationship-key>model.model-invariant-id</relationship-key>
+                                                               <relationship-value>997fc7-fca1-451f-b953-9a1e6197b4d6
+                                                               </relationship-value>
+                                                       </relationship-data>
+                                               </relationship>
+                                       </relationship-list>
+                                       <named-query-elements>
+                                               <named-query-element>
+                                                       <relationship-list>
+                                                               <relationship>
+                                                                       <related-to>model</related-to>
+                                                                       <relationship-data>
+                                                                               <!-- logical-link -->
+                                                                               <relationship-key>model.model-invariant-id
+                                                                               </relationship-key>
+                                                                               <relationship-value>897df7ea-8938-42b0-bc57-46e913a4d93b
+                                                                               </relationship-value>
+                                                                       </relationship-data>
+                                                               </relationship>
+                                                       </relationship-list>
+                                                       <named-query-elements>
+                                                               <named-query-element>
+                                                                       <relationship-list>
+                                                                               <relationship>
+                                                                                       <related-to>model</related-to>
+                                                                                       <relationship-data>
+                                                                                               <!-- pserver -->
+                                                                                               <relationship-key>model.model-invariant-id
+                                                                                               </relationship-key>
+                                                                                               <relationship-value>f2b24d95-c582-48d5-b2d6-c5b3a94ce812
+                                                                                               </relationship-value>
+                                                                                       </relationship-data>
+                                                                               </relationship>
+                                                                       </relationship-list>
+                                                               </named-query-element>
+                                                       </named-query-elements>
+                                               </named-query-element>
+                                       </named-query-elements>
+                               </named-query-element>
+                       </named-query-elements>
+               </named-query-element>
+       </named-query-elements>
+</named-query>
+
diff --git a/src/test/resources/models/v8-wan-connector-model.xml b/src/test/resources/models/v8-wan-connector-model.xml
new file mode 100644 (file)
index 0000000..09f1933
--- /dev/null
@@ -0,0 +1,165 @@
+<model xmlns="http://com.att.aai.inventory/v7">
+       <model-id>e4a9901b-6c94-4e07-b8d8-b877d3df554c</model-id>
+       <model-type>service</model-type>
+       <model-name>wan-connector</model-name>
+       <model-version>v1.0</model-version>
+       <model-name-version-id>93d9d45d-7eec-4371-9083-675e4c353de3
+       </model-name-version-id>
+       <model-description>Connects a customer vpn to the border elements of an
+               AT&amp;T product</model-description>
+       <metadata>
+               <metadatum>
+                       <metaname>a</metaname>
+                       <metaval>vpn-id</metaval>
+               </metadatum>
+               <metadatum>
+                       <metaname>b</metaname>
+                       <metaval>product</metaval>
+               </metadatum>
+       </metadata>
+       <model-elements>
+               <model-element>
+                       <new-data-del-flag>true</new-data-del-flag>
+                       <cardinality>unbounded</cardinality>
+                       <relationship-list>
+                               <relationship>
+                                       <related-to>model</related-to>
+                                       <relationship-data>
+                                               <!-- connector -->
+                                               <relationship-key>model.model-name-version-id</relationship-key>
+                                               <relationship-value>d09dd9da-0148-46cd-a947-591afc844d24
+                                               </relationship-value>
+                                       </relationship-data>
+                               </relationship>
+                       </relationship-list>
+                       <model-elements>
+                               <model-element>
+                                       <new-data-del-flag>true</new-data-del-flag>
+                                       <cardinality>unbounded</cardinality>
+                                       <relationship-list>
+                                               <relationship>
+                                                       <related-to>model</related-to>
+                                                       <relationship-data>
+                                                               <!-- vdc -->
+                                                               <relationship-key>model.model-name-version-id</relationship-key>
+                                                               <relationship-value>997fc7-fca1-451f-b953-9a1e6197b4d6
+                                                               </relationship-value>
+                                                       </relationship-data>
+                                               </relationship>
+                                       </relationship-list>
+                                       <model-elements>
+                                               <model-element>
+                                                       <new-data-del-flag>true</new-data-del-flag>
+                                                       <cardinality>unbounded</cardinality>
+                                                       <relationship-list>
+                                                               <relationship>
+                                                                       <related-to>model</related-to>
+                                                                       <relationship-data>
+                                                                               <!-- l2-bridge-for-wan-connector -->
+                                                                               <relationship-key>model.model-name-version-id
+                                                                               </relationship-key>
+                                                                               <relationship-value>ae16244f-4d29-4801-a559-e25f2db2a4c3
+                                                                               </relationship-value>
+                                                                       </relationship-data>
+                                                               </relationship>
+                                                       </relationship-list>
+                                                       <model-constraint>
+                                                               <constrained-element-sets>
+                                                                       <constrained-element-set>
+                                                                               <path>logical-link</path>
+                                                                               <constrained-element-set-uuid>999
+                                                                               </constrained-element-set-uuid>
+                                                                               <constraint-type>combination</constraint-type>
+                                                                               <check-type>AND</check-type>
+                                                                               <element-choice-sets>
+                                                                                       <element-choice-set>
+                                                                                               <element-choice-set-name>A</element-choice-set-name>
+                                                                                               <cardinality>1</cardinality>
+                                                                                               <model-elements>
+                                                                                                       <model-element>
+                                                                                                               <cardinality>unbounded</cardinality>
+                                                                                                               <new-data-del-flag>false</new-data-del-flag>
+                                                                                                               <relationship-list>
+                                                                                                                       <relationship>
+                                                                                                                               <related-to>model</related-to>
+                                                                                                                               <relationship-data>
+                                                                                                                                       <!-- ipe -->
+                                                                                                                                       <relationship-key>model.model-name-version-id
+                                                                                                                                       </relationship-key>
+                                                                                                                                       <relationship-value>759dbd4a-2473-46f3-a932-48d987c9b4a1
+                                                                                                                                       </relationship-value>
+                                                                                                                               </relationship-data>
+                                                                                                                       </relationship>
+                                                                                                               </relationship-list>
+                                                                                                               <linkage-points>
+                                                                                                                       <linkage-point>l-interface|p-interface|pserver
+                                                                                                                       </linkage-point>
+                                                                                                               </linkage-points>
+                                                                                                       </model-element>
+                                                                                               </model-elements>
+                                                                                       </element-choice-set>
+                                                                                       <element-choice-set>
+                                                                                               <element-choice-set-name>B</element-choice-set-name>
+                                                                                               <cardinality>1</cardinality>
+                                                                                               <model-elements>
+                                                                                                       <model-element>
+                                                                                                               <cardinality>unbounded</cardinality>
+                                                                                                               <new-data-del-flag>false</new-data-del-flag>
+                                                                                                               <relationship-list>
+                                                                                                                       <relationship>
+                                                                                                                               <related-to>model</related-to>
+                                                                                                                               <relationship-data>
+                                                                                                                                       <!-- vDbe -->
+                                                                                                                                       <relationship-key>model.model-name-version-id
+                                                                                                                                       </relationship-key>
+                                                                                                                                       <relationship-value>8da97b81-e0e9-4157-a4cd-af3ba52871d6
+                                                                                                                                       </relationship-value>
+                                                                                                                               </relationship-data>
+                                                                                                                       </relationship>
+                                                                                                               </relationship-list>
+                                                                                                       </model-element>
+                                                                                                       <model-element>
+                                                                                                               <cardinality>unbounded</cardinality>
+                                                                                                               <new-data-del-flag>false</new-data-del-flag>
+                                                                                                               <relationship-list>
+                                                                                                                       <relationship>
+                                                                                                                               <related-to>model</related-to>
+                                                                                                                               <relationship-data>
+                                                                                                                                       <!-- vSbg -->
+                                                                                                                                       <relationship-key>model.model-name-version-id
+                                                                                                                                       </relationship-key>
+                                                                                                                                       <relationship-value>a6d9de88-4046-4b78-a59e-5691243d292a
+                                                                                                                                       </relationship-value>
+                                                                                                                               </relationship-data>
+                                                                                                                       </relationship>
+                                                                                                               </relationship-list>
+                                                                                                       </model-element>
+                                                                                                       <model-element>
+                                                                                                               <cardinality>unbounded</cardinality>
+                                                                                                               <new-data-del-flag>false</new-data-del-flag>
+                                                                                                               <relationship-list>
+                                                                                                                       <relationship>
+                                                                                                                               <related-to>model</related-to>
+                                                                                                                               <relationship-data>
+                                                                                                                                       <!-- pBgf -->
+                                                                                                                                       <relationship-key>model.model-name-version-id
+                                                                                                                                       </relationship-key>
+                                                                                                                                       <relationship-value>35be1acf-1298-48c6-a128-66850083b8bd
+                                                                                                                                       </relationship-value>
+                                                                                                                               </relationship-data>
+                                                                                                                       </relationship>
+                                                                                                               </relationship-list>
+                                                                                                       </model-element>
+                                                                                               </model-elements>
+                                                                                       </element-choice-set>
+                                                                               </element-choice-sets>
+                                                                       </constrained-element-set>
+                                                               </constrained-element-sets>
+                                                       </model-constraint>
+                                               </model-element>
+                                       </model-elements>
+                               </model-element>
+                       </model-elements>
+               </model-element>
+       </model-elements>
+</model>
index 0348f71..c38b411 100644 (file)
-<!--\r
-  ============LICENSE_START=======================================================
-  MODEL LOADER SERVICE
-  ================================================================================
-  Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
-  ================================================================================
-  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
-  \r
-       http://www.apache.org/licenses/LICENSE-2.0\r
-  \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.
-  ============LICENSE_END=========================================================\r
-  -->\r
-\r
-<vnf-catalog>\r
-       <part-number-list>\r
-               <part-number>FortiGate-VM00</part-number>\r
-               <vnf-type>FW</vnf-type>\r
-               <vendor-info>\r
-                       <vendor-name>FORTINET</vendor-name>\r
-                       <vendor-part-number>FortiGate-VM00</vendor-part-number>\r
-                       <vendor-model>VM00</vendor-model>\r
-               </vendor-info>\r
-               <vcpu>\r
-                       <vcpu-default>1</vcpu-default>\r
-                       <vcpu-min>1</vcpu-min>\r
-                       <vcpu-max>1</vcpu-max>\r
-               </vcpu>\r
-               <vmemory>\r
-                       <vmemory-default>1</vmemory-default>\r
-                       <vmemory-units>GB</vmemory-units>\r
-                       <vmemory-min>1</vmemory-min>\r
-                       <vmemory-max>1</vmemory-max>\r
-               </vmemory>\r
-               <vdisk>\r
-                       <vdisk-default>2</vdisk-default>\r
-                       <vdisk-units>GB</vdisk-units>\r
-                       <vdisk-min>2</vdisk-min>\r
-                       <vdisk-max>32</vdisk-max>\r
-               </vdisk>\r
-               <software-version-list>\r
-                       <software-version>5.2.7</software-version>\r
-                       <software-version-state>0</software-version-state>\r
-                       <software-filetype>IMAGE</software-filetype>\r
-                       <file-md5-value>1c59a521885c465004456f74d003726c</file-md5-value>\r
-                       <software-filename>test3</software-filename>\r
-               </software-version-list>\r
-               <software-version-list>\r
-                       <software-version>5.2.5</software-version>\r
-                       <software-version-state>1</software-version-state>\r
-                       <software-filetype>IMAGE</software-filetype>\r
-                       <file-md5-value>C4D2CBE51669796E48623E006782F7DC</file-md5-value>\r
-                       <software-filename>test2</software-filename>\r
-               </software-version-list>\r
-               <software-version-list>\r
-                       <software-version>5.2.4</software-version>\r
-                       <software-version-state>2</software-version-state>\r
-                       <software-filetype>IMAGE</software-filetype>\r
-                       <file-md5-value>4987E1E743FD641C879E1D3C5D50BCE0</file-md5-value>\r
-                       <software-filename>test1</software-filename>\r
-               </software-version-list>\r
-               <vnf-features-list>\r
-                       <vnf-feature>APPID</vnf-feature>\r
-               </vnf-features-list>\r
-               <vnf-features-list>\r
-                       <vnf-feature>IPS-IDS</vnf-feature>\r
-               </vnf-features-list>\r
-               <vnf-features-list>\r
-                       <vnf-feature>URLF</vnf-feature>\r
-               </vnf-features-list>\r
-               <vnf-features-list>\r
-                       <vnf-feature>Anti-Virus</vnf-feature>\r
-               </vnf-features-list>\r
-               <license-list>\r
-                       <license-assignment-group>FortiGate-VM00</license-assignment-group>\r
-                       <license-required>FALSE</license-required>\r
-               </license-list>\r
-       </part-number-list>\r
-       <part-number-list>\r
-               <part-number>FortiGate-VM01</part-number>\r
-               <vnf-type>FW</vnf-type>\r
-               <vendor-info>\r
-                       <vendor-name>FORTINET</vendor-name>\r
-                       <vendor-part-number>FortiGate-VM01</vendor-part-number>\r
-                       <vendor-model>VM01</vendor-model>\r
-               </vendor-info>\r
-               <vcpu>\r
-                       <vcpu-default>1</vcpu-default>\r
-                       <vcpu-min>1</vcpu-min>\r
-                       <vcpu-max>1</vcpu-max>\r
-               </vcpu>\r
-               <vmemory>\r
-                       <vmemory-default>2</vmemory-default>\r
-                       <vmemory-units>GB</vmemory-units>\r
-                       <vmemory-min>1</vmemory-min>\r
-                       <vmemory-max>2</vmemory-max>\r
-               </vmemory>\r
-               <vdisk>\r
-                       <vdisk-default>2</vdisk-default>\r
-                       <vdisk-units>GB</vdisk-units>\r
-                       <vdisk-min>2</vdisk-min>\r
-                       <vdisk-max>32</vdisk-max>\r
-               </vdisk>\r
-               <software-version-list>\r
-                       <software-version>5.2.7</software-version>\r
-                       <software-version-state>0</software-version-state>\r
-                       <software-filetype>IMAGE</software-filetype>\r
-                       <file-md5-value>1c59a521885c465004456f74d003726c</file-md5-value>\r
-                       <software-filename>software file name 3</software-filename>\r
-               </software-version-list>\r
-               <software-version-list>\r
-                       <software-version>5.2.5</software-version>\r
-                       <software-version-state>1</software-version-state>\r
-                       <software-filetype>IMAGE</software-filetype>\r
-                       <file-md5-value>C4D2CBE51669796E48623E006782F7DC</file-md5-value>\r
-                       <software-filename>software file name 2</software-filename>\r
-               </software-version-list>\r
-               <software-version-list>\r
-                       <software-version>5.2.4</software-version>\r
-                       <software-version-state>2</software-version-state>\r
-                       <software-filetype>IMAGE</software-filetype>\r
-                       <file-md5-value>4987E1E743FD641C879E1D3C5D50BCE0</file-md5-value>\r
-                       <software-filename>software file name</software-filename>\r
-               </software-version-list>\r
-               <vnf-features-list>\r
-                       <vnf-feature>APPID</vnf-feature>\r
-               </vnf-features-list>\r
-               <vnf-features-list>\r
-                       <vnf-feature>IPS-IDS</vnf-feature>\r
-               </vnf-features-list>\r
-               <vnf-features-list>\r
-                       <vnf-feature>URLF</vnf-feature>\r
-               </vnf-features-list>\r
-               <vnf-features-list>\r
-                       <vnf-feature>Anti-Virus</vnf-feature>\r
-               </vnf-features-list>\r
-               <license-list>\r
-                       <license-assignment-group>license group</license-assignment-group>\r
-                       <license-required>FALSE</license-required>\r
-               </license-list>\r
-       </part-number-list>\r
-\r
-</vnf-catalog>\r
+<vnf-catalog>
+       <part-number-list>
+               <part-number>FortiGate-VM00</part-number>
+               <vnf-type>FW</vnf-type>
+               <vendor-info>
+                       <vendor-name>FORTINET</vendor-name>
+                       <vendor-part-number>FortiGate-VM00</vendor-part-number>
+                       <vendor-model>VM00</vendor-model>
+               </vendor-info>
+               <vcpu>
+                       <vcpu-default>1</vcpu-default>
+                       <vcpu-min>1</vcpu-min>
+                       <vcpu-max>1</vcpu-max>
+               </vcpu>
+               <vmemory>
+                       <vmemory-default>1</vmemory-default>
+                       <vmemory-units>GB</vmemory-units>
+                       <vmemory-min>1</vmemory-min>
+                       <vmemory-max>1</vmemory-max>
+               </vmemory>
+               <vdisk>
+                       <vdisk-default>2</vdisk-default>
+                       <vdisk-units>GB</vdisk-units>
+                       <vdisk-min>2</vdisk-min>
+                       <vdisk-max>32</vdisk-max>
+               </vdisk>
+               <software-version-list>
+                       <software-version>5.2.7</software-version>
+                       <software-version-state>0</software-version-state>
+                       <software-filetype>IMAGE</software-filetype>
+                       <file-md5-value>1c59a521885c465004456f74d003726c</file-md5-value>
+                       <software-filename>test3</software-filename>
+               </software-version-list>
+               <software-version-list>
+                       <software-version>5.2.5</software-version>
+                       <software-version-state>1</software-version-state>
+                       <software-filetype>IMAGE</software-filetype>
+                       <file-md5-value>C4D2CBE51669796E48623E006782F7DC</file-md5-value>
+                       <software-filename>test2</software-filename>
+               </software-version-list>
+               <software-version-list>
+                       <software-version>5.2.4</software-version>
+                       <software-version-state>2</software-version-state>
+                       <software-filetype>IMAGE</software-filetype>
+                       <file-md5-value>4987E1E743FD641C879E1D3C5D50BCE0</file-md5-value>
+                       <software-filename>test1</software-filename>
+               </software-version-list>
+               <vnf-features-list>
+                       <vnf-feature>APPID</vnf-feature>
+               </vnf-features-list>
+               <vnf-features-list>
+                       <vnf-feature>IPS-IDS</vnf-feature>
+               </vnf-features-list>
+               <vnf-features-list>
+                       <vnf-feature>URLF</vnf-feature>
+               </vnf-features-list>
+               <vnf-features-list>
+                       <vnf-feature>Anti-Virus</vnf-feature>
+               </vnf-features-list>
+               <license-list>
+                       <license-assignment-group>FortiGate-VM00</license-assignment-group>
+                       <license-required>FALSE</license-required>
+               </license-list>
+       </part-number-list>
+       <part-number-list>
+               <part-number>FortiGate-VM01</part-number>
+               <vnf-type>FW</vnf-type>
+               <vendor-info>
+                       <vendor-name>FORTINET</vendor-name>
+                       <vendor-part-number>FortiGate-VM01</vendor-part-number>
+                       <vendor-model>VM01</vendor-model>
+               </vendor-info>
+               <vcpu>
+                       <vcpu-default>1</vcpu-default>
+                       <vcpu-min>1</vcpu-min>
+                       <vcpu-max>1</vcpu-max>
+               </vcpu>
+               <vmemory>
+                       <vmemory-default>2</vmemory-default>
+                       <vmemory-units>GB</vmemory-units>
+                       <vmemory-min>1</vmemory-min>
+                       <vmemory-max>2</vmemory-max>
+               </vmemory>
+               <vdisk>
+                       <vdisk-default>2</vdisk-default>
+                       <vdisk-units>GB</vdisk-units>
+                       <vdisk-min>2</vdisk-min>
+                       <vdisk-max>32</vdisk-max>
+               </vdisk>
+               <software-version-list>
+                       <software-version>5.2.7</software-version>
+                       <software-version-state>0</software-version-state>
+                       <software-filetype>IMAGE</software-filetype>
+                       <file-md5-value>1c59a521885c465004456f74d003726c</file-md5-value>
+                       <software-filename>software file name 3</software-filename>
+               </software-version-list>
+               <software-version-list>
+                       <software-version>5.2.5</software-version>
+                       <software-version-state>1</software-version-state>
+                       <software-filetype>IMAGE</software-filetype>
+                       <file-md5-value>C4D2CBE51669796E48623E006782F7DC</file-md5-value>
+                       <software-filename>software file name 2</software-filename>
+               </software-version-list>
+               <software-version-list>
+                       <software-version>5.2.4</software-version>
+                       <software-version-state>2</software-version-state>
+                       <software-filetype>IMAGE</software-filetype>
+                       <file-md5-value>4987E1E743FD641C879E1D3C5D50BCE0</file-md5-value>
+                       <software-filename>software file name</software-filename>
+               </software-version-list>
+               <vnf-features-list>
+                       <vnf-feature>APPID</vnf-feature>
+               </vnf-features-list>
+               <vnf-features-list>
+                       <vnf-feature>IPS-IDS</vnf-feature>
+               </vnf-features-list>
+               <vnf-features-list>
+                       <vnf-feature>URLF</vnf-feature>
+               </vnf-features-list>
+               <vnf-features-list>
+                       <vnf-feature>Anti-Virus</vnf-feature>
+               </vnf-features-list>
+               <license-list>
+                       <license-assignment-group>license group</license-assignment-group>
+                       <license-required>FALSE</license-required>
+               </license-list>
+       </part-number-list>
+
+</vnf-catalog>