Merge "Upversion Spring-Boot to 1.5.19.RELEASE"
authorJames Forsyth <jf2512@att.com>
Wed, 20 Mar 2019 20:32:16 +0000 (20:32 +0000)
committerGerrit Code Review <gerrit@onap.org>
Wed, 20 Mar 2019 20:32:16 +0000 (20:32 +0000)
70 files changed:
.gitignore [new file with mode: 0644]
INFO.yaml
License.txt
src/main/java/org/onap/aai/auth/AAIAuthException.java
src/main/java/org/onap/aai/auth/AAIMicroServiceAuthCore.java
src/main/java/org/onap/aai/auth/FileWatcher.java
src/main/java/org/onap/aai/babel/BabelApplication.java
src/main/java/org/onap/aai/babel/config/BabelAuthConfig.java
src/main/java/org/onap/aai/babel/csar/CsarToXmlConverter.java
src/main/java/org/onap/aai/babel/csar/vnfcatalog/VendorImageConfiguration.java
src/main/java/org/onap/aai/babel/parser/ArtifactGeneratorToscaParser.java
src/main/java/org/onap/aai/babel/service/GenerateArtifactsServiceImpl.java
src/main/java/org/onap/aai/babel/service/data/BabelArtifact.java
src/main/java/org/onap/aai/babel/xml/generator/api/AaiArtifactGenerator.java
src/main/java/org/onap/aai/babel/xml/generator/api/AaiModelGenerator.java
src/main/java/org/onap/aai/babel/xml/generator/api/AaiModelGeneratorImpl.java [deleted file]
src/main/java/org/onap/aai/babel/xml/generator/data/Artifact.java
src/main/java/org/onap/aai/babel/xml/generator/data/GenerationData.java
src/main/java/org/onap/aai/babel/xml/generator/data/GeneratorUtil.java
src/main/java/org/onap/aai/babel/xml/generator/data/GroupConfiguration.java
src/main/java/org/onap/aai/babel/xml/generator/data/WidgetConfigurationUtil.java
src/main/java/org/onap/aai/babel/xml/generator/data/WidgetMapping.java
src/main/java/org/onap/aai/babel/xml/generator/data/WidgetTypeConfig.java [moved from src/main/java/org/onap/aai/babel/xml/generator/model/ResourceWidget.java with 72% similarity]
src/main/java/org/onap/aai/babel/xml/generator/model/AllotedResourceWidget.java [deleted file]
src/main/java/org/onap/aai/babel/xml/generator/model/CRWidget.java [deleted file]
src/main/java/org/onap/aai/babel/xml/generator/model/ConfigurationWidget.java [deleted file]
src/main/java/org/onap/aai/babel/xml/generator/model/FlavorWidget.java [deleted file]
src/main/java/org/onap/aai/babel/xml/generator/model/ImageWidget.java [deleted file]
src/main/java/org/onap/aai/babel/xml/generator/model/InstanceGroupWidget.java [deleted file]
src/main/java/org/onap/aai/babel/xml/generator/model/L3NetworkWidget.java [deleted file]
src/main/java/org/onap/aai/babel/xml/generator/model/LIntfWidget.java [deleted file]
src/main/java/org/onap/aai/babel/xml/generator/model/Model.java
src/main/java/org/onap/aai/babel/xml/generator/model/OamNetwork.java [deleted file]
src/main/java/org/onap/aai/babel/xml/generator/model/Resource.java
src/main/java/org/onap/aai/babel/xml/generator/model/Service.java
src/main/java/org/onap/aai/babel/xml/generator/model/ServiceWidget.java [deleted file]
src/main/java/org/onap/aai/babel/xml/generator/model/TenantWidget.java [deleted file]
src/main/java/org/onap/aai/babel/xml/generator/model/TunnelXconnectWidget.java [deleted file]
src/main/java/org/onap/aai/babel/xml/generator/model/VServerWidget.java [deleted file]
src/main/java/org/onap/aai/babel/xml/generator/model/VfModuleWidget.java [deleted file]
src/main/java/org/onap/aai/babel/xml/generator/model/VfWidget.java [deleted file]
src/main/java/org/onap/aai/babel/xml/generator/model/VfcWidget.java [deleted file]
src/main/java/org/onap/aai/babel/xml/generator/model/VolumeGroupWidget.java [deleted file]
src/main/java/org/onap/aai/babel/xml/generator/model/VolumeWidget.java [deleted file]
src/main/java/org/onap/aai/babel/xml/generator/model/Widget.java
src/main/java/org/onap/aai/babel/xml/generator/model/WidgetType.java [new file with mode: 0644]
src/main/java/org/onap/aai/babel/xml/generator/types/Cardinality.java [deleted file]
src/main/java/org/onap/aai/babel/xml/generator/types/Model.java [deleted file]
src/main/java/org/onap/aai/babel/xml/generator/types/ModelWidget.java [deleted file]
src/main/resources/babel-logging-resources.properties
src/test/java/org/onap/aai/babel/MicroServiceAuthTest.java
src/test/java/org/onap/aai/babel/TestApplication.java [new file with mode: 0644]
src/test/java/org/onap/aai/babel/csar/extractor/YamlExtractorTest.java
src/test/java/org/onap/aai/babel/logging/TestApplicationLogger.java
src/test/java/org/onap/aai/babel/parser/TestArtifactGeneratorToscaParser.java
src/test/java/org/onap/aai/babel/parser/TestToscaParser.java
src/test/java/org/onap/aai/babel/service/CsarToXmlConverterTest.java
src/test/java/org/onap/aai/babel/service/TestGenerateArtifactsServiceImpl.java
src/test/java/org/onap/aai/babel/util/ArtifactTestUtils.java
src/test/java/org/onap/aai/babel/util/Resources.java
src/test/java/org/onap/aai/babel/xml/generator/TestModelGenerator.java [new file with mode: 0644]
src/test/java/org/onap/aai/babel/xml/generator/model/TestGeneratorUtil.java
src/test/java/org/onap/aai/babel/xml/generator/model/TestModel.java
src/test/java/org/onap/aai/babel/xml/generator/model/TestVfModule.java
src/test/java/org/onap/aai/babel/xml/generator/model/TestWidget.java
src/test/resources/appconfig/auth/auth_policy.json [new file with mode: 0644]
src/test/resources/auth/keystore.jks [new file with mode: 0644]
src/test/resources/empty-tosca-mappings.json [new file with mode: 0644]
src/test/resources/invalid-tosca-mappings.json [new file with mode: 0644]
src/test/resources/tosca-mappings.json

diff --git a/.gitignore b/.gitignore
new file mode 100644 (file)
index 0000000..5e13100
--- /dev/null
@@ -0,0 +1,14 @@
+.settings
+.project
+.classpath
+.checkstyle
+target/
+**/logs/
+**/debug-logs/
+/.pydevproject
+/bin/
+appconfig-local/
+**/.idea/
+*/.idea
+*.iml
+.idea/
index c2dfdb7..c5aaa2f 100644 (file)
--- a/INFO.yaml
+++ b/INFO.yaml
@@ -1,18 +1,24 @@
 ---
 project: 'aai-babel'
 project_creation_date: '2017-07-14'
+project_category: ''
 lifecycle_state: 'Incubation'
-project_lead: &onap_releng_ptl
+project_lead: &onap_aai_ptl
     name: 'James Forsyth'
     email: 'jf2512@att.com'
     id: 'jimmydot'
     company: 'ATT'
     timezone: 'America/Detroit'
-primary_contact: *onap_releng_ptl
+primary_contact: *onap_aai_ptl
 issue_tracking:
     type: 'jira'
     url: 'https://jira.onap.org/projects/AAI'
     key: 'AAI'
+mailing_list:
+    type: 'groups.io'
+    url: 'lists.onap.org'
+    tag: '<[sub-project_name]>'
+realtime_discussion: ''
 meetings:
     - type: 'zoom'
       agenda: 'https://wiki.onap.org/display/DW/AAI+Meeting+Notes'
@@ -21,13 +27,46 @@ meetings:
       channel: 'n/a'
       repeats: 'weekly'
       time: '14:00 UTC'
+repositories:
+    - 'aai-aai-common'
+    - 'aai-aai-config'
+    - 'aai-aai-data'
+    - 'aai-aai-service'
+    - 'aai-babel'
+    - 'aai-cacher'
+    - 'aai-chameleon'
+    - 'aai-champ'
+    - 'aai-data-router'
+    - 'aai-eis'
+    - 'aai-enricher'
+    - 'aai-event-client'
+    - 'aai-gallifrey'
+    - 'aai-gap'
+    - 'aai-gizmo'
+    - 'aai-graphadmin'
+    - 'aai-graphgraph'
+    - 'aai-logging-service'
+    - 'aai-model-loader'
+    - 'aai-oom'
+    - 'aai-resources'
+    - 'aai-rest-client'
+    - 'aai-router-core'
+    - 'aai-schema-service'
+    - 'aai-search-data-service'
+    - 'aai-sparky-be'
+    - 'aai-sparky-fe'
+    - 'aai-spike'
+    - 'aai-tabular-data-service'
+    - 'aai-test-config'
+    - 'aai-traversal'
+    - 'aai-validation'
 committers:
-    - <<: *onap_releng_ptl
+    - <<: *onap_aai_ptl
     - name: 'Manisha Aggarwal'
       email: 'ma9181@att.com'
       company: 'ATT'
       id: 'ma9181'
-      timezone: 'America/New York'
+      timezone: 'America/New_York'
     - name: 'Steven Blimkie'
       email: 'Steven.Blimkie@amdocs.com'
       company: 'Amdocs'
@@ -42,7 +81,7 @@ committers:
       email: 'vk250x@att.com'
       company: 'ATT'
       id: 'vk250x'
-      timezone: 'America/New York'
+      timezone: 'America/New_York'
 tsc:
     approval: 'https://lists.onap.org/pipermail/onap-tsc'
     changes:
index 6d771b3..50054e3 100644 (file)
@@ -1,8 +1,8 @@
 ============LICENSE_START=======================================================
 org.onap.aai
 ================================================================================
-Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
-Copyright © 2017-2018 European Software Marketing Ltd.
+Copyright (c) 2017-2019 AT&T Intellectual Property. All rights reserved.
+Copyright (c) 2017-2019 European Software Marketing Ltd.
 ================================================================================
 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
@@ -15,4 +15,4 @@ 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=========================================================
\ No newline at end of file
+============LICENSE_END=========================================================
index a29ee98..35adb5a 100644 (file)
@@ -2,8 +2,8 @@
  * ============LICENSE_START=======================================================
  * org.onap.aai
  * ================================================================================
- * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2018 European Software Marketing Ltd.
+ * Copyright © 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright © 2017-2019 European Software Marketing Ltd.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.auth;
 
 public class AAIAuthException extends Exception {
-    /** */
+
     private static final long serialVersionUID = 1L;
 
     public AAIAuthException(String string) {
index ee5fb26..0eec7e1 100644 (file)
@@ -2,8 +2,8 @@
  * ============LICENSE_START=======================================================
  * org.onap.aai
  * ================================================================================
- * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2018 European Software Marketing Ltd.
+ * Copyright (c) 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (c) 2017-2019 European Software Marketing Ltd.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -18,6 +18,7 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.auth;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
@@ -26,12 +27,14 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 import java.io.File;
 import java.io.FileNotFoundException;
 import java.io.IOException;
+import java.nio.file.Path;
+import java.nio.file.Paths;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
-import java.util.Map;
 import java.util.Map.Entry;
+import java.util.Optional;
 import java.util.Timer;
 import java.util.TimerTask;
 import java.util.concurrent.TimeUnit;
@@ -43,15 +46,15 @@ public class AAIMicroServiceAuthCore {
 
     private static LogHelper applicationLogger = LogHelper.INSTANCE;
 
-    private static final String CONFIG_HOME = System.getProperty("CONFIG_HOME");
-
-    public static final String FILESEP =
-            (System.getProperty("file.separator") == null) ? "/" : System.getProperty("file.separator");
-    public static final String APPCONFIG_DIR =
-            (CONFIG_HOME == null) ? System.getProperty("APP_HOME") + FILESEP + "appconfig" : CONFIG_HOME;
-
-    private static String appConfigAuthDir = APPCONFIG_DIR + FILESEP + "auth";
-    private static String defaultAuthFileName = appConfigAuthDir + FILESEP + "auth_policy.json";
+    /**
+     * The default policy file is expected to be located in either one of
+     * <ul>
+     * <li><code>$CONFIG_HOME/auth_policy.json</code></li>
+     * <li><code>$CONFIG_HOME/auth/auth_policy.json</code></li>
+     * <p>
+     * Note that if <code>CONFIG_HOME</code> is not set then assume it has a value of <code>$APP_HOME/appconfig</code>
+     */
+    private static String defaultAuthFileName = "auth_policy.json";
 
     private static boolean usersInitialized = false;
     private static HashMap<String, AAIAuthUser> users;
@@ -60,11 +63,7 @@ public class AAIMicroServiceAuthCore {
     private static String policyAuthFileName;
 
     public enum HTTP_METHODS {
-        GET,
-        PUT,
-        DELETE,
-        HEAD,
-        POST
+        GET, PUT, DELETE, HEAD, POST
     }
 
     // Don't instantiate
@@ -86,8 +85,9 @@ public class AAIMicroServiceAuthCore {
             applicationLogger.error(ApplicationMsgs.PROCESS_REQUEST_ERROR, e);
             throw new AAIAuthException(e.getMessage());
         }
+
         if (policyAuthFileName == null) {
-            throw new AAIAuthException("Auth policy file could not be found" + CONFIG_HOME + APPCONFIG_DIR);
+            throw new AAIAuthException("Auth policy file could not be found");
         }
         AAIMicroServiceAuthCore.reloadUsers();
 
@@ -119,21 +119,46 @@ public class AAIMicroServiceAuthCore {
     }
 
     public static String getConfigFile(String authPolicyFile) throws IOException {
-        File authFile = new File(authPolicyFile);
-        if (authFile.exists()) {
-            return authFile.getCanonicalPath();
-        }
-        authFile = new File(appConfigAuthDir + FILESEP + authPolicyFile);
-        if (authFile.exists()) {
-            return authFile.getCanonicalPath();
-        }
-        if (defaultAuthFileName != null) {
-            authFile = new File(defaultAuthFileName);
-            if (authFile.exists()) {
-                return defaultAuthFileName;
+        return locateConfigFile(authPolicyFile).orElse(locateConfigFile(defaultAuthFileName).orElse(null));
+    }
+
+    /**
+     * Locate the auth policy file by its name or path.
+     * <ul>
+     * <li>First try to use the absolute path to the file (if provided), or instead locate the path relative to the
+     * current (or user) dir.</li>
+     * <li>If this fails, try resolving the path relative to the configuration home location (either
+     * <code>$CONFIG_HOME</code> or <code>$APP_HOME/appconfig</code>).</li>
+     * <li>If this fails try resolving relative to the <code>auth</code> folder under configuration home.</li>
+     * 
+     * @param authPolicyFile
+     *            filename or path
+     * @return the Optional canonical path to the located policy file
+     * @throws IOException
+     *             if the construction of the canonical pathname requires filesystem queries which cause I/O error(s)
+     */
+    private static Optional<String> locateConfigFile(String authPolicyFile) throws IOException {
+        if (authPolicyFile != null) {
+            List<Path> paths = new ArrayList<>();
+            paths.add(Paths.get("."));
+
+            String configHome = System.getProperty("CONFIG_HOME");
+            if (configHome == null) {
+                configHome = System.getProperty("APP_HOME") + "/appconfig";
+            }
+
+            paths.add(Paths.get(configHome));
+            paths.add(Paths.get(configHome).resolve("auth"));
+
+            for (Path path : paths) {
+                File authFile = path.resolve(authPolicyFile).toFile();
+                if (authFile.exists()) {
+                    return Optional.of(authFile.getCanonicalPath());
+                }
             }
         }
-        return null;
+
+        return Optional.empty();
     }
 
     public static synchronized void reloadUsers() throws AAIAuthException {
@@ -193,28 +218,18 @@ public class AAIMicroServiceAuthCore {
                 user = new AAIAuthUser();
             }
             applicationLogger.debug("Assigning " + roleName + " to user " + name);
-            user.setUser(name);
             user.addRole(roleName, r);
             users.put(name, user);
         }
     }
 
     public static class AAIAuthUser {
-        private String username;
         private HashMap<String, AAIAuthRole> roles;
 
         public AAIAuthUser() {
             this.roles = new HashMap<>();
         }
 
-        public String getUser() {
-            return this.username;
-        }
-
-        public Map<String, AAIAuthRole> getRoles() {
-            return this.roles;
-        }
-
         public void addRole(String roleName, AAIAuthRole r) {
             this.roles.put(roleName, r);
         }
@@ -228,10 +243,6 @@ public class AAIMicroServiceAuthCore {
             }
             return false;
         }
-
-        public void setUser(String myuser) {
-            this.username = myuser;
-        }
     }
 
     public static class AAIAuthRole {
@@ -246,12 +257,6 @@ public class AAIMicroServiceAuthCore {
             this.allowedFunctions.add(func);
         }
 
-        public void delAllowedFunction(String delFunc) {
-            if (this.allowedFunctions.contains(delFunc)) {
-                this.allowedFunctions.remove(delFunc);
-            }
-        }
-
         public boolean hasAllowedFunction(String afunc) {
             return this.allowedFunctions.contains(afunc);
         }
index d974e66..9c4e04e 100644 (file)
@@ -2,8 +2,8 @@
  * ============LICENSE_START=======================================================
  * org.onap.aai
  * ================================================================================
- * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2018 European Software Marketing Ltd.
+ * Copyright © 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright © 2017-2019 European Software Marketing Ltd.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -18,6 +18,7 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.auth;
 
 import java.io.File;
index 0b0285b..9eaa0ce 100644 (file)
@@ -2,8 +2,8 @@
  * ============LICENSE_START=======================================================
  * org.onap.aai
  * ================================================================================
- * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2018 European Software Marketing Ltd.
+ * Copyright (c) 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (c) 2017-2019 European Software Marketing Ltd.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.babel;
 
 import java.util.HashMap;
 import org.eclipse.jetty.util.security.Password;
+import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.builder.SpringApplicationBuilder;
 import org.springframework.boot.web.support.SpringBootServletInitializer;
+import org.springframework.context.ConfigurableApplicationContext;
 import org.springframework.context.annotation.ImportResource;
 
 @SpringBootApplication
 @ImportResource("classpath:babel-beans.xml")
 public class BabelApplication extends SpringBootServletInitializer {
 
-    private static final String OBFS_PATTERN = "OBF:";
+    private static ConfigurableApplicationContext context;
 
     /**
      * Spring Boot Initialization.
      * 
-     * @param args main args
+     * @param args
+     *            main args
      */
     public static void main(String[] args) {
         String keyStorePassword = System.getProperty("KEY_STORE_PASSWORD");
@@ -44,14 +48,19 @@ public class BabelApplication extends SpringBootServletInitializer {
             throw new IllegalArgumentException("Env property KEY_STORE_PASSWORD not set");
         }
         HashMap<String, Object> props = new HashMap<>();
-        String decryptedValue = keyStorePassword.startsWith(OBFS_PATTERN)? Password.deobfuscate(keyStorePassword) : keyStorePassword;
+        String decryptedValue = keyStorePassword.startsWith(Password.__OBFUSCATE) ? //
+                Password.deobfuscate(keyStorePassword) : keyStorePassword;
         props.put("server.ssl.key-store-password", decryptedValue);
 
         String requireClientAuth = System.getenv("REQUIRE_CLIENT_AUTH");
         props.put("server.ssl.client-auth",
                 Boolean.FALSE.toString().equalsIgnoreCase(requireClientAuth) ? "want" : "need");
 
-        new BabelApplication().configure(new SpringApplicationBuilder(BabelApplication.class).properties(props))
-                .run(args);
+        context = new BabelApplication()
+                .configure(new SpringApplicationBuilder(BabelApplication.class).properties(props)).run(args);
+    }
+
+    public static void exit() {
+        SpringApplication.exit(context);
     }
 }
index 21525a1..cae71de 100644 (file)
@@ -2,8 +2,8 @@
  * ============LICENSE_START=======================================================
  * org.onap.aai
  * ================================================================================
- * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2018 European Software Marketing Ltd.
+ * Copyright (c) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * Copyright (c) 2017-2018 European Software Marketing Ltd.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -18,6 +18,7 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.babel.config;
 
 import org.springframework.beans.factory.annotation.Value;
index 98db8ae..9e1ff6e 100644 (file)
@@ -2,8 +2,8 @@
  * ============LICENSE_START=======================================================
  * org.onap.aai
  * ================================================================================
- * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2018 European Software Marketing Ltd.
+ * Copyright © 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright © 2017-2019 European Software Marketing Ltd.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -18,6 +18,7 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.babel.csar;
 
 import java.util.List;
@@ -53,7 +54,7 @@ public class CsarToXmlConverter {
      *            the name of the archive file
      * @param version
      *            the version of the archive file
-     * @return List<org.onap.sdc.generator.data.Artifact> a list of generated XML artifacts
+     * @return a list of generated XML artifacts
      * @throws CsarConverterException
      *             if there is an error either extracting the YAML files or generating XML artifacts
      */
index 6142aac..bb4476a 100644 (file)
@@ -2,8 +2,8 @@
  * ============LICENSE_START=======================================================
  * org.onap.aai
  * ================================================================================
- * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2018 European Software Marketing Ltd.
+ * Copyright (c) 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (c) 2017-2019 European Software Marketing Ltd.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -18,6 +18,7 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.babel.csar.vnfcatalog;
 
 import com.google.gson.annotations.SerializedName;
@@ -79,30 +80,6 @@ class VendorImageConfiguration {
         this.applicationVersion = applicationVersion;
     }
 
-    public String getApplication() {
-        return application;
-    }
-
-    public void setApplication(String application) {
-        this.application = application;
-    }
-
-    public String getApplicationVendor() {
-        return applicationVendor;
-    }
-
-    public void setApplicationVendor(String applicationVendor) {
-        this.applicationVendor = applicationVendor;
-    }
-
-    public String getApplicationVersion() {
-        return applicationVersion;
-    }
-
-    public void setApplicationVersion(String applicationVersion) {
-        this.applicationVersion = applicationVersion;
-    }
-
     @Override
     public String toString() {
         return "VendorImage [" + application + ", " + applicationVendor + ", " + applicationVersion + "]";
index 50c6edf..3f2e670 100644 (file)
@@ -2,8 +2,8 @@
  * ============LICENSE_START=======================================================
  * org.onap.aai
  * ================================================================================
- * Copyright © 2017-2019 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2019 European Software Marketing Ltd.
+ * Copyright (c) 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (c) 2017-2019 European Software Marketing Ltd.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
 package org.onap.aai.babel.parser;
 
 import com.google.gson.Gson;
+import com.google.gson.JsonSyntaxException;
 import java.io.BufferedReader;
 import java.io.File;
 import java.io.FileInputStream;
-import java.io.FileNotFoundException;
 import java.io.FileReader;
 import java.io.IOException;
 import java.util.ArrayList;
@@ -37,12 +37,14 @@ import java.util.Properties;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 import org.onap.aai.babel.logging.LogHelper;
+import org.onap.aai.babel.xml.generator.XmlArtifactGenerationException;
 import org.onap.aai.babel.xml.generator.data.GroupConfiguration;
 import org.onap.aai.babel.xml.generator.data.WidgetConfigurationUtil;
 import org.onap.aai.babel.xml.generator.model.Model;
 import org.onap.aai.babel.xml.generator.model.Resource;
 import org.onap.aai.babel.xml.generator.model.Widget;
-import org.onap.aai.babel.xml.generator.model.Widget.Type;
+import org.onap.aai.babel.xml.generator.model.WidgetType;
+import org.onap.aai.babel.xml.generator.types.ModelType;
 import org.onap.aai.cl.api.Logger;
 import org.onap.sdc.tosca.parser.api.ISdcCsarHelper;
 import org.onap.sdc.toscaparser.api.Group;
@@ -92,27 +94,10 @@ public class ArtifactGeneratorToscaParser {
     }
 
     /**
-     * Get or create the artifact description.
-     *
-     * @param model
-     *            the artifact model
-     * @return the artifact model's description
-     */
-    public static String getArtifactDescription(Model model) {
-        switch (model.getModelType()) {
-            case SERVICE:
-                return "AAI Service Model";
-            case RESOURCE:
-                return "AAI Resource Model";
-            default:
-                return model.getModelDescription();
-        }
-    }
-
-    /**
-     * Initialises the widget configuration.
-     *
+     * Initializes the Widget to UUID mapping configuration.
+     * 
      * @throws IOException
+     *             if an error occurs reading the configuration properties
      */
     public static void initWidgetConfiguration() throws IOException {
         log.debug("Getting Widget Configuration");
@@ -133,26 +118,35 @@ public class ArtifactGeneratorToscaParser {
     }
 
     /**
-     * Initialises the group filtering and TOSCA mapping configuration.
+     * Initializes the group filtering and TOSCA to Widget mapping configuration.
      * 
      * @param configLocation
-     *            the pathname to the JSON config file
-     * @throws FileNotFoundException
-     *             if the file cannot be opened for reading
+     *            the pathname to the JSON mappings file
+     * @throws IOException
+     *             if the file content could not be read successfully
      */
-    public static void initToscaMappingsConfiguration(String configLocation) throws FileNotFoundException {
+    public static void initToscaMappingsConfiguration(String configLocation) throws IOException {
         log.debug("Getting TOSCA Mappings Configuration");
         File file = new File(configLocation);
         if (!file.exists()) {
             throw new IllegalArgumentException(String.format(GENERATOR_AAI_CONFIGFILE_NOT_FOUND, configLocation));
         }
 
-        BufferedReader bufferedReader = new BufferedReader(new FileReader(configLocation));
-        GroupConfiguration config = new Gson().fromJson(bufferedReader, GroupConfiguration.class);
-        if (config != null) {
-            WidgetConfigurationUtil.setSupportedInstanceGroups(config.getInstanceGroupTypes());
-            WidgetConfigurationUtil.setWidgetMappings(config.getWidgetMappings());
+        GroupConfiguration config;
+
+        try (BufferedReader bufferedReader = new BufferedReader(new FileReader(configLocation))) {
+            config = new Gson().fromJson(bufferedReader, GroupConfiguration.class);
+        } catch (JsonSyntaxException e) {
+            throw new IOException("Invalid Mappings Configuration " + configLocation, e);
+        }
+
+        if (config == null) {
+            throw new IOException("There is no content for the Mappings Configuration " + configLocation);
         }
+
+        WidgetConfigurationUtil.setSupportedInstanceGroups(config.getInstanceGroupTypes());
+        WidgetConfigurationUtil.setWidgetTypes(config.getWidgetTypes());
+        WidgetConfigurationUtil.setWidgetMappings(config.getWidgetMappings());
     }
 
     /**
@@ -161,8 +155,11 @@ public class ArtifactGeneratorToscaParser {
      * @param resourceModel
      * @param serviceNodeTemplate
      * @return resources for which XML Models should be generated
+     * @throws XmlArtifactGenerationException
+     *             if there is no configuration defined for a member Widget of an instance group
      */
-    public List<Resource> processInstanceGroups(Model resourceModel, NodeTemplate serviceNodeTemplate) {
+    public List<Resource> processInstanceGroups(Model resourceModel, NodeTemplate serviceNodeTemplate)
+            throws XmlArtifactGenerationException {
         List<Resource> resources = new ArrayList<>();
         if (serviceNodeTemplate.getSubMappingToscaTemplate() != null) {
             List<Group> serviceGroups = csarHelper.getGroupsOfOriginOfNodeTemplate(serviceNodeTemplate);
@@ -194,17 +191,22 @@ public class ArtifactGeneratorToscaParser {
     }
 
     public Resource createInstanceGroupModel(Map<String, String> properties) {
-        Resource groupModel = new Resource(Type.INSTANCE_GROUP, true);
+        Resource groupModel = new Resource(WidgetType.valueOf("INSTANCE_GROUP"), true);
         groupModel.populateModelIdentificationInformation(properties);
         return groupModel;
     }
 
     /**
+     * Add the resource/widget to the specified model.
+     * 
      * @param model
      * @param relation
+     *            resource or widget model to add
+     * @throws XmlArtifactGenerationException
+     *             if the relation is a widget and there is no configuration defined for the relation's widget type
      */
-    public void addRelatedModel(final Model model, final Resource relation) {
-        if (relation.isResource()) {
+    public void addRelatedModel(final Model model, final Resource relation) throws XmlArtifactGenerationException {
+        if (relation.getModelType() == ModelType.RESOURCE) {
             model.addResource(relation);
         } else {
             model.addWidget(Widget.getWidget(relation.getWidgetType()));
@@ -225,8 +227,10 @@ public class ArtifactGeneratorToscaParser {
      * @param resources
      * @param model
      * @param serviceNode
+     * @throws XmlArtifactGenerationException
      */
-    public void processVfModules(List<Resource> resources, Model resourceModel, NodeTemplate serviceNode) {
+    public void processVfModules(List<Resource> resources, Model resourceModel, NodeTemplate serviceNode)
+            throws XmlArtifactGenerationException {
         // Get the customisation UUID for each VF node and use it to get its Groups
         String uuid = csarHelper.getNodeTemplateCustomizationUuid(serviceNode);
         List<Group> serviceGroups = csarHelper.getVfModulesByVf(uuid);
@@ -234,7 +238,7 @@ public class ArtifactGeneratorToscaParser {
         // Process each VF Group
         for (Group serviceGroup : serviceGroups) {
             Model groupModel = Model.getModelFor(serviceGroup.getType());
-            if (groupModel.getWidgetType() == Type.VFMODULE) {
+            if (groupModel.getWidgetType() == WidgetType.valueOf("VFMODULE")) {
                 processVfModule(resources, resourceModel, serviceGroup, serviceNode, (Resource) groupModel);
             }
         }
@@ -253,19 +257,18 @@ public class ArtifactGeneratorToscaParser {
             String metaDataType = Optional.ofNullable(metadata).map(m -> m.getValue("type")).orElse(nodeTypeName);
             Resource model = Model.getModelFor(nodeTypeName, metaDataType);
 
-            if (metadata != null && hasAllottedResource(metadata.getAllProperties())) {
-                if (model.getWidgetType() == Type.VSERVER) {
-                    model = new Resource(Type.ALLOTTED_RESOURCE, false);
-                    Map<String, Object> props = new HashMap<>();
-                    props.put("providingService", true);
-                    model.setProperties(props);
-                }
+            if (metadata != null && hasAllottedResource(metadata.getAllProperties())
+                    && model.getWidgetType() == WidgetType.valueOf("VSERVER")) {
+                model = new Resource(WidgetType.valueOf("ALLOTTED_RESOURCE"), false);
+                Map<String, Object> props = new HashMap<>();
+                props.put("providingService", true);
+                model.setProperties(props);
             }
 
             foundProvidingService |= processModel(resourceModel, metadata, model, resourceNodeTemplate.getProperties());
         }
 
-        if (resourceModel.getWidgetType() == Type.ALLOTTED_RESOURCE && !foundProvidingService) {
+        if (resourceModel.getWidgetType() == WidgetType.valueOf("ALLOTTED_RESOURCE") && !foundProvidingService) {
             final String modelInvariantId = resourceModel.getModelId();
             throw new IllegalArgumentException(String.format(GENERATOR_AAI_PROVIDING_SERVICE_MISSING,
                     modelInvariantId == null ? "<null ID>" : modelInvariantId));
@@ -284,9 +287,12 @@ public class ArtifactGeneratorToscaParser {
      * @param properties
      *            the properties of the Group
      * @return the Instance Group and Member resource models
+     * @throws XmlArtifactGenerationException
+     *             if there is no configuration defined for one of the member Widgets
      */
     private List<Resource> processInstanceGroup(Model resourceModel, ArrayList<NodeTemplate> memberNodes,
-            Map<String, String> metaProperties, Map<String, Property> properties) {
+            Map<String, String> metaProperties, Map<String, Property> properties)
+            throws XmlArtifactGenerationException {
         Resource groupModel = createInstanceGroupModel(mergeProperties(metaProperties, properties));
         resourceModel.addResource(groupModel);
         List<Resource> resources = Stream.of(groupModel).collect(Collectors.toList());
@@ -301,10 +307,13 @@ public class ArtifactGeneratorToscaParser {
     /**
      * @param memberNodes
      * @param groupModel
-     * @return
+     * @return a list of Resources
+     * @throws XmlArtifactGenerationException
+     *             if a member node template is a widget and there is no configuration defined for that relation's
+     *             widget type
      */
     private List<Resource> generateResourcesAndWidgets(final ArrayList<NodeTemplate> memberNodes,
-            final Resource groupModel) {
+            final Resource groupModel) throws XmlArtifactGenerationException {
         log.debug(String.format("Processing member nodes for Group %s (invariant UUID %s)", //
                 groupModel.getModelName(), groupModel.getModelId()));
 
@@ -324,7 +333,7 @@ public class ArtifactGeneratorToscaParser {
                         memberModel.getClass().getSuperclass().getSimpleName(), memberModel.getClass(), nodeTypeName));
 
                 addRelatedModel(groupModel, memberModel);
-                if (memberModel.isResource()) {
+                if (memberModel.getModelType() == ModelType.RESOURCE) {
                     resources.add(memberModel);
                 }
             }
@@ -333,7 +342,7 @@ public class ArtifactGeneratorToscaParser {
     }
 
     private void processVfModule(List<Resource> resources, Model vfModel, Group groupDefinition,
-            NodeTemplate serviceNode, Resource groupModel) {
+            NodeTemplate serviceNode, Resource groupModel) throws XmlArtifactGenerationException {
         groupModel.populateModelIdentificationInformation(
                 mergeProperties(groupDefinition.getMetadata().getAllProperties(), groupDefinition.getProperties()));
 
@@ -346,7 +355,8 @@ public class ArtifactGeneratorToscaParser {
         }
     }
 
-    private void processVfModuleGroup(Resource groupModel, List<NodeTemplate> members) {
+    private void processVfModuleGroup(Resource groupModel, List<NodeTemplate> members)
+            throws XmlArtifactGenerationException {
         if (members != null && !members.isEmpty()) {
             // Get names of the members of the service group
             List<String> memberNames = members.stream().map(NodeTemplate::getName).collect(Collectors.toList());
@@ -362,18 +372,19 @@ public class ArtifactGeneratorToscaParser {
      * 
      * @param group
      * @param member
+     * @throws XmlArtifactGenerationException
      */
-    private void processGroupMembers(Resource group, NodeTemplate member) {
+    private void processGroupMembers(Resource group, NodeTemplate member) throws XmlArtifactGenerationException {
         Resource resource = Model.getModelFor(member.getType());
 
         log.debug(member.getType() + " mapped to " + resource);
 
-        if (resource.getWidgetType() == Type.L3_NET) {
+        if (resource.getWidgetType() == WidgetType.valueOf("L3_NET")) {
             // An l3-network inside a vf-module is treated as a Widget
-            resource.setIsResource(false);
+            resource.setModelType(ModelType.WIDGET);
         }
 
-        if (!resource.isResource()) {
+        if (resource.getModelType() == ModelType.WIDGET) {
             Widget widget = Widget.getWidget(resource.getWidgetType());
             widget.addKey(member.getName());
             // Add the widget element encountered to the Group model
@@ -414,8 +425,8 @@ public class ArtifactGeneratorToscaParser {
 
         if (foundProvidingService) {
             processProvidingService(resourceModel, resourceNode, nodeProperties);
-        } else if (resourceNode != null && resourceNode.isResource()
-                && resourceNode.getWidgetType() != Widget.Type.L3_NET) {
+        } else if (resourceNode != null && resourceNode.getModelType() == ModelType.RESOURCE
+                && resourceNode.getWidgetType() != WidgetType.valueOf("L3_NET")) {
             if (metaData != null) {
                 resourceNode.populateModelIdentificationInformation(metaData.getAllProperties());
             }
index 72d8ae2..8d89db9 100644 (file)
@@ -2,8 +2,8 @@
  * ============LICENSE_START=======================================================
  * org.onap.aai
  * ================================================================================
- * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2018 European Software Marketing Ltd.
+ * Copyright © 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright © 2017-2019 European Software Marketing Ltd.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -18,6 +18,7 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.babel.service;
 
 import com.google.gson.Gson;
@@ -59,7 +60,9 @@ public class GenerateArtifactsServiceImpl implements GenerateArtifactsService {
 
     private AAIMicroServiceAuth aaiMicroServiceAuth;
 
-    /** @param authorization */
+    /**
+     * @param authorization
+     */
     @Inject
     public GenerateArtifactsServiceImpl(final AAIMicroServiceAuth authorization) {
         this.aaiMicroServiceAuth = authorization;
index 81c237e..86bf0cc 100644 (file)
@@ -2,8 +2,8 @@
  * ============LICENSE_START=======================================================
  * org.onap.aai
  * ================================================================================
- * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2018 European Software Marketing Ltd.
+ * Copyright (c) 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (c) 2017-2019 European Software Marketing Ltd.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.babel.service.data;
 
 /** Bean representing the return artifacts of the Babel microservice. */
 public class BabelArtifact {
 
     public enum ArtifactType {
-        MODEL,
-        VNFCATALOG;
+        MODEL, VNFCATALOG;
     }
 
     String name;
@@ -42,23 +42,11 @@ public class BabelArtifact {
         return name;
     }
 
-    public void setName(String name) {
-        this.name = name;
-    }
-
     public ArtifactType getType() {
         return type;
     }
 
-    public void setType(String type) {
-        this.type = ArtifactType.valueOf(type);
-    }
-
     public String getPayload() {
         return payload;
     }
-
-    public void setPayload(String payload) {
-        this.payload = payload;
-    }
 }
index 19b3d80..741c194 100644 (file)
@@ -2,8 +2,8 @@
  * ============LICENSE_START=======================================================
  * org.onap.aai
  * ================================================================================
- * Copyright © 2017-2019 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2019 European Software Marketing Ltd.
+ * Copyright (c) 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (c) 2017-2019 European Software Marketing Ltd.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -33,6 +33,7 @@ import org.apache.commons.lang3.StringUtils;
 import org.onap.aai.babel.logging.ApplicationMsgs;
 import org.onap.aai.babel.logging.LogHelper;
 import org.onap.aai.babel.parser.ArtifactGeneratorToscaParser;
+import org.onap.aai.babel.xml.generator.XmlArtifactGenerationException;
 import org.onap.aai.babel.xml.generator.data.AdditionalParams;
 import org.onap.aai.babel.xml.generator.data.Artifact;
 import org.onap.aai.babel.xml.generator.data.ArtifactType;
@@ -43,10 +44,12 @@ import org.onap.aai.babel.xml.generator.data.WidgetConfigurationUtil;
 import org.onap.aai.babel.xml.generator.model.Model;
 import org.onap.aai.babel.xml.generator.model.Resource;
 import org.onap.aai.babel.xml.generator.model.Service;
-import org.onap.aai.babel.xml.generator.model.TunnelXconnectWidget;
-import org.onap.aai.babel.xml.generator.model.Widget.Type;
+import org.onap.aai.babel.xml.generator.model.WidgetType;
+import org.onap.aai.babel.xml.generator.model.Widget;
+import org.onap.aai.babel.xml.generator.types.ModelType;
 import org.onap.aai.cl.api.Logger;
 import org.onap.sdc.tosca.parser.api.ISdcCsarHelper;
+import org.onap.sdc.tosca.parser.exceptions.SdcToscaParserException;
 import org.onap.sdc.tosca.parser.impl.SdcToscaParserFactory;
 import org.onap.sdc.toscaparser.api.Group;
 import org.onap.sdc.toscaparser.api.NodeTemplate;
@@ -66,20 +69,11 @@ public class AaiArtifactGenerator implements ArtifactGenerator {
     private static final String GENERATOR_AAI_INVALID_SERVICE_VERSION =
             "Cannot generate artifacts. Service version is incorrect";
 
-    private AaiModelGenerator modelGenerator = new AaiModelGeneratorImpl();
+    private AaiModelGenerator modelGenerator = new AaiModelGenerator();
 
     @Override
     public GenerationData generateArtifact(byte[] csarArchive, List<Artifact> input,
             Map<String, String> additionalParams) {
-        Path csarPath;
-
-        try {
-            csarPath = createTempFile(csarArchive);
-        } catch (IOException e) {
-            log.error(ApplicationMsgs.TEMP_FILE_ERROR, e);
-            return createErrorData(e);
-        }
-
         String configLocation = System.getProperty(ArtifactGeneratorToscaParser.PROPERTY_TOSCA_MAPPING_FILE);
         if (configLocation == null) {
             throw new IllegalArgumentException(
@@ -90,10 +84,25 @@ public class AaiArtifactGenerator implements ArtifactGenerator {
         try {
             ArtifactGeneratorToscaParser.initWidgetConfiguration();
             ArtifactGeneratorToscaParser.initToscaMappingsConfiguration(configLocation);
+        } catch (IOException e) {
+            log.error(ApplicationMsgs.LOAD_PROPERTIES, e, configLocation);
+            return createErrorData(e);
+        }
+
+        Path csarPath;
+
+        try {
+            csarPath = createTempFile(csarArchive);
+        } catch (IOException e) {
+            log.error(ApplicationMsgs.TEMP_FILE_ERROR, e);
+            return createErrorData(e);
+        }
+
+        try {
             ISdcCsarHelper csarHelper =
                     SdcToscaParserFactory.getInstance().getSdcCsarHelper(csarPath.toAbsolutePath().toString());
             return generateAllArtifacts(validateServiceVersion(additionalParams), csarHelper);
-        } catch (Exception e) {
+        } catch (SdcToscaParserException | XmlArtifactGenerationException e) {
             log.error(ApplicationMsgs.INVALID_CSAR_FILE, e);
             return createErrorData(e);
         } finally {
@@ -114,8 +123,10 @@ public class AaiArtifactGenerator implements ArtifactGenerator {
      * @param csarHelper
      *            interface to the TOSCA parser
      * @return the generated Artifacts (containing XML models)
+     * @throws XmlArtifactGenerationException
      */
-    private GenerationData generateAllArtifacts(final String serviceVersion, ISdcCsarHelper csarHelper) {
+    private GenerationData generateAllArtifacts(final String serviceVersion, ISdcCsarHelper csarHelper)
+            throws XmlArtifactGenerationException {
         List<NodeTemplate> serviceNodeTemplates = csarHelper.getServiceNodeTemplates();
         if (serviceNodeTemplates == null) {
             throw new IllegalArgumentException(GENERATOR_AAI_ERROR_MISSING_SERVICE_TOSCA);
@@ -170,9 +181,10 @@ public class AaiArtifactGenerator implements ArtifactGenerator {
      * @param serviceNodeTemplates
      * @param serviceModel
      * @return the generated Models
+     * @throws XmlArtifactGenerationException
      */
     private List<Resource> generateResourceModels(ISdcCsarHelper csarHelper, List<NodeTemplate> serviceNodeTemplates,
-            Service serviceModel) {
+            Service serviceModel) throws XmlArtifactGenerationException {
         final List<Group> serviceGroups = csarHelper.getGroupsOfTopologyTemplate();
         final ArtifactGeneratorToscaParser parser = new ArtifactGeneratorToscaParser(csarHelper);
 
@@ -191,7 +203,7 @@ public class AaiArtifactGenerator implements ArtifactGenerator {
 
     private void generateModelFromNodeTemplate(ISdcCsarHelper csarHelper, Service serviceModel,
             List<Resource> resources, final List<Group> serviceGroups, ArtifactGeneratorToscaParser parser,
-            NodeTemplate nodeTemplate) {
+            NodeTemplate nodeTemplate) throws XmlArtifactGenerationException {
         Resource model = getModelFor(parser, nodeTemplate);
 
         if (model != null) {
@@ -200,7 +212,7 @@ public class AaiArtifactGenerator implements ArtifactGenerator {
             }
 
             parser.addRelatedModel(serviceModel, model);
-            if (model.isResource()) {
+            if (model.getModelType() == ModelType.RESOURCE) {
                 generateResourceModel(csarHelper, resources, parser, nodeTemplate);
             }
         } else {
@@ -229,10 +241,9 @@ public class AaiArtifactGenerator implements ArtifactGenerator {
 
         if (model != null) {
             Metadata metadata = nodeTemplate.getMetaData();
-            if (metadata != null && parser.hasAllottedResource(metadata.getAllProperties())) {
-                if (model.getWidgetType() == Type.VF) {
-                    model = new Resource(Type.ALLOTTED_RESOURCE, true);
-                }
+            if (metadata != null && parser.hasAllottedResource(metadata.getAllProperties())
+                    && model.getWidgetType() == WidgetType.valueOf("VF")) {
+                model = new Resource(WidgetType.valueOf("ALLOTTED_RESOURCE"), true);
             }
         }
 
@@ -240,8 +251,13 @@ public class AaiArtifactGenerator implements ArtifactGenerator {
     }
 
     private void generateResourceModel(ISdcCsarHelper csarHelper, List<Resource> resources,
-            ArtifactGeneratorToscaParser parser, NodeTemplate nodeTemplate) {
+            ArtifactGeneratorToscaParser parser, NodeTemplate nodeTemplate) throws XmlArtifactGenerationException {
         Resource resourceModel = getModelFor(parser, nodeTemplate);
+        if (resourceModel == null) {
+            log.info(ApplicationMsgs.DISTRIBUTION_EVENT, "Could not generate resource model");
+            return;
+        }
+
         Map<String, String> serviceMetadata = nodeTemplate.getMetaData().getAllProperties();
         resourceModel.populateModelIdentificationInformation(serviceMetadata);
 
@@ -252,7 +268,7 @@ public class AaiArtifactGenerator implements ArtifactGenerator {
         }
 
         if (parser.hasSubCategoryTunnelXConnect(serviceMetadata) && parser.hasAllottedResource(serviceMetadata)) {
-            resourceModel.addWidget(new TunnelXconnectWidget());
+            resourceModel.addWidget(Widget.getWidget(WidgetType.valueOf("TUNNEL_XCONNECT")));
         }
 
         resources.addAll(parser.processInstanceGroups(resourceModel, nodeTemplate));
@@ -262,8 +278,10 @@ public class AaiArtifactGenerator implements ArtifactGenerator {
     /**
      * @param generationData
      * @param resource
+     * @throws XmlArtifactGenerationException
      */
-    private void generateResourceArtifact(GenerationData generationData, Resource resource) {
+    private void generateResourceArtifact(GenerationData generationData, Resource resource)
+            throws XmlArtifactGenerationException {
         if (!isContained(generationData, getArtifactName(resource))) {
             log.info(ApplicationMsgs.DISTRIBUTION_EVENT, "Generating resource model");
             generationData.add(getResourceArtifact(resource, modelGenerator.generateModelFor(resource)));
@@ -286,7 +304,7 @@ public class AaiArtifactGenerator implements ArtifactGenerator {
     private String getArtifactLabel(Model model) {
         StringBuilder artifactName = new StringBuilder(ArtifactType.AAI.name());
         artifactName.append("-");
-        artifactName.append(model.getModelType().name().toLowerCase());
+        artifactName.append(model.getModelTypeName());
         artifactName.append("-");
         artifactName.append(hashCodeUuId(model.getModelNameVersionId()));
         return (artifactName.toString()).replaceAll("[^a-zA-Z0-9 +]+", "-");
@@ -307,7 +325,7 @@ public class AaiArtifactGenerator implements ArtifactGenerator {
         artifactName.append(truncatedArtifactName);
 
         artifactName.append("-");
-        artifactName.append(model.getModelType().name().toLowerCase());
+        artifactName.append(model.getModelTypeName());
         artifactName.append("-");
         artifactName.append(model.getModelVersion());
 
@@ -325,7 +343,7 @@ public class AaiArtifactGenerator implements ArtifactGenerator {
      *            AAI model as string
      * @return Generated {@link Artifact} model for the resource
      */
-    private Artifact getResourceArtifact(Model resourceModel, String aaiResourceModel) {
+    private Artifact getResourceArtifact(Resource resourceModel, String aaiResourceModel) {
         final String resourceArtifactLabel = getArtifactLabel(resourceModel);
         MDC.put(MDC_PARAM_MODEL_INFO, resourceModel.getModelName() + "," + resourceArtifactLabel);
         final byte[] bytes = aaiResourceModel.getBytes();
@@ -334,7 +352,7 @@ public class AaiArtifactGenerator implements ArtifactGenerator {
                 GeneratorUtil.checkSum(bytes), GeneratorUtil.encode(bytes));
         artifact.setName(getArtifactName(resourceModel));
         artifact.setLabel(resourceArtifactLabel);
-        artifact.setDescription(ArtifactGeneratorToscaParser.getArtifactDescription(resourceModel));
+        artifact.setDescription("AAI Resource Model");
         return artifact;
     }
 
@@ -364,8 +382,7 @@ public class AaiArtifactGenerator implements ArtifactGenerator {
         String serviceArtifactLabel = getArtifactLabel(serviceModel);
         artifact.setName(serviceArtifactName);
         artifact.setLabel(serviceArtifactLabel);
-        String description = ArtifactGeneratorToscaParser.getArtifactDescription(serviceModel);
-        artifact.setDescription(description);
+        artifact.setDescription("AAI Service Model");
         return artifact;
     }
 
index daf9d36..91eb6a4 100644 (file)
@@ -2,8 +2,8 @@
  * ============LICENSE_START=======================================================
  * org.onap.aai
  * ================================================================================
- * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2018 European Software Marketing Ltd.
+ * Copyright (c) 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (c) 2017-2019 European Software Marketing Ltd.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.babel.xml.generator.api;
 
+import java.io.StringWriter;
+import java.util.Collection;
+import java.util.List;
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.JAXBException;
+import javax.xml.bind.Marshaller;
+import org.onap.aai.babel.logging.ApplicationMsgs;
+import org.onap.aai.babel.logging.LogHelper;
+import org.onap.aai.babel.xml.generator.XmlArtifactGenerationException;
+import org.onap.aai.babel.xml.generator.model.Model;
 import org.onap.aai.babel.xml.generator.model.Resource;
 import org.onap.aai.babel.xml.generator.model.Service;
+import org.onap.aai.babel.xml.generator.model.Widget;
+import org.onap.aai.babel.xml.generator.xsd.ModelElement;
+import org.onap.aai.babel.xml.generator.xsd.ModelElements;
+import org.onap.aai.babel.xml.generator.xsd.ModelVer;
+import org.onap.aai.babel.xml.generator.xsd.ModelVers;
+import org.onap.aai.babel.xml.generator.xsd.Relationship;
+import org.onap.aai.babel.xml.generator.xsd.RelationshipData;
+import org.onap.aai.babel.xml.generator.xsd.RelationshipList;
+import org.onap.aai.cl.api.Logger;
+import org.w3c.dom.DOMException;
+
+/**
+ * Generates the A&AI XML models from the Service/Resource/Widget Java models.
+ */
+public class AaiModelGenerator {
+
+    private static Logger log = LogHelper.INSTANCE;
+
+    /**
+     * Method to generate the AAI model for a Service or Resource.
+     *
+     * @param model
+     *            Java object model representing an AAI {@link Service} or {@link Resource} model
+     * @return XML representation of the model in String format
+     * @throws XmlArtifactGenerationException
+     */
+    public String generateModelFor(Model model) throws XmlArtifactGenerationException {
+        org.onap.aai.babel.xml.generator.xsd.Model aaiModel = createJaxbModel(model);
+        ModelElement baseWidget = addBaseWidgetRelation(model, aaiModel);
+        generateWidgetChildren(baseWidget, model.getWidgets());
+        return getModelAsString(aaiModel);
+    }
+
+    /**
+     * Create a JAXB Model from the supplied Service or Resource.
+     *
+     * @param model
+     *            the Service or Resource containing the model details
+     * @return a new Model object based on the A&AI schema
+     */
+    private org.onap.aai.babel.xml.generator.xsd.Model createJaxbModel(Model model) {
+        log.debug(model.toString());
+
+        org.onap.aai.babel.xml.generator.xsd.Model aaiModel = new org.onap.aai.babel.xml.generator.xsd.Model();
+        aaiModel.setModelInvariantId(model.getModelId());
+        aaiModel.setModelType(model.getModelTypeName());
+
+        aaiModel.setModelVers(new ModelVers());
+        aaiModel.getModelVers().getModelVer().add(createModelVersion(model));
+
+        return aaiModel;
+    }
+
+    /**
+     * Create a new JAXB object representing the model-ver complex type, and populate this with the Model Version
+     * information.
+     * 
+     * @param model
+     *            the Service or Resource containing the version details
+     * @return a new ModelVer object
+     */
+    private ModelVer createModelVersion(Model model) {
+        ModelVer modelVer = new ModelVer();
+        modelVer.setModelDescription(model.getModelDescription());
+        modelVer.setModelName(model.getModelName());
+        modelVer.setModelVersion(model.getModelVersion());
+        modelVer.setModelVersionId(model.getModelNameVersionId());
+        modelVer.setModelElements(new ModelElements());
+        return modelVer;
+    }
+
+    /**
+     * Add base widget model element for the Service or Resource.
+     * 
+     * @param model
+     *            the Service or Resource containing the Model and child resources
+     * @param aaiModel
+     *            the JAXB Model to populate
+     * @return a new ModelElement for the relationship to the base Widget
+     * @throws XmlArtifactGenerationException
+     */
+    private ModelElement addBaseWidgetRelation(Model model, org.onap.aai.babel.xml.generator.xsd.Model aaiModel)
+            throws XmlArtifactGenerationException {
+        ModelElement widgetElement = createWidgetRelationshipModelElement(model);
+        ModelVer modelVer = aaiModel.getModelVers().getModelVer().get(0);
+        modelVer.getModelElements().getModelElement().add(widgetElement);
+
+        // Add the child resources to the base widget model element list
+        List<ModelElement> modelElements = widgetElement.getModelElements().getModelElement();
+        for (Resource resource : model.getResources()) {
+            modelElements.add(createRelationshipModelElement(resource));
+        }
+
+        return widgetElement;
+    }
+
+    /**
+     * Create a model-element complex type storing the relationship to a Service or Resource model's base Widget.
+     * 
+     * @param model
+     *            the Service or Resource model storing the widget's relationship data
+     * @return a new Java object for the model-element type storing the Widget relationship
+     * @throws XmlArtifactGenerationException
+     */
+    private ModelElement createWidgetRelationshipModelElement(Model model) throws XmlArtifactGenerationException {
+        return createRelationshipModelElement(model.getDeleteFlag(), model.getWidgetId(),
+                model.getWidgetInvariantId());
+    }
+
+    /**
+     * Create a model-element complex type storing the relationship to a Resource model.
+     * 
+     * @param resource
+     *            the Resource model storing the relationship data
+     * @return a new Java object for the model-element type storing the relationship
+     * @throws XmlArtifactGenerationException
+     */
+    private ModelElement createRelationshipModelElement(Resource resource) {
+        return createRelationshipModelElement(resource.getDeleteFlag(), resource.getModelNameVersionId(),
+                resource.getModelId());
+    }
+
+    /**
+     * Create a model-element complex type storing the relationship to a Widget model.
+     * 
+     * @param widget
+     *            the Widget model storing the relationship data
+     * @return a new Java object for the model-element type storing the Widget relationship
+     */
+    private ModelElement createRelationshipModelElement(Widget widget) {
+        return createRelationshipModelElement(widget.getDeleteFlag(), widget.getId(), widget.getWidgetId());
+    }
+
+    /**
+     * Method to create the <model-element></model-element> holding the relationship value for a resource/widget model.
+     *
+     * @param newDataDelFlag
+     *            new-data-del-flag (mapped from boolean to the string T or F)
+     * @param modelVersionId
+     *            model-version-id
+     * @param modelInvariantId
+     *            model-invariant-id
+     * @return a new Java object for the model-element type storing the relationship
+     */
+    private ModelElement createRelationshipModelElement(boolean newDataDelFlag, String modelVersionId,
+            String modelInvariantId) {
+        ModelElement relationshipModelElement = new ModelElement();
+        relationshipModelElement.setNewDataDelFlag(newDataDelFlag ? "T" : "F");
+        relationshipModelElement.setCardinality("unbounded");
+        relationshipModelElement.setModelElements(new ModelElements());
+        relationshipModelElement.setRelationshipList(createModelRelationship(modelVersionId, modelInvariantId));
+        return relationshipModelElement;
+    }
+
+    /**
+     * Create the Model Version relationship data.
+     * 
+     * @param modelVersionId
+     *            model-version-id
+     * @param modelInvariantId
+     *            model-invariant-id
+     * @return a new RelationshipList object containing the model-ver relationships
+     */
+    private RelationshipList createModelRelationship(String modelVersionId, String modelInvariantId) {
+        Relationship relationship = new Relationship();
+        relationship.setRelatedTo("model-ver");
+        List<RelationshipData> relationshipDataList = relationship.getRelationshipData();
+        relationshipDataList.add(createRelationshipData("model-ver.model-version-id", modelVersionId));
+        relationshipDataList.add(createRelationshipData("model.model-invariant-id", modelInvariantId));
+
+        RelationshipList relationShipList = new RelationshipList();
+        relationShipList.getRelationship().add(relationship);
+        return relationShipList;
+    }
+
+    /**
+     * Create a new RelationshipData element for the given key/value pair.
+     * 
+     * @param key
+     *            relationship key
+     * @param value
+     *            relationship value
+     * @return a new Java object representing the relationship-data complex type
+     */
+    private RelationshipData createRelationshipData(String key, String value) {
+        RelationshipData data = new RelationshipData();
+        data.setRelationshipKey(key);
+        data.setRelationshipValue(value);
+        return data;
+    }
 
-public interface AaiModelGenerator {
+    /**
+     * Method to create the child model elements of the widget. Handles the generation of recursive child widget
+     * elements (if any).
+     * 
+     * @param parent
+     *            Reference to the parent widget model element
+     * @param widgets
+     *            Set of child widgets obtained from the tosca/widget definition
+     */
+    private void generateWidgetChildren(ModelElement parent, Collection<Widget> widgets) {
+        for (Widget widget : widgets) {
+            ModelElement childRelation = createRelationshipModelElement(widget);
+            parent.getModelElements().getModelElement().add(childRelation);
+            // Recursive call to create any child widgets.
+            generateWidgetChildren(childRelation, widget.getWidgets());
+        }
+    }
 
-    public String generateModelFor(Service service);
+    /**
+     * JAXB marshalling helper method to convert the Java object model to XML String.
+     *
+     * @param model
+     *            Java Object model of a service/widget/resource
+     * @return XML representation of the Java model in String format
+     */
+    private String getModelAsString(org.onap.aai.babel.xml.generator.xsd.Model model) {
+        JAXBContext jaxbContext;
+        StringWriter modelStringWriter = new StringWriter();
+        try {
+            jaxbContext = JAXBContext.newInstance(org.onap.aai.babel.xml.generator.xsd.Model.class);
+            Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
+            jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
+            jaxbMarshaller.setProperty(Marshaller.JAXB_ENCODING, "US-ASCII");
+            jaxbMarshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
+            jaxbMarshaller.marshal(model, modelStringWriter);
+        } catch (JAXBException jaxbException) {
+            log.error(ApplicationMsgs.INVALID_CSAR_FILE, jaxbException);
+            throw new DOMException(DOMException.SYNTAX_ERR, jaxbException.getMessage());
+        }
 
-    public String generateModelFor(Resource resource);
+        return modelStringWriter.toString();
+    }
 }
diff --git a/src/main/java/org/onap/aai/babel/xml/generator/api/AaiModelGeneratorImpl.java b/src/main/java/org/onap/aai/babel/xml/generator/api/AaiModelGeneratorImpl.java
deleted file mode 100644 (file)
index 3bff7e7..0000000
+++ /dev/null
@@ -1,264 +0,0 @@
-/**
- * ============LICENSE_START=======================================================
- * org.onap.aai
- * ================================================================================
- * Copyright © 2017-2019 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2019 European Software Marketing Ltd.
- * ================================================================================
- * 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=========================================================
- */
-
-package org.onap.aai.babel.xml.generator.api;
-
-import java.io.StringWriter;
-import java.util.List;
-import java.util.Set;
-import javax.xml.bind.JAXBContext;
-import javax.xml.bind.JAXBException;
-import javax.xml.bind.Marshaller;
-import org.onap.aai.babel.logging.ApplicationMsgs;
-import org.onap.aai.babel.logging.LogHelper;
-import org.onap.aai.babel.xml.generator.model.Resource;
-import org.onap.aai.babel.xml.generator.model.Service;
-import org.onap.aai.babel.xml.generator.model.Widget;
-import org.onap.aai.babel.xml.generator.xsd.Model;
-import org.onap.aai.babel.xml.generator.xsd.ModelElement;
-import org.onap.aai.babel.xml.generator.xsd.ModelElements;
-import org.onap.aai.babel.xml.generator.xsd.ModelVer;
-import org.onap.aai.babel.xml.generator.xsd.ModelVers;
-import org.onap.aai.babel.xml.generator.xsd.Relationship;
-import org.onap.aai.babel.xml.generator.xsd.RelationshipData;
-import org.onap.aai.babel.xml.generator.xsd.RelationshipList;
-import org.onap.aai.cl.api.Logger;
-import org.w3c.dom.DOMException;
-
-/**
- * Implementation of the {@link AaiModelGenerator} which generates the XML models from the Service/Resource/Widget java
- * models.
- */
-public class AaiModelGeneratorImpl implements AaiModelGenerator {
-    private static Logger log = LogHelper.INSTANCE;
-
-    /**
-     * Method to generate the AAI model for a Service.
-     *
-     * @param service
-     *            Java object model representing an AAI {@link Service} model
-     * @return XML representation of the service model in String format
-     */
-    @Override
-    public String generateModelFor(Service service) {
-        // Create a JAXB Model for AAI service model
-        Model aaiServiceModel = new Model();
-        log.debug("Generating Model for Service with ModelName: " + service.getModelName());
-        // after new model
-        aaiServiceModel.setModelInvariantId(service.getModelId());
-        aaiServiceModel.setModelVers(new ModelVers());
-        ModelVer modelVer = new ModelVer();
-        modelVer.setModelDescription(service.getModelDescription());
-        modelVer.setModelName(service.getModelName());
-        modelVer.setModelVersion(service.getModelVersion());
-        modelVer.setModelVersionId(service.getModelNameVersionId());
-        modelVer.setModelElements(new ModelElements());
-        ModelElements modelElements = modelVer.getModelElements();
-        // Populate basic model details
-        aaiServiceModel.setModelType(service.getModelType().name().toLowerCase()); // Using enum name as model type
-        List<ModelElement> modelElementList = modelElements.getModelElement();
-
-        // Add service base widget model element
-        ModelElement serviceWidgetModelRelationshipElement = createRelationshipModelElement(
-                getNewDataDelFlagValue(service.getDeleteFlag()), service.getWidgetId(), service.getWidgetInvariantId());
-        modelElementList.add(serviceWidgetModelRelationshipElement);
-
-        // Add the resource model elements
-        ModelElements serviceModelElements = serviceWidgetModelRelationshipElement.getModelElements();
-        List<ModelElement> serviceModelElementList = serviceModelElements.getModelElement();
-        Set<Resource> serviceResources = service.getResources();
-        if (serviceResources != null && !serviceResources.isEmpty()) {
-            for (Resource resourceModel : serviceResources) {
-                ModelElement aaiResourceModelElement =
-                        createRelationshipModelElement(getNewDataDelFlagValue(resourceModel.getDeleteFlag()),
-                                resourceModel.getModelNameVersionId(), resourceModel.getModelId());
-                serviceModelElementList.add(aaiResourceModelElement);
-            }
-        }
-
-        // Add the widget model elements
-        Set<Widget> serviceWidgets = service.getWidgets();
-        if (serviceWidgets != null && !serviceWidgets.isEmpty()) {
-            for (Widget widgetModel : serviceWidgets) {
-                ModelElement widgetModelElement =
-                        createRelationshipModelElement(getNewDataDelFlagValue(widgetModel.getDeleteFlag()),
-                                widgetModel.getId(), widgetModel.getWidgetId());
-                serviceModelElementList.add(widgetModelElement);
-            }
-        }
-        ModelVers modelVers = aaiServiceModel.getModelVers();
-        List<ModelVer> modelVerList = modelVers.getModelVer();
-        modelVerList.add(modelVer);
-        return getModelAsString(aaiServiceModel);
-    }
-
-    /**
-     * Method to generate the AAI model for a Resource.
-     *
-     * @param resource
-     *            Java object model representing an AAI {@link Resource} model
-     * @return XML representation of the resource model in String format
-     */
-    @Override
-    public String generateModelFor(Resource resource) {
-        // Create a JAXB Model for AAI Resource model
-        Model aaiResourceModel = new Model();
-        log.debug("Generating Model for Resource with ModelName: " + resource.getModelName());
-        aaiResourceModel.setModelInvariantId(resource.getModelId());
-        aaiResourceModel.setModelVers(new ModelVers());
-        ModelVer modelVer = new ModelVer();
-        modelVer.setModelDescription(resource.getModelDescription());
-        modelVer.setModelName(resource.getModelName());
-        modelVer.setModelVersion(resource.getModelVersion());
-        modelVer.setModelVersionId(resource.getModelNameVersionId());
-        modelVer.setModelElements(new ModelElements());
-        ModelElements modelElements = modelVer.getModelElements();
-        aaiResourceModel.setModelType(resource.getModelType().name().toLowerCase()); // Using enum name as model type
-        List<ModelElement> modelElementList = modelElements.getModelElement();
-
-        // Add resource base widget model element
-        ModelElement resourceWidgetModelRelationshipElement =
-                createRelationshipModelElement(getNewDataDelFlagValue(resource.getDeleteFlag()), resource.getWidgetId(),
-                        resource.getWidgetInvariantId());
-        modelElementList.add(resourceWidgetModelRelationshipElement);
-
-        // Add the child resources to the base widget model element list
-        ModelElements baseResourceWidgetModelElements = resourceWidgetModelRelationshipElement.getModelElements();
-        List<ModelElement> baseResourceWidgetModelElementList = baseResourceWidgetModelElements.getModelElement();
-        Set<Resource> childResources = resource.getResources();
-        if (childResources != null && !childResources.isEmpty()) {
-            for (Resource childResourceModel : childResources) {
-                ModelElement aaiChildResourceModelElement =
-                        createRelationshipModelElement(getNewDataDelFlagValue(childResourceModel.getDeleteFlag()),
-                                childResourceModel.getModelNameVersionId(), childResourceModel.getModelId());
-                baseResourceWidgetModelElementList.add(aaiChildResourceModelElement);
-            }
-        }
-        // Add resource widgets/resources to the resource widget model relationship element
-        Set<Widget> resourceWidgets = resource.getWidgets();
-        if (resourceWidgets != null && !resourceWidgets.isEmpty()) {
-            generateWidgetChildren(resourceWidgetModelRelationshipElement, resourceWidgets);
-        }
-
-        ModelVers modelVers = aaiResourceModel.getModelVers();
-        List<ModelVer> modelVerList = modelVers.getModelVer();
-        modelVerList.add(modelVer);
-        return getModelAsString(aaiResourceModel);
-    }
-
-    /**
-     * Method to create the <model-element></model-element> holding the relationship value for a resource/widget model.
-     *
-     * @param newDataDelFlag
-     *            Value of the <new-data-del-flag></new-data-del-flag> attribute for a widget/resource in the model xml
-     * @param relationshipValue
-     *            Value of the <relationship-value></relationship-value> attribute for the widget/resource in the model
-     *            xml
-     * @return Java object representation for the <model-element></model-element> holding the relationship
-     */
-    private ModelElement createRelationshipModelElement(String newDataDelFlag, String modelVersionId,
-            String modelInvariantId) {
-        ModelElement relationshipModelElement = new ModelElement();
-        relationshipModelElement.setNewDataDelFlag(newDataDelFlag); // Set new-data-del-flag value
-        relationshipModelElement.setCardinality("unbounded");
-        RelationshipList relationShipList = new RelationshipList();
-        final List<Relationship> relationships = relationShipList.getRelationship();
-        Relationship relationship = new Relationship();
-        relationship.setRelatedTo("model-ver");
-        List<RelationshipData> relationshipDataList = relationship.getRelationshipData();
-
-        RelationshipData modelVersionRelationshipData = new RelationshipData();
-        modelVersionRelationshipData.setRelationshipKey("model-ver.model-version-id");
-        modelVersionRelationshipData.setRelationshipValue(modelVersionId); // Set the widget/resource name-version-uuid
-        // as value
-        relationshipDataList.add(modelVersionRelationshipData);
-        RelationshipData modelInvariantRelationshipData = new RelationshipData();
-        modelInvariantRelationshipData.setRelationshipKey("model.model-invariant-id");
-        modelInvariantRelationshipData.setRelationshipValue(modelInvariantId);
-        relationshipDataList.add(modelInvariantRelationshipData);
-        relationships.add(relationship);
-        relationshipModelElement.setRelationshipList(relationShipList);
-        relationshipModelElement.setModelElements(new ModelElements());
-        return relationshipModelElement;
-    }
-
-    /**
-     * Method to create the child model elements of the widget. Handles the generation of recursive child widget
-     * elements (if any)
-     *
-     * @param parent
-     *            Reference to the parent widget model element
-     * @param widgetChildrenSet
-     *            Set of children obtained from the tosca/widget definition
-     */
-    private void generateWidgetChildren(ModelElement parent, Set<Widget> widgetChildrenSet) {
-        for (Widget widget : widgetChildrenSet) {
-            Set<Widget> widgetSubChildren = widget.getWidgets();
-            if (widgetSubChildren != null && !widgetSubChildren.isEmpty()) {
-                ModelElement widgetChildRelationshipElement = createRelationshipModelElement(
-                        getNewDataDelFlagValue(widget.getDeleteFlag()), widget.getId(), widget.getWidgetId());
-                // Recursive call for getting the children of widgets (if any)
-                generateWidgetChildren(widgetChildRelationshipElement, widgetSubChildren);
-                parent.getModelElements().getModelElement().add(widgetChildRelationshipElement);
-            } else {
-                ModelElement widgetChildRelationshipElement = createRelationshipModelElement(
-                        getNewDataDelFlagValue(widget.getDeleteFlag()), widget.getId(), widget.getWidgetId());
-                parent.getModelElements().getModelElement().add(widgetChildRelationshipElement);
-            }
-        }
-    }
-
-    /**
-     * Converts the data delete flag value from boolean to String as per AAI model.
-     *
-     * @param delFlag
-     *            Boolean value as true/false from the annotation
-     * @return Converted value to a flag as per AAI model
-     */
-    private String getNewDataDelFlagValue(boolean delFlag) {
-        return delFlag ? "T" : "F";
-    }
-
-    /**
-     * JAXB marshalling helper method to convert the Java object model to XML String.
-     *
-     * @param model
-     *            Java Object model of a service/widget/resource
-     * @return XML representation of the Java model in String format
-     */
-    private String getModelAsString(Model model) {
-        JAXBContext jaxbContext;
-        StringWriter modelStringWriter = new StringWriter();
-        try {
-            jaxbContext = JAXBContext.newInstance(Model.class);
-            Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
-            jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
-            jaxbMarshaller.setProperty(Marshaller.JAXB_ENCODING, "US-ASCII");
-            jaxbMarshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
-            jaxbMarshaller.marshal(model, modelStringWriter);
-        } catch (JAXBException jaxbException) {
-            log.error(ApplicationMsgs.INVALID_CSAR_FILE, jaxbException);
-            throw new DOMException(DOMException.SYNTAX_ERR, jaxbException.getMessage());
-        }
-
-        return modelStringWriter.toString();
-    }
-}
index 50dfc89..2a2e32c 100644 (file)
@@ -2,8 +2,8 @@
  * ============LICENSE_START=======================================================
  * org.onap.aai
  * ================================================================================
- * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2018 European Software Marketing Ltd.
+ * Copyright (c) 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (c) 2017-2019 European Software Marketing Ltd.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -18,6 +18,7 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.babel.xml.generator.data;
 
 public class Artifact {
@@ -50,18 +51,6 @@ public class Artifact {
         return payload;
     }
 
-    public String getChecksum() {
-        return checksum;
-    }
-
-    public String getType() {
-        return type;
-    }
-
-    public String getGroupType() {
-        return groupType;
-    }
-
     public String getName() {
         return name;
     }
@@ -70,18 +59,10 @@ public class Artifact {
         this.name = name;
     }
 
-    public String getLabel() {
-        return label;
-    }
-
     public void setLabel(String label) {
         this.label = label;
     }
 
-    public String getDescription() {
-        return description;
-    }
-
     public void setDescription(String description) {
         this.description = description;
     }
index f59cb66..8ca8b6b 100644 (file)
@@ -2,8 +2,8 @@
  * ============LICENSE_START=======================================================
  * org.onap.aai
  * ================================================================================
- * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2018 European Software Marketing Ltd.
+ * Copyright (c) 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (c) 2017-2019 European Software Marketing Ltd.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -18,6 +18,7 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.babel.xml.generator.data;
 
 import java.util.ArrayList;
@@ -30,17 +31,12 @@ public class GenerationData {
     List<Artifact> resultData = new ArrayList<>();
     Map<String, List<String>> errorData = new HashMap<>();
 
-    public void add(List<Artifact> resultData, Map<String, List<String>> errorData) {
-        this.resultData.addAll(resultData);
-        this.errorData.putAll(errorData);
-    }
-
     public void add(Artifact generatedArtifact) {
         resultData.add(generatedArtifact);
     }
 
     /**
-     * Add the error code to the list of error codes for the given ID
+     * Add the error code to the list of error codes for the given ID.
      *
      * @param generatorId the generator id
      * @param errorCode the error code
@@ -50,11 +46,6 @@ public class GenerationData {
         errorData.get(generatorId).add(errorCode);
     }
 
-    public void add(GenerationData generationData) {
-        this.resultData.addAll(generationData.resultData);
-        this.errorData.putAll(generationData.errorData);
-    }
-
     public List<Artifact> getResultData() {
         return resultData;
     }
index 42c8893..16f6b13 100644 (file)
@@ -2,8 +2,8 @@
  * ============LICENSE_START=======================================================
  * org.onap.aai
  * ================================================================================
- * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2018 European Software Marketing Ltd.
+ * Copyright (c) 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (c) 2017-2019 European Software Marketing Ltd.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -18,6 +18,7 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.babel.xml.generator.data;
 
 import java.util.Base64;
@@ -27,20 +28,10 @@ import org.apache.commons.codec.digest.DigestUtils;
 public final class GeneratorUtil {
 
     /*
-     * Private constructor to prevent instantiation
+     * Private constructor to prevent instantiation.
      */
     private GeneratorUtil() {}
 
-    /**
-     * Decodes Base64 encode byte array input.
-     *
-     * @param input Base64 encoded byte array
-     * @return Decoded byte array
-     */
-    public static byte[] decode(byte[] input) {
-        return input != null ? Base64.getDecoder().decode(input) : new byte[0];
-    }
-
     /**
      * Encode a byte array input using Base64 encoding.
      *
index bbc7164..7ecd3f2 100644 (file)
@@ -2,8 +2,8 @@
  * ============LICENSE_START=======================================================
  * org.onap.aai
  * ================================================================================
- * Copyright © 2017-2019 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2019 European Software Marketing Ltd.
+ * Copyright (c) 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (c) 2017-2019 European Software Marketing Ltd.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -30,6 +30,11 @@ public class GroupConfiguration {
      */
     private List<String> instanceGroupTypes;
 
+    /**
+     * Set of Widget Types.
+     */
+    private List<WidgetTypeConfig> widgetTypes;
+
     /**
      * Mapping from TOSCA type to Widget directly.
      */
@@ -39,7 +44,12 @@ public class GroupConfiguration {
         return instanceGroupTypes;
     }
 
+    public List<WidgetTypeConfig> getWidgetTypes() {
+        return widgetTypes;
+    }
+
     public List<WidgetMapping> getWidgetMappings() {
         return widgetMappings;
     }
+
 }
index 5298f08..7683f7c 100644 (file)
@@ -2,8 +2,8 @@
  * ============LICENSE_START=======================================================
  * org.onap.aai
  * ================================================================================
- * Copyright © 2017-2019 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2019 European Software Marketing Ltd.
+ * Copyright (c) 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (c) 2017-2019 European Software Marketing Ltd.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
 
 package org.onap.aai.babel.xml.generator.data;
 
+import com.google.common.base.Enums;
+import java.io.IOException;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
 import java.util.Properties;
+import org.onap.aai.babel.xml.generator.XmlArtifactGenerationException;
 import org.onap.aai.babel.xml.generator.model.Resource;
+import org.onap.aai.babel.xml.generator.model.WidgetType;
 import org.onap.aai.babel.xml.generator.model.Widget;
+import org.onap.aai.babel.xml.generator.types.ModelType;
 
 public class WidgetConfigurationUtil {
 
     private static Properties config;
     private static List<String> instanceGroups = Collections.emptyList();
-    private static Map<String, Resource> typeToWidget = new HashMap<>();
+    private static Map<String, Resource> typeToResource = new HashMap<>();
+    private static Map<String, Widget> typeToWidget = new HashMap<>();
 
     /*
-     * Private constructor to prevent instantiation
+     * Private constructor to prevent instantiation.
      */
     private WidgetConfigurationUtil() {
         throw new UnsupportedOperationException("This static class should not be instantiated!");
@@ -60,17 +66,40 @@ public class WidgetConfigurationUtil {
     }
 
     public static Optional<Resource> createModelFromType(String typePrefix) {
-        return Optional.ofNullable(typeToWidget.get(typePrefix));
+        return Optional.ofNullable(typeToResource.get(typePrefix));
     }
 
-    public static void setWidgetMappings(List<WidgetMapping> mappings) {
+    public static Widget createWidgetFromType(String widgetType) throws XmlArtifactGenerationException {
+        Optional<Widget> widget = Optional.ofNullable(typeToWidget.get(widgetType));
+        if (widget.isPresent()) {
+            // Make a copy of the Widget found in the mappings table.
+            return new Widget(widget.get());
+        }
+        return null;
+    }
+
+    public static void setWidgetTypes(List<WidgetTypeConfig> types) {
+        for (WidgetTypeConfig type : types) {
+            if (type.type == null || type.name == null) {
+                throw new IllegalArgumentException("Incomplete widget type specified: " + type);
+            }
+            WidgetType widgetType = new WidgetType(type.type);
+            Widget widget = new Widget(widgetType, type.name, type.deleteFlag);
+            typeToWidget.put(type.type, widget);
+        }
+        WidgetType.validateElements();
+    }
+
+    public static void setWidgetMappings(List<WidgetMapping> mappings) throws IOException  {
         for (WidgetMapping mapping : mappings) {
-            if (mapping.prefix == null || mapping.widget == null) {
-                throw new IllegalArgumentException("Incomplete widget mapping specified: " + mapping);
+            ModelType modelType = Optional.ofNullable(mapping.type).map(String::toUpperCase)
+                    .map(s -> Enums.getIfPresent(ModelType.class, s).orNull()).orElse(null);
+            if (mapping.prefix == null || mapping.widget == null || modelType == null) {
+                throw new IOException("Invalid widget mapping specified: " + mapping);
             }
-            Resource resource = new Resource(Widget.Type.valueOf(mapping.widget), mapping.deleteFlag);
-            resource.setIsResource(mapping.type.equalsIgnoreCase("resource"));
-            typeToWidget.put(mapping.prefix, resource);
+            Resource resource = new Resource(WidgetType.valueOf(mapping.widget), mapping.deleteFlag);
+            resource.setModelType(modelType);
+            typeToResource.put(mapping.prefix, resource);
         }
     }
 }
index dd46626..2b298da 100644 (file)
 
 package org.onap.aai.babel.xml.generator.data;
 
-import java.util.Map;
-
 public class WidgetMapping {
 
-    String prefix = null;
+    String prefix;
     String type = "resource"; // Default type is Resource (not Widget)
-    String widget = null;
+    String widget;
     boolean deleteFlag = true;
-    Map<String, Object> properties;
 
     public void setType(String type) {
         this.type = type;
@@ -42,6 +39,6 @@ public class WidgetMapping {
     @Override
     public String toString() {
         return "WidgetMapping [prefix=" + prefix + ", type=" + type + ", widget=" + widget + ", deleteFlag="
-                + deleteFlag + ", properties=" + properties + "]";
+                + deleteFlag + "]";
     }
 }
@@ -2,8 +2,8 @@
  * ============LICENSE_START=======================================================
  * org.onap.aai
  * ================================================================================
- * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2018 European Software Marketing Ltd.
+ * Copyright (c) 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (c) 2017-2019 European Software Marketing Ltd.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
-package org.onap.aai.babel.xml.generator.model;
 
-public class ResourceWidget extends Widget {
+package org.onap.aai.babel.xml.generator.data;
+
+/**
+ * Widget Type as configured in the TOSCA Mappings. 
+ *
+ */
+public class WidgetTypeConfig {
+
+    String type;
+    String name;
+    boolean deleteFlag = false;
+
 }
diff --git a/src/main/java/org/onap/aai/babel/xml/generator/model/AllotedResourceWidget.java b/src/main/java/org/onap/aai/babel/xml/generator/model/AllotedResourceWidget.java
deleted file mode 100644 (file)
index 740ca62..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-/**
- * ============LICENSE_START=======================================================
- * org.onap.aai
- * ================================================================================
- * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2018 European Software Marketing Ltd.
- * ================================================================================
- * 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=========================================================
- */
-package org.onap.aai.babel.xml.generator.model;
-
-import org.onap.aai.babel.xml.generator.types.Cardinality;
-import org.onap.aai.babel.xml.generator.types.ModelType;
-import org.onap.aai.babel.xml.generator.types.ModelWidget;
-
-@org.onap.aai.babel.xml.generator.types.Model(widget = Widget.Type.ALLOTTED_RESOURCE,
-        cardinality = Cardinality.UNBOUNDED, dataDeleteFlag = true)
-@ModelWidget(type = ModelType.WIDGET, name = "allotted-resource")
-public class AllotedResourceWidget extends ResourceWidget {
-}
diff --git a/src/main/java/org/onap/aai/babel/xml/generator/model/CRWidget.java b/src/main/java/org/onap/aai/babel/xml/generator/model/CRWidget.java
deleted file mode 100644 (file)
index f0962ad..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-/**
- * ============LICENSE_START=======================================================
- * org.onap.aai
- * ================================================================================
- * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2018 European Software Marketing Ltd.
- * ================================================================================
- * 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=========================================================
- */
-package org.onap.aai.babel.xml.generator.model;
-
-import org.onap.aai.babel.xml.generator.types.Cardinality;
-import org.onap.aai.babel.xml.generator.types.ModelType;
-import org.onap.aai.babel.xml.generator.types.ModelWidget;
-
-@org.onap.aai.babel.xml.generator.types.Model(widget = Widget.Type.CR, cardinality = Cardinality.UNBOUNDED,
-        dataDeleteFlag = true)
-@ModelWidget(type = ModelType.WIDGET, name = "cr")
-public class CRWidget extends ResourceWidget {
-}
diff --git a/src/main/java/org/onap/aai/babel/xml/generator/model/ConfigurationWidget.java b/src/main/java/org/onap/aai/babel/xml/generator/model/ConfigurationWidget.java
deleted file mode 100644 (file)
index 7822926..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-/**
- * ============LICENSE_START=======================================================
- * org.onap.aai
- * ================================================================================
- * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2018 European Software Marketing Ltd.
- * ================================================================================
- * 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=========================================================
- */
-package org.onap.aai.babel.xml.generator.model;
-
-import org.onap.aai.babel.xml.generator.types.Cardinality;
-import org.onap.aai.babel.xml.generator.types.ModelType;
-import org.onap.aai.babel.xml.generator.types.ModelWidget;
-
-@org.onap.aai.babel.xml.generator.types.Model(widget = Widget.Type.CONFIGURATION, cardinality = Cardinality.UNBOUNDED,
-        dataDeleteFlag = true)
-@ModelWidget(type = ModelType.WIDGET, name = "configuration")
-public class ConfigurationWidget extends ResourceWidget {
-}
diff --git a/src/main/java/org/onap/aai/babel/xml/generator/model/FlavorWidget.java b/src/main/java/org/onap/aai/babel/xml/generator/model/FlavorWidget.java
deleted file mode 100644 (file)
index 26dde9b..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-/**
- * ============LICENSE_START=======================================================
- * org.onap.aai
- * ================================================================================
- * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2018 European Software Marketing Ltd.
- * ================================================================================
- * 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=========================================================
- */
-package org.onap.aai.babel.xml.generator.model;
-
-import org.onap.aai.babel.xml.generator.types.Cardinality;
-import org.onap.aai.babel.xml.generator.types.Model;
-import org.onap.aai.babel.xml.generator.types.ModelType;
-import org.onap.aai.babel.xml.generator.types.ModelWidget;
-
-@Model(widget = Widget.Type.FLAVOR, cardinality = Cardinality.UNBOUNDED, dataDeleteFlag = false)
-@ModelWidget(type = ModelType.WIDGET, name = "flavor")
-public class FlavorWidget extends ResourceWidget {
-}
diff --git a/src/main/java/org/onap/aai/babel/xml/generator/model/ImageWidget.java b/src/main/java/org/onap/aai/babel/xml/generator/model/ImageWidget.java
deleted file mode 100644 (file)
index 60656b2..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-/**
- * ============LICENSE_START=======================================================
- * org.onap.aai
- * ================================================================================
- * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2018 European Software Marketing Ltd.
- * ================================================================================
- * 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=========================================================
- */
-package org.onap.aai.babel.xml.generator.model;
-
-import org.onap.aai.babel.xml.generator.types.Cardinality;
-import org.onap.aai.babel.xml.generator.types.Model;
-import org.onap.aai.babel.xml.generator.types.ModelType;
-import org.onap.aai.babel.xml.generator.types.ModelWidget;
-
-@Model(widget = Widget.Type.IMAGE, cardinality = Cardinality.UNBOUNDED, dataDeleteFlag = false)
-@ModelWidget(type = ModelType.WIDGET, name = "image")
-public class ImageWidget extends ResourceWidget {
-}
diff --git a/src/main/java/org/onap/aai/babel/xml/generator/model/InstanceGroupWidget.java b/src/main/java/org/onap/aai/babel/xml/generator/model/InstanceGroupWidget.java
deleted file mode 100644 (file)
index dabce34..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-/**
- * ============LICENSE_START=======================================================
- * org.onap.aai
- * ================================================================================
- * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2018 European Software Marketing Ltd.
- * ================================================================================
- * 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=========================================================
- */
-package org.onap.aai.babel.xml.generator.model;
-
-import org.onap.aai.babel.xml.generator.types.Cardinality;
-import org.onap.aai.babel.xml.generator.types.ModelType;
-import org.onap.aai.babel.xml.generator.types.ModelWidget;
-
-@org.onap.aai.babel.xml.generator.types.Model(widget = Widget.Type.INSTANCE_GROUP, cardinality = Cardinality.UNBOUNDED,
-        dataDeleteFlag = true)
-@ModelWidget(type = ModelType.WIDGET, name = "instance-group")
-public class InstanceGroupWidget extends Widget {
-}
diff --git a/src/main/java/org/onap/aai/babel/xml/generator/model/L3NetworkWidget.java b/src/main/java/org/onap/aai/babel/xml/generator/model/L3NetworkWidget.java
deleted file mode 100644 (file)
index f737b82..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-/**
- * ============LICENSE_START=======================================================
- * org.onap.aai
- * ================================================================================
- * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2018 European Software Marketing Ltd.
- * ================================================================================
- * 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=========================================================
- */
-package org.onap.aai.babel.xml.generator.model;
-
-import org.onap.aai.babel.xml.generator.types.Cardinality;
-import org.onap.aai.babel.xml.generator.types.ModelType;
-import org.onap.aai.babel.xml.generator.types.ModelWidget;
-
-@org.onap.aai.babel.xml.generator.types.Model(widget = Widget.Type.L3_NET, cardinality = Cardinality.UNBOUNDED,
-        dataDeleteFlag = true)
-@ModelWidget(type = ModelType.WIDGET, name = "l3-network")
-public class L3NetworkWidget extends Widget {
-}
diff --git a/src/main/java/org/onap/aai/babel/xml/generator/model/LIntfWidget.java b/src/main/java/org/onap/aai/babel/xml/generator/model/LIntfWidget.java
deleted file mode 100644 (file)
index fb07ef6..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-/**
- * ============LICENSE_START=======================================================
- * org.onap.aai
- * ================================================================================
- * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2018 European Software Marketing Ltd.
- * ================================================================================
- * 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=========================================================
- */
-package org.onap.aai.babel.xml.generator.model;
-
-import org.onap.aai.babel.xml.generator.types.Cardinality;
-import org.onap.aai.babel.xml.generator.types.Model;
-import org.onap.aai.babel.xml.generator.types.ModelType;
-import org.onap.aai.babel.xml.generator.types.ModelWidget;
-
-@Model(widget = Widget.Type.LINT, cardinality = Cardinality.UNBOUNDED, dataDeleteFlag = true)
-@ModelWidget(type = ModelType.WIDGET, name = "l-interface")
-public class LIntfWidget extends ResourceWidget {
-}
index d4da6df..ea1d478 100644 (file)
@@ -2,8 +2,8 @@
  * ============LICENSE_START=======================================================
  * org.onap.aai
  * ================================================================================
- * Copyright © 2017-2019 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2019 European Software Marketing Ltd.
+ * Copyright (c) 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (c) 2017-2019 European Software Marketing Ltd.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -18,6 +18,7 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.babel.xml.generator.model;
 
 import java.util.Collections;
@@ -27,10 +28,8 @@ import java.util.Iterator;
 import java.util.Map;
 import java.util.Optional;
 import java.util.Set;
+import org.onap.aai.babel.xml.generator.XmlArtifactGenerationException;
 import org.onap.aai.babel.xml.generator.data.WidgetConfigurationUtil;
-import org.onap.aai.babel.xml.generator.error.IllegalAccessException;
-import org.onap.aai.babel.xml.generator.model.Widget.Type;
-import org.onap.aai.babel.xml.generator.types.ModelType;
 
 public abstract class Model {
 
@@ -99,9 +98,9 @@ public abstract class Model {
         public abstract void populate(Model model, String value);
     }
 
-    private String modelId;
+    private String modelId; // model-invariant-id
     private String modelName;
-    private String modelNameVersionId;
+    private String modelNameVersionId; // model-version-id
     private String modelVersion;
     private String modelDescription;
 
@@ -109,10 +108,10 @@ public abstract class Model {
     protected Set<Widget> widgets = new HashSet<>();
 
     /**
-     * Gets the object (model) corresponding to the supplied TOSCA type.
+     * Gets the Resource Model corresponding to the supplied TOSCA type.
      *
      * @param toscaType
-     *     the tosca type
+     *            the tosca type
      * @return the model for the type, or null
      */
     public static Resource getModelFor(String toscaType) {
@@ -141,30 +140,30 @@ public abstract class Model {
      * information.
      *
      * @param toscaType
-     *     the TOSCA type
+     *            the TOSCA type
      * @param metaDataType
-     *     the type from the TOSCA metadata
+     *            the type from the TOSCA metadata
      * @return the model for the type, or null
      */
     public static Resource getModelFor(String toscaType, String metaDataType) {
         if ("Configuration".equals(metaDataType)) {
-            return new Resource(Type.CONFIGURATION, true);
+            return new Resource(WidgetType.valueOf("CONFIGURATION"), true);
         } else if ("CR".equals(metaDataType)) {
-            return new Resource(Type.CR, true);
+            return new Resource(WidgetType.valueOf("CR"), true);
         } else {
             return getModelFor(toscaType);
         }
     }
 
-    public abstract boolean addResource(Resource resource);
-
-    public abstract boolean addWidget(Widget resource);
+    public abstract boolean addWidget(Widget resource) throws XmlArtifactGenerationException;
 
-    public abstract Widget.Type getWidgetType();
+    public abstract WidgetType getWidgetType();
 
-    public abstract Map<String, Object> getProperties();
+    public abstract String getModelTypeName();
 
-    public abstract boolean isResource();
+    public boolean addResource(Resource resource) {
+        return resources.add(resource);
+    }
 
     /**
      * Gets delete flag.
@@ -172,9 +171,7 @@ public abstract class Model {
      * @return the delete flag
      */
     public boolean getDeleteFlag() {
-        org.onap.aai.babel.xml.generator.types.Model model =
-                this.getClass().getAnnotation(org.onap.aai.babel.xml.generator.types.Model.class);
-        return model.dataDeleteFlag();
+        return true;
     }
 
     public String getModelDescription() {
@@ -182,7 +179,6 @@ public abstract class Model {
     }
 
     public String getModelId() {
-        checkSupported();
         return modelId;
     }
 
@@ -195,54 +191,34 @@ public abstract class Model {
     }
 
     public String getModelNameVersionId() {
-        checkSupported();
         return modelNameVersionId;
     }
 
-    /**
-     * Gets model type.
-     *
-     * @return the model type
-     */
-    public ModelType getModelType() {
-        if (this instanceof Service) {
-            return ModelType.SERVICE;
-        } else if (this instanceof Resource) {
-            return ModelType.RESOURCE;
-        } else if (this instanceof Widget) {
-            return ModelType.WIDGET;
-        } else {
-            return null;
-        }
-    }
-
     /**
      * Gets widget version id.
      *
      * @return the widget version id
+     * @throws XmlArtifactGenerationException
      */
-    public String getWidgetId() {
-        org.onap.aai.babel.xml.generator.types.Model model =
-                this.getClass().getAnnotation(org.onap.aai.babel.xml.generator.types.Model.class);
-        return Widget.getWidget(model.widget()).getId();
+    public String getWidgetId() throws XmlArtifactGenerationException {
+        return Widget.getWidget(getWidgetType()).getId();
     }
 
     /**
      * Gets invariant id.
      *
      * @return the invariant id
+     * @throws XmlArtifactGenerationException
      */
-    public String getWidgetInvariantId() {
-        org.onap.aai.babel.xml.generator.types.Model model =
-                this.getClass().getAnnotation(org.onap.aai.babel.xml.generator.types.Model.class);
-        return Widget.getWidget(model.widget()).getWidgetId();
+    public String getWidgetInvariantId() throws XmlArtifactGenerationException {
+        return Widget.getWidget(getWidgetType()).getWidgetId();
     }
 
     /**
      * Populate model identification information.
      *
      * @param modelIdentInfo
-     *     the model ident info
+     *            the model ident info
      */
     public void populateModelIdentificationInformation(Map<String, String> modelIdentInfo) {
         Iterator<String> iter = modelIdentInfo.keySet().iterator();
@@ -268,10 +244,9 @@ public abstract class Model {
         return widgets;
     }
 
-    private void checkSupported() {
-        if (this instanceof Widget) {
-            throw new IllegalAccessException(GENERATOR_AAI_ERROR_UNSUPPORTED_WIDGET_OPERATION);
-        }
+    @Override
+    public String toString() {
+        return "Model [type=" + getModelTypeName() + ", name=" + getModelName() + "]";
     }
 
 }
diff --git a/src/main/java/org/onap/aai/babel/xml/generator/model/OamNetwork.java b/src/main/java/org/onap/aai/babel/xml/generator/model/OamNetwork.java
deleted file mode 100644 (file)
index e9076a9..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-/**
- * ============LICENSE_START=======================================================
- * org.onap.aai
- * ================================================================================
- * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2018 European Software Marketing Ltd.
- * ================================================================================
- * 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=========================================================
- */
-package org.onap.aai.babel.xml.generator.model;
-
-import org.onap.aai.babel.xml.generator.types.Cardinality;
-import org.onap.aai.babel.xml.generator.types.Model;
-import org.onap.aai.babel.xml.generator.types.ModelType;
-import org.onap.aai.babel.xml.generator.types.ModelWidget;
-
-@Model(widget = Widget.Type.L3_NET, cardinality = Cardinality.UNBOUNDED, dataDeleteFlag = true)
-@ModelWidget(type = ModelType.WIDGET, name = "oam-network")
-public class OamNetwork extends Widget {
-}
index d6a9405..f5f7c50 100644 (file)
@@ -2,8 +2,8 @@
  * ============LICENSE_START=======================================================
  * org.onap.aai
  * ================================================================================
- * Copyright © 2017-2019 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2019 European Software Marketing Ltd.
+ * Copyright (c) 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (c) 2017-2019 European Software Marketing Ltd.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -24,13 +24,14 @@ package org.onap.aai.babel.xml.generator.model;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
-import org.onap.aai.babel.xml.generator.model.Widget.Type;
+import org.onap.aai.babel.xml.generator.XmlArtifactGenerationException;
+import org.onap.aai.babel.xml.generator.types.ModelType;
 
 public class Resource extends Model {
 
-    private Type type;
+    private WidgetType type;
     private boolean deleteFlag;
-    private boolean isResource = true;
+    private ModelType modelType = ModelType.RESOURCE;
     private Map<String, Object> properties = Collections.emptyMap();
 
     Widget vserver = null;
@@ -38,7 +39,7 @@ public class Resource extends Model {
     boolean addvolume = false;
     List<String> members;
 
-    public Resource(Type type, boolean deleteFlag) {
+    public Resource(WidgetType type, boolean deleteFlag) {
         this.type = type;
         this.deleteFlag = deleteFlag;
     }
@@ -57,65 +58,52 @@ public class Resource extends Model {
         return false;
     }
 
+    @Override
     public boolean getDeleteFlag() {
         return deleteFlag;
     }
 
-    public String getWidgetInvariantId() {
-        return Widget.getWidget(getWidgetType()).getWidgetId();
-    }
-
-    public String getWidgetId() {
-        return Widget.getWidget(getWidgetType()).getId();
-    }
-
     public void setProperties(Map<String, Object> properties) {
         this.properties = properties;
     }
 
-    @Override
     public Map<String, Object> getProperties() {
         return properties;
     }
 
-    public void setIsResource(boolean isResource) {
-        this.isResource = isResource;
+    public void setModelType(ModelType type) {
+        this.modelType = type;
     }
 
-    @Override
-    public boolean isResource() {
-        return isResource;
+    public ModelType getModelType() {
+        return modelType;
     }
 
     public void setMembers(List<String> members) {
         this.members = members;
     }
 
-    @Override
-    public boolean addResource(Resource resource) {
-        return resources.add(resource);
-    }
-
     /**
      * Adds a Widget.
      *
      * @param widget
      *            the widget
      * @return the boolean
+     * @throws XmlArtifactGenerationException
      */
     @Override
-    public boolean addWidget(Widget widget) {
-        if (type == Type.VFMODULE) {
+    public boolean addWidget(Widget widget) throws XmlArtifactGenerationException {
+        if (type == WidgetType.valueOf("VFMODULE")) {
             if (widget.memberOf(members)) {
-                if (vserver == null && widget instanceof VServerWidget) {
+                if (vserver == null && widget.getWidgetType() == WidgetType.valueOf("VSERVER")) {
                     addVserverWidget(widget);
-                } else if (widget instanceof LIntfWidget) {
+                } else if (widget.getWidgetType() == WidgetType.valueOf("LINT")) {
                     return addLIntfWidget(widget);
-                } else if (widget instanceof VolumeWidget) {
+                } else if (widget.getWidgetType() == WidgetType.valueOf("VOLUME")) {
                     addVolumeWidget(widget);
                     return true;
                 }
-                if (!(widget instanceof OamNetwork)) {
+                if (widget.getWidgetType() != WidgetType.valueOf("OAM_NETWORK")) {
                     return widgets.add(widget);
                 }
             }
@@ -125,13 +113,19 @@ public class Resource extends Model {
         }
     }
 
-    public Type getWidgetType() {
+    public WidgetType getWidgetType() {
         return type;
     }
 
+    public String getModelTypeName() {
+        return "resource";
+    }
+
     @Override
     public String toString() {
-        return "Widget type " + getWidgetType() + ", isResource=" + isResource() + ", deleteFlag=" + deleteFlag;
+        return "Resource [widget type=" + getWidgetType() + ", deleteFlag=" + deleteFlag + ", modelType=" + modelType
+                + ", properties=" + properties + ", vserver=" + vserver + ", addlintf=" + addlintf + ", addvolume="
+                + addvolume + ", members=" + members + "]";
     }
 
     private void addVolumeWidget(Widget widget) {
@@ -156,13 +150,13 @@ public class Resource extends Model {
         }
     }
 
-    private void addVserverWidget(Widget widget) {
+    private void addVserverWidget(Widget widget) throws XmlArtifactGenerationException {
         vserver = widget;
         if (addlintf) {
-            vserver.addWidget(new LIntfWidget());
+            vserver.addWidget(Widget.getWidget(WidgetType.valueOf("LINT")));
         }
         if (addvolume) {
-            vserver.addWidget(new VolumeWidget());
+            vserver.addWidget(Widget.getWidget(WidgetType.valueOf("VOLUME")));
         }
     }
 
index 0815a61..0d20c2d 100644 (file)
@@ -2,8 +2,8 @@
  * ============LICENSE_START=======================================================
  * org.onap.aai
  * ================================================================================
- * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2018 European Software Marketing Ltd.
+ * Copyright (c) 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (c) 2017-2019 European Software Marketing Ltd.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
-package org.onap.aai.babel.xml.generator.model;
 
-import java.util.Collections;
-import java.util.Map;
-import org.onap.aai.babel.xml.generator.types.Cardinality;
+package org.onap.aai.babel.xml.generator.model;
 
-@org.onap.aai.babel.xml.generator.types.Model(widget = Widget.Type.SERVICE, cardinality = Cardinality.UNBOUNDED,
-        dataDeleteFlag = true)
 public class Service extends Model {
 
-    @Override
-    public boolean addResource(Resource resource) {
-        return resources.add(resource);
-    }
-
     @Override
     public boolean addWidget(Widget widget) {
         return widgets.add(widget);
     }
 
     @Override
-    public Widget.Type getWidgetType() {
-        return null;
-    }
-    
-    @Override
-    public Map<String, Object> getProperties() {
-        return Collections.emptyMap();
+    public WidgetType getWidgetType() {
+        return WidgetType.valueOf("SERVICE");
     }
 
-    @Override
-    public boolean isResource() {
-        return false;
+    public String getModelTypeName() {
+        return "service";
     }
 }
diff --git a/src/main/java/org/onap/aai/babel/xml/generator/model/ServiceWidget.java b/src/main/java/org/onap/aai/babel/xml/generator/model/ServiceWidget.java
deleted file mode 100644 (file)
index 7c2229d..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-/**
- * ============LICENSE_START=======================================================
- * org.onap.aai
- * ================================================================================
- * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2018 European Software Marketing Ltd.
- * ================================================================================
- * 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=========================================================
- */
-package org.onap.aai.babel.xml.generator.model;
-
-import org.onap.aai.babel.xml.generator.types.ModelType;
-import org.onap.aai.babel.xml.generator.types.ModelWidget;
-
-@ModelWidget(type = ModelType.WIDGET, name = "service-instance")
-public class ServiceWidget extends Widget {
-}
diff --git a/src/main/java/org/onap/aai/babel/xml/generator/model/TenantWidget.java b/src/main/java/org/onap/aai/babel/xml/generator/model/TenantWidget.java
deleted file mode 100644 (file)
index a0a4392..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-/**
- * ============LICENSE_START=======================================================
- * org.onap.aai
- * ================================================================================
- * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2018 European Software Marketing Ltd.
- * ================================================================================
- * 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=========================================================
- */
-package org.onap.aai.babel.xml.generator.model;
-
-import org.onap.aai.babel.xml.generator.types.Cardinality;
-import org.onap.aai.babel.xml.generator.types.Model;
-import org.onap.aai.babel.xml.generator.types.ModelType;
-import org.onap.aai.babel.xml.generator.types.ModelWidget;
-
-@Model(widget = Widget.Type.TENANT, cardinality = Cardinality.UNBOUNDED, dataDeleteFlag = false)
-@ModelWidget(type = ModelType.WIDGET, name = "tenant")
-public class TenantWidget extends Widget {
-}
diff --git a/src/main/java/org/onap/aai/babel/xml/generator/model/TunnelXconnectWidget.java b/src/main/java/org/onap/aai/babel/xml/generator/model/TunnelXconnectWidget.java
deleted file mode 100644 (file)
index 548cd6f..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-/**
- * ============LICENSE_START=======================================================
- * org.onap.aai
- * ================================================================================
- * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2018 European Software Marketing Ltd.
- * ================================================================================
- * 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=========================================================
- */
-package org.onap.aai.babel.xml.generator.model;
-
-import org.onap.aai.babel.xml.generator.types.Cardinality;
-import org.onap.aai.babel.xml.generator.types.ModelType;
-import org.onap.aai.babel.xml.generator.types.ModelWidget;
-
-@org.onap.aai.babel.xml.generator.types.Model(widget = Widget.Type.TUNNEL_XCONNECT, cardinality = Cardinality.UNBOUNDED,
-        dataDeleteFlag = true)
-@ModelWidget(type = ModelType.WIDGET, name = "tunnel-xconnect")
-public class TunnelXconnectWidget extends Widget {
-}
diff --git a/src/main/java/org/onap/aai/babel/xml/generator/model/VServerWidget.java b/src/main/java/org/onap/aai/babel/xml/generator/model/VServerWidget.java
deleted file mode 100644 (file)
index dabeecd..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-/**
- * ============LICENSE_START=======================================================
- * org.onap.aai
- * ================================================================================
- * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2018 European Software Marketing Ltd.
- * ================================================================================
- * 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=========================================================
- */
-package org.onap.aai.babel.xml.generator.model;
-
-import org.onap.aai.babel.xml.generator.types.Cardinality;
-import org.onap.aai.babel.xml.generator.types.Model;
-import org.onap.aai.babel.xml.generator.types.ModelType;
-import org.onap.aai.babel.xml.generator.types.ModelWidget;
-
-@Model(widget = Widget.Type.VSERVER, cardinality = Cardinality.UNBOUNDED, dataDeleteFlag = true)
-@ModelWidget(type = ModelType.WIDGET, name = "vserver")
-public class VServerWidget extends Widget {
-
-    /** Instantiates a new vserver widget. */
-    public VServerWidget() {
-        addWidget(new FlavorWidget());
-        addWidget(new ImageWidget());
-        addWidget(new TenantWidget());
-        addWidget(new VfcWidget());
-    }
-
-    @Override
-    public boolean addWidget(Widget widget) {
-        return widgets.add(widget);
-    }
-}
diff --git a/src/main/java/org/onap/aai/babel/xml/generator/model/VfModuleWidget.java b/src/main/java/org/onap/aai/babel/xml/generator/model/VfModuleWidget.java
deleted file mode 100644 (file)
index cc27ca9..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-/**
- * ============LICENSE_START=======================================================
- * org.onap.aai
- * ================================================================================
- * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2018 European Software Marketing Ltd.
- * ================================================================================
- * 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=========================================================
- */
-package org.onap.aai.babel.xml.generator.model;
-
-import org.onap.aai.babel.xml.generator.types.Cardinality;
-import org.onap.aai.babel.xml.generator.types.ModelType;
-import org.onap.aai.babel.xml.generator.types.ModelWidget;
-
-@org.onap.aai.babel.xml.generator.types.Model(widget = Widget.Type.VFMODULE, cardinality = Cardinality.UNBOUNDED,
-        dataDeleteFlag = true)
-@ModelWidget(type = ModelType.WIDGET, name = "vf-module")
-public class VfModuleWidget extends Widget {
-}
diff --git a/src/main/java/org/onap/aai/babel/xml/generator/model/VfWidget.java b/src/main/java/org/onap/aai/babel/xml/generator/model/VfWidget.java
deleted file mode 100644 (file)
index 614244e..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-/**
- * ============LICENSE_START=======================================================
- * org.onap.aai
- * ================================================================================
- * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2018 European Software Marketing Ltd.
- * ================================================================================
- * 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=========================================================
- */
-package org.onap.aai.babel.xml.generator.model;
-
-import org.onap.aai.babel.xml.generator.types.Cardinality;
-import org.onap.aai.babel.xml.generator.types.ModelType;
-import org.onap.aai.babel.xml.generator.types.ModelWidget;
-
-@org.onap.aai.babel.xml.generator.types.Model(widget = Widget.Type.VF, cardinality = Cardinality.UNBOUNDED,
-        dataDeleteFlag = true)
-@ModelWidget(type = ModelType.WIDGET, name = "generic-vnf")
-public class VfWidget extends ResourceWidget {
-}
diff --git a/src/main/java/org/onap/aai/babel/xml/generator/model/VfcWidget.java b/src/main/java/org/onap/aai/babel/xml/generator/model/VfcWidget.java
deleted file mode 100644 (file)
index abfa49f..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-/**
- * ============LICENSE_START=======================================================
- * org.onap.aai
- * ================================================================================
- * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2018 European Software Marketing Ltd.
- * ================================================================================
- * 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=========================================================
- */
-package org.onap.aai.babel.xml.generator.model;
-
-import org.onap.aai.babel.xml.generator.types.Cardinality;
-import org.onap.aai.babel.xml.generator.types.ModelType;
-import org.onap.aai.babel.xml.generator.types.ModelWidget;
-
-@org.onap.aai.babel.xml.generator.types.Model(widget = Widget.Type.VFC, cardinality = Cardinality.UNBOUNDED,
-        dataDeleteFlag = true)
-@ModelWidget(type = ModelType.WIDGET, name = "vnfc")
-public class VfcWidget extends ResourceWidget {
-}
diff --git a/src/main/java/org/onap/aai/babel/xml/generator/model/VolumeGroupWidget.java b/src/main/java/org/onap/aai/babel/xml/generator/model/VolumeGroupWidget.java
deleted file mode 100644 (file)
index 3a0aa37..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-/**
- * ============LICENSE_START=======================================================
- * org.onap.aai
- * ================================================================================
- * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2018 European Software Marketing Ltd.
- * ================================================================================
- * 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=========================================================
- */
-package org.onap.aai.babel.xml.generator.model;
-
-import org.onap.aai.babel.xml.generator.types.Cardinality;
-import org.onap.aai.babel.xml.generator.types.ModelType;
-import org.onap.aai.babel.xml.generator.types.ModelWidget;
-
-@org.onap.aai.babel.xml.generator.types.Model(widget = Widget.Type.VOLUME_GROUP, cardinality = Cardinality.UNBOUNDED,
-        dataDeleteFlag = true)
-@ModelWidget(type = ModelType.WIDGET, name = "volume-group")
-public class VolumeGroupWidget extends Widget {
-}
diff --git a/src/main/java/org/onap/aai/babel/xml/generator/model/VolumeWidget.java b/src/main/java/org/onap/aai/babel/xml/generator/model/VolumeWidget.java
deleted file mode 100644 (file)
index d18a723..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-/**
- * ============LICENSE_START=======================================================
- * org.onap.aai
- * ================================================================================
- * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2018 European Software Marketing Ltd.
- * ================================================================================
- * 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=========================================================
- */
-package org.onap.aai.babel.xml.generator.model;
-
-import org.onap.aai.babel.xml.generator.types.Cardinality;
-import org.onap.aai.babel.xml.generator.types.Model;
-import org.onap.aai.babel.xml.generator.types.ModelType;
-import org.onap.aai.babel.xml.generator.types.ModelWidget;
-
-@Model(widget = Widget.Type.VOLUME, cardinality = Cardinality.UNBOUNDED, dataDeleteFlag = true)
-@ModelWidget(type = ModelType.WIDGET, name = "volume")
-public class VolumeWidget extends ResourceWidget {
-}
index be84526..732ec4d 100644 (file)
@@ -2,8 +2,8 @@
  * ============LICENSE_START=======================================================
  * org.onap.aai
  * ================================================================================
- * Copyright © 2017-2019 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2019 European Software Marketing Ltd.
+ * Copyright (c) 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (c) 2017-2019 European Software Marketing Ltd.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.babel.xml.generator.model;
 
-import java.lang.reflect.InvocationTargetException;
 import java.util.Collection;
 import java.util.Collections;
-import java.util.EnumMap;
 import java.util.HashSet;
-import java.util.Map;
 import java.util.Properties;
 import java.util.Set;
-import org.onap.aai.babel.logging.ApplicationMsgs;
-import org.onap.aai.babel.logging.LogHelper;
+import org.onap.aai.babel.xml.generator.XmlArtifactGenerationException;
 import org.onap.aai.babel.xml.generator.data.ArtifactType;
 import org.onap.aai.babel.xml.generator.data.WidgetConfigurationUtil;
 import org.onap.aai.babel.xml.generator.error.IllegalAccessException;
 import org.onap.aai.babel.xml.generator.types.ModelType;
-import org.onap.aai.babel.xml.generator.types.ModelWidget;
-import org.onap.aai.cl.api.Logger;
 
-public abstract class Widget extends Model {
+public class Widget extends Model {
 
     public static final String GENERATOR_AAI_CONFIGLPROP_NOT_FOUND =
             "Cannot generate artifacts. Widget configuration not found for %s";
 
-    public enum Type {
-        SERVICE, VF, VFC, VSERVER, VOLUME, FLAVOR, TENANT, VOLUME_GROUP, LINT, L3_NET, VFMODULE, IMAGE, OAM_NETWORK, ALLOTTED_RESOURCE, TUNNEL_XCONNECT, CONFIGURATION, CR, INSTANCE_GROUP;
-    }
+    private Set<String> keys = new HashSet<>();
 
-    private static Logger log = LogHelper.INSTANCE;
+    protected String name;
+    protected WidgetType type;
+    protected boolean deleteFlag = false;
 
-    private Set<String> keys = new HashSet<>();
+    public Widget(WidgetType widgetType, String name, boolean deleteFlag) {
+        type = widgetType;
+        this.name = name;
+        this.deleteFlag = deleteFlag;
+    }
 
-    private static EnumMap<Widget.Type, Class<? extends Widget>> typeToWidget = new EnumMap<>(Widget.Type.class);
-    static {
-        typeToWidget.put(Type.SERVICE, ServiceWidget.class);
-        typeToWidget.put(Type.VF, VfWidget.class);
-        typeToWidget.put(Type.VFC, VfcWidget.class);
-        typeToWidget.put(Type.VSERVER, VServerWidget.class);
-        typeToWidget.put(Type.VOLUME, VolumeWidget.class);
-        typeToWidget.put(Type.FLAVOR, FlavorWidget.class);
-        typeToWidget.put(Type.TENANT, TenantWidget.class);
-        typeToWidget.put(Type.VOLUME_GROUP, VolumeGroupWidget.class);
-        typeToWidget.put(Type.LINT, LIntfWidget.class);
-        typeToWidget.put(Type.L3_NET, L3NetworkWidget.class);
-        typeToWidget.put(Type.VFMODULE, VfModuleWidget.class);
-        typeToWidget.put(Type.IMAGE, ImageWidget.class);
-        typeToWidget.put(Type.OAM_NETWORK, OamNetwork.class);
-        typeToWidget.put(Type.ALLOTTED_RESOURCE, AllotedResourceWidget.class);
-        typeToWidget.put(Type.TUNNEL_XCONNECT, TunnelXconnectWidget.class);
-        typeToWidget.put(Type.CONFIGURATION, ConfigurationWidget.class);
-        typeToWidget.put(Type.CR, CRWidget.class);
-        typeToWidget.put(Type.INSTANCE_GROUP, InstanceGroupWidget.class);
+    /**
+     * Copy Constructor.
+     * 
+     * @param baseWidget
+     * @throws XmlArtifactGenerationException
+     */
+    public Widget(Widget baseWidget) throws XmlArtifactGenerationException {
+        this(baseWidget.getWidgetType(), baseWidget.getName(), baseWidget.getDeleteFlag());
+        if (type == WidgetType.valueOf("VSERVER")) {
+            widgets.add(getWidget(WidgetType.valueOf("FLAVOR")));
+            widgets.add(getWidget(WidgetType.valueOf("IMAGE")));
+            widgets.add(getWidget(WidgetType.valueOf("TENANT")));
+            widgets.add(getWidget(WidgetType.valueOf("VFC")));
+        }
     }
 
     /**
      * Gets widget.
      *
-     * @param type
-     *            the type
-     * @return the widget
+     * @param typeString
+     * 
+     * @return a new widget of the specified type
+     * @throws XmlArtifactGenerationException
+     *             if there is no configuration defined for the specified type
      */
-    public static Widget getWidget(Type type) {
-        Widget widget = null;
-        Class<? extends Widget> clazz = typeToWidget.get(type);
-        if (clazz != null) {
-            try {
-                widget = clazz.getConstructor().newInstance();
-            } catch (InstantiationException | java.lang.IllegalAccessException | IllegalArgumentException
-                    | InvocationTargetException | NoSuchMethodException | SecurityException e) {
-                log.error(ApplicationMsgs.INVALID_CSAR_FILE, e);
-            }
+    public static Widget getWidget(WidgetType type) throws XmlArtifactGenerationException {
+        Widget widget = WidgetConfigurationUtil.createWidgetFromType(type.toString());
+        if (widget == null) {
+            throw new XmlArtifactGenerationException("No widget type is defined for " + type);
         }
         return widget;
     }
 
-    @Override
-    public boolean isResource() {
-        return false;
-    }
-
     public String getId() {
         String id = WidgetConfigurationUtil.getConfig()
                 .getProperty(ArtifactType.AAI.name() + ".model-version-id." + getName());
@@ -109,12 +93,11 @@ public abstract class Widget extends Model {
     }
 
     public ModelType getType() {
-        ModelWidget widgetModel = this.getClass().getAnnotation(ModelWidget.class);
-        return widgetModel.type();
+        return ModelType.WIDGET;
     }
 
     public String getName() {
-        return this.getClass().getAnnotation(ModelWidget.class).name();
+        return name;
     }
 
     /**
@@ -139,8 +122,8 @@ public abstract class Widget extends Model {
     }
 
     @Override
-    public Type getWidgetType() {
-        return null;
+    public WidgetType getWidgetType() {
+        return type;
     }
 
     /**
@@ -188,11 +171,35 @@ public abstract class Widget extends Model {
 
     @Override
     public boolean addWidget(Widget widget) {
+        if (getWidgetType() == WidgetType.valueOf("VSERVER")) {
+            return widgets.add(widget);
+        }
         return true;
     }
 
     @Override
-    public Map<String, Object> getProperties() {
-        return Collections.emptyMap();
+    public String toString() {
+        return getName() + " Widget keys=" + keys + ", resources=" + resources + ", widgets=" + widgets;
     }
+
+    @Override
+    public boolean getDeleteFlag() {
+        return deleteFlag;
+    }
+
+    @Override
+    public String getModelTypeName() {
+        throw new IllegalAccessException(GENERATOR_AAI_ERROR_UNSUPPORTED_WIDGET_OPERATION);
+    }
+
+    @Override
+    public String getModelId() {
+        throw new IllegalAccessException(GENERATOR_AAI_ERROR_UNSUPPORTED_WIDGET_OPERATION);
+    }
+
+    @Override
+    public String getModelNameVersionId() {
+        throw new IllegalAccessException(GENERATOR_AAI_ERROR_UNSUPPORTED_WIDGET_OPERATION);
+    }
+
 }
diff --git a/src/main/java/org/onap/aai/babel/xml/generator/model/WidgetType.java b/src/main/java/org/onap/aai/babel/xml/generator/model/WidgetType.java
new file mode 100644 (file)
index 0000000..2cab6ae
--- /dev/null
@@ -0,0 +1,73 @@
+/**
+ * ============LICENSE_START=======================================================
+ * org.onap.aai
+ * ================================================================================
+ * Copyright (c) 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (c) 2017-2019 European Software Marketing Ltd.
+ * ================================================================================
+ * 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=========================================================
+ */
+
+package org.onap.aai.babel.xml.generator.model;
+
+import java.util.Arrays;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Widget Type Enumeration.
+ *
+ */
+public class WidgetType {
+
+    /**
+     * Dynamically created set of Widget Types.
+     */
+    private static Map<String, WidgetType> elements = new LinkedHashMap<>();
+
+    /**
+     * Types that must be present for Model generation to function correctly.
+     */
+    private static final List<String> mandatoryElements = Arrays.asList( //
+            "SERVICE", "VF", "VFC", "VSERVER", "VOLUME", "FLAVOR", "TENANT", "VOLUME_GROUP", "LINT", "L3_NET",
+            "VFMODULE", "IMAGE", "OAM_NETWORK", "ALLOTTED_RESOURCE", "TUNNEL_XCONNECT", "CONFIGURATION", "CR",
+            "INSTANCE_GROUP");
+
+    private final String name;
+
+    public WidgetType(String name) {
+        this.name = name;
+        elements.put(name, this);
+    }
+
+    public static void validateElements() {
+        mandatoryElements.forEach(WidgetType::valueOf);
+    }
+
+    public static WidgetType valueOf(String typeName) {
+        WidgetType type = elements.get(typeName);
+        if (type == null) {
+            throw new IllegalArgumentException("Unknown type " + typeName);
+        }
+        return type;
+    }
+
+    @Override
+    public String toString() {
+        return name;
+    }
+
+}
+
diff --git a/src/main/java/org/onap/aai/babel/xml/generator/types/Cardinality.java b/src/main/java/org/onap/aai/babel/xml/generator/types/Cardinality.java
deleted file mode 100644 (file)
index 9cdb93b..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-/**
- * ============LICENSE_START=======================================================
- * org.onap.aai
- * ================================================================================
- * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2018 European Software Marketing Ltd.
- * ================================================================================
- * 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=========================================================
- */
-package org.onap.aai.babel.xml.generator.types;
-
-public enum Cardinality {
-    UNBOUNDED
-}
diff --git a/src/main/java/org/onap/aai/babel/xml/generator/types/Model.java b/src/main/java/org/onap/aai/babel/xml/generator/types/Model.java
deleted file mode 100644 (file)
index f69c3ea..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-/**
- * ============LICENSE_START=======================================================
- * org.onap.aai
- * ================================================================================
- * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2018 European Software Marketing Ltd.
- * ================================================================================
- * 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=========================================================
- */
-package org.onap.aai.babel.xml.generator.types;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import org.onap.aai.babel.xml.generator.model.Widget;
-
-@Target(ElementType.TYPE)
-@Retention(RetentionPolicy.RUNTIME)
-public @interface Model {
-
-    /**
-     * Widget widget . type.
-     *
-     * @return the widget . type
-     */
-    public Widget.Type widget();
-
-    /**
-     * Data delete flag boolean.
-     *
-     * @return the boolean
-     */
-    public boolean dataDeleteFlag();
-
-    /**
-     * Cardinality cardinality.
-     *
-     * @return the cardinality
-     */
-    public Cardinality cardinality();
-}
diff --git a/src/main/java/org/onap/aai/babel/xml/generator/types/ModelWidget.java b/src/main/java/org/onap/aai/babel/xml/generator/types/ModelWidget.java
deleted file mode 100644 (file)
index 307524e..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-/**
- * ============LICENSE_START=======================================================
- * org.onap.aai
- * ================================================================================
- * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2018 European Software Marketing Ltd.
- * ================================================================================
- * 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=========================================================
- */
-package org.onap.aai.babel.xml.generator.types;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-@Target(ElementType.TYPE)
-@Retention(RetentionPolicy.RUNTIME)
-public @interface ModelWidget {
-
-    /**
-     * Type model type.
-     *
-     * @return the model type
-     */
-    public ModelType type();
-
-    /**
-     * Name string.
-     *
-     * @return the string
-     */
-    public String name();
-}
index 167c369..d749cd0 100644 (file)
@@ -1,8 +1,8 @@
 # ============LICENSE_START=======================================================
 # org.onap.aai
 # ================================================================================
-# Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
-# Copyright © 2017-2018 European Software Marketing Ltd.
+# Copyright (c) 2017-2019 AT&T Intellectual Property. All rights reserved.
+# Copyright (c) 2017-2019 European Software Marketing Ltd.
 # ================================================================================
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
 # limitations under the License.
 # ============LICENSE_END=========================================================
 
-#Resource key=Error Code|Message text|Resolution text |Description text
-#######
-#Newlines can be utilized to add some clarity ensuring continuing line
-#has at least one leading space
-#ResourceKey=\
+# Resource key=Error Code|Message text|Resolution text |Description text
+#
+# For example:
+# ResourceKey=\
 #             ERR0000E\
 #             Sample error msg txt\
 #             Sample resolution msg\
 #             Sample description txt
 #
-######
-#Error code classification category
-#000 Info/Debug
-#100 Permission errors
-#200 Availability errors/Timeouts
-#300 Data errors
-#400 Schema Interface type/validation errors
-#500 Business process errors
-#900 Unknown errors
-#
-########################################################################
+# Error code classification category
+# 000 Info/Debug
+# 100 Permission errors
+# 200 Availability errors/Timeouts
+# 300 Data errors
+# 400 Schema Interface type/validation errors
+# 500 Business process errors
+# 900 Unknown errors
 
 DISTRIBUTION_EVENT=\
                   BABEL0001I|\
@@ -89,4 +85,8 @@ MISSING_SERVICE_METADATA=\
 TEMP_FILE_ERROR=\
                   BABEL0012E|\
                   Error creating temporary CSAR file.|\
-                
\ No newline at end of file
+                  
+LOAD_PROPERTIES=\
+                  BABEL0013E|\
+                  Error loading properties: {0}|\
+                  Correct the file contents|\
index aae7846..ef9504b 100644 (file)
@@ -2,8 +2,8 @@
  * ============LICENSE_START=======================================================
  * org.onap.aai
  * ================================================================================
- * Copyright © 2017-2019 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2019 European Software Marketing Ltd.
+ * Copyright (c) 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (c) 2017-2019 European Software Marketing Ltd.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -27,9 +27,11 @@ import static org.junit.Assert.assertThat;
 import java.io.File;
 import java.io.FileWriter;
 import java.io.IOException;
+import java.util.concurrent.TimeUnit;
 import org.json.JSONArray;
 import org.json.JSONException;
 import org.json.JSONObject;
+import org.junit.Before;
 import org.junit.Test;
 import org.onap.aai.auth.AAIAuthException;
 import org.onap.aai.auth.AAIMicroServiceAuth;
@@ -46,12 +48,27 @@ public class MicroServiceAuthTest {
     private static final String VALID_ADMIN_USER = "cn=common-name, ou=org-unit, o=org, l=location, st=state, c=us";
     private static final String authPolicyFile = "auth_policy.json";
 
-    static {
-        System.setProperty("CONFIG_HOME", System.getProperty("user.dir") + File.separator + "src/test/resources");
+    @Before
+    public void setup() {
+        System.setProperty("CONFIG_HOME", "src/test/resources");
     }
 
     /**
-     * Temporarily invalidate the default policy file and then try to initialise the authorisation class using the name
+     * Test authorization of a request when authentication is disabled.
+     *
+     * @throws AAIAuthException
+     *             if the test creates invalid Auth Policy roles
+     */
+    @Test
+    public void testAuthenticationDisabled() throws AAIAuthException {
+        BabelAuthConfig babelAuthConfig = new BabelAuthConfig();
+        babelAuthConfig.setAuthenticationDisable(true);
+        AAIMicroServiceAuth auth = new AAIMicroServiceAuth(babelAuthConfig);
+        assertThat(auth.validateRequest(null, new MockHttpServletRequest(), null, "any/uri"), is(true));
+    }
+
+    /**
+     * Temporarily invalidate the default policy file and then try to initialize the authorization class using the name
      * of a policy file that does not exist.
      *
      * @throws AAIAuthException
@@ -70,6 +87,26 @@ public class MicroServiceAuthTest {
         }
     }
 
+    /**
+     * Temporarily invalidate the default policy file and then try to initialize the authorization class using a null
+     * policy file name.
+     *
+     * @throws AAIAuthException
+     *             if the Auth policy file cannot be loaded
+     */
+    @Test(expected = AAIAuthException.class)
+    public void testNullPolicyFile() throws AAIAuthException {
+        String defaultFile = AAIMicroServiceAuthCore.getDefaultAuthFileName();
+        try {
+            AAIMicroServiceAuthCore.setDefaultAuthFileName("invalid.default.file");
+            BabelAuthConfig babelServiceAuthConfig = new BabelAuthConfig();
+            babelServiceAuthConfig.setAuthPolicyFile(null);
+            new AAIMicroServiceAuth(babelServiceAuthConfig);
+        } finally {
+            AAIMicroServiceAuthCore.setDefaultAuthFileName(defaultFile);
+        }
+    }
+
     /**
      * Test loading of a temporary file created with the specified roles.
      *
@@ -88,6 +125,40 @@ public class MicroServiceAuthTest {
         assertThat(AAIMicroServiceAuthCore.authorize("user", "method:func"), is(true));
     }
 
+    /**
+     * Test re-loading of users by changing the contents of a temporary file.
+     *
+     * @throws JSONException
+     *             if this test creates an invalid JSON object
+     * @throws AAIAuthException
+     *             if the test creates invalid Auth Policy roles
+     * @throws IOException
+     *             for I/O failures
+     * @throws InterruptedException
+     *             if interrupted while sleeping
+     */
+    @Test
+    public void createLocalAuthFileOnChange()
+            throws JSONException, AAIAuthException, IOException, InterruptedException {
+        JSONObject roles = createRoleObject("role", createUserObject("user"), createFunctionObject("func"));
+        File file = createTempPolicyFile(roles);
+
+        BabelAuthConfig babelAuthConfig = new BabelAuthConfig();
+        babelAuthConfig.setAuthPolicyFile(file.getAbsolutePath());
+        new AAIMicroServiceAuth(babelAuthConfig);
+
+        // Make changes to the temp file
+        FileWriter fileWriter = new FileWriter(file);
+        fileWriter.write("");
+        fileWriter.flush();
+        fileWriter.close();
+
+        // Wait for the file to be reloaded
+        TimeUnit.SECONDS.sleep(3);
+
+        AAIMicroServiceAuthCore.cleanup();
+    }
+
     /**
      * Test that the default policy file is loaded when a non-existent file is passed to the authorisation class.
      *
@@ -103,6 +174,23 @@ public class MicroServiceAuthTest {
         assertAdminUserAuthorisation(auth, VALID_ADMIN_USER);
     }
 
+    /**
+     * Test that the default policy file is loaded when a non-existent file is passed to the authorisation class and
+     * CONFIG_HOME is not set.
+     *
+     * @throws AAIAuthException
+     *             if the Auth Policy cannot be loaded
+     */
+    @Test
+    public void createAuthFromDefaultFileAppHome() throws AAIAuthException {
+        System.clearProperty("CONFIG_HOME");
+        System.setProperty("APP_HOME", "src/test/resources");
+        BabelAuthConfig babelServiceAuthConfig = new BabelAuthConfig();
+        babelServiceAuthConfig.setAuthPolicyFile("non-existent-file");
+        new AAIMicroServiceAuth(babelServiceAuthConfig);
+        // The default policy will have been loaded from APP_HOME/appconfig
+    }
+
     /**
      * Test loading of the policy file relative to CONFIG_HOME.
      *
@@ -146,16 +234,29 @@ public class MicroServiceAuthTest {
      *             if the auth policy file cannot be loaded
      */
     private AAIMicroServiceAuth createAuthService(JSONObject roles) throws AAIAuthException, IOException {
+        File file = createTempPolicyFile(roles);
+        BabelAuthConfig babelAuthConfig = new BabelAuthConfig();
+        babelAuthConfig.setAuthPolicyFile(file.getAbsolutePath());
+        return new AAIMicroServiceAuth(babelAuthConfig);
+    }
+
+    /**
+     * Create a temporary JSON file using the supplied roles.
+     * 
+     * @param roles
+     *            the roles to use to populate the new file
+     * @return the new temporary file
+     * @throws IOException
+     *             for I/O errors
+     */
+    private File createTempPolicyFile(JSONObject roles) throws IOException {
         File file = File.createTempFile("auth-policy", "json");
         file.deleteOnExit();
         FileWriter fileWriter = new FileWriter(file);
         fileWriter.write(roles.toString());
         fileWriter.flush();
         fileWriter.close();
-
-        BabelAuthConfig babelAuthConfig = new BabelAuthConfig();
-        babelAuthConfig.setAuthPolicyFile(file.getAbsolutePath());
-        return new AAIMicroServiceAuth(babelAuthConfig);
+        return file;
     }
 
     /**
diff --git a/src/test/java/org/onap/aai/babel/TestApplication.java b/src/test/java/org/onap/aai/babel/TestApplication.java
new file mode 100644 (file)
index 0000000..8c9ca5e
--- /dev/null
@@ -0,0 +1,117 @@
+/**
+ * ============LICENSE_START=======================================================
+ * org.onap.aai
+ * ================================================================================
+ * Copyright (c) 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (c) 2017-2019 European Software Marketing Ltd.
+ * ================================================================================
+ * 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=========================================================
+ */
+
+package org.onap.aai.babel;
+
+import java.io.IOException;
+import org.eclipse.jetty.util.security.Password;
+import org.hamcrest.Description;
+import org.hamcrest.TypeSafeMatcher;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest(classes = BabelApplication.class)
+public class TestApplication {
+
+    @Rule
+    public ExpectedException expectedEx = ExpectedException.none();
+
+    /**
+     * Initialize System Properties.
+     */
+    @Before
+    public void init() {
+        System.setProperty("APP_HOME", ".");
+        System.setProperty("CONFIG_HOME", "src/test/resources");
+        System.setProperty("server.ssl.key-store", "src/test/resources/auth/keystore.jks");
+    }
+
+    @Test
+    public void testApplicationStarts() {
+        System.setProperty("KEY_STORE_PASSWORD", "password");
+        BabelApplication.main(new String[] {});
+        BabelApplication.exit();
+    }
+
+    @Test
+    public void testApplicationStartsWithObfuscatedPassword() {
+        System.setProperty("KEY_STORE_PASSWORD", Password.obfuscate("password"));
+        BabelApplication.main(new String[] {});
+        BabelApplication.exit();
+    }
+
+    @Test
+    public void testApplicationWithNullArgs() {
+        System.setProperty("KEY_STORE_PASSWORD", "test");
+        expectedEx.expect(IllegalArgumentException.class);
+        expectedEx.expectMessage("Args must not be null");
+        BabelApplication.main(null);
+    }
+
+    @Test
+    public void testApplicationWithEmptyKeyStorePassword() {
+        System.setProperty("KEY_STORE_PASSWORD", "");
+        expectedEx.expect(IllegalArgumentException.class);
+        expectedEx.expectMessage("roperty KEY_STORE_PASSWORD not set");
+        BabelApplication.main(new String[] {});
+    }
+
+    @Test
+    public void testApplicationWithNullKeyStorePassword() {
+        System.clearProperty("KEY_STORE_PASSWORD");
+        expectedEx.expect(IllegalArgumentException.class);
+        expectedEx.expectMessage("roperty KEY_STORE_PASSWORD not set");
+        BabelApplication.main(new String[] {});
+    }
+
+    @Test
+    public void testApplicationWithIncorrectKeyStorePassword() {
+        System.setProperty("KEY_STORE_PASSWORD", "test");
+        final CauseMatcher expectedCause = new CauseMatcher(IOException.class, "password was incorrect");
+        expectedEx.expectCause(expectedCause);
+        BabelApplication.main(new String[] {});
+    }
+
+    private static class CauseMatcher extends TypeSafeMatcher<Throwable> {
+
+        private final Class<? extends Throwable> type;
+        private final String expectedMessage;
+
+        public CauseMatcher(Class<? extends Throwable> type, String expectedMessage) {
+            this.type = type;
+            this.expectedMessage = expectedMessage;
+        }
+
+        @Override
+        protected boolean matchesSafely(Throwable item) {
+            return item.getClass().isAssignableFrom(type) && item.getMessage().contains(expectedMessage);
+        }
+
+        @Override
+        public void describeTo(Description description) {
+            description.appendValue(type).appendText(" and message ").appendValue(expectedMessage);
+        }
+    }
+
+}
index abe6f4d..5bb7763 100644 (file)
@@ -132,10 +132,14 @@ public class YamlExtractorTest {
     /**
      * Call the extractor with the specified arguments and assert that an exception is thrown.
      *
-     * @param archive the compressed archive in the form of a byte array, expected to contain one or more YAML files
-     * @param name the name of the archive
-     * @param version the version of the archive
-     * @param expectedErrorMessage the text of the InvalidArchiveException thrown by the extractor
+     * @param archive
+     *            the compressed archive in the form of a byte array, expected to contain one or more YAML files
+     * @param name
+     *            the name of the archive
+     * @param version
+     *            the version of the archive
+     * @param expectedErrorMessage
+     *            the text of the InvalidArchiveException thrown by the extractor
      */
     private void invalidArgumentsTest(byte[] archive, String name, String version, String expectedErrorMessage) {
         try {
index 2719315..02df4e8 100644 (file)
@@ -55,14 +55,15 @@ public class TestApplicationLogger {
      * Check that each message can be logged and that (by implication of successful logging) there is a corresponding
      * resource (message format).
      *
-     * @throws IOException if the log files cannot be read
+     * @throws IOException
+     *             if the log files cannot be read
      */
     @Test
     public void logAllMessages() throws IOException {
         Logger logger = LogHelper.INSTANCE;
         LogReader errorReader = new LogReader(LogHelper.getLogDirectory(), "error");
         LogReader debugReader = new LogReader(LogHelper.getLogDirectory(), "debug");
-        String[] args = { "1", "2", "3", "4" };
+        String[] args = {"1", "2", "3", "4"};
         for (ApplicationMsgs msg : Arrays.asList(ApplicationMsgs.values())) {
             if (msg.name().endsWith("ERROR")) {
                 logger.error(msg, args);
@@ -90,7 +91,8 @@ public class TestApplicationLogger {
      * Check that each message can be logged and that (by implication of successful logging) there is a corresponding
      * resource (message format).
      *
-     * @throws IOException if the log file cannot be read
+     * @throws IOException
+     *             if the log file cannot be read
      */
     @Test
     public void logDebugMessages() throws IOException {
@@ -103,7 +105,8 @@ public class TestApplicationLogger {
     /**
      * Check logAudit with HTTP headers.
      *
-     * @throws IOException if the log file cannot be read
+     * @throws IOException
+     *             if the log file cannot be read
      */
     @Test
     public void logAuditMessage() throws IOException {
@@ -135,7 +138,8 @@ public class TestApplicationLogger {
     /**
      * Check logAudit with no HTTP headers.
      *
-     * @throws IOException if the log file cannot be read
+     * @throws IOException
+     *             if the log file cannot be read
      */
     @Test
     public void logAuditMessageWithoutHeaders() throws IOException {
@@ -152,7 +156,8 @@ public class TestApplicationLogger {
     /**
      * Check logMetrics.
      *
-     * @throws IOException if the log file cannot be read
+     * @throws IOException
+     *             if the log file cannot be read
      */
     @Test
     public void logMetricsMessage() throws IOException {
@@ -207,13 +212,15 @@ public class TestApplicationLogger {
     /**
      * Call a logger method which is expected to throw an UnsupportedOperationException.
      *
-     * @param logMethod the logger method to invoke
-     * @param dummyMsg any Application Message enumeration value
+     * @param logMethod
+     *            the logger method to invoke
+     * @param dummyMsg
+     *            any Application Message enumeration value
      */
     private void callUnsupportedOperationMethod(TriConsumer<Enum<?>, LogFields, String[]> logMethod,
             ApplicationMsgs dummyMsg) {
         try {
-            logMethod.accept(dummyMsg, new LogFields(), new String[] { "" });
+            logMethod.accept(dummyMsg, new LogFields(), new String[] {""});
             org.junit.Assert.fail("method should have thrown execption"); // NOSONAR as code not reached
         } catch (UnsupportedOperationException e) {
             // Expected to reach here
@@ -223,10 +230,14 @@ public class TestApplicationLogger {
     /**
      * Assert that a log message was logged to the expected log file at the expected severity.
      *
-     * @param msg the Application Message enumeration value
-     * @param reader the log reader for the message
-     * @param severity log level
-     * @throws IOException if the log file cannot be read
+     * @param msg
+     *            the Application Message enumeration value
+     * @param reader
+     *            the log reader for the message
+     * @param severity
+     *            log level
+     * @throws IOException
+     *             if the log file cannot be read
      */
     private void validateLoggedMessage(ApplicationMsgs msg, LogReader reader, String severity) throws IOException {
         String str = reader.getNewLines();
index a538373..50f0aa9 100644 (file)
@@ -2,8 +2,8 @@
  * ============LICENSE_START=======================================================
  * org.onap.aai
  * ================================================================================
- * Copyright © 2017-2019 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2019 European Software Marketing Ltd.
+ * Copyright (c) 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (c) 2017-2019 European Software Marketing Ltd.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -25,16 +25,20 @@ import static org.hamcrest.CoreMatchers.equalTo;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.is;
 
+import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.LinkedHashMap;
 import java.util.List;
 import org.junit.Test;
 import org.mockito.Mockito;
+import org.onap.aai.babel.util.ArtifactTestUtils;
+import org.onap.aai.babel.util.Resources;
+import org.onap.aai.babel.xml.generator.XmlArtifactGenerationException;
 import org.onap.aai.babel.xml.generator.data.WidgetConfigurationUtil;
 import org.onap.aai.babel.xml.generator.data.WidgetMapping;
 import org.onap.aai.babel.xml.generator.model.Resource;
-import org.onap.aai.babel.xml.generator.model.Widget.Type;
+import org.onap.aai.babel.xml.generator.model.WidgetType;
 import org.onap.sdc.tosca.parser.api.ISdcCsarHelper;
 import org.onap.sdc.toscaparser.api.Group;
 import org.onap.sdc.toscaparser.api.NodeTemplate;
@@ -49,14 +53,61 @@ public class TestArtifactGeneratorToscaParser {
 
     private static final String TEST_UUID = "1234";
 
+    /**
+     * Initialize the Generator with an invalid artifact generator properties file path.
+     * 
+     * @throws IOException
+     *             if an error occurs reading the configuration properties
+     */
+    @Test(expected = IllegalArgumentException.class)
+    public void testMissingPropertiesFile() throws IOException {
+        System.setProperty(ArtifactGeneratorToscaParser.PROPERTY_ARTIFACT_GENERATOR_CONFIG_FILE, "non-existent.file");
+        ArtifactGeneratorToscaParser.initWidgetConfiguration();
+    }
+
+    /**
+     * Initialize the Generator with an invalid mappings file path.
+     * 
+     * @throws IOException
+     *             if the file content could not be read successfully
+     */
+    @Test(expected = IllegalArgumentException.class)
+    public void testMissingMappingsFile() throws IOException {
+        ArtifactGeneratorToscaParser.initToscaMappingsConfiguration("non-existent.file");
+    }
+
+    /**
+     * Initialize the Generator with no Widget Mappings content.
+     * 
+     * @throws IOException
+     *             if the file content could not be read successfully
+     */
+    @Test(expected = IOException.class)
+    public void testMissingMappingsContent() throws IOException {
+        String invalidJson = new ArtifactTestUtils().getResourcePath(Resources.EMPTY_TOSCA_MAPPING_CONFIG);
+        ArtifactGeneratorToscaParser.initToscaMappingsConfiguration(invalidJson);
+    }
+
+    /**
+     * Initialize the Generator with invalid Widget Mappings content.
+     * 
+     * @throws IOException
+     *             if the file content could not be read successfully
+     */
+    @Test(expected = IOException.class)
+    public void testInvalidMappingsContent() throws IOException {
+        String invalidJson = new ArtifactTestUtils().getResourcePath(Resources.INVALID_TOSCA_MAPPING_CONFIG);
+        ArtifactGeneratorToscaParser.initToscaMappingsConfiguration(invalidJson);
+    }
+
     /**
      * Process an Allotted Resource that does not have a Providing Service.
      */
     @Test(expected = IllegalArgumentException.class)
     public void testMissingProvidingService() {
         List<NodeTemplate> nodeTemplateList = Collections.singletonList(buildNodeTemplate("name", "BlockStorage"));
-        new ArtifactGeneratorToscaParser(null).processResourceModels(new Resource(Type.ALLOTTED_RESOURCE, true),
-                nodeTemplateList);
+        new ArtifactGeneratorToscaParser(null)
+                .processResourceModels(new Resource(WidgetType.valueOf("ALLOTTED_RESOURCE"), true), nodeTemplateList);
     }
 
     /**
@@ -66,25 +117,44 @@ public class TestArtifactGeneratorToscaParser {
     public void testAddResourceNotProvidingService() {
         List<NodeTemplate> nodeTemplateList = Collections.singletonList(buildNodeTemplate("testCR", "CR"));
         // Create any Resource to which the CR can be added
-        final Resource dummyResource = new Resource(Type.ALLOTTED_RESOURCE, true);
+        final Resource dummyResource = new Resource(WidgetType.valueOf("ALLOTTED_RESOURCE"), true);
         new ArtifactGeneratorToscaParser(null).processResourceModels(dummyResource, nodeTemplateList);
     }
 
     /**
-     * Initialise the Artifact Generator Widget Mapping config with incomplete data.
+     * Initialize the Artifact Generator Widget Mapping config with incomplete data (no type).
+     * 
+     * @throws IOException
+     *             if a WidgetMapping is invalid
      */
-    @Test(expected = IllegalArgumentException.class)
-    public void testToscaMappingWithoutType() {
+    @Test(expected = IOException.class)
+    public void testToscaMappingWithoutType() throws IOException {
         WidgetMapping invalidMapping = new WidgetMapping();
         invalidMapping.setType(null);
         WidgetConfigurationUtil.setWidgetMappings(Collections.singletonList(invalidMapping));
     }
 
     /**
-     * Initialise the Artifact Generator Widget Mapping config with incomplete data.
+     * Initialize the Artifact Generator Widget Mapping config with invalid data (type value).
+     * 
+     * @throws IOException
+     *             if a WidgetMapping is invalid
      */
-    @Test(expected = IllegalArgumentException.class)
-    public void testToscaMappingWithoutWidget() {
+    @Test(expected = IOException.class)
+    public void testToscaMappingWithInvalidType() throws IOException {
+        WidgetMapping invalidMapping = new WidgetMapping();
+        invalidMapping.setType("invalid");
+        WidgetConfigurationUtil.setWidgetMappings(Collections.singletonList(invalidMapping));
+    }
+
+    /**
+     * Initialize the Artifact Generator Widget Mapping config with incomplete data (no widget name).
+     * 
+     * @throws IOException
+     *             if a WidgetMapping is invalid
+     */
+    @Test(expected = IOException.class)
+    public void testToscaMappingWithoutWidget() throws IOException {
         WidgetMapping invalidMapping = new WidgetMapping();
         invalidMapping.setWidget(null);
         WidgetConfigurationUtil.setWidgetMappings(Collections.singletonList(invalidMapping));
@@ -92,9 +162,16 @@ public class TestArtifactGeneratorToscaParser {
 
     /**
      * Process a dummy Group object for a Service Resource.
+     * 
+     * @throws XmlArtifactGenerationException
+     *             if there is no configuration defined for a member Widget of an instance group
+     * @throws IOException
+     *             if the widget mappings cannot be loaded
      */
     @Test
-    public void testInstanceGroups() {
+    public void testInstanceGroups() throws XmlArtifactGenerationException, IOException {
+        new ArtifactTestUtils().loadWidgetMappings();
+
         final String instanceGroupType = "org.openecomp.groups.ResourceInstanceGroup";
         WidgetConfigurationUtil.setSupportedInstanceGroups(Collections.singletonList(instanceGroupType));
 
@@ -111,8 +188,8 @@ public class TestArtifactGeneratorToscaParser {
         Mockito.when(helper.getGroupsOfOriginOfNodeTemplate(serviceNodeTemplate)).thenReturn(groups);
 
         ArtifactGeneratorToscaParser parser = new ArtifactGeneratorToscaParser(helper);
-        List<Resource> resources =
-                parser.processInstanceGroups(new Resource(Type.INSTANCE_GROUP, true), serviceNodeTemplate);
+        Resource groupResource = new Resource(WidgetType.valueOf("INSTANCE_GROUP"), true);
+        List<Resource> resources = parser.processInstanceGroups(groupResource, serviceNodeTemplate);
 
         assertThat(resources.size(), is(1));
         Resource resource = resources.get(0);
index 348e1a1..f300f7b 100644 (file)
@@ -2,8 +2,8 @@
  * ============LICENSE_START=======================================================
  * org.onap.aai
  * ================================================================================
- * Copyright © 2017-2019 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2019 European Software Marketing Ltd.
+ * Copyright (c) 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (c) 2017-2019 European Software Marketing Ltd.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -27,16 +27,15 @@ import static org.junit.Assert.assertThat;
 
 import java.io.IOException;
 import java.util.HashMap;
-import java.util.List;
 import java.util.Map;
 import org.junit.Before;
 import org.junit.Test;
 import org.onap.aai.babel.csar.extractor.InvalidArchiveException;
 import org.onap.aai.babel.testdata.CsarTest;
 import org.onap.aai.babel.util.ArtifactTestUtils;
+import org.onap.aai.babel.util.Resources;
 import org.onap.aai.babel.xml.generator.api.AaiArtifactGenerator;
 import org.onap.aai.babel.xml.generator.data.AdditionalParams;
-import org.onap.aai.babel.xml.generator.data.Artifact;
 import org.onap.aai.babel.xml.generator.data.GenerationData;
 
 /**
@@ -44,29 +43,41 @@ import org.onap.aai.babel.xml.generator.data.GenerationData;
  */
 public class TestToscaParser {
 
-    static {
-        if (System.getProperty("APP_HOME") == null) {
-            System.setProperty("APP_HOME", ".");
-        }
-    }
-
     @Before
     public void setup() {
         new ArtifactTestUtils().setGeneratorSystemProperties();
     }
 
     @Test
-    public void testParserWithCsarFile() throws IOException, InvalidArchiveException {
-        List<Artifact> ymlFiles = CsarTest.VNF_VENDOR_CSAR.extractArtifacts();
-        Map<String, String> additionalParams = new HashMap<>();
-        additionalParams.put(AdditionalParams.SERVICE_VERSION.getName(), "1.0");
+    public void testParserWithInvalidMappings() throws IOException, InvalidArchiveException {
+        System.setProperty(ArtifactGeneratorToscaParser.PROPERTY_TOSCA_MAPPING_FILE,
+                new ArtifactTestUtils().getResourcePath(Resources.INVALID_TOSCA_MAPPING_CONFIG));
 
-        AaiArtifactGenerator generator = new AaiArtifactGenerator();
-        GenerationData data =
-                generator.generateArtifact(CsarTest.VNF_VENDOR_CSAR.getContent(), ymlFiles, additionalParams);
+        GenerationData data = generateArtifactsFromCsarFile();
+        assertThat("Number of errors produced " + data.getErrorData(), data.getErrorData().size(), is(equalTo(1)));
+        assertThat("Number of resources generated", data.getResultData().size(), is(equalTo(0)));
+    }
 
-        assertThat("Number of errors produced", data.getErrorData().size(), is(equalTo(0)));
+    @Test
+    public void testParserWithCsarFile() throws IOException, InvalidArchiveException {
+        GenerationData data = generateArtifactsFromCsarFile();
+        assertThat("Number of errors produced " + data.getErrorData(), data.getErrorData().size(), is(equalTo(0)));
         assertThat("Number of resources generated", data.getResultData().size(), is(equalTo(2)));
     }
 
+    /**
+     * Invoke the generator with a sample CSAR file.
+     * 
+     * @return the generated AAI Artifacts
+     * @throws InvalidArchiveException
+     *             if the test CSAR file is invalid
+     * @throws IOException
+     *             if there are I/O errors reading the CSAR content
+     */
+    private GenerationData generateArtifactsFromCsarFile() throws InvalidArchiveException, IOException {
+        Map<String, String> additionalParams = new HashMap<>();
+        additionalParams.put(AdditionalParams.SERVICE_VERSION.getName(), "1.0");
+        return new AaiArtifactGenerator().generateArtifact(CsarTest.VNF_VENDOR_CSAR.getContent(),
+                CsarTest.VNF_VENDOR_CSAR.extractArtifacts(), additionalParams);
+    }
 }
index 4921490..5001a09 100644 (file)
@@ -2,8 +2,8 @@
  * ============LICENSE_START=======================================================
  * org.onap.aai
  * ================================================================================
- * Copyright © 2017-2019 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2019 European Software Marketing Ltd.
+ * Copyright (c) 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (c) 2017-2019 European Software Marketing Ltd.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -57,12 +57,6 @@ public class CsarToXmlConverterTest {
     private static final String INCORRECT_CSAR_NAME = "the_name_of_the_csar_file.csar";
     private static final String SERVICE_VERSION = "1.0";
 
-    static {
-        if (System.getProperty("APP_HOME") == null) {
-            System.setProperty("APP_HOME", ".");
-        }
-    }
-
     // The class to be tested.
     private CsarToXmlConverter converter;
 
@@ -116,8 +110,9 @@ public class CsarToXmlConverterTest {
      */
     @Test
     public void testArtifactGeneratorConfigMissing() throws CsarConverterException, IOException {
-        exception.expect(CsarConverterException.class);
-        exception.expectMessage("Cannot generate artifacts. System property artifactgenerator.config not configured");
+        exception.expect(IllegalArgumentException.class);
+        exception.expectMessage("Cannot generate artifacts. System property "
+                + ArtifactGeneratorToscaParser.PROPERTY_ARTIFACT_GENERATOR_CONFIG_FILE + " not configured");
 
         // Unset the required system property
         System.clearProperty(ArtifactGeneratorToscaParser.PROPERTY_ARTIFACT_GENERATOR_CONFIG_FILE);
index a38686f..0673d04 100644 (file)
@@ -2,8 +2,8 @@
  * ============LICENSE_START=======================================================
  * org.onap.aai
  * ================================================================================
- * Copyright © 2017-2019 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2019 European Software Marketing Ltd.
+ * Copyright (c) 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (c) 2017-2019 European Software Marketing Ltd.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -59,26 +59,21 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
 public class TestGenerateArtifactsServiceImpl {
 
     static {
-        if (System.getProperty("APP_HOME") == null) {
-            System.setProperty("APP_HOME", ".");
-        }
         System.setProperty("CONFIG_HOME", "src/test/resources");
     }
 
-
     @Inject
     private AAIMicroServiceAuth auth;
 
     @BeforeClass
     public static void setup() {
         new ArtifactTestUtils().setGeneratorSystemProperties();
-
     }
 
     @Test
     public void testGenerateArtifacts() throws Exception {
         Response response = processJsonRequest(CsarTest.VNF_VENDOR_CSAR);
-        assertThat(response.getStatus(), is(Response.Status.OK.getStatusCode()));
+        assertThat(response.toString(), response.getStatus(), is(Response.Status.OK.getStatusCode()));
         assertThat(response.getEntity(), is(getResponseJson("response.json")));
     }
 
index 01f62cf..df27c22 100644 (file)
@@ -2,8 +2,8 @@
  * ============LICENSE_START=======================================================
  * org.onap.aai
  * ================================================================================
- * Copyright © 2017-2019 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2019 European Software Marketing Ltd.
+ * Copyright (c) 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (c) 2017-2019 European Software Marketing Ltd.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -57,7 +57,7 @@ public class ArtifactTestUtils {
     private static final String CSAR_INPUTS_FOLDER = "compressedArtifacts/";
 
     /**
-     * Initialise System Properties for test configuration files.
+     * Initialize System Properties for test configuration files.
      */
     public void setGeneratorSystemProperties() {
         System.setProperty(ArtifactGeneratorToscaParser.PROPERTY_ARTIFACT_GENERATOR_CONFIG_FILE,
@@ -77,6 +77,16 @@ public class ArtifactTestUtils {
         WidgetConfigurationUtil.setConfig(getResourceAsProperties(Resources.ARTIFACT_GENERATOR_CONFIG));
     }
 
+    /**
+     * Load the Widget type mappings (resource).
+     * 
+     * @throws IOException
+     *             if the configuration file is not loaded
+     */
+    public void loadWidgetMappings() throws IOException {
+        ArtifactGeneratorToscaParser.initToscaMappingsConfiguration(getResourcePath(Resources.TOSCA_MAPPING_CONFIG));
+    }
+
     /**
      * Specific test method for the YAML Extractor test.
      *
index bbd663d..72b0d1a 100644 (file)
@@ -2,8 +2,8 @@
  * ============LICENSE_START=======================================================
  * org.onap.aai
  * ================================================================================
- * Copyright © 2017-2019 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2019 European Software Marketing Ltd.
+ * Copyright (c) 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (c) 2017-2019 European Software Marketing Ltd.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -18,6 +18,7 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.babel.util;
 
 /**
@@ -27,5 +28,7 @@ public class Resources {
 
     public static final String ARTIFACT_GENERATOR_CONFIG = "artifact-generator.properties";
     public static final String TOSCA_MAPPING_CONFIG = "tosca-mappings.json";
+    public static final String EMPTY_TOSCA_MAPPING_CONFIG = "empty-tosca-mappings.json";
+    public static final String INVALID_TOSCA_MAPPING_CONFIG = "invalid-tosca-mappings.json";
 
 }
diff --git a/src/test/java/org/onap/aai/babel/xml/generator/TestModelGenerator.java b/src/test/java/org/onap/aai/babel/xml/generator/TestModelGenerator.java
new file mode 100644 (file)
index 0000000..404fb19
--- /dev/null
@@ -0,0 +1,55 @@
+/**
+ * ============LICENSE_START=======================================================
+ * org.onap.aai
+ * ================================================================================
+ * Copyright (c) 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (c) 2017-2019 European Software Marketing Ltd.
+ * ================================================================================
+ * 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=========================================================
+ */
+
+package org.onap.aai.babel.xml.generator;
+
+import java.io.IOException;
+import java.util.Collections;
+import org.junit.Before;
+import org.junit.Test;
+import org.onap.aai.babel.testdata.CsarTest;
+import org.onap.aai.babel.util.ArtifactTestUtils;
+import org.onap.aai.babel.xml.generator.data.Artifact;
+
+/**
+ * Direct tests of the @{link ModelGenerator} implementation class (to improve code coverage). Not all methods are
+ * tested here. Most use cases are covered by direct tests of @{link CsarToXmlConverter}.
+ */
+public class TestModelGenerator {
+
+    static {
+        System.setProperty("APP_HOME", ".");
+    }
+
+    @Before
+    public void setup() {
+        new ArtifactTestUtils().setGeneratorSystemProperties();
+    }
+
+    @Test
+    public void testDefaultServiceVersion() throws XmlArtifactGenerationException, IOException {
+        Artifact ymlFile = new Artifact(null, null, null, null);
+        new ModelGenerator().generateArtifacts(CsarTest.SD_WAN_CSAR_FILE.getContent(),
+                Collections.singletonList(ymlFile));
+    }
+
+
+}
index 60bcc7e..1fc5d13 100644 (file)
@@ -2,13 +2,14 @@
  * ============LICENSE_START=======================================================
  * org.onap.aai
  * ================================================================================
- * Copyright © 2017-2018 Nokia Networks Intellectual Property. All rights reserved.
+ * Copyright (c) 2017-2018 Nokia Networks Intellectual Property. All rights reserved.
+ * Copyright (c) 2017-2019 European Software Marketing Ltd.
  * ================================================================================
  * 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
+ *       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,
@@ -48,23 +49,6 @@ public class TestGeneratorUtil {
         assertThat(result, is(EMPTY_BYTE_ARRAY));
     }
 
-    @Test
-    public void shouldDecodeUsingBase64() {
-        byte[] input = Base64.getEncoder().encode(TEST_BYTES);
-        byte[] expected = Base64.getDecoder().decode(input);
-
-        byte[] result = GeneratorUtil.decode(input);
-
-        assertThat(result, is(expected));
-    }
-
-    @Test
-    public void shouldReturnEmptyByteArrayWhenNullPassedToDecode() {
-        byte[] result = GeneratorUtil.decode(null);
-
-        assertThat(result, is(EMPTY_BYTE_ARRAY));
-    }
-
     @Test
     public void shouldReturnNullWhenNullPassedToCheckSum() {
         assertNull(GeneratorUtil.checkSum(null));
index 8d1a045..ed4f5c1 100644 (file)
@@ -2,8 +2,8 @@
  * ============LICENSE_START=======================================================
  * org.onap.aai
  * ================================================================================
- * Copyright © 2017-2019 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2019 European Software Marketing Ltd.
+ * Copyright (c) 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (c) 2017-2019 European Software Marketing Ltd.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -26,16 +26,9 @@ import static org.hamcrest.CoreMatchers.nullValue;
 import static org.junit.Assert.assertThat;
 
 import java.io.IOException;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import org.junit.Before;
+import org.junit.BeforeClass;
 import org.junit.Test;
-import org.onap.aai.babel.parser.ArtifactGeneratorToscaParser;
 import org.onap.aai.babel.util.ArtifactTestUtils;
-import org.onap.aai.babel.xml.generator.model.Widget.Type;
-import org.onap.aai.babel.xml.generator.types.ModelType;
 
 /**
  * Direct tests of the Model abstract class (to improve code coverage). Not all methods are tested here. Some are
@@ -43,63 +36,17 @@ import org.onap.aai.babel.xml.generator.types.ModelType;
  */
 public class TestModel {
 
-    private Service serviceModel = new Service();
-    private List<Resource> resourceModels =
-            Arrays.asList(new Resource(Type.CR, true), new Resource(Type.INSTANCE_GROUP, true));
-    private Widget widgetModel = new OamNetwork();
-    private Model anonymousModel;
-
-    static {
-        System.setProperty("APP_HOME", ".");
-    }
-
     /**
-     * Initialise the Artifact Generator with filtering and mapping configuration. Also Load the Widget to UUID mappings
-     * from the Artifact Generator properties.
+     * Load the Widget Configuration, including the type mappings and the UUID mappings.
      *
      * @throws IOException
-     *     if the Artifact Generator properties file is not loaded
+     *             if the mappings configuration cannot be loaded
      */
-    @Before
-    public void setup() throws IOException {
-        ArtifactTestUtils utils = new ArtifactTestUtils();
-        utils.setGeneratorSystemProperties();
-
-        String configLocation = System.getProperty(ArtifactGeneratorToscaParser.PROPERTY_TOSCA_MAPPING_FILE);
-        if (configLocation == null) {
-            throw new IllegalArgumentException(
-                    String.format(ArtifactGeneratorToscaParser.GENERATOR_AAI_CONFIGLOCATION_NOT_FOUND, ArtifactGeneratorToscaParser.PROPERTY_TOSCA_MAPPING_FILE));
-        }
-        
-        ArtifactGeneratorToscaParser.initToscaMappingsConfiguration(configLocation);
-        utils.loadWidgetToUuidMappings();
-
-        anonymousModel = new Model() {
-            @Override
-            public boolean addResource(Resource resource) {
-                return false;
-            }
-
-            @Override
-            public boolean addWidget(Widget resource) {
-                return false;
-            }
-
-            @Override
-            public Type getWidgetType() {
-                return null;
-            }
-
-            @Override
-            public Map<String, Object> getProperties() {
-                return Collections.emptyMap();
-            }
-
-            @Override
-            public boolean isResource() {
-                return false;
-            }
-        };
+    @BeforeClass
+    public static void setup() throws IOException {
+        ArtifactTestUtils util = new ArtifactTestUtils();
+        util.loadWidgetToUuidMappings();
+        util.loadWidgetMappings();
     }
 
     @Test
@@ -108,32 +55,33 @@ public class TestModel {
         assertThat(Model.getModelFor(""), is(nullValue()));
         assertThat(Model.getModelFor("any.unknown.type"), is(nullValue()));
 
-        assertMapping("org.openecomp.resource.vfc", Type.VSERVER);
-        assertMapping("org.openecomp.resource.cp", Type.LINT);
-        assertMapping("org.openecomp.cp", Type.LINT);
-        assertMapping("org.openecomp.cp.some.suffix", Type.LINT);
-        assertMapping("org.openecomp.resource.vl", Type.L3_NET);
-        assertMapping("org.openecomp.resource.vf", Type.VF);
-        assertMapping("org.openecomp.groups.vfmodule", Type.VFMODULE);
-        assertMapping("org.openecomp.groups.VfModule", Type.VFMODULE);
-        assertMapping("org.openecomp.resource.vfc.nodes.heat.cinder", Type.VOLUME);
-        assertMapping("org.openecomp.nodes.PortMirroringConfiguration", "Configuration", Type.CONFIGURATION);
-        assertMapping("any.string", "Configuration", Type.CONFIGURATION);
-        assertMapping("org.openecomp.resource.cr.Kk1806Cr1", "CR", Type.CR);
-        assertMapping("any.string", "CR", Type.CR);
-
-        assertMapping("org.openecomp.resource.vfc", "an.unknown.type", Type.VSERVER);
+        assertMapping("org.openecomp.resource.vfc", WidgetType.valueOf("VSERVER"));
+        assertMapping("org.openecomp.resource.cp", WidgetType.valueOf("LINT"));
+        assertMapping("org.openecomp.cp", WidgetType.valueOf("LINT"));
+        assertMapping("org.openecomp.cp.some.suffix", WidgetType.valueOf("LINT"));
+        assertMapping("org.openecomp.resource.vl", WidgetType.valueOf("L3_NET"));
+        assertMapping("org.openecomp.resource.vf", WidgetType.valueOf("VF"));
+        assertMapping("org.openecomp.groups.vfmodule", WidgetType.valueOf("VFMODULE"));
+        assertMapping("org.openecomp.groups.VfModule", WidgetType.valueOf("VFMODULE"));
+        assertMapping("org.openecomp.resource.vfc.nodes.heat.cinder", WidgetType.valueOf("VOLUME"));
+        assertMapping("org.openecomp.nodes.PortMirroringConfiguration", "Configuration",
+                WidgetType.valueOf("CONFIGURATION"));
+        assertMapping("any.string", "Configuration", WidgetType.valueOf("CONFIGURATION"));
+        assertMapping("org.openecomp.resource.cr.Kk1806Cr1", "CR", WidgetType.valueOf("CR"));
+        assertMapping("any.string", "CR", WidgetType.valueOf("CR"));
+
+        assertMapping("org.openecomp.resource.vfc", "an.unknown.type", WidgetType.valueOf("VSERVER"));
     }
 
     /**
      * Assert that the TOSCA type String is mapped to the expected Widget Type.
      * 
      * @param toscaType
-     *     the TOSCA type or prefix
+     *            the TOSCA type or prefix
      * @param widgetType
-     *     the type of Widget expected from the mappings
+     *            the type of Widget expected from the mappings
      */
-    private void assertMapping(String toscaType, Type widgetType) {
+    private void assertMapping(String toscaType, WidgetType widgetType) {
         assertThat(Model.getModelFor(toscaType).getWidgetType(), is(widgetType));
     }
 
@@ -141,37 +89,14 @@ public class TestModel {
      * Assert that the TOSCA metadata type is mapped to the expected Widget Type.
      * 
      * @param toscaType
-     *     the name (or name prefix) of the TOSCA type
+     *            the name (or name prefix) of the TOSCA type
      * @param metadataType
-     *     the type specified in the TOSCA metadata
+     *            the type specified in the TOSCA metadata
      * @param widgetType
-     *     the type of Widget expected from the mappings
+     *            the type of Widget expected from the mappings
      */
-    private void assertMapping(String toscaType, String metadataType, Type widgetType) {
+    private void assertMapping(String toscaType, String metadataType, WidgetType widgetType) {
         assertThat(Model.getModelFor(toscaType, metadataType).getWidgetType(), is(widgetType));
     }
 
-    @Test
-    public void testGetModelType() {
-        assertThat(serviceModel.getModelType(), is(ModelType.SERVICE));
-        for (Resource resourceModel : resourceModels) {
-            assertThat(resourceModel.getModelType(), is(ModelType.RESOURCE));
-        }
-        assertThat(widgetModel.getModelType(), is(ModelType.WIDGET));
-        assertThat(anonymousModel.getModelType(), is(nullValue()));
-    }
-
-    @Test
-    public void testGetModelNameVersionId() {
-        assertThat(anonymousModel.getModelNameVersionId(), is(nullValue()));
-    }
-
-    @Test(expected = org.onap.aai.babel.xml.generator.error.IllegalAccessException.class)
-    public void testGetModelNameVersionIdIsUnsupported() {
-        assertThat(widgetModel.getModelNameVersionId(), is(nullValue()));
-        assertThat(resourceModels.get(0).getModelType(), is(ModelType.RESOURCE));
-        assertThat(widgetModel.getModelType(), is(ModelType.WIDGET));
-        assertThat(anonymousModel.getModelType(), is(nullValue()));
-    }
-
 }
index 451d2bb..14f3798 100644 (file)
@@ -2,8 +2,8 @@
  * ============LICENSE_START=======================================================
  * org.onap.aai
  * ================================================================================
- * Copyright © 2017-2019 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2019 European Software Marketing Ltd.
+ * Copyright (c) 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (c) 2017-2019 European Software Marketing Ltd.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -33,20 +33,24 @@ import java.util.Map;
 import org.junit.BeforeClass;
 import org.junit.Test;
 import org.onap.aai.babel.util.ArtifactTestUtils;
-import org.onap.aai.babel.xml.generator.model.Widget.Type;
+import org.onap.aai.babel.xml.generator.XmlArtifactGenerationException;
 
 /**
- * Direct tests of the VfModule Model class to improve code coverage.
+ * Direct tests of the VFMODULE Resource and Widget functionality to improve code coverage.
  */
 public class TestVfModule {
 
-    static {
-        System.setProperty("APP_HOME", ".");
-    }
-
+    /**
+     * Load the Widget Configuration, including the type mappings and the UUID mappings.
+     *
+     * @throws IOException
+     *             if the mappings configuration cannot be loaded
+     */
     @BeforeClass
     public static void setup() throws IOException {
-        new ArtifactTestUtils().loadWidgetToUuidMappings();
+        ArtifactTestUtils util = new ArtifactTestUtils();
+        util.loadWidgetToUuidMappings();
+        util.loadWidgetMappings();
     }
 
     /**
@@ -80,33 +84,39 @@ public class TestVfModule {
     }
 
     @Test
-    public void testAddVServerWidgetToVf() {
-        assertAddWidget(createNewVfModule(), Type.VSERVER);
+    public void testAddVServerWidgetToVf() throws XmlArtifactGenerationException {
+        assertAddWidget(createNewVfModule(), WidgetType.valueOf("VSERVER"));
     }
 
     @Test
-    public void testAddServiceWidgetToVf() {
-        assertAddWidget(createNewVfModule(), Type.SERVICE);
+    public void testAddServiceWidgetToVf() throws XmlArtifactGenerationException {
+        assertAddWidget(createNewVfModule(), WidgetType.valueOf("SERVICE"));
     }
 
     /**
      * Add a new Widget to a VF Module, where the Widget is NOT set as a member. N.B. For the current VF Module
      * implementation the actual Widget type is not important.
+     * 
+     * @throws XmlArtifactGenerationException
+     *             if the Widget mapping configuration is missing
      */
     @Test
-    public void testNonMemberWidgetToVf() {
+    public void testNonMemberWidgetToVf() throws XmlArtifactGenerationException {
         Resource vfModule = createNewVfModule();
-        assertThat(vfModule.addWidget(createNewWidget(Type.SERVICE)), is(false));
+        assertThat(vfModule.addWidget(createNewWidget(WidgetType.valueOf("SERVICE"))), is(false));
         assertNumberOfWidgets(vfModule, 0);
     }
 
     /**
      * OAM Network is specifically excluded from a VF Module.
+     * 
+     * @throws XmlArtifactGenerationException
+     *             if the Widget mapping configuration is missing
      */
     @Test
-    public void testAddOamNetworkWidgetToVf() {
+    public void testAddOamNetworkWidgetToVf() throws XmlArtifactGenerationException {
         Resource vfModule = createNewVfModule();
-        assertThat(createNewWidgetForModule(vfModule, Type.OAM_NETWORK), is(false));
+        assertThat(createNewWidgetForModule(vfModule, WidgetType.valueOf("OAM_NETWORK")), is(false));
         assertNumberOfWidgets(vfModule, 0);
     }
 
@@ -117,13 +127,16 @@ public class TestVfModule {
      * <li>Add a Volume Widget</li>
      * <li>Add a vserver Widget</li>
      * <li>Check that the Volume Widget appears under the vserver</li>
+     * 
+     * @throws XmlArtifactGenerationException
+     *             if the Widget mapping configuration is missing
      */
     @Test
-    public void testAddVolumeWidgetToVf() {
+    public void testAddVolumeWidgetToVf() throws XmlArtifactGenerationException {
         Resource vfModule = createNewVfModule();
 
         // Adding a Volume widget has no effect until a vserver widget is added.
-        assertAddWidget(vfModule, Type.VOLUME);
+        assertAddWidget(vfModule, WidgetType.valueOf("VOLUME"));
         assertNumberOfWidgets(vfModule, 0);
 
         final int vserverBaseWidgetCount = createVserverForVf(vfModule);
@@ -132,11 +145,11 @@ public class TestVfModule {
         assertNumberOfWidgets(vfModule.vserver, vserverBaseWidgetCount + 1);
 
         // Adding another instance of a vserver widget fails.
-        assertFailToAddWidget(vfModule, Type.VSERVER);
+        assertFailToAddWidget(vfModule, WidgetType.valueOf("VSERVER"));
         assertNumberOfWidgets(vfModule, 1);
 
         // Adding another Volume widget is always treated as successful.
-        assertAddWidget(vfModule, Type.VOLUME);
+        assertAddWidget(vfModule, WidgetType.valueOf("VOLUME"));
         // Assert that no additional Widgets are actually present.
         assertNumberOfWidgets(vfModule, 1);
         assertNumberOfWidgets(vfModule.vserver, vserverBaseWidgetCount + 1);
@@ -149,13 +162,16 @@ public class TestVfModule {
      * <li>Add an L-Interface Widget</li>
      * <li>Add a vserver Widget</li>
      * <li>Check that the L-Interface Widget appears under the vserver</li>
+     * 
+     * @throws XmlArtifactGenerationException
+     *             if the Widget mapping configuration is missing
      */
     @Test
-    public void testAddLinterfaceWidgetToVf() {
+    public void testAddLinterfaceWidgetToVf() throws XmlArtifactGenerationException {
         Resource vfModule = createNewVfModule();
 
         // Adding an L-Interface widget has no effect until a vserver widget is added.
-        assertFailToAddWidget(vfModule, Type.LINT);
+        assertFailToAddWidget(vfModule, WidgetType.valueOf("LINT"));
         assertNumberOfWidgets(vfModule, 0);
 
         final int vserverBaseWidgetCount = createVserverForVf(vfModule);
@@ -164,11 +180,11 @@ public class TestVfModule {
         assertNumberOfWidgets(vfModule.vserver, vserverBaseWidgetCount + 1);
 
         // Adding another instance of a vserver widget fails.
-        assertFailToAddWidget(vfModule, Type.VSERVER);
+        assertFailToAddWidget(vfModule, WidgetType.valueOf("VSERVER"));
         assertNumberOfWidgets(vfModule, 1);
 
         // Adding an L-Interface widget is always treated as successful when a vserver exists.
-        assertAddWidget(vfModule, Type.LINT);
+        assertAddWidget(vfModule, WidgetType.valueOf("LINT"));
         // Assert that no additional Widgets are actually present.
         assertNumberOfWidgets(vfModule, 1);
         assertNumberOfWidgets(vfModule.vserver, vserverBaseWidgetCount + 1);
@@ -182,17 +198,20 @@ public class TestVfModule {
      * <li>Add an L-Interface Widget</li>
      * <li>Add a vserver Widget</li>
      * <li>Check that both Widgets appear under the vserver</li>
+     * 
+     * @throws XmlArtifactGenerationException
+     *             if the Widget mapping configuration is missing
      */
     @Test
-    public void testAddVolumeAndLinterfaceWidgetToVf() {
+    public void testAddVolumeAndLinterfaceWidgetToVf() throws XmlArtifactGenerationException {
         Resource vfModule = createNewVfModule();
 
         // Adding a Volume widget has no effect until a vserver widget is added.
-        assertAddWidget(vfModule, Type.VOLUME);
+        assertAddWidget(vfModule, WidgetType.valueOf("VOLUME"));
         assertNumberOfWidgets(vfModule, 0);
 
         // Adding an L-Interface widget has no effect until a vserver widget is added.
-        assertFailToAddWidget(vfModule, Type.LINT);
+        assertFailToAddWidget(vfModule, WidgetType.valueOf("LINT"));
         assertNumberOfWidgets(vfModule, 0);
 
         final int vserverBaseWidgetCount = createVserverForVf(vfModule);
@@ -201,12 +220,12 @@ public class TestVfModule {
         assertNumberOfWidgets(vfModule.vserver, vserverBaseWidgetCount + 2);
 
         // Adding another instance of a vserver widget fails.
-        assertFailToAddWidget(vfModule, Type.VSERVER);
+        assertFailToAddWidget(vfModule, WidgetType.valueOf("VSERVER"));
         assertNumberOfWidgets(vfModule, 1);
 
         // Add new instances (with no effect).
-        assertAddWidget(vfModule, Type.VOLUME);
-        assertAddWidget(vfModule, Type.LINT);
+        assertAddWidget(vfModule, WidgetType.valueOf("VOLUME"));
+        assertAddWidget(vfModule, WidgetType.valueOf("LINT"));
         // Assert that no additional Widgets are in fact present.
         assertNumberOfWidgets(vfModule, 1);
         assertNumberOfWidgets(vfModule.vserver, vserverBaseWidgetCount + 2);
@@ -222,8 +241,10 @@ public class TestVfModule {
      * @param widgetType
      *            type of Widget to create
      * @return a new Widget
+     * @throws XmlArtifactGenerationException
+     *             if the Widget mapping configuration is missing
      */
-    private Widget createNewWidget(Type widgetType) {
+    private Widget createNewWidget(WidgetType widgetType) throws XmlArtifactGenerationException {
         return Widget.getWidget(widgetType);
     }
 
@@ -233,7 +254,7 @@ public class TestVfModule {
      * @return new VF Module resource
      */
     private Resource createNewVfModule() {
-        Resource vfModule = new Resource(Type.VFMODULE, true);
+        Resource vfModule = new Resource(WidgetType.valueOf("VFMODULE"), true);
         assertNumberOfWidgets(vfModule, 0);
         return vfModule;
     }
@@ -257,8 +278,10 @@ public class TestVfModule {
      *            the VF Module to update
      * @param widgetType
      *            the type of Widget to create and add
+     * @throws XmlArtifactGenerationException
+     *             if the Widget mapping configuration is missing
      */
-    private void assertAddWidget(Resource vfModule, Type widgetType) {
+    private void assertAddWidget(Resource vfModule, WidgetType widgetType) throws XmlArtifactGenerationException {
         assertThat(createNewWidgetForModule(vfModule, widgetType), is(true));
     }
 
@@ -269,8 +292,10 @@ public class TestVfModule {
      *            the VF Module
      * @param widgetType
      *            the type of Widget to create and attempt to add
+     * @throws XmlArtifactGenerationException
+     *             if the Widget mapping configuration is missing
      */
-    private void assertFailToAddWidget(Resource vfModule, Type widgetType) {
+    private void assertFailToAddWidget(Resource vfModule, WidgetType widgetType) throws XmlArtifactGenerationException {
         assertThat(createNewWidgetForModule(vfModule, widgetType), is(false));
     }
 
@@ -282,8 +307,11 @@ public class TestVfModule {
      * @param widgetType
      *            the type of Widget to create and attempt to add
      * @return whether or not the Widget was added to the module
+     * @throws XmlArtifactGenerationException
+     *             if the Widget mapping configuration is missing
      */
-    private boolean createNewWidgetForModule(Resource vfModule, Type widgetType) {
+    private boolean createNewWidgetForModule(Resource vfModule, WidgetType widgetType)
+            throws XmlArtifactGenerationException {
         Widget widget = createNewWidget(widgetType);
         setWidgetAsMember(vfModule, widget);
         return vfModule.addWidget(widget);
@@ -311,9 +339,11 @@ public class TestVfModule {
      * @param vfModule
      *            the VF Module to update
      * @return the number of Widgets present in the vserver on creation
+     * @throws XmlArtifactGenerationException
+     *             if the Widget mapping configuration is missing
      */
-    private int createVserverForVf(Resource vfModule) {
-        VServerWidget vserverWidget = (VServerWidget) createNewWidget(Type.VSERVER);
+    private int createVserverForVf(Resource vfModule) throws XmlArtifactGenerationException {
+        Widget vserverWidget = createNewWidget(WidgetType.valueOf("VSERVER"));
         assertNumberOfWidgets(vfModule, 0);
         final int initialWidgetCount = addVserverToVf(vfModule, vserverWidget);
         assertNumberOfWidgets(vfModule, 1);
@@ -328,8 +358,10 @@ public class TestVfModule {
      * @param vserverWidget
      *            the Widget to add
      * @return initial widget count for the vserver Widget
+     * @throws XmlArtifactGenerationException
+     *             if the Widget mapping configuration is missing
      */
-    private int addVserverToVf(Resource vfModule, VServerWidget vserverWidget) {
+    private int addVserverToVf(Resource vfModule, Widget vserverWidget) throws XmlArtifactGenerationException {
         // A vserver (initially) has Flavor, Image, Tenant and Vfc.
         final int initialWidgetCount = 4;
         assertNumberOfWidgets(vserverWidget, initialWidgetCount);
index d7fe4af..4f28131 100644 (file)
@@ -2,8 +2,8 @@
  * ============LICENSE_START=======================================================
  * org.onap.aai
  * ================================================================================
- * Copyright © 2017-2019 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2019 European Software Marketing Ltd.
+ * Copyright (c) 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (c) 2017-2019 European Software Marketing Ltd.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -21,7 +21,6 @@
 
 package org.onap.aai.babel.xml.generator.model;
 
-import static org.hamcrest.CoreMatchers.instanceOf;
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.CoreMatchers.nullValue;
 import static org.junit.Assert.assertThat;
@@ -31,7 +30,7 @@ import java.util.Collections;
 import org.junit.BeforeClass;
 import org.junit.Test;
 import org.onap.aai.babel.util.ArtifactTestUtils;
-import org.onap.aai.babel.xml.generator.model.Widget.Type;
+import org.onap.aai.babel.xml.generator.XmlArtifactGenerationException;
 import org.onap.aai.babel.xml.generator.types.ModelType;
 
 /**
@@ -39,56 +38,161 @@ import org.onap.aai.babel.xml.generator.types.ModelType;
  */
 public class TestWidget {
 
-    static {
-        System.setProperty("APP_HOME", ".");
-    }
-
     /**
-     * Load the Widget to UUID mappings from the Artifact Generator properties.
+     * Load the Widget Configuration, including the type mappings and the UUID mappings.
      *
      * @throws IOException
-     *             if the properties file is not loaded
+     *             if the mappings configuration cannot be loaded
      */
     @BeforeClass
     public static void setup() throws IOException {
-        new ArtifactTestUtils().loadWidgetToUuidMappings();
+        ArtifactTestUtils util = new ArtifactTestUtils();
+        util.loadWidgetToUuidMappings();
+        util.loadWidgetMappings();
     }
 
     @Test
-    public void testGetWidgets() {
-        assertThat(Widget.getWidget(Type.SERVICE), instanceOf(ServiceWidget.class));
-        assertThat(Widget.getWidget(Type.VF), instanceOf(VfWidget.class));
-        assertThat(Widget.getWidget(Type.VFC), instanceOf(VfcWidget.class));
-        assertThat(Widget.getWidget(Type.VSERVER), instanceOf(VServerWidget.class));
-        assertThat(Widget.getWidget(Type.VOLUME), instanceOf(VolumeWidget.class));
-        assertThat(Widget.getWidget(Type.FLAVOR), instanceOf(FlavorWidget.class));
-        assertThat(Widget.getWidget(Type.TENANT), instanceOf(TenantWidget.class));
-        assertThat(Widget.getWidget(Type.VOLUME_GROUP), instanceOf(VolumeGroupWidget.class));
-        assertThat(Widget.getWidget(Type.LINT), instanceOf(LIntfWidget.class));
-        assertThat(Widget.getWidget(Type.L3_NET), instanceOf(L3NetworkWidget.class));
-        assertThat(Widget.getWidget(Type.VFMODULE), instanceOf(VfModuleWidget.class));
-        assertThat(Widget.getWidget(Type.IMAGE), instanceOf(ImageWidget.class));
-        assertThat(Widget.getWidget(Type.OAM_NETWORK), instanceOf(OamNetwork.class));
-        assertThat(Widget.getWidget(Type.ALLOTTED_RESOURCE), instanceOf(AllotedResourceWidget.class));
-        assertThat(Widget.getWidget(Type.TUNNEL_XCONNECT), instanceOf(TunnelXconnectWidget.class));
-        assertThat(Widget.getWidget(Type.CONFIGURATION), instanceOf(ConfigurationWidget.class));
+    public void testGetWidgets() throws XmlArtifactGenerationException {
+        Widget widget = Widget.getWidget(WidgetType.valueOf("SERVICE"));
+        assertThat(widget.getType(), is(ModelType.WIDGET));
+        assertThat(widget.getName(), is("service-instance"));
+        assertThat(widget.getDeleteFlag(), is(true));
+
+        widget = Widget.getWidget(WidgetType.valueOf("VF"));
+        assertThat(widget.getType(), is(ModelType.WIDGET));
+        assertThat(widget.getName(), is("generic-vnf"));
+        assertThat(widget.getDeleteFlag(), is(false));
+
+        widget = Widget.getWidget(WidgetType.valueOf("VFC"));
+        assertThat(widget.getType(), is(ModelType.WIDGET));
+        assertThat(widget.getName(), is("vnfc"));
+        assertThat(widget.getDeleteFlag(), is(true));
+
+        widget = Widget.getWidget(WidgetType.valueOf("VSERVER"));
+        assertThat(widget.getType(), is(ModelType.WIDGET));
+        assertThat(widget.getName(), is("vserver"));
+        assertThat(widget.getDeleteFlag(), is(true));
+
+        widget = Widget.getWidget(WidgetType.valueOf("VOLUME"));
+        assertThat(widget.getType(), is(ModelType.WIDGET));
+        assertThat(widget.getName(), is("volume"));
+        assertThat(widget.getDeleteFlag(), is(true));
+
+        widget = Widget.getWidget(WidgetType.valueOf("FLAVOR"));
+        assertThat(widget.getType(), is(ModelType.WIDGET));
+        assertThat(widget.getName(), is("flavor"));
+        assertThat(widget.getDeleteFlag(), is(false));
+
+        widget = Widget.getWidget(WidgetType.valueOf("TENANT"));
+        assertThat(widget.getType(), is(ModelType.WIDGET));
+        assertThat(widget.getName(), is("tenant"));
+        assertThat(widget.getDeleteFlag(), is(false));
+
+        widget = Widget.getWidget(WidgetType.valueOf("VOLUME_GROUP"));
+        assertThat(widget.getType(), is(ModelType.WIDGET));
+        assertThat(widget.getName(), is("volume-group"));
+        assertThat(widget.getDeleteFlag(), is(true));
+
+        widget = Widget.getWidget(WidgetType.valueOf("LINT"));
+        assertThat(widget.getType(), is(ModelType.WIDGET));
+        assertThat(widget.getName(), is("l-interface"));
+        assertThat(widget.getDeleteFlag(), is(true));
+
+        widget = Widget.getWidget(WidgetType.valueOf("L3_NET"));
+        assertThat(widget.getType(), is(ModelType.WIDGET));
+        assertThat(widget.getName(), is("l3-network"));
+        assertThat(widget.getDeleteFlag(), is(true));
+
+        widget = Widget.getWidget(WidgetType.valueOf("VFMODULE"));
+        assertThat(widget.getType(), is(ModelType.WIDGET));
+        assertThat(widget.getName(), is("vf-module"));
+        assertThat(widget.getDeleteFlag(), is(true));
+
+        widget = Widget.getWidget(WidgetType.valueOf("IMAGE"));
+        assertThat(widget.getType(), is(ModelType.WIDGET));
+        assertThat(widget.getName(), is("image"));
+        assertThat(widget.getDeleteFlag(), is(false));
+
+        widget = Widget.getWidget(WidgetType.valueOf("OAM_NETWORK"));
+        assertThat(widget.getType(), is(ModelType.WIDGET));
+        assertThat(widget.getName(), is("oam-network"));
+        assertThat(widget.getDeleteFlag(), is(true));
+
+        widget = Widget.getWidget(WidgetType.valueOf("ALLOTTED_RESOURCE"));
+        assertThat(widget.getType(), is(ModelType.WIDGET));
+        assertThat(widget.getName(), is("allotted-resource"));
+        assertThat(widget.getDeleteFlag(), is(true));
+
+        widget = Widget.getWidget(WidgetType.valueOf("TUNNEL_XCONNECT"));
+        assertThat(widget.getType(), is(ModelType.WIDGET));
+        assertThat(widget.getName(), is("tunnel-xconnect"));
+        assertThat(widget.getDeleteFlag(), is(true));
+
+        widget = Widget.getWidget(WidgetType.valueOf("CONFIGURATION"));
+        assertThat(widget.getType(), is(ModelType.WIDGET));
+        assertThat(widget.getName(), is("configuration"));
+        assertThat(widget.getDeleteFlag(), is(true));
     }
 
     @Test
-    public void testWidgetMethods() {
-        Widget widget = new ServiceWidget();
+    public void testWidgetMethods() throws XmlArtifactGenerationException {
+        Widget widget = new Widget(WidgetType.valueOf("SERVICE"), "service-instance", true);
         assertThat(widget.getType(), is(ModelType.WIDGET));
         assertThat(widget.getWidgetId(), is("service-instance-invariant-id"));
-        assertThat(widget.addWidget(new TenantWidget()), is(true));
+        assertThat(widget.addWidget(Widget.getWidget(WidgetType.valueOf("TENANT"))), is(true));
         assertThat(widget.memberOf(null), is(false));
         assertThat(widget.memberOf(Collections.emptyList()), is(false));
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testGetUnknownWidget() throws XmlArtifactGenerationException {
+        WidgetType.valueOf("invalid-widget-name");
+    }
+
+    /**
+     * Try to get the Widget object for an unsupported (non-configured) type.
+     * 
+     * @throws XmlArtifactGenerationException
+     *             if there is no configuration defined for the specified Widget type
+     */
+    @Test(expected = XmlArtifactGenerationException.class)
+    public void testGetDynamicWidget() throws XmlArtifactGenerationException {
+        Widget.getWidget(new WidgetType(null));
+    }
+    
+    @Test(expected = org.onap.aai.babel.xml.generator.error.IllegalAccessException.class)
+    public void testAddResourceIsUnsupported() throws XmlArtifactGenerationException {
+        Widget.getWidget(WidgetType.valueOf("OAM_NETWORK")).addResource(null);
+    }
 
-        widget = new VolumeGroupWidget(); // just for variety
-        assertThat(widget.getWidgetType(), is(nullValue()));
+    @Test(expected = IllegalArgumentException.class)
+    public void testGetVersionIdForUknownWidget() {
+        new Widget(new WidgetType("test"), null, false).getId();
     }
 
+    @Test(expected = IllegalArgumentException.class)
+    public void testGetInvariantIdForUknownWidget() {
+        new Widget(new WidgetType("test"), null, false).getWidgetId();
+    }
+
+    // Call Widget methods which are not supported, purely for code coverage.
+
     @Test(expected = org.onap.aai.babel.xml.generator.error.IllegalAccessException.class)
-    public void testAddResourceIsUnsupported() {
-        new OamNetwork().addResource(null);
+    public void testGetModelNameVersionIdIsUnsupported() {
+        Widget widgetModel = new Widget(WidgetType.valueOf("OAM_NETWORK"), "oam-network", true);
+        assertThat(widgetModel.getModelNameVersionId(), is(nullValue()));
     }
+
+    @Test(expected = org.onap.aai.babel.xml.generator.error.IllegalAccessException.class)
+    public void testGetModelTypeNameIsUnsupported() {
+        Widget widgetModel = new Widget(WidgetType.valueOf("OAM_NETWORK"), "oam-network", true);
+        assertThat(widgetModel.getModelTypeName(), is(nullValue()));
+    }
+
+    @Test(expected = org.onap.aai.babel.xml.generator.error.IllegalAccessException.class)
+    public void testGetModelIdIsUnsupported() {
+        Widget widgetModel = new Widget(WidgetType.valueOf("OAM_NETWORK"), "oam-network", true);
+        assertThat(widgetModel.getModelId(), is(nullValue()));
+    }
+
 }
diff --git a/src/test/resources/appconfig/auth/auth_policy.json b/src/test/resources/appconfig/auth/auth_policy.json
new file mode 100644 (file)
index 0000000..dc966e0
--- /dev/null
@@ -0,0 +1,12 @@
+{"roles": [
+    {
+        "name": "nofuncauth",
+        "functions": [{
+            "name": "nofuncutil"
+        }],        
+        "users": [{
+            "user": "aai",
+            "pass": "OBF:1u2a1t2v1vgb1s3g1s3m1vgj1t3b1u30"
+        }]
+    }    
+]}
diff --git a/src/test/resources/auth/keystore.jks b/src/test/resources/auth/keystore.jks
new file mode 100644 (file)
index 0000000..037769b
Binary files /dev/null and b/src/test/resources/auth/keystore.jks differ
diff --git a/src/test/resources/empty-tosca-mappings.json b/src/test/resources/empty-tosca-mappings.json
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/src/test/resources/invalid-tosca-mappings.json b/src/test/resources/invalid-tosca-mappings.json
new file mode 100644 (file)
index 0000000..bbd27bd
--- /dev/null
@@ -0,0 +1 @@
+test file that does not contain valid JSON content
\ No newline at end of file
index 0d306ea..c67b3e2 100644 (file)
@@ -4,6 +4,98 @@
                "org.openecomp.groups.VfcInstanceGroup",
                "org.openecomp.groups.ResourceInstanceGroup"
        ],
+       "widgetTypes": [
+               {
+                       "type": "SERVICE",
+                       "name": "service-instance",
+                       "deleteFlag": true
+               },
+               {
+                       "type": "VF",
+                       "name": "generic-vnf",
+                       "deleteFlag": false
+               },
+               {
+                       "type": "VFC",
+                       "name": "vnfc",
+                       "deleteFlag": true
+               },
+               {
+                       "type": "VSERVER",
+                       "name": "vserver",
+                       "deleteFlag": true
+               },
+               {
+                       "type": "VOLUME",
+                       "name": "volume",
+                       "deleteFlag": true
+               },
+               {
+                       "type": "FLAVOR",
+                       "name": "flavor",
+                       "deleteFlag": false
+               },
+               {
+                       "type": "TENANT",
+                       "name": "tenant",
+                       "deleteFlag": false
+               },
+               {
+                       "type": "VOLUME_GROUP",
+                       "name": "volume-group",
+                       "deleteFlag": true
+               },
+               {
+                       "type": "LINT",
+                       "name": "l-interface",
+                       "deleteFlag": true
+               },
+               {
+                       "type": "L3_NET",
+                       "name": "l3-network",
+                       "deleteFlag": true
+               },
+               {
+                       "type": "VFMODULE",
+                       "name": "vf-module",
+                       "deleteFlag": true
+               },
+               {
+                       "type": "IMAGE",
+                       "name": "image",
+                       "deleteFlag": false
+               },
+               {
+                       "type": "OAM_NETWORK",
+                       "name": "oam-network",
+                       "deleteFlag": true
+               },
+               {
+                       "type": "ALLOTTED_RESOURCE",
+                       "name": "allotted-resource",
+                       "deleteFlag": true
+               },
+               {
+                       "type": "TUNNEL_XCONNECT",
+                       "name": "tunnel-xconnect",
+                       "deleteFlag": true
+               },
+               {
+                       "type": "CONFIGURATION",
+                       "name": "configuration",
+                       "deleteFlag": true
+               },
+               {
+                       "type": "CR",
+                       "name": "cr",
+                       "deleteFlag": true
+               },
+               {
+                       "type": "INSTANCE_GROUP",
+                       "name": "instance-group",
+                       "deleteFlag": true
+               }
+       ],
        "widgetMappings": [
                {
                        "prefix": "org.openecomp.resource.vfc",