Replace Resource sub-classes with configuration 75/77875/1
authormark.j.leonard <mark.j.leonard@gmail.com>
Tue, 5 Feb 2019 14:24:33 +0000 (14:24 +0000)
committermark.j.leonard <mark.j.leonard@gmail.com>
Tue, 5 Feb 2019 14:24:33 +0000 (14:24 +0000)
Delete the sub-classes of the Resource (internal Model class) and
replace the annotated properties of these classes with TOSCA-to-Model
mappping data loaded from the JSON configuration.

Change-Id: I56d5d9d4893be45eb42ae65099ea9abe5f4409b9
Issue-ID: AAI-2121
Signed-off-by: mark.j.leonard <mark.j.leonard@gmail.com>
21 files changed:
src/main/java/org/onap/aai/babel/parser/ArtifactGeneratorToscaParser.java
src/main/java/org/onap/aai/babel/xml/generator/api/AaiArtifactGenerator.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 [moved from src/main/java/org/onap/aai/babel/xml/generator/logging/CategoryLogLevel.java with 70% similarity]
src/main/java/org/onap/aai/babel/xml/generator/model/AllotedResource.java [deleted file]
src/main/java/org/onap/aai/babel/xml/generator/model/CR.java [deleted file]
src/main/java/org/onap/aai/babel/xml/generator/model/Configuration.java [deleted file]
src/main/java/org/onap/aai/babel/xml/generator/model/InstanceGroup.java [deleted file]
src/main/java/org/onap/aai/babel/xml/generator/model/L3Network.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/ProvidingService.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/VfModule.java [deleted file]
src/main/java/org/onap/aai/babel/xml/generator/model/VirtualFunction.java [deleted file]
src/main/java/org/onap/aai/babel/xml/generator/model/Widget.java
src/test/java/org/onap/aai/babel/parser/TestArtifactGeneratorToscaParser.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/resources/tosca-mappings.json

index 505afbf..7dfc807 100644 (file)
@@ -18,6 +18,7 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.babel.parser;
 
 import com.google.gson.Gson;
@@ -38,14 +39,10 @@ import java.util.stream.Stream;
 import org.onap.aai.babel.logging.LogHelper;
 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.AllotedResource;
-import org.onap.aai.babel.xml.generator.model.InstanceGroup;
-import org.onap.aai.babel.xml.generator.model.L3NetworkWidget;
 import org.onap.aai.babel.xml.generator.model.Model;
-import org.onap.aai.babel.xml.generator.model.ProvidingService;
 import org.onap.aai.babel.xml.generator.model.Resource;
-import org.onap.aai.babel.xml.generator.model.VfModule;
 import org.onap.aai.babel.xml.generator.model.Widget;
+import org.onap.aai.babel.xml.generator.model.Widget.Type;
 import org.onap.aai.cl.api.Logger;
 import org.onap.sdc.tosca.parser.api.ISdcCsarHelper;
 import org.onap.sdc.toscaparser.api.Group;
@@ -87,7 +84,7 @@ public class ArtifactGeneratorToscaParser {
      * Constructs using csarHelper
      *
      * @param csarHelper
-     *            The csar helper
+     *     The csar helper
      */
     public ArtifactGeneratorToscaParser(ISdcCsarHelper csarHelper) {
         this.csarHelper = csarHelper;
@@ -97,7 +94,7 @@ public class ArtifactGeneratorToscaParser {
      * Get or create the artifact description.
      *
      * @param model
-     *            the artifact model
+     *     the artifact model
      * @return the artifact model's description
      */
     public static String getArtifactDescription(Model model) {
@@ -152,11 +149,11 @@ public class ArtifactGeneratorToscaParser {
         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);
         WidgetConfigurationUtil.setSupportedInstanceGroups(config.getInstanceGroupTypes());
-        WidgetConfigurationUtil.setTypeMappings(config.getToscaToWidgetMappings());
+        WidgetConfigurationUtil.setWidgetMappings(config.getWidgetMappings());
     }
 
     /**
@@ -185,9 +182,9 @@ public class ArtifactGeneratorToscaParser {
      * duplicate keys then the TOSCA Property value takes precedence.
      *
      * @param stringProps
-     *            initial Map of String property values (e.g. from the TOSCA YAML metadata section)
+     *     initial Map of String property values (e.g. from the TOSCA YAML metadata section)
      * @param toscaProps
-     *            Map of TOSCA Property Type Object values to merge in (or overwrite)
+     *     Map of TOSCA Property Type Object values to merge in (or overwrite)
      * @return a Map of the property values converted to String
      */
     public Map<String, String> mergeProperties(Map<String, String> stringProps, Map<String, Property> toscaProps) {
@@ -198,7 +195,7 @@ public class ArtifactGeneratorToscaParser {
     }
 
     public Resource createInstanceGroupModel(Map<String, String> properties) {
-        Resource groupModel = new InstanceGroup();
+        Resource groupModel = new Resource(Type.INSTANCE_GROUP, true);
         groupModel.populateModelIdentificationInformation(properties);
         return groupModel;
     }
@@ -207,28 +204,14 @@ public class ArtifactGeneratorToscaParser {
      * @param model
      * @param relation
      */
-    public void addRelatedModel(final Model model, final Model relation) {
-        if (relation instanceof Resource) {
-            model.addResource((Resource) relation);
+    public void addRelatedModel(final Model model, final Resource relation) {
+        if (relation.isResource()) {
+            model.addResource(relation);
         } else {
-            model.addWidget((Widget) relation);
+            model.addWidget(Widget.getWidget(relation.getWidgetType()));
         }
     }
 
-    public String normaliseNodeTypeName(NodeTemplate nodeType) {
-        String nodeTypeName = nodeType.getType();
-        Metadata metadata = nodeType.getMetaData();
-        if (metadata != null && hasAllottedResource(metadata.getAllProperties())) {
-            if (nodeType.getType().contains("org.openecomp.resource.vf.")) {
-                nodeTypeName = "org.openecomp.resource.vf.allottedResource";
-            }
-            if (nodeType.getType().contains("org.openecomp.resource.vfc.")) {
-                nodeTypeName = "org.openecomp.resource.vfc.AllottedResource";
-            }
-        }
-        return nodeTypeName;
-    }
-
     public boolean hasAllottedResource(Map<String, String> metadata) {
         return ALLOTTED_RESOURCE.equals(metadata.get(CATEGORY));
     }
@@ -252,8 +235,8 @@ public class ArtifactGeneratorToscaParser {
         // Process each VF Group
         for (Group serviceGroup : serviceGroups) {
             Model groupModel = Model.getModelFor(serviceGroup.getType());
-            if (groupModel instanceof VfModule) {
-                processVfModule(resources, resourceModel, serviceGroup, serviceNode, (VfModule) groupModel);
+            if (groupModel.getWidgetType() == Type.VFMODULE) {
+                processVfModule(resources, resourceModel, serviceGroup, serviceNode, (Resource) groupModel);
             }
         }
     }
@@ -266,15 +249,24 @@ public class ArtifactGeneratorToscaParser {
         boolean foundProvidingService = false;
 
         for (NodeTemplate resourceNodeTemplate : resourceNodeTemplates) {
-            String nodeTypeName = normaliseNodeTypeName(resourceNodeTemplate);
-            Metadata metaData = resourceNodeTemplate.getMetaData();
-            String metaDataType = Optional.ofNullable(metaData).map(m -> m.getValue("type")).orElse(nodeTypeName);
-            Model resourceNode = Model.getModelFor(nodeTypeName, metaDataType);
-            foundProvidingService |=
-                    processModel(resourceModel, metaData, resourceNode, resourceNodeTemplate.getProperties());
+            String nodeTypeName = resourceNodeTemplate.getType();
+            Metadata metadata = resourceNodeTemplate.getMetaData();
+            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);
+                }
+            }
+
+            foundProvidingService |= processModel(resourceModel, metadata, model, resourceNodeTemplate.getProperties());
         }
 
-        if (resourceModel instanceof AllotedResource && !foundProvidingService) {
+        if (resourceModel.getWidgetType() == Type.ALLOTTED_RESOURCE && !foundProvidingService) {
             final String modelInvariantId = resourceModel.getModelId();
             throw new IllegalArgumentException(String.format(GENERATOR_AAI_PROVIDING_SERVICE_MISSING,
                     modelInvariantId == null ? "<null ID>" : modelInvariantId));
@@ -285,13 +277,13 @@ public class ArtifactGeneratorToscaParser {
      * Create an Instance Group Model and populate it with the supplied data.
      *
      * @param resourceModel
-     *            the Resource node template Model
+     *     the Resource node template Model
      * @param memberNodes
-     *            the Resources and Widgets belonging to the Group
+     *     the Resources and Widgets belonging to the Group
      * @param metaProperties
-     *            the metadata of the Group
+     *     the metadata of the Group
      * @param properties
-     *            the properties of the Group
+     *     the properties of the Group
      * @return the Instance Group and Member resource models
      */
     private List<Resource> processInstanceGroup(Model resourceModel, ArrayList<NodeTemplate> memberNodes,
@@ -320,11 +312,11 @@ public class ArtifactGeneratorToscaParser {
         List<Resource> resources = new ArrayList<>();
 
         for (NodeTemplate nodeTemplate : memberNodes) {
-            String nodeTypeName = normaliseNodeTypeName(nodeTemplate);
+            String nodeTypeName = nodeTemplate.getType();
             final String metadataType = nodeTemplate.getMetaData().getValue("type");
 
             log.debug(String.format("Get model for %s (metadata type %s)", nodeTypeName, metadataType));
-            Model memberModel = Model.getModelFor(nodeTypeName, metadataType);
+            Resource memberModel = Model.getModelFor(nodeTypeName, metadataType);
 
             if (memberModel != null) {
                 memberModel.populateModelIdentificationInformation(nodeTemplate.getMetaData().getAllProperties());
@@ -333,8 +325,8 @@ public class ArtifactGeneratorToscaParser {
                         memberModel.getClass().getSuperclass().getSimpleName(), memberModel.getClass(), nodeTypeName));
 
                 addRelatedModel(groupModel, memberModel);
-                if (memberModel instanceof Resource) {
-                    resources.add((Resource) memberModel);
+                if (memberModel.isResource()) {
+                    resources.add(memberModel);
                 }
             }
         }
@@ -342,7 +334,7 @@ public class ArtifactGeneratorToscaParser {
     }
 
     private void processVfModule(List<Resource> resources, Model vfModel, Group groupDefinition,
-            NodeTemplate serviceNode, VfModule groupModel) {
+            NodeTemplate serviceNode, Resource groupModel) {
         groupModel.populateModelIdentificationInformation(
                 mergeProperties(groupDefinition.getMetadata().getAllProperties(), groupDefinition.getProperties()));
 
@@ -355,7 +347,7 @@ public class ArtifactGeneratorToscaParser {
         }
     }
 
-    private void processVfModuleGroup(VfModule groupModel, List<NodeTemplate> members) {
+    private void processVfModuleGroup(Resource groupModel, List<NodeTemplate> members) {
         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());
@@ -366,16 +358,22 @@ public class ArtifactGeneratorToscaParser {
         }
     }
 
-    private void processGroupMembers(Model group, NodeTemplate member) {
-        Model resourceNode;
-        // L3-network inside vf-module to be generated as Widget a special handling.
-        if (member.getType().contains("org.openecomp.resource.vl")) {
-            resourceNode = new L3NetworkWidget();
-        } else {
-            resourceNode = Model.getModelFor(member.getType());
+    /**
+     * Process the Widget members of a VF Module Group
+     * 
+     * @param group
+     * @param member
+     */
+    private void processGroupMembers(Resource group, NodeTemplate member) {
+        Resource resource = Model.getModelFor(member.getType());
+
+        if (resource.getWidgetType() == Type.L3_NET) {
+            // An l3-network inside a vf-module is treated as a Widget
+            resource.setIsResource(false);
         }
-        if (resourceNode != null && !(resourceNode instanceof Resource)) {
-            Widget widget = (Widget) resourceNode;
+
+        if (!resource.isResource()) {
+            Widget widget = Widget.getWidget(resource.getWidgetType());
             widget.addKey(member.getName());
             // Add the widget element encountered to the Group model
             group.addWidget(widget);
@@ -386,7 +384,7 @@ public class ArtifactGeneratorToscaParser {
      * Create a Map of property name against String property value from the input Map
      *
      * @param inputMap
-     *            The input Map
+     *     The input Map
      * @return Map of property name against String property value
      */
     private Map<String, String> populateStringProperties(Map<String, Property> inputMap) {
@@ -396,25 +394,27 @@ public class ArtifactGeneratorToscaParser {
 
     /**
      * If the specified resourceNode is a type of Resource, add it to the specified resourceModel. If the Resource type
-     * is ProvidingService return true, otherwise return false.
+     * is ProvidingService then return true, otherwise return false.
      *
      * @param resourceModel
-     *            parent Resource
+     *     parent Resource
      * @param metaData
-     *            for populating the Resource IDs
+     *     for populating the Resource IDs
      * @param resourceNode
-     *            any Model (will be ignored if not a Resource)
+     *     any Model (will be ignored if not a Resource)
      * @param nodeProperties
-     *            the node properties
-     * @return whether or not a ProvidingService was prcoessed
+     *     the node properties
+     * @return whether or not a ProvidingService was processed
      */
-    private boolean processModel(Model resourceModel, Metadata metaData, Model resourceNode,
+    private boolean processModel(Model resourceModel, Metadata metaData, Resource resourceNode,
             Map<String, Property> nodeProperties) {
-        boolean foundProvidingService = false;
-        if (resourceNode instanceof ProvidingService) {
-            foundProvidingService = true;
+        boolean foundProvidingService = resourceNode != null
+                && (boolean) Optional.ofNullable(resourceNode.getProperties().get("providingService")).orElse(false);
+
+        if (foundProvidingService) {
             processProvidingService(resourceModel, resourceNode, nodeProperties);
-        } else if (resourceNode instanceof Resource && !(resourceNode.getWidgetType().equals(Widget.Type.L3_NET))) {
+        } else if (resourceNode != null && resourceNode.isResource()
+                && resourceNode.getWidgetType() != Widget.Type.L3_NET) {
             if (metaData != null) {
                 resourceNode.populateModelIdentificationInformation(metaData.getAllProperties());
             }
@@ -423,7 +423,7 @@ public class ArtifactGeneratorToscaParser {
         return foundProvidingService;
     }
 
-    private void processProvidingService(Model resourceModel, Model resourceNode,
+    private void processProvidingService(Model resourceModel, Resource resourceNode,
             Map<String, Property> nodeProperties) {
         if (nodeProperties == null || nodeProperties.get("providing_service_uuid") == null
                 || nodeProperties.get("providing_service_invariant_uuid") == null) {
@@ -433,6 +433,6 @@ public class ArtifactGeneratorToscaParser {
         Map<String, String> properties = populateStringProperties(nodeProperties);
         properties.put(VERSION, "1.0");
         resourceNode.populateModelIdentificationInformation(properties);
-        resourceModel.addResource((Resource) resourceNode);
+        resourceModel.addResource(resourceNode);
     }
 }
index d6d0a1e..fc5acda 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.xml.generator.api;
 
 import java.io.IOException;
@@ -26,6 +27,7 @@ import java.nio.file.Path;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.onap.aai.babel.logging.ApplicationMsgs;
@@ -39,15 +41,16 @@ import org.onap.aai.babel.xml.generator.data.GeneratorUtil;
 import org.onap.aai.babel.xml.generator.data.GroupType;
 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.ProvidingService;
 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.cl.api.Logger;
 import org.onap.sdc.tosca.parser.api.ISdcCsarHelper;
 import org.onap.sdc.tosca.parser.impl.SdcToscaParserFactory;
 import org.onap.sdc.toscaparser.api.Group;
 import org.onap.sdc.toscaparser.api.NodeTemplate;
+import org.onap.sdc.toscaparser.api.elements.Metadata;
 import org.slf4j.MDC;
 
 public class AaiArtifactGenerator implements ArtifactGenerator {
@@ -128,7 +131,10 @@ public class AaiArtifactGenerator implements ArtifactGenerator {
         for (Resource resource : resources) {
             generateResourceArtifact(generationData, resource);
             for (Resource childResource : resource.getResources()) {
-                if (!(childResource instanceof ProvidingService)) {
+                boolean isProvidingService =
+                        (boolean) Optional.ofNullable(childResource.getProperties().get("providingService")) //
+                                .orElse(false);
+                if (!isProvidingService) {
                     generateResourceArtifact(generationData, childResource);
                 }
             }
@@ -179,16 +185,16 @@ public class AaiArtifactGenerator implements ArtifactGenerator {
     private void generateModelFromNodeTemplate(ISdcCsarHelper csarHelper, Service serviceModel,
             List<Resource> resources, final List<Group> serviceGroups, ArtifactGeneratorToscaParser parser,
             NodeTemplate nodeTemplate) {
-        String nodeTypeName = parser.normaliseNodeTypeName(nodeTemplate);
-        Model model = Model.getModelFor(nodeTypeName, nodeTemplate.getMetaData().getValue("type"));
+        Resource model = getModelFor(parser, nodeTemplate);
+
         if (model != null) {
             if (nodeTemplate.getMetaData() != null) {
                 model.populateModelIdentificationInformation(nodeTemplate.getMetaData().getAllProperties());
             }
 
             parser.addRelatedModel(serviceModel, model);
-            if (model instanceof Resource) {
-                generateResourceModel(csarHelper, resources, parser, nodeTemplate, nodeTypeName);
+            if (model.isResource()) {
+                generateResourceModel(csarHelper, resources, parser, nodeTemplate);
             }
         } else {
             for (Group group : serviceGroups) {
@@ -206,11 +212,26 @@ public class AaiArtifactGenerator implements ArtifactGenerator {
         }
     }
 
-    private void generateResourceModel(ISdcCsarHelper csarHelper, List<Resource> resources,
-            ArtifactGeneratorToscaParser parser, NodeTemplate nodeTemplate, String nodeTypeName) {
+    private Resource getModelFor(ArtifactGeneratorToscaParser parser, NodeTemplate nodeTemplate) {
+        String nodeTypeName = nodeTemplate.getType();
+
         log.debug("Processing resource " + nodeTypeName + ": " + nodeTemplate.getMetaData().getValue("UUID"));
-        Model resourceModel = Model.getModelFor(nodeTypeName, nodeTemplate.getMetaData().getValue("type"));
 
+        Resource model = Model.getModelFor(nodeTypeName, nodeTemplate.getMetaData().getValue("type"));
+
+        Metadata metadata = nodeTemplate.getMetaData();
+        if (metadata != null && parser.hasAllottedResource(metadata.getAllProperties())) {
+            if (model.getWidgetType() == Type.VF) {
+                model = new Resource(Type.ALLOTTED_RESOURCE, true);
+            }
+        }
+
+        return model;
+    }
+
+    private void generateResourceModel(ISdcCsarHelper csarHelper, List<Resource> resources,
+            ArtifactGeneratorToscaParser parser, NodeTemplate nodeTemplate) {
+        Resource resourceModel = getModelFor(parser, nodeTemplate);
         Map<String, String> serviceMetadata = nodeTemplate.getMetaData().getAllProperties();
         resourceModel.populateModelIdentificationInformation(serviceMetadata);
 
index 9223f27..bbc7164 100644 (file)
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.babel.xml.generator.data;
 
 import java.util.List;
-import java.util.Map;
 
 public class GroupConfiguration {
 
@@ -29,17 +29,17 @@ public class GroupConfiguration {
      * Names of Instance Groups that will be processed (not filtered out).
      */
     private List<String> instanceGroupTypes;
-    
+
     /**
-     * Mapping from TOSCA type to Widget Model. 
+     * Mapping from TOSCA type to Widget directly.
      */
-    private Map<String, String> toscaToWidgetMappings;
+    private List<WidgetMapping> widgetMappings;
 
     public List<String> getInstanceGroupTypes() {
         return instanceGroupTypes;
     }
 
-    public Map<String, String> getToscaToWidgetMappings() {
-        return toscaToWidgetMappings;
+    public List<WidgetMapping> getWidgetMappings() {
+        return widgetMappings;
     }
 }
index 30b6c8e..9af6e8d 100644 (file)
@@ -24,15 +24,16 @@ import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.Map.Entry;
+import java.util.Optional;
 import java.util.Properties;
-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;
 
 public class WidgetConfigurationUtil {
 
     private static Properties config;
     private static List<String> instanceGroups = Collections.emptyList();
-    private static Map<String, Class<? extends Model>> typeToModel = new HashMap<>();
+    private static Map<String, Resource> typeToWidget = new HashMap<>();
 
     /*
      * Private constructor to prevent instantiation
@@ -51,36 +52,21 @@ public class WidgetConfigurationUtil {
 
     public static void setSupportedInstanceGroups(List<String> supportedInstanceGroups) {
         instanceGroups = supportedInstanceGroups;
-    }    
+    }
 
     public static boolean isSupportedInstanceGroup(String groupType) {
         return instanceGroups.contains(groupType);
     }
 
-    /**
-     * Create the mappings from TOSCA type to Widget type. The Properties store a set of TOSCA type prefix Strings.
-     * These keys take a single class name (String), which is used to map to a Widget Class in the Model.
-     * 
-     * @param map
-     *            the key/value pairs of TOSCA type and Class name
-     */
-    @SuppressWarnings("unchecked")
-    public static void setTypeMappings(Map<String, String> map) {
-        for (Entry<String, String> entry : map.entrySet()) {
-            final String toscaType = entry.getKey();
-            final String javaBean = entry.getValue();
-            final String modelClassName = Model.class.getPackage().getName() + "." + javaBean;
-            try {
-                typeToModel.put(toscaType, (Class<? extends Model>) Class.forName(modelClassName));
-            } catch (ClassNotFoundException e) {
-                throw new IllegalArgumentException(
-                        String.format("Unsupported type \"%s\" for TOSCA mapping %s: no class found for %s", //
-                                javaBean, toscaType, modelClassName));
-            }
-        }
+    public static Optional<Resource> createModelFromType(String typePrefix) {
+        return Optional.ofNullable(typeToWidget.get(typePrefix));
     }
 
-    public static Class<? extends Model> getModelFromType(String typePrefix) {
-        return typeToModel.get(typePrefix);
+    public static void setWidgetMappings(List<WidgetMapping> mappings) {
+        for (WidgetMapping mapping : mappings) {
+            Resource resource = new Resource(Widget.Type.valueOf(mapping.widget), mapping.deleteFlag);
+            resource.setIsResource(mapping.type.equalsIgnoreCase("resource"));
+            typeToWidget.put(mapping.prefix, resource);
+        }
     }
 }
@@ -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.babel.xml.generator.logging;
 
-public enum CategoryLogLevel {
-    INFO,
-    WARN,
-    DEBUG,
-    ERROR,
-    FATAL
+package org.onap.aai.babel.xml.generator.data;
+
+import java.util.Map;
+
+public class WidgetMapping {
+
+    String prefix;
+    String type = "resource"; // Default type is Resource (not Widget)
+    String widget;
+    boolean deleteFlag;
+    Map<String, Object> properties;
 }
diff --git a/src/main/java/org/onap/aai/babel/xml/generator/model/AllotedResource.java b/src/main/java/org/onap/aai/babel/xml/generator/model/AllotedResource.java
deleted file mode 100644 (file)
index cecf7bd..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.Cardinality;
-import org.onap.aai.babel.xml.generator.types.Model;
-
-@Model(widget = Widget.Type.ALLOTTED_RESOURCE, cardinality = Cardinality.UNBOUNDED, dataDeleteFlag = true)
-public class AllotedResource extends Resource {
-}
diff --git a/src/main/java/org/onap/aai/babel/xml/generator/model/CR.java b/src/main/java/org/onap/aai/babel/xml/generator/model/CR.java
deleted file mode 100644 (file)
index 2c50a0f..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.Cardinality;
-import org.onap.aai.babel.xml.generator.types.Model;
-
-@Model(widget = Widget.Type.CR, cardinality = Cardinality.UNBOUNDED, dataDeleteFlag = true)
-public class CR extends Resource {
-}
\ No newline at end of file
diff --git a/src/main/java/org/onap/aai/babel/xml/generator/model/Configuration.java b/src/main/java/org/onap/aai/babel/xml/generator/model/Configuration.java
deleted file mode 100644 (file)
index 20dbea9..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.Cardinality;
-import org.onap.aai.babel.xml.generator.types.Model;
-
-@Model(widget = Widget.Type.CONFIGURATION, cardinality = Cardinality.UNBOUNDED, dataDeleteFlag = true)
-public class Configuration extends Resource {
-}
diff --git a/src/main/java/org/onap/aai/babel/xml/generator/model/InstanceGroup.java b/src/main/java/org/onap/aai/babel/xml/generator/model/InstanceGroup.java
deleted file mode 100644 (file)
index f312064..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.Cardinality;
-import org.onap.aai.babel.xml.generator.types.Model;
-
-@Model(widget = Widget.Type.INSTANCE_GROUP, cardinality = Cardinality.UNBOUNDED, dataDeleteFlag = true)
-public class InstanceGroup extends Resource {
-}
diff --git a/src/main/java/org/onap/aai/babel/xml/generator/model/L3Network.java b/src/main/java/org/onap/aai/babel/xml/generator/model/L3Network.java
deleted file mode 100644 (file)
index 105c3a1..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.Cardinality;
-
-@org.onap.aai.babel.xml.generator.types.Model(widget = Widget.Type.L3_NET, cardinality = Cardinality.UNBOUNDED,
-        dataDeleteFlag = false)
-public class L3Network extends Resource {
-}
index 0e2b8d5..d4da6df 100644 (file)
@@ -27,20 +27,15 @@ import java.util.Iterator;
 import java.util.Map;
 import java.util.Optional;
 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.data.WidgetConfigurationUtil;
 import org.onap.aai.babel.xml.generator.error.IllegalAccessException;
-import org.onap.aai.babel.xml.generator.types.Cardinality;
+import org.onap.aai.babel.xml.generator.model.Widget.Type;
 import org.onap.aai.babel.xml.generator.types.ModelType;
-import org.onap.aai.cl.api.Logger;
 
 public abstract class Model {
 
     public static final String GENERATOR_AAI_ERROR_UNSUPPORTED_WIDGET_OPERATION = "Operation Not Supported for Widgets";
 
-    private static Logger log = LogHelper.INSTANCE;
-
     private enum ModelIdentification {
         ID("vfModuleModelInvariantUUID", "serviceInvariantUUID", "resourceInvariantUUID", "invariantUUID",
                 "providing_service_invariant_uuid") {
@@ -117,37 +112,28 @@ public abstract class Model {
      * Gets the object (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 Model getModelFor(String toscaType) {
-        Model model = null;
+    public static Resource getModelFor(String toscaType) {
+        Resource resource = null;
         if (toscaType != null && !toscaType.isEmpty()) {
-            model = getModelFromType(toscaType).orElseGet(() -> Model.getModelFromPrefix(toscaType));
+            resource = getModelFromType(toscaType).orElseGet(() -> Model.getModelFromPrefix(toscaType));
         }
-        return model;
+        return resource;
     }
 
-    private static Model getModelFromPrefix(String toscaType) {
-        Model model = null;
+    private static Resource getModelFromPrefix(String toscaType) {
+        Resource resource = null;
         int lastSeparator = toscaType.lastIndexOf('.');
         if (lastSeparator != -1) {
-            model = getModelFor(toscaType.substring(0, lastSeparator));
+            resource = getModelFor(toscaType.substring(0, lastSeparator));
         }
-        return model;
+        return resource;
     }
 
-    private static Optional<Model> getModelFromType(String typePrefix) {
-        Optional<Model> modelToBeReturned = Optional.empty();
-        Class<? extends Model> clazz = WidgetConfigurationUtil.getModelFromType(typePrefix);
-        if (clazz != null) {
-            try {
-                modelToBeReturned = Optional.ofNullable(clazz.getConstructor().newInstance());
-            } catch (Exception e) {
-                log.error(ApplicationMsgs.INVALID_CSAR_FILE, e);
-            }
-        }
-        return modelToBeReturned;
+    private static Optional<Resource> getModelFromType(String typePrefix) {
+        return WidgetConfigurationUtil.createModelFromType(typePrefix);
     }
 
     /**
@@ -155,16 +141,16 @@ 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 Model getModelFor(String toscaType, String metaDataType) {
+    public static Resource getModelFor(String toscaType, String metaDataType) {
         if ("Configuration".equals(metaDataType)) {
-            return new Configuration();
+            return new Resource(Type.CONFIGURATION, true);
         } else if ("CR".equals(metaDataType)) {
-            return new CR();
+            return new Resource(Type.CR, true);
         } else {
             return getModelFor(toscaType);
         }
@@ -176,16 +162,9 @@ public abstract class Model {
 
     public abstract Widget.Type getWidgetType();
 
-    /**
-     * Gets cardinality.
-     *
-     * @return the cardinality
-     */
-    public Cardinality getCardinality() {
-        org.onap.aai.babel.xml.generator.types.Model model =
-                this.getClass().getAnnotation(org.onap.aai.babel.xml.generator.types.Model.class);
-        return model.cardinality();
-    }
+    public abstract Map<String, Object> getProperties();
+
+    public abstract boolean isResource();
 
     /**
      * Gets delete flag.
@@ -263,7 +242,7 @@ public abstract class Model {
      * 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();
diff --git a/src/main/java/org/onap/aai/babel/xml/generator/model/ProvidingService.java b/src/main/java/org/onap/aai/babel/xml/generator/model/ProvidingService.java
deleted file mode 100644 (file)
index e25274e..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.Cardinality;
-
-@org.onap.aai.babel.xml.generator.types.Model(widget = Widget.Type.ALLOTTED_RESOURCE,
-        cardinality = Cardinality.UNBOUNDED, dataDeleteFlag = false)
-public class ProvidingService extends Resource {
-}
index 1b64907..121bc19 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.
  */
 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;
+
 public class Resource extends Model {
 
+    private Type type;
+    private boolean deleteFlag;
+    private boolean isResource = true;     
+    private Map<String, Object> properties = Collections.emptyMap();
+
+    Widget vserver = null;
+    boolean addlintf = false;
+    boolean addvolume = false;
+    List<String> members;
+
+    public Resource(Type type, boolean deleteFlag) {
+        this.type = type;
+        this.deleteFlag = deleteFlag;
+    }
+
     @Override
     public int hashCode() {
         final String uuid = getModelNameVersionId();
@@ -36,20 +56,109 @@ public class Resource extends Model {
         return false;
     }
 
+    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;
+    }
+
+    @Override
+    public boolean isResource() {
+        return isResource;
+    }
+
+    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
+     */
     @Override
     public boolean addWidget(Widget widget) {
-        return widgets.add(widget);
+        if (type == Type.VFMODULE) {
+            if (widget.memberOf(members)) {
+                if (vserver == null && widget.getId().equals(new VServerWidget().getId())) {
+                    addVserverWidget(widget);
+                } else if (widget.getId().equals(new LIntfWidget().getId())) {
+                    return addLIntfWidget(widget);
+                } else if (widget.getId().equals(new VolumeWidget().getId())) {
+                    addVolumeWidget(widget);
+                    return true;
+                }
+                if (widget.getId().equals(new OamNetwork().getId())) {
+                    return false;
+                }
+                return widgets.add(widget);
+            }
+            return false;
+        } else {
+            return widgets.add(widget);
+        }
     }
 
-    @Override
-    public Widget.Type getWidgetType() {
-        org.onap.aai.babel.xml.generator.types.Model model =
-                this.getClass().getAnnotation(org.onap.aai.babel.xml.generator.types.Model.class);
-        return model.widget();
+    public Type getWidgetType() {
+        return type;
+    }
+
+    private void addVolumeWidget(Widget widget) {
+        if (vserver != null) {
+            vserver.addWidget(widget);
+        } else {
+            addvolume = true;
+        }
     }
+
+    /**
+     * @param widget
+     * @return
+     */
+    private boolean addLIntfWidget(Widget widget) {
+        if (vserver != null) {
+            vserver.addWidget(widget);
+            return true;
+        } else {
+            addlintf = true;
+            return false;
+        }
+    }
+
+    private void addVserverWidget(Widget widget) {
+        vserver = widget;
+        if (addlintf) {
+            vserver.addWidget(new LIntfWidget());
+        }
+        if (addvolume) {
+            vserver.addWidget(new VolumeWidget());
+        }
+    }
+
 }
index 9d22e41..0815a61 100644 (file)
@@ -20,6 +20,8 @@
  */
 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;
 
 @org.onap.aai.babel.xml.generator.types.Model(widget = Widget.Type.SERVICE, cardinality = Cardinality.UNBOUNDED,
@@ -40,4 +42,14 @@ public class Service extends Model {
     public Widget.Type getWidgetType() {
         return null;
     }
+    
+    @Override
+    public Map<String, Object> getProperties() {
+        return Collections.emptyMap();
+    }
+
+    @Override
+    public boolean isResource() {
+        return false;
+    }
 }
diff --git a/src/main/java/org/onap/aai/babel/xml/generator/model/VfModule.java b/src/main/java/org/onap/aai/babel/xml/generator/model/VfModule.java
deleted file mode 100644 (file)
index d6d3a2d..0000000
+++ /dev/null
@@ -1,109 +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 java.util.List;
-import org.onap.aai.babel.xml.generator.types.Cardinality;
-import org.onap.aai.babel.xml.generator.types.Model;
-
-@Model(widget = Widget.Type.VFMODULE, cardinality = Cardinality.UNBOUNDED, dataDeleteFlag = true)
-public class VfModule extends Resource {
-
-    Widget vserver = null;
-    boolean addlintf = false;
-    boolean addvolume = false;
-
-    List<String> members;
-
-    public void setMembers(List<String> members) {
-        this.members = members;
-    }
-
-    /**
-     * Adds a Widget.
-     *
-     * @param widget the widget
-     * @return the boolean
-     */
-    @Override
-    public boolean addWidget(Widget widget) {
-        if (widget.memberOf(members)) {
-            if (vserver == null && widget.getId().equals(new VServerWidget().getId())) {
-                addVserverWidget(widget);
-            } else if (widget.getId().equals(new LIntfWidget().getId())) {
-                return addLIntfWidget(widget);
-            } else if (widget.getId().equals(new VolumeWidget().getId())) {
-                addVolumeWidget(widget);
-                return true;
-            }
-            if (widget.getId().equals(new OamNetwork().getId())) {
-                return false;
-            }
-            return widgets.add(widget);
-        }
-        return false;
-    }
-
-    private void addVolumeWidget(Widget widget) {
-        if (vserver != null) {
-            vserver.addWidget(widget);
-        } else {
-            addvolume = true;
-        }
-    }
-
-    /**
-     * @param widget
-     * @return
-     */
-    private boolean addLIntfWidget(Widget widget) {
-        if (vserver != null) {
-            vserver.addWidget(widget);
-            return true;
-        } else {
-            addlintf = true;
-            return false;
-        }
-    }
-
-    private void addVserverWidget(Widget widget) {
-        vserver = widget;
-        if (addlintf) {
-            vserver.addWidget(new LIntfWidget());
-        }
-        if (addvolume) {
-            vserver.addWidget(new VolumeWidget());
-        }
-    }
-
-    @Override
-    public int hashCode() {
-        return getModelNameVersionId().hashCode();
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (obj instanceof Resource) {
-            return getModelNameVersionId().equals(((Resource) obj).getModelNameVersionId());
-        }
-        return false;
-    }
-}
diff --git a/src/main/java/org/onap/aai/babel/xml/generator/model/VirtualFunction.java b/src/main/java/org/onap/aai/babel/xml/generator/model/VirtualFunction.java
deleted file mode 100644 (file)
index be75d65..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.Cardinality;
-import org.onap.aai.babel.xml.generator.types.Model;
-
-@Model(widget = Widget.Type.VF, cardinality = Cardinality.UNBOUNDED, dataDeleteFlag = true)
-public class VirtualFunction extends Resource {
-}
index 963d9e2..11a9612 100644 (file)
@@ -25,6 +25,7 @@ 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;
@@ -42,24 +43,7 @@ public abstract class Widget extends Model {
             "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;
+        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 static Logger log = LogHelper.INSTANCE;
@@ -91,7 +75,8 @@ public abstract class Widget extends Model {
     /**
      * Gets widget.
      *
-     * @param type the type
+     * @param type
+     *            the type
      * @return the widget
      */
     public static Widget getWidget(Type type) {
@@ -108,8 +93,14 @@ public abstract class Widget extends Model {
         return widget;
     }
 
+    @Override
+    public boolean isResource() {
+        return false;
+    }
+
     public String getId() {
-        String id = WidgetConfigurationUtil.getConfig().getProperty(ArtifactType.AAI.name() + ".model-version-id." + getName());
+        String id = WidgetConfigurationUtil.getConfig()
+                .getProperty(ArtifactType.AAI.name() + ".model-version-id." + getName());
         if (id == null) {
             throw new IllegalArgumentException(String.format(GENERATOR_AAI_CONFIGLPROP_NOT_FOUND,
                     ArtifactType.AAI.name() + ".model-version-id." + getName()));
@@ -156,7 +147,8 @@ public abstract class Widget extends Model {
     /**
      * Equals method that compares Widget IDs.
      *
-     * @param obj the Widget object to compare
+     * @param obj
+     *            the Widget object to compare
      * @return whether or not obj is equal to this Widget
      */
     @Override
@@ -179,7 +171,8 @@ public abstract class Widget extends Model {
     /**
      * Determine whether one or more keys belonging to this Widget appear in the specified Collection.
      *
-     * @param keys the keys
+     * @param keys
+     *            the keys
      * @return the boolean
      */
     public boolean memberOf(Collection<String> keys) {
@@ -198,4 +191,9 @@ public abstract class Widget extends Model {
     public boolean addWidget(Widget widget) {
         return true;
     }
+
+    @Override
+    public Map<String, Object> getProperties() {
+        return Collections.emptyMap();
+    }
 }
index 52dd462..d7519c0 100644 (file)
@@ -32,9 +32,8 @@ import java.util.List;
 import org.junit.Test;
 import org.mockito.Mockito;
 import org.onap.aai.babel.xml.generator.data.WidgetConfigurationUtil;
-import org.onap.aai.babel.xml.generator.model.AllotedResource;
-import org.onap.aai.babel.xml.generator.model.InstanceGroup;
 import org.onap.aai.babel.xml.generator.model.Resource;
+import org.onap.aai.babel.xml.generator.model.Widget.Type;
 import org.onap.sdc.tosca.parser.api.ISdcCsarHelper;
 import org.onap.sdc.toscaparser.api.Group;
 import org.onap.sdc.toscaparser.api.NodeTemplate;
@@ -55,7 +54,8 @@ public class TestArtifactGeneratorToscaParser {
     @Test(expected = IllegalArgumentException.class)
     public void testMissingProvidingService() {
         List<NodeTemplate> nodeTemplateList = Collections.singletonList(buildNodeTemplate("name", "BlockStorage"));
-        new ArtifactGeneratorToscaParser(null).processResourceModels(new AllotedResource(), nodeTemplateList);
+        new ArtifactGeneratorToscaParser(null).processResourceModels(new Resource(Type.ALLOTTED_RESOURCE, true),
+                nodeTemplateList);
     }
 
     /**
@@ -65,7 +65,8 @@ public class TestArtifactGeneratorToscaParser {
     @Test(expected = IllegalArgumentException.class)
     public void testAddResourceNotProvidingService() {
         List<NodeTemplate> nodeTemplateList = Collections.singletonList(buildNodeTemplate("testCR", "CR"));
-        final Resource dummyResource = new AllotedResource(); // Any Resource to which the CR can be added
+        // Create any Resource to which the CR can be added
+        final Resource dummyResource = new Resource(Type.ALLOTTED_RESOURCE, true);
         new ArtifactGeneratorToscaParser(null).processResourceModels(dummyResource, nodeTemplateList);
     }
 
@@ -90,7 +91,8 @@ public class TestArtifactGeneratorToscaParser {
         Mockito.when(helper.getGroupsOfOriginOfNodeTemplate(serviceNodeTemplate)).thenReturn(groups);
 
         ArtifactGeneratorToscaParser parser = new ArtifactGeneratorToscaParser(helper);
-        List<Resource> resources = parser.processInstanceGroups(new InstanceGroup(), serviceNodeTemplate);
+        List<Resource> resources =
+                parser.processInstanceGroups(new Resource(Type.INSTANCE_GROUP, true), serviceNodeTemplate);
 
         assertThat(resources.size(), is(1));
         Resource resource = resources.get(0);
@@ -102,9 +104,9 @@ public class TestArtifactGeneratorToscaParser {
      * sdc-tosca parser.
      *
      * @param name
-     *            name of the NodeTemplate
+     *     name of the NodeTemplate
      * @param type
-     *            type of the NodeTemplate
+     *     type of the NodeTemplate
      * @return a new NodeTemplate object
      */
     private NodeTemplate buildNodeTemplate(String name, String type) {
index 912a505..3d5e841 100644 (file)
 
 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;
 
 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.Test;
 import org.onap.aai.babel.parser.ArtifactGeneratorToscaParser;
@@ -43,7 +44,8 @@ import org.onap.aai.babel.xml.generator.types.ModelType;
 public class TestModel {
 
     private Service serviceModel = new Service();
-    private List<Resource> resourceModels = Arrays.asList(new VirtualFunction(), new InstanceGroup());
+    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;
 
@@ -56,7 +58,7 @@ public class TestModel {
      * from the Artifact Generator properties.
      *
      * @throws IOException
-     *             if the Artifact Generator properties file is not loaded
+     *     if the Artifact Generator properties file is not loaded
      */
     @Before
     public void setup() throws IOException {
@@ -81,6 +83,16 @@ public class TestModel {
             public Type getWidgetType() {
                 return null;
             }
+
+            @Override
+            public Map<String, Object> getProperties() {
+                return Collections.emptyMap();
+            }
+
+            @Override
+            public boolean isResource() {
+                return false;
+            }
         };
     }
 
@@ -90,34 +102,47 @@ public class TestModel {
         assertThat(Model.getModelFor(""), is(nullValue()));
         assertThat(Model.getModelFor("any.unknown.type"), is(nullValue()));
 
-        assertThat(Model.getModelFor("org.openecomp.resource.vf.allottedResource"), instanceOf(AllotedResource.class));
-        assertThat(Model.getModelFor("org.openecomp.resource.vf.allottedResource.with.sub.type"),
-                instanceOf(AllotedResource.class));
-        assertThat(Model.getModelFor("org.openecomp.resource.vfc.AllottedResource"),
-                instanceOf(ProvidingService.class));
-        assertThat(Model.getModelFor("org.openecomp.resource.vfc"), instanceOf(VServerWidget.class));
-        assertThat(Model.getModelFor("org.openecomp.resource.cp"), instanceOf(LIntfWidget.class));
-        assertThat(Model.getModelFor("org.openecomp.cp"), instanceOf(LIntfWidget.class));
-        assertThat(Model.getModelFor("org.openecomp.cp.some.suffix"), instanceOf(LIntfWidget.class));
-        assertThat(Model.getModelFor("org.openecomp.resource.vl"), instanceOf(L3Network.class));
-        assertThat(Model.getModelFor("org.openecomp.resource.vf"), instanceOf(VirtualFunction.class));
-        assertThat(Model.getModelFor("org.openecomp.groups.vfmodule"), instanceOf(VfModule.class));
-        assertThat(Model.getModelFor("org.openecomp.groups.VfModule"), instanceOf(VfModule.class));
-        assertThat(Model.getModelFor("org.openecomp.resource.vfc.nodes.heat.cinder"), instanceOf(VolumeWidget.class));
-        assertThat(Model.getModelFor("org.openecomp.nodes.PortMirroringConfiguration"),
-                instanceOf(Configuration.class));
-        assertThat(Model.getModelFor("org.openecomp.nodes.PortMirroringConfiguration", "Configuration"),
-                instanceOf(Configuration.class));
-        assertThat(Model.getModelFor("any.string", "Configuration"), instanceOf(Configuration.class));
-        assertThat(Model.getModelFor("org.openecomp.resource.cr.Kk1806Cr1", "CR"), instanceOf(CR.class));
-        assertThat(Model.getModelFor("any.string", "CR"), instanceOf(CR.class));
-
-        assertThat(Model.getModelFor("org.openecomp.resource.vfc", "an.unknown.type"), instanceOf(VServerWidget.class));
+        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);
     }
 
-    @Test
-    public void testGetCardinality() {
-        resourceModels.get(0).getCardinality();
+    /**
+     * Assert that the TOSCA type String is mapped to the expected Widget Type.
+     * 
+     * @param toscaType
+     *     the TOSCA type or prefix
+     * @param widgetType
+     *     the type of Widget expected from the mappings
+     */
+    private void assertMapping(String toscaType, Type widgetType) {
+        assertThat(Model.getModelFor(toscaType).getWidgetType(), is(widgetType));
+    }
+
+    /**
+     * Assert that the TOSCA metadata type is mapped to the expected Widget Type.
+     * 
+     * @param toscaType
+     *     the name (or name prefix) of the TOSCA type
+     * @param metadataType
+     *     the type specified in the TOSCA metadata
+     * @param widgetType
+     *     the type of Widget expected from the mappings
+     */
+    private void assertMapping(String toscaType, String metadataType, Type widgetType) {
+        assertThat(Model.getModelFor(toscaType, metadataType).getWidgetType(), is(widgetType));
     }
 
     @Test
index 1a5986b..451d2bb 100644 (file)
@@ -54,25 +54,25 @@ public class TestVfModule {
      */
     @Test
     public void testHashCode() {
-        VfModule vfModule = createNewVfModule();
+        Resource vfModule = createNewVfModule();
         populateIdentInfo(vfModule);
         assertThat(vfModule.hashCode(), is(notNullValue()));
     }
-    
+
     /**
      * Call equals() method for code coverage.
      */
     @Test
     public void testEquals() {
-        VfModule vfModuleA = createNewVfModule();
-        populateIdentInfo(vfModuleA);        
+        Resource vfModuleA = createNewVfModule();
+        populateIdentInfo(vfModuleA);
 
-       // equals() is reflexive
+        // equals() is reflexive
         assertThat(vfModuleA.equals(vfModuleA), is(true));
-        
+
         // equals() is symmetric
-        VfModule vfModuleB = createNewVfModule();
-        populateIdentInfo(vfModuleB);        
+        Resource vfModuleB = createNewVfModule();
+        populateIdentInfo(vfModuleB);
         assertThat(vfModuleA.equals(vfModuleB), is(true));
         assertThat(vfModuleB.equals(vfModuleA), is(true));
 
@@ -95,7 +95,7 @@ public class TestVfModule {
      */
     @Test
     public void testNonMemberWidgetToVf() {
-        VfModule vfModule = createNewVfModule();
+        Resource vfModule = createNewVfModule();
         assertThat(vfModule.addWidget(createNewWidget(Type.SERVICE)), is(false));
         assertNumberOfWidgets(vfModule, 0);
     }
@@ -105,7 +105,7 @@ public class TestVfModule {
      */
     @Test
     public void testAddOamNetworkWidgetToVf() {
-        VfModule vfModule = createNewVfModule();
+        Resource vfModule = createNewVfModule();
         assertThat(createNewWidgetForModule(vfModule, Type.OAM_NETWORK), is(false));
         assertNumberOfWidgets(vfModule, 0);
     }
@@ -120,7 +120,7 @@ public class TestVfModule {
      */
     @Test
     public void testAddVolumeWidgetToVf() {
-        VfModule vfModule = createNewVfModule();
+        Resource vfModule = createNewVfModule();
 
         // Adding a Volume widget has no effect until a vserver widget is added.
         assertAddWidget(vfModule, Type.VOLUME);
@@ -152,7 +152,7 @@ public class TestVfModule {
      */
     @Test
     public void testAddLinterfaceWidgetToVf() {
-        VfModule vfModule = createNewVfModule();
+        Resource vfModule = createNewVfModule();
 
         // Adding an L-Interface widget has no effect until a vserver widget is added.
         assertFailToAddWidget(vfModule, Type.LINT);
@@ -185,7 +185,7 @@ public class TestVfModule {
      */
     @Test
     public void testAddVolumeAndLinterfaceWidgetToVf() {
-        VfModule vfModule = createNewVfModule();
+        Resource vfModule = createNewVfModule();
 
         // Adding a Volume widget has no effect until a vserver widget is added.
         assertAddWidget(vfModule, Type.VOLUME);
@@ -232,8 +232,8 @@ public class TestVfModule {
      *
      * @return new VF Module resource
      */
-    private VfModule createNewVfModule() {
-        VfModule vfModule = new VfModule();
+    private Resource createNewVfModule() {
+        Resource vfModule = new Resource(Type.VFMODULE, true);
         assertNumberOfWidgets(vfModule, 0);
         return vfModule;
     }
@@ -244,7 +244,7 @@ public class TestVfModule {
      * @param vfModule
      *            to be populated
      */
-    private void populateIdentInfo(VfModule vfModule) {
+    private void populateIdentInfo(Resource vfModule) {
         Map<String, String> modelIdentInfo = new HashMap<>();
         modelIdentInfo.put("UUID", "dummy_uuid");
         vfModule.populateModelIdentificationInformation(modelIdentInfo);
@@ -258,7 +258,7 @@ public class TestVfModule {
      * @param widgetType
      *            the type of Widget to create and add
      */
-    private void assertAddWidget(VfModule vfModule, Type widgetType) {
+    private void assertAddWidget(Resource vfModule, Type widgetType) {
         assertThat(createNewWidgetForModule(vfModule, widgetType), is(true));
     }
 
@@ -270,7 +270,7 @@ public class TestVfModule {
      * @param widgetType
      *            the type of Widget to create and attempt to add
      */
-    private void assertFailToAddWidget(VfModule vfModule, Type widgetType) {
+    private void assertFailToAddWidget(Resource vfModule, Type widgetType) {
         assertThat(createNewWidgetForModule(vfModule, widgetType), is(false));
     }
 
@@ -283,7 +283,7 @@ public class TestVfModule {
      *            the type of Widget to create and attempt to add
      * @return whether or not the Widget was added to the module
      */
-    private boolean createNewWidgetForModule(VfModule vfModule, Type widgetType) {
+    private boolean createNewWidgetForModule(Resource vfModule, Type widgetType) {
         Widget widget = createNewWidget(widgetType);
         setWidgetAsMember(vfModule, widget);
         return vfModule.addWidget(widget);
@@ -299,7 +299,7 @@ public class TestVfModule {
      * @param widget
      *            the widget to be set as the member
      */
-    private void setWidgetAsMember(VfModule vfModule, Widget widget) {
+    private void setWidgetAsMember(Resource vfModule, Widget widget) {
         String id = widget.getId();
         widget.addKey(id);
         vfModule.setMembers(Collections.singletonList(id));
@@ -312,7 +312,7 @@ public class TestVfModule {
      *            the VF Module to update
      * @return the number of Widgets present in the vserver on creation
      */
-    private int createVserverForVf(VfModule vfModule) {
+    private int createVserverForVf(Resource vfModule) {
         VServerWidget vserverWidget = (VServerWidget) createNewWidget(Type.VSERVER);
         assertNumberOfWidgets(vfModule, 0);
         final int initialWidgetCount = addVserverToVf(vfModule, vserverWidget);
@@ -329,7 +329,7 @@ public class TestVfModule {
      *            the Widget to add
      * @return initial widget count for the vserver Widget
      */
-    private int addVserverToVf(VfModule vfModule, VServerWidget vserverWidget) {
+    private int addVserverToVf(Resource vfModule, VServerWidget vserverWidget) {
         // A vserver (initially) has Flavor, Image, Tenant and Vfc.
         final int initialWidgetCount = 4;
         assertNumberOfWidgets(vserverWidget, initialWidgetCount);
index 9c3d0b4..0d306ea 100644 (file)
@@ -1,21 +1,53 @@
 {
-  "instanceGroupTypes": [
-    "org.openecomp.groups.NetworkCollection",
-    "org.openecomp.groups.VfcInstanceGroup",
-    "org.openecomp.groups.ResourceInstanceGroup"
-  ],
-  "toscaToWidgetMappings": {
-    "org.openecomp.resource.vf.allottedResource": "AllotedResource",
-    "org.openecomp.resource.vfc.AllottedResource": "ProvidingService",
-    "org.openecomp.resource.vfc": "VServerWidget",
-    "org.openecomp.resource.cp": "LIntfWidget",
-    "org.openecomp.cp": "LIntfWidget",
-    "org.openecomp.resource.vl": "L3Network",
-    "org.openecomp.resource.vf": "VirtualFunction",
-    "org.openecomp.groups.vfmodule": "VfModule",
-    "org.openecomp.groups.VfModule": "VfModule",
-    "org.openecomp.resource.vfc.nodes.heat.cinder": "VolumeWidget",
-    "org.openecomp.nodes.PortMirroringConfiguration": "Configuration",
-    "org.openecomp.resource.cr.Kk1806Cr1": "CR"
-  }
+       "instanceGroupTypes": [
+               "org.openecomp.groups.NetworkCollection",
+               "org.openecomp.groups.VfcInstanceGroup",
+               "org.openecomp.groups.ResourceInstanceGroup"
+       ],
+       "widgetMappings": [
+               {
+                       "prefix": "org.openecomp.resource.vfc",
+                       "type": "widget",
+                       "widget": "VSERVER",
+                       "deleteFlag": true
+               },
+               {
+                       "prefix": "org.openecomp.resource.cp",
+                       "type": "widget",
+                       "widget": "LINT",
+                       "deleteFlag": true
+               },
+               {
+                       "prefix": "org.openecomp.cp",
+                       "type": "widget",
+                       "widget": "LINT",
+                       "deleteFlag": true
+               },
+               {
+                       "prefix": "org.openecomp.resource.vl",
+                       "widget": "L3_NET",
+                       "deleteFlag": false
+               },
+               {
+                       "prefix": "org.openecomp.resource.vf",
+                       "widget": "VF",
+                       "deleteFlag": true
+               },
+               {
+                       "prefix": "org.openecomp.groups.vfmodule",
+                       "widget": "VFMODULE",
+                       "deleteFlag": true
+               },
+               {
+                       "prefix": "org.openecomp.groups.VfModule",
+                       "widget": "VFMODULE",
+                       "deleteFlag": true
+               },
+               {
+                       "prefix": "org.openecomp.resource.vfc.nodes.heat.cinder",
+                       "type": "widget",
+                       "widget": "VOLUME",
+                       "deleteFlag": true
+               }
+       ]
 }