You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@atlas.apache.org by da...@apache.org on 2018/02/16 09:52:43 UTC

[27/30] atlas git commit: ATLAS-2246: OMRS Connector API plus REST and IGC Connector skeleton - 15th February 2018

http://git-wip-us.apache.org/repos/asf/atlas/blob/8a57e657/omrs/src/main/java/org/apache/atlas/omrs/archivemanager/opentypes/OpenMetadataTypesArchive.java
----------------------------------------------------------------------
diff --git a/omrs/src/main/java/org/apache/atlas/omrs/archivemanager/opentypes/OpenMetadataTypesArchive.java b/omrs/src/main/java/org/apache/atlas/omrs/archivemanager/opentypes/OpenMetadataTypesArchive.java
new file mode 100644
index 0000000..b8aa172
--- /dev/null
+++ b/omrs/src/main/java/org/apache/atlas/omrs/archivemanager/opentypes/OpenMetadataTypesArchive.java
@@ -0,0 +1,5657 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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
+ * <p/>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p/>
+ * 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.
+ */
+
+package org.apache.atlas.omrs.archivemanager.opentypes;
+
+
+import org.apache.atlas.omrs.archivemanager.OMRSArchiveBuilder;
+import org.apache.atlas.omrs.archivemanager.properties.OpenMetadataArchive;
+import org.apache.atlas.omrs.archivemanager.properties.OpenMetadataArchiveType;
+import org.apache.atlas.omrs.ffdc.OMRSErrorCode;
+import org.apache.atlas.omrs.ffdc.exception.OMRSLogicErrorException;
+import org.apache.atlas.omrs.metadatacollection.properties.instances.InstanceStatus;
+import org.apache.atlas.omrs.metadatacollection.properties.typedefs.*;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.Map;
+
+/**
+ * OpenMetadataTypesArchive builds an open metadata archive containing all of the standard open metadata types.
+ * These types have hardcoded dates and guids so that however many times this archive is rebuilt, it will
+ * produce the same content.
+ * <p>
+ *     Details of the open metadata types are documented on the wiki:
+ *     <a href="https://cwiki.apache.org/confluence/display/ATLAS/Building+out+the+Open+Metadata+Typesystem">Building out the Open Metadata Typesystem</a>
+ * </p>
+ * <p>
+ *     There are 8 areas, each covering a different topic area of metadata.  The module breaks down the process of creating
+ *     the models into the areas and then the individual models to simplify the maintenance of this class
+ * </p>
+ */
+public class OpenMetadataTypesArchive
+{
+    /*
+     * This is the header information for the archive.
+     */
+    private static final  String                  archiveGUID        = "bce3b0a0-662a-4f87-b8dc-844078a11a6e";
+    private static final  String                  archiveName        = "Open Metadata Types";
+    private static final  String                  archiveDescription = "Standard types for open metadata repositories.";
+    private static final  OpenMetadataArchiveType archiveType        = OpenMetadataArchiveType.CONTENT_PACK;
+    private static final  String                  originatorName     = "Apache Atlas (OMRS)";
+    private static final  Date                    creationDate       = new Date(1516313040008L);
+
+    /*
+     * Specific values for initializing TypeDefs
+     */
+    private static final  long                    versionNumber      = 1L;
+    private static final  String                  versionName        = "1.0";
+
+
+
+    private OMRSArchiveBuilder      archiveBuilder;
+
+
+    /**
+     * Default constructor sets up the archive builder.  This in turn sets up the header for the archive.
+     */
+    public OpenMetadataTypesArchive()
+    {
+        OMRSArchiveBuilder      newArchiveBuilder = new OMRSArchiveBuilder(archiveGUID,
+                                                                           archiveName,
+                                                                           archiveDescription,
+                                                                           archiveType,
+                                                                           originatorName,
+                                                                           creationDate,
+                                                                           null);
+        this.archiveBuilder = newArchiveBuilder;
+    }
+
+
+    /**
+     * Return the unique identifier for this archive.
+     *
+     * @return String guid
+     */
+    public String getArchiveGUID()
+    {
+        return archiveGUID;
+    }
+
+    /**
+     * Returns the open metadata type archive containing all of the standard open metadata types.
+     *
+     * @return populated open metadata archive object
+     */
+    public OpenMetadataArchive getOpenMetadataArchive()
+    {
+        final String methodName = "getOpenMetadataArchive()";
+
+        if (this.archiveBuilder != null)
+        {
+            /*
+             * Call each of the methods to systematically add the contents of the archive.
+             */
+            this.addStandardPrimitiveDefs();
+            this.addArea0Types();
+            this.addArea1Types();
+            this.addArea2Types();
+            this.addArea3Types();
+            this.addArea4Types();
+            this.addArea5Types();
+            this.addArea6Types();
+            this.addArea7Types();
+
+            /*
+             * The completed archive is ready to be packaged up and returned
+             */
+            return this.archiveBuilder.getOpenMetadataArchive();
+        }
+        else
+        {
+            /*
+             * This is a logic error since it means the creation of the archive builder threw an exception
+             * in the constructor and so this object should not be used.
+             */
+            OMRSErrorCode errorCode = OMRSErrorCode.ARCHIVE_UNAVAILABLE;
+            String errorMessage = errorCode.getErrorMessageId() + errorCode.getFormattedErrorMessage();
+
+            throw new OMRSLogicErrorException(errorCode.getHTTPErrorCode(),
+                                              this.getClass().getName(),
+                                              methodName,
+                                              errorMessage,
+                                              errorCode.getSystemAction(),
+                                              errorCode.getUserAction());
+        }
+    }
+
+
+    /*
+     * ========================================
+     * Attribute types
+     */
+
+
+    /**
+     * Add the standard primitive types to the archive builder.
+     */
+    private void addStandardPrimitiveDefs()
+    {
+        this.archiveBuilder.addPrimitiveDef(getPrimitiveDef(PrimitiveDefCategory.OM_PRIMITIVE_TYPE_BOOLEAN));
+        this.archiveBuilder.addPrimitiveDef(getPrimitiveDef(PrimitiveDefCategory.OM_PRIMITIVE_TYPE_BYTE));
+        this.archiveBuilder.addPrimitiveDef(getPrimitiveDef(PrimitiveDefCategory.OM_PRIMITIVE_TYPE_CHAR));
+        this.archiveBuilder.addPrimitiveDef(getPrimitiveDef(PrimitiveDefCategory.OM_PRIMITIVE_TYPE_SHORT));
+        this.archiveBuilder.addPrimitiveDef(getPrimitiveDef(PrimitiveDefCategory.OM_PRIMITIVE_TYPE_INT));
+        this.archiveBuilder.addPrimitiveDef(getPrimitiveDef(PrimitiveDefCategory.OM_PRIMITIVE_TYPE_LONG));
+        this.archiveBuilder.addPrimitiveDef(getPrimitiveDef(PrimitiveDefCategory.OM_PRIMITIVE_TYPE_FLOAT));
+        this.archiveBuilder.addPrimitiveDef(getPrimitiveDef(PrimitiveDefCategory.OM_PRIMITIVE_TYPE_DOUBLE));
+        this.archiveBuilder.addPrimitiveDef(getPrimitiveDef(PrimitiveDefCategory.OM_PRIMITIVE_TYPE_BIGINTEGER));
+        this.archiveBuilder.addPrimitiveDef(getPrimitiveDef(PrimitiveDefCategory.OM_PRIMITIVE_TYPE_BIGDECIMAL));
+        this.archiveBuilder.addPrimitiveDef(getPrimitiveDef(PrimitiveDefCategory.OM_PRIMITIVE_TYPE_STRING));
+        this.archiveBuilder.addPrimitiveDef(getPrimitiveDef(PrimitiveDefCategory.OM_PRIMITIVE_TYPE_DATE));
+    }
+
+
+    /**
+     * Set up an individual primitive definition
+     *
+     * @param primitiveDefCategory - category of the primitive def defines the unique
+     *                             information about this primitive type.
+     * @return initialized PrimitiveDef object ready for the archive
+     */
+    private PrimitiveDef getPrimitiveDef(PrimitiveDefCategory primitiveDefCategory)
+    {
+        PrimitiveDef  primitiveDef = new PrimitiveDef(primitiveDefCategory);
+
+        primitiveDef.setGUID(primitiveDefCategory.getGUID());
+        primitiveDef.setName(primitiveDefCategory.getName());
+
+        return primitiveDef;
+    }
+
+
+    /**
+     * Create a CollectionDef.  A new CollectionDef is required for each combination of primitive types
+     * used to initialize the collection.  Each CollectionDef has its own unique identifier (guid) and
+     * its name is a combination of the collection type and the primitives use to initialize it.
+     *
+     * @param guid - unique identifier for the CollectionDef
+     * @param name - unique name for the CollectionDef
+     * @param collectionDefCategory - category of the collection.
+     * @return Filled out CollectionDef
+     */
+    private CollectionDef getCollectionDef(String                guid,
+                                           String                name,
+                                           CollectionDefCategory collectionDefCategory)
+    {
+        CollectionDef   collectionDef = new CollectionDef(collectionDefCategory);
+
+        collectionDef.setGUID(guid);
+        collectionDef.setName(name);
+
+        return collectionDef;
+    }
+
+
+    /**
+     * Create an EnumDef that has no valid values defined.  These are added by the caller.
+     *
+     * @param guid - unique identifier for the CollectionDef
+     * @param name - unique name for the CollectionDef
+     * @param description - short default description of the enum type
+     * @param descriptionGUID - guid of the glossary term describing this enum type
+     * @return basic EnumDef without valid values
+     */
+    private EnumDef getEmptyEnumDef(String                guid,
+                                    String                name,
+                                    String                description,
+                                    String                descriptionGUID)
+    {
+        EnumDef  enumDef = new EnumDef();
+
+        enumDef.setGUID(guid);
+        enumDef.setName(name);
+        enumDef.setDescription(description);
+        enumDef.setDescriptionGUID(descriptionGUID);
+        enumDef.setDefaultValue(null);
+
+        return enumDef;
+    }
+
+
+    /**
+     * Create an EnumElementDef that carries one of the valid values for an Enum.
+     *
+     * @param ordinal - code number
+     * @param value - name
+     * @param description - short description
+     * @param descriptionGUID - guid of the glossary term describing this enum element
+     * @return Fully filled out EnumElementDef
+     */
+    private EnumElementDef  getEnumElementDef(int     ordinal,
+                                              String  value,
+                                              String  description,
+                                              String  descriptionGUID)
+    {
+        EnumElementDef   enumElementDef = new EnumElementDef();
+
+        enumElementDef.setOrdinal(ordinal);
+        enumElementDef.setValue(value);
+        enumElementDef.setDescription(description);
+        enumElementDef.setDescriptionGUID(descriptionGUID);
+
+        return enumElementDef;
+    }
+
+
+    /**
+     * Sets up a default EntityDef.  Calling methods can override the default values.  This EntityDef
+     * has no attribute defined.
+     *
+     * @param guid - unique identifier for the entity
+     * @param name - name of the entity
+     * @param superType - Super type for this entity (null for top-level)
+     * @param description - short description of the entity
+     * @param descriptionGUID - guid of the glossary term describing this entity type
+     * @return Initialized EntityDef
+     */
+    EntityDef  getDefaultEntityDef(String                  guid,
+                                   String                  name,
+                                   TypeDefLink             superType,
+                                   String                  description,
+                                   String                  descriptionGUID)
+    {
+        EntityDef entityDef = new EntityDef();
+
+        /*
+         * Set up the parameters supplied by the caller.
+         */
+        entityDef.setGUID(guid);
+        entityDef.setName(name);
+        entityDef.setSuperType(superType);
+        entityDef.setDescription(description);
+        entityDef.setDescriptionGUID(descriptionGUID);
+
+        /*
+         * Set up the defaults
+         */
+        entityDef.setOrigin(archiveGUID);
+        entityDef.setCreatedBy(originatorName);
+        entityDef.setCreateTime(creationDate);
+        entityDef.setVersion(versionNumber);
+        entityDef.setVersionName(versionName);
+
+        /*
+         * Set default valid instance statuses
+         */
+        ArrayList<InstanceStatus>    validInstanceStatusList  = new ArrayList<>();
+        validInstanceStatusList.add(InstanceStatus.ACTIVE);
+        validInstanceStatusList.add(InstanceStatus.DELETED);
+        entityDef.setValidInstanceStatusList(validInstanceStatusList);
+
+        return entityDef;
+    }
+
+
+    /**
+     * Return an attribute with the supplied name and description that is of type String.  It is set up to be optional,
+     * indexable (useful for searches) but the value does not need to be unique.
+     * These are the typical values used for most open metadata attribute.
+     * They can be changed by the caller once the TypeDefAttribute is returned.
+     *
+     * @param attributeName - name of the attribute
+     * @param attributeDescription - short description for the attribute
+     * @param attributeDescriptionGUID - guid of the glossary term that describes this attribute.
+     * @return Optional TypeDefAttribute of type string
+     */
+    TypeDefAttribute  getStringTypeDefAttribute(String      attributeName,
+                                                String      attributeDescription,
+                                                String      attributeDescriptionGUID)
+    {
+        TypeDefAttribute     attribute = new TypeDefAttribute();
+
+        attribute.setAttributeName(attributeName);
+        attribute.setAttributeDescription(attributeDescription);
+        attribute.setAttributeDescriptionGUID(attributeDescriptionGUID);
+        attribute.setAttributeType(getPrimitiveDef(PrimitiveDefCategory.OM_PRIMITIVE_TYPE_STRING));
+        attribute.setAttributeCardinality(AttributeCardinality.AT_MOST_ONE);
+        attribute.setValuesMinCount(0);
+        attribute.setValuesMaxCount(1);
+        attribute.setIndexable(true);
+        attribute.setUnique(false);
+        attribute.setDefaultValue(null);
+        attribute.setExternalStandardMappings(null);
+
+        return attribute;
+    }
+
+
+    /**
+     * Returns a basic RelationshipDef without any attributes or ends set up.
+     * The caller is responsible for adding the attributes and ends definition.
+     *
+     * @param guid - unique identifier for the relationship
+     * @param name - name of the relationship
+     * @param superType - Super type for this relationship (null for top-level)
+     * @param description - short default description of the relationship
+     * @param descriptionGUID - guid of the glossary term that describes this relationship
+     * @param relationshipCategory - is this an association, aggregation or composition?
+     * @param propagationRule - should classifications propagate over this relationship?
+     * @return RelationshipDef with no ends defined.
+     */
+    private RelationshipDef getBasicRelationshipDef(String                        guid,
+                                                    String                        name,
+                                                    TypeDefLink                   superType,
+                                                    String                        description,
+                                                    String                        descriptionGUID,
+                                                    RelationshipCategory          relationshipCategory,
+                                                    ClassificationPropagationRule propagationRule)
+    {
+        RelationshipDef relationshipDef = new RelationshipDef();
+
+        /*
+         * Set up the parameters supplied by the caller.
+         */
+        relationshipDef.setGUID(guid);
+        relationshipDef.setName(name);
+        relationshipDef.setSuperType(superType);
+        relationshipDef.setDescription(description);
+        relationshipDef.setDescriptionGUID(descriptionGUID);
+
+        /*
+         * Set up the defaults
+         */
+        relationshipDef.setOrigin(archiveGUID);
+        relationshipDef.setCreatedBy(originatorName);
+        relationshipDef.setCreateTime(creationDate);
+        relationshipDef.setVersion(versionNumber);
+        relationshipDef.setVersionName(versionName);
+
+        /*
+         * Set default valid instance statuses
+         */
+        ArrayList<InstanceStatus>    validInstanceStatusList  = new ArrayList<>();
+        validInstanceStatusList.add(InstanceStatus.ACTIVE);
+        validInstanceStatusList.add(InstanceStatus.DELETED);
+        relationshipDef.setValidInstanceStatusList(validInstanceStatusList);
+
+        /*
+         * Set up the category of relationship
+         */
+        relationshipDef.setRelationshipCategory(relationshipCategory);
+
+        if ((relationshipCategory == RelationshipCategory.AGGREGATION) ||
+            (relationshipCategory == RelationshipCategory.COMPOSITION))
+        {
+            /*
+             * By convention, end 1 is the container end in the open metadata model.
+             */
+            relationshipDef.setRelationshipContainerEnd(RelationshipContainerEnd.END1);
+        }
+        else
+        {
+            relationshipDef.setRelationshipContainerEnd(RelationshipContainerEnd.NOT_APPLICABLE);
+        }
+
+        /*
+         * Use the supplied propagation rule.
+         */
+        relationshipDef.setPropagationRule(propagationRule);
+
+        return relationshipDef;
+    }
+
+
+    /**
+     * Returns a RelationshipEndDef object that sets up details of an entity at one end of a relationship.
+     *
+     * @param entityType - details of the type of entity connected to this end.
+     * @param attributeName - name of the attribute that the entity at the other end uses to refer to this entity.
+     * @param attributeDescription - description of this attribute
+     * @param attributeDescriptionGUID - unique identifier of the glossary term describing this attribute.
+     * @param attributeCardinality - cardinality of this end of the relationship.
+     * @return the definition of one end of a Relationship.
+     */
+    private RelationshipEndDef  getRelationshipEndDef(TypeDefLink          entityType,
+                                                      String               attributeName,
+                                                      String               attributeDescription,
+                                                      String               attributeDescriptionGUID,
+                                                      AttributeCardinality attributeCardinality)
+    {
+        RelationshipEndDef  relationshipEndDef = new RelationshipEndDef();
+
+        relationshipEndDef.setEntityType(entityType);
+        relationshipEndDef.setAttributeName(attributeName);
+        relationshipEndDef.setAttributeDescription(attributeDescription);
+        relationshipEndDef.setAttributeDescriptionGUID(attributeDescriptionGUID);
+        relationshipEndDef.setAttributeCardinality(attributeCardinality);
+
+        return relationshipEndDef;
+    }
+
+
+    /**
+     * Returns a basic ClassificationDef without any attributes.   The caller is responsible for adding the
+     * attribute definitions.
+     *
+     * @param guid - unique identifier for the classification
+     * @param name - name of the classification
+     * @param superType - Super type for this classification (null for top-level)
+     * @param description - short description of the classification
+     * @param descriptionGUID - unique identifier of the glossary term that describes this classification.
+     * @param validEntityDefs - which entities can this classification be linked to.
+     * @param propagatable - can the classification propagate over relationships?
+     * @return ClassificationDef with no attributes defined.
+     */
+    private ClassificationDef getClassificationDef(String                        guid,
+                                                   String                        name,
+                                                   TypeDefLink                   superType,
+                                                   String                        description,
+                                                   String                        descriptionGUID,
+                                                   ArrayList<TypeDefLink>        validEntityDefs,
+                                                   boolean                       propagatable)
+    {
+        ClassificationDef classificationDef = new ClassificationDef();
+
+        /*
+         * Set up the parameters supplied by the caller.
+         */
+        classificationDef.setGUID(guid);
+        classificationDef.setName(name);
+        classificationDef.setSuperType(superType);
+        classificationDef.setDescription(description);
+        classificationDef.setDescriptionGUID(descriptionGUID);
+
+        /*
+         * Set up the defaults
+         */
+        classificationDef.setOrigin(archiveGUID);
+        classificationDef.setCreatedBy(originatorName);
+        classificationDef.setCreateTime(creationDate);
+        classificationDef.setVersion(versionNumber);
+        classificationDef.setVersionName(versionName);
+
+        /*
+         * Set default valid instance statuses
+         */
+        ArrayList<InstanceStatus>    validInstanceStatusList  = new ArrayList<>();
+        validInstanceStatusList.add(InstanceStatus.ACTIVE);
+        validInstanceStatusList.add(InstanceStatus.DELETED);
+        classificationDef.setValidInstanceStatusList(validInstanceStatusList);
+
+        /*
+         * Set up the supplied validEntityTypes and propagatable flag.
+         */
+        classificationDef.setValidEntityDefs(validEntityDefs);
+        classificationDef.setPropagatable(propagatable);
+
+        return classificationDef;
+    }
+
+
+    /*
+     * ========================================
+     * AREA 0 - common types and infrastructure
+     */
+
+    /**
+     * Add the list of area 0 types
+     */
+    private void addArea0Types()
+    {
+        this.add0010BaseModel();
+        this.add0015LinkedMediaTypes();
+        this.add0017ExternalIdentifiers();
+        this.add0020PropertyFacets();
+        this.add0025Locations();
+        this.add0030HostsAndPlatforms();
+        this.add0035ComplexHosts();
+        this.add0040SoftwareServers();
+        this.add0045ServersAndAssets();
+        this.add0070NetworksAndGateways();
+        this.add0090CloudPlatformsAndServices();
+    }
+
+    /*
+     * -------------------------------------------------------------------------------------------------------
+     */
+
+    /**
+     * 0010 Base Model defines the core entities that have been inherited from the original Apache Atlas model.
+     * It defines an initial set of asset types that need to be governed (more assets are defined in Area 2).
+     */
+    private void add0010BaseModel()
+    {
+        this.archiveBuilder.addEntityDef(getReferenceableEntity());
+        this.archiveBuilder.addEntityDef(getAssetEntity());
+        this.archiveBuilder.addEntityDef(getInfrastructureEntity());
+        this.archiveBuilder.addEntityDef(getProcessEntity());
+        this.archiveBuilder.addEntityDef(getDataSetEntity());
+
+        this.archiveBuilder.addRelationshipDef(getProcessInputRelationship());
+        this.archiveBuilder.addRelationshipDef(getProcessOutputRelationship());
+    }
+
+
+    /**
+     * The Referenceable entity is the superclass of all of the governed open metadata entities.  It specifies that
+     * these entities have a unique identifier called "qualifiedName".
+     *
+     * @return Referenceable EntityDef
+     */
+    private EntityDef getReferenceableEntity()
+    {
+        /*
+         * Build the Entity
+         */
+        final String guid            = "005c7c14-ac84-4136-beed-959401b041f8";
+        final String name            = "Referenceable";
+        final String description     = "An open metadata entity that has a unique identifier.";
+        final String descriptionGUID = null;
+
+        EntityDef entityDef = getDefaultEntityDef(guid,
+                                                  name,
+                                                  null,
+                                                  description,
+                                                  descriptionGUID);
+
+        /*
+         * Build the attributes
+         */
+        ArrayList<TypeDefAttribute> properties = new ArrayList<>();
+        TypeDefAttribute            property;
+
+        final String attributeName = "qualifiedName";
+        final String attributeDescription = "Unique identifier for the entity.";
+        final String attributeDescriptionGUID = null;
+
+
+        property = getStringTypeDefAttribute(attributeName, attributeDescription, attributeDescriptionGUID);
+        property.setUnique(true);
+        properties.add(property);
+
+        entityDef.setPropertiesDefinition(properties);
+
+        return entityDef;
+    }
+
+
+    /**
+     * The Asset entity is the root entity for the assets that open metadata and governance is governing.
+     *
+     * @return Asset EntityDef
+     */
+    private EntityDef getAssetEntity()
+    {
+        /*
+         * Build the Entity
+         */
+        final String guid            = "896d14c2-7522-4f6c-8519-757711943fe6";
+        final String name            = "Asset";
+        final String description     = "The description of an asset that needs to be catalogued and governed.";
+        final String descriptionGUID = null;
+        final String superTypeName   = "Referenceable";
+
+        EntityDef entityDef = getDefaultEntityDef(guid,
+                                                  name,
+                                                  this.archiveBuilder.getEntityDef(superTypeName),
+                                                  description,
+                                                  descriptionGUID);
+
+        /*
+         * Build the attributes
+         */
+        ArrayList<TypeDefAttribute> properties = new ArrayList<>();
+        TypeDefAttribute            property;
+
+        final String attribute1Name = "name";
+        final String attribute1Description = "Display name for the asset.";
+        final String attribute1DescriptionGUID = null;
+        final String attribute2Name = "description";
+        final String attribute2Description = "Description of the asset.";
+        final String attribute2DescriptionGUID = null;
+        final String attribute3Name = "owner";
+        final String attribute3Description = "User name of the person or process that owns the asset.";
+        final String attribute3DescriptionGUID = null;
+
+
+        property = getStringTypeDefAttribute(attribute1Name, attribute1Description, attribute1DescriptionGUID);
+        properties.add(property);
+        property = getStringTypeDefAttribute(attribute2Name, attribute2Description, attribute2DescriptionGUID);
+        properties.add(property);
+        property = getStringTypeDefAttribute(attribute3Name, attribute3Description, attribute3DescriptionGUID);
+        properties.add(property);
+
+        entityDef.setPropertiesDefinition(properties);
+
+        return entityDef;
+    }
+
+
+    /**
+     * The Infrastructure entity describes an asset that is physical infrastructure or part of the software
+     * platform that supports the data and process assets.
+     *
+     * @return Infrastructure EntityDef
+     */
+    private EntityDef getInfrastructureEntity()
+    {
+        /*
+         * Build the Entity
+         */
+        final String guid = "c19746ac-b3ec-49ce-af4b-83348fc55e07";
+        final String name = "Infrastructure";
+        final String description = "Physical infrastructure or software platform.";
+        final String descriptionGUID = null;
+        final String superTypeName   = "Asset";
+
+        EntityDef entityDef = getDefaultEntityDef(guid,
+                                                  name,
+                                                  this.archiveBuilder.getEntityDef(superTypeName),
+                                                  description,
+                                                  descriptionGUID);
+
+        return entityDef;
+    }
+
+
+    /**
+     * The Process entity describes a well-defined sequence of activities performed by people or software components.
+     *
+     * @return Process EntityDef
+     */
+    private EntityDef getProcessEntity()
+    {
+        /*
+         * Build the Entity
+         */
+        final String guid = "d8f33bd7-afa9-4a11-a8c7-07dcec83c050";
+        final String name = "Process";
+        final String description = "Well-defined sequence of activities performed by people or software components.";
+        final String descriptionGUID = null;
+        final String superTypeName   = "Asset";
+
+        EntityDef entityDef = getDefaultEntityDef(guid,
+                                                  name,
+                                                  this.archiveBuilder.getEntityDef(superTypeName),
+                                                  description,
+                                                  descriptionGUID);
+
+        return entityDef;
+    }
+
+
+    /**
+     * The DataSet entity describes a collection of related data.
+     *
+     * @return DataSet EntityDef
+     */
+    private EntityDef getDataSetEntity()
+    {
+        /*
+         * Build the Entity
+         */
+        final String guid = "1449911c-4f44-4c22-abc0-7540154feefb";
+        final String name = "DataSet";
+        final String description = "Collection of related data.";
+        final String descriptionGUID = null;
+        final String superTypeName   = "Asset";
+
+        EntityDef entityDef = getDefaultEntityDef(guid,
+                                                  name,
+                                                  this.archiveBuilder.getEntityDef(superTypeName),
+                                                  description,
+                                                  descriptionGUID);
+
+        return entityDef;
+    }
+
+
+    /**
+     * The ProcessInput relationship describes the data set(s) that are passed into a process.
+     *
+     * @return ProcessInput RelationshipDef
+     */
+    private RelationshipDef getProcessInputRelationship()
+    {
+        /*
+         * Build the relationship
+         */
+        final String                        guid                          = "9a6583c4-7419-4d5a-a6e5-26b0033fa349";
+        final String                        name                          = "ProcessInput";
+        final String                        description                   = "The DataSets passed into a Process.";
+        final String                        descriptionGUID               = null;
+        final RelationshipCategory          relationshipCategory          = RelationshipCategory.AGGREGATION;
+        final ClassificationPropagationRule classificationPropagationRule = ClassificationPropagationRule.NONE;
+
+        RelationshipDef   relationshipDef = getBasicRelationshipDef(guid,
+                                                                    name,
+                                                                    null,
+                                                                    description,
+                                                                    descriptionGUID,
+                                                                    relationshipCategory,
+                                                                    classificationPropagationRule);
+
+        RelationshipEndDef     relationshipEndDef;
+
+        /*
+         * Set up end 1.
+         */
+        final String               end1EntityType               = "Process";
+        final String               end1AttributeName            = "consumedByProcess";
+        final String               end1AttributeDescription     = "Processes that consume this DataSet";
+        final String               end1AttributeDescriptionGUID = null;
+        final AttributeCardinality end1Cardinality              = AttributeCardinality.ANY_NUMBER_UNORDERED;
+
+        relationshipEndDef = getRelationshipEndDef(this.archiveBuilder.getEntityDef(end1EntityType),
+                                                   end1AttributeName,
+                                                   end1AttributeDescription,
+                                                   end1AttributeDescriptionGUID,
+                                                   end1Cardinality);
+        relationshipDef.setEndDef1(relationshipEndDef);
+
+
+        /*
+         * Set up end 2.
+         */
+        final String               end2EntityType               = "DataSet";
+        final String               end2AttributeName            = "processInputData";
+        final String               end2AttributeDescription     = "DataSets consumed by this Process";
+        final String               end2AttributeDescriptionGUID = null;
+        final AttributeCardinality end2Cardinality              = AttributeCardinality.ANY_NUMBER_UNORDERED;
+
+        relationshipEndDef = getRelationshipEndDef(this.archiveBuilder.getEntityDef(end2EntityType),
+                                                   end2AttributeName,
+                                                   end2AttributeDescription,
+                                                   end2AttributeDescriptionGUID,
+                                                   end2Cardinality);
+        relationshipDef.setEndDef2(relationshipEndDef);
+
+
+        return relationshipDef;
+    }
+
+
+    /**
+     * The ProcessOutput relationship describes the data set(s) that are produced by a process.
+     *
+     * @return ProcessOutput RelationshipDef
+     */
+    private RelationshipDef getProcessOutputRelationship()
+    {
+        /*
+         * Build the relationship
+         */
+        final String                        guid                          = "8920eada-9b05-4368-b511-b8506a4bef4b";
+        final String                        name                          = "ProcessOutput";
+        final String                        description                   = "The DataSets produced by a Process.";
+        final String                        descriptionGUID               = null;
+        final RelationshipCategory          relationshipCategory          = RelationshipCategory.AGGREGATION;
+        final ClassificationPropagationRule classificationPropagationRule = ClassificationPropagationRule.NONE;
+
+        RelationshipDef   relationshipDef = getBasicRelationshipDef(guid,
+                                                                    name,
+                                                                    null,
+                                                                    description,
+                                                                    descriptionGUID,
+                                                                    relationshipCategory,
+                                                                    classificationPropagationRule);
+
+        RelationshipEndDef     relationshipEndDef;
+
+        /*
+         * Set up end 1.
+         */
+        final String               end1EntityType               = "Process";
+        final String               end1AttributeName            = "producedByProcess";
+        final String               end1AttributeDescription     = "Processes that produce this DataSet";
+        final String               end1AttributeDescriptionGUID = null;
+        final AttributeCardinality end1Cardinality              = AttributeCardinality.ANY_NUMBER_UNORDERED;
+
+        relationshipEndDef = getRelationshipEndDef(this.archiveBuilder.getEntityDef(end1EntityType),
+                                                   end1AttributeName,
+                                                   end1AttributeDescription,
+                                                   end1AttributeDescriptionGUID,
+                                                   end1Cardinality);
+        relationshipDef.setEndDef1(relationshipEndDef);
+
+
+        /*
+         * Set up end 2.
+         */
+        final String               end2EntityType               = "DataSet";
+        final String               end2AttributeName            = "processOutputData";
+        final String               end2AttributeDescription     = "DataSets produced by this Process";
+        final String               end2AttributeDescriptionGUID = null;
+        final AttributeCardinality end2Cardinality              = AttributeCardinality.ANY_NUMBER_UNORDERED;
+
+        relationshipEndDef = getRelationshipEndDef(this.archiveBuilder.getEntityDef(end2EntityType),
+                                                   end2AttributeName,
+                                                   end2AttributeDescription,
+                                                   end2AttributeDescriptionGUID,
+                                                   end2Cardinality);
+        relationshipDef.setEndDef2(relationshipEndDef);
+
+
+        return relationshipDef;
+    }
+
+
+    /*
+     * -------------------------------------------------------------------------------------------------------
+     */
+
+
+    /**
+     * 0015 Linked Media Types describe different media (like images and documents) that enhance the description
+     * of an entity.  Media entities can be added to any Referenceable entities.
+     */
+    private void add0015LinkedMediaTypes()
+    {
+        this.archiveBuilder.addEnumDef(getMediaUsageEnum());
+
+        this.archiveBuilder.addEntityDef(getExternalReferenceEntity());
+        this.archiveBuilder.addEntityDef(getRelatedMediaEntity());
+
+        this.archiveBuilder.addRelationshipDef(getExternalReferenceLinkRelationship());
+        this.archiveBuilder.addRelationshipDef(getMediaReferenceRelationship());
+    }
+
+    private EnumDef  getMediaUsageEnum()
+    {
+        final String guid = "c6861a72-7485-48c9-8040-876f6c342b61";
+        final String name = "MediaUsage";
+        final String description = "Defines how a related media reference should be used.";
+        final String descriptionGUID = null;
+
+        EnumDef enumDef = getEmptyEnumDef(guid, name, description, descriptionGUID);
+
+        ArrayList<EnumElementDef> elementDefs    = new ArrayList();
+        EnumElementDef            elementDef;
+
+        final int    element1Ordinal         = 0;
+        final String element1Value           = "Icon";
+        final String element1Description     = "Provides a small image to represent the asset in tree views and graphs.";
+        final String element1DescriptionGUID = null;
+
+        elementDef = getEnumElementDef(element1Ordinal, element1Value, element1Description, element1DescriptionGUID);
+        elementDefs.add(elementDef);
+
+        final int    element2Ordinal         = 1;
+        final String element2Value           = "Thumbnail";
+        final String element2Description     = "Provides a small image about the asset that can be used in lists.";
+        final String element2DescriptionGUID = null;
+
+        elementDef = getEnumElementDef(element2Ordinal, element2Value, element2Description, element2DescriptionGUID);
+        elementDefs.add(elementDef);
+
+        final int    element3Ordinal         = 2;
+        final String element3Value           = "Illustration";
+        final String element3Description     = "Illustrates how the asset works or what it contains. It is complementary to the asset's description.";
+        final String element3DescriptionGUID = null;
+
+        elementDef = getEnumElementDef(element3Ordinal, element3Value, element3Description, element3DescriptionGUID);
+        elementDefs.add(elementDef);
+
+        final int    element4Ordinal         = 3;
+        final String element4Value           = "Usage Guidance";
+        final String element4Description     = "Provides guidance to a person on how to use the asset.";
+        final String element4DescriptionGUID = null;
+
+        elementDef = getEnumElementDef(element4Ordinal, element4Value, element4Description, element4DescriptionGUID);
+        elementDefs.add(elementDef);
+
+        final int    element5Ordinal         = 99;
+        final String element5Value           = "Other";
+        final String element5Description     = "Another usage.";
+        final String element5DescriptionGUID = null;
+
+        elementDef = getEnumElementDef(element5Ordinal, element5Value, element5Description, element5DescriptionGUID);
+        elementDefs.add(elementDef);
+
+        enumDef.setElementDefs(elementDefs);
+
+        return enumDef;
+    }
+
+    private EntityDef  getExternalReferenceEntity()
+    {
+        final String guid = "af536f20-062b-48ef-9c31-1ddd05b04c56";
+        final String name            = "ExternalReference";
+        final String description     = "A link to more information.";
+        final String descriptionGUID = null;
+
+        // TODO
+        return null;
+    }
+
+    private EntityDef  getRelatedMediaEntity()
+    {
+        final String guid = "747f8b86-fe7c-4c9b-ba75-979e093cc307";
+        final String name            = "RelatedMedia";
+        final String description     = "Images, video or sound media.";
+        final String descriptionGUID = null;
+
+        // TODO
+        return null;
+    }
+
+    private RelationshipDef  getExternalReferenceLinkRelationship()
+    {
+        final String guid = "7d818a67-ab45-481c-bc28-f6b1caf12f06";
+        final String name            = "ExternalReferenceLink";
+        final String description     = "Link to more information.";
+        final String descriptionGUID = null;
+
+        // TODO
+        return null;
+    }
+
+    private RelationshipDef  getMediaReferenceRelationship()
+    {
+        final String guid = "1353400f-b0ab-4ab9-ab09-3045dd8a7140";
+        final String name            = "MediaReference";
+        final String description     = "Link to related media such as images, videos and audio.";
+        final String descriptionGUID = null;
+
+        // TODO
+        return null;
+    }
+
+    /*
+     * -------------------------------------------------------------------------------------------------------
+     */
+
+
+    /**
+     * 0017 External Identifiers define identifiers used to identify this entity in other systems.
+     */
+    private void add0017ExternalIdentifiers()
+    {
+        this.archiveBuilder.addEnumDef(getKeyPatternEnum());
+
+        this.archiveBuilder.addEntityDef(getExternalIdEntity());
+
+        this.archiveBuilder.addRelationshipDef(getExternalIdScopeRelationship());
+        this.archiveBuilder.addRelationshipDef(getExternalIdLinkRelationship());
+    }
+
+    private EnumDef  getKeyPatternEnum()
+    {
+        final String guid = "8904df8f-1aca-4de8-9abd-1ef2aadba300";
+        final String name = "KeyPattern";
+        final String description = "Defines the type of identifier used for an asset.";
+        final String descriptionGUID = null;
+
+        EnumDef enumDef = getEmptyEnumDef(guid, name, description, descriptionGUID);
+
+        ArrayList<EnumElementDef> elementDefs    = new ArrayList();
+        EnumElementDef            elementDef;
+
+        final int    element1Ordinal         = 0;
+        final String element1Value           = "Local Key";
+        final String element1Description     = "Unique key allocated and used within the scope of a single system.";
+        final String element1DescriptionGUID = null;
+
+        elementDef = getEnumElementDef(element1Ordinal, element1Value, element1Description, element1DescriptionGUID);
+        elementDefs.add(elementDef);
+
+        final int    element2Ordinal         = 1;
+        final String element2Value           = "Recycled Key";
+        final String element2Description     = "Key allocated and used within the scope of a single system that is periodically reused for different records.";
+        final String element2DescriptionGUID = null;
+
+        elementDef = getEnumElementDef(element2Ordinal, element2Value, element2Description, element2DescriptionGUID);
+        elementDefs.add(elementDef);
+
+        final int    element3Ordinal         = 2;
+        final String element3Value           = "Natural Key";
+        final String element3Description     = "Key derived from an attribute of the entity, such as email address, passport number.";
+        final String element3DescriptionGUID = null;
+
+        elementDef = getEnumElementDef(element3Ordinal, element3Value, element3Description, element3DescriptionGUID);
+        elementDefs.add(elementDef);
+
+        final int    element4Ordinal         = 3;
+        final String element4Value           = "Mirror Key";
+        final String element4Description     = "Key value copied from another system.";
+        final String element4DescriptionGUID = null;
+
+        elementDef = getEnumElementDef(element4Ordinal, element4Value, element4Description, element4DescriptionGUID);
+        elementDefs.add(elementDef);
+
+        final int    element5Ordinal         = 4;
+        final String element5Value           = "Aggregate Key";
+        final String element5Description     = "Key formed by combining keys from multiple systems.";
+        final String element5DescriptionGUID = null;
+
+        elementDef = getEnumElementDef(element5Ordinal, element5Value, element5Description, element5DescriptionGUID);
+        elementDefs.add(elementDef);
+
+        final int    element6Ordinal         = 5;
+        final String element6Value           = "Caller's Key";
+        final String element6Description     = "Key from another system can bey used if system name provided.";
+        final String element6DescriptionGUID = null;
+
+        elementDef = getEnumElementDef(element6Ordinal, element6Value, element6Description, element6DescriptionGUID);
+        elementDefs.add(elementDef);
+
+        final int    element7Ordinal         = 6;
+        final String element7Value           = "Stable Key";
+        final String element7Description     = "Key value will remain active even if records are merged.";
+        final String element7DescriptionGUID = null;
+
+        elementDef = getEnumElementDef(element7Ordinal, element7Value, element7Description, element7DescriptionGUID);
+        elementDefs.add(elementDef);
+
+        final int    element8Ordinal         = 99;
+        final String element8Value           = "Other";
+        final String element8Description     = "Another key pattern.";
+        final String element8DescriptionGUID = null;
+
+        elementDef = getEnumElementDef(element8Ordinal, element8Value, element8Description, element8DescriptionGUID);
+        elementDefs.add(elementDef);
+
+        return enumDef;
+    }
+
+    private EntityDef  getExternalIdEntity()
+    {
+        final String guid = "7c8f8c2c-cc48-429e-8a21-a1f1851ccdb0";
+        final String name            = "ExternalId";
+        final String description     = "Alternative identifier used in another system.";
+        final String descriptionGUID = null;
+
+        // TODO
+        return null;
+    }
+
+    private RelationshipDef  getExternalIdScopeRelationship()
+    {
+        final String guid = "8c5b1415-2d1f-4190-ba6c-1fdd47f03269";
+        final String name            = "ExternalIdScope";
+        final String description     = "Places where an external identifier is recognized.";
+        final String descriptionGUID = null;
+
+        // TODO
+        return null;
+    }
+
+    private RelationshipDef  getExternalIdLinkRelationship()
+    {
+        final String guid = "28ab0381-c662-4b6d-b787-5d77208de126";
+        final String name            = "ExternalIdLink";
+        final String description     = "Link between an external identifier and an asset.";
+        final String descriptionGUID = null;
+
+        // TODO
+        return null;
+    }
+
+    /*
+     * -------------------------------------------------------------------------------------------------------
+     */
+
+
+    /**
+     * 0020 Property Facets define blocks of properties that are unique to a particular vendor or service.
+     */
+    private void add0020PropertyFacets()
+    {
+        this.archiveBuilder.addEntityDef(getPropertyFacetEntity());
+
+        this.archiveBuilder.addRelationshipDef(getReferenceableFacetRelationship());
+    }
+
+    private EntityDef  getPropertyFacetEntity()
+    {
+        final String guid = "6403a704-aad6-41c2-8e08-b9525c006f85";
+        final String name            = "PropertyFacet";
+        final String description     = "Additional properties that support a particular vendor or service.";
+        final String descriptionGUID = null;
+
+        // TODO
+        return null;
+    }
+
+    private RelationshipDef  getReferenceableFacetRelationship()
+    {
+        final String guid = "58c87647-ada9-4c90-a3c3-a40ace46b1f7";
+        final String name            = "ReferenceableFacet";
+        final String description     = "Link between a property facet and the element it relates to.";
+        final String descriptionGUID = null;
+
+        // TODO
+        return null;
+    }
+
+    /*
+     * -------------------------------------------------------------------------------------------------------
+     */
+
+
+    /**
+     * 0025 Locations define entities that describe physical, logical and cyber locations for Assets.
+     */
+    private void add0025Locations()
+    {
+        this.archiveBuilder.addEntityDef(getLocationEntity());
+
+        this.archiveBuilder.addRelationshipDef(getNestedLocationRelationship());
+        this.archiveBuilder.addRelationshipDef(getAdjacentLocationRelationship());
+        this.archiveBuilder.addRelationshipDef(getAssetLocationRelationship());
+
+        this.archiveBuilder.addClassificationDef(getMobileAssetClassification());
+        this.archiveBuilder.addClassificationDef(getFixedLocationClassification());
+        this.archiveBuilder.addClassificationDef(getSecureLocationClassification());
+        this.archiveBuilder.addClassificationDef(getCyberLocationClassification());
+    }
+
+    private EntityDef  getLocationEntity()
+    {
+        final String guid = "3e09cb2b-5f15-4fd2-b004-fe0146ad8628";
+        final String name            = "Location";
+        final String description     = "A physical place, digital location or area.";
+        final String descriptionGUID = null;
+
+        // TODO
+        return null;
+    }
+
+    private RelationshipDef  getNestedLocationRelationship()
+    {
+        final String guid = "f82a96c2-95a3-4223-88c0-9cbf2882b772";
+        final String name            = "NestedLocation";
+        final String description     = "Link between two locations to show one is nested inside another.";
+        final String descriptionGUID = null;
+
+        // TODO
+        return null;
+    }
+
+    private RelationshipDef  getAdjacentLocationRelationship()
+    {
+        final String guid = "017d0518-fc25-4e5e-985e-491d91e61e17";
+        final String name            = "AdjacentLocation";
+        final String description     = "Link between two locations that are next to one another.";
+        final String descriptionGUID = null;
+
+        // TODO
+        return null;
+    }
+
+    private RelationshipDef  getAssetLocationRelationship()
+    {
+        final String guid = "bc236b62-d0e6-4c5c-93a1-3a35c3dba7b1";
+        final String name            = "AssetLocation";
+        final String description     = "Location of an Asset.";
+        final String descriptionGUID = null;
+
+        // TODO
+        return null;
+    }
+
+    private ClassificationDef  getMobileAssetClassification()
+    {
+        final String guid = "b25fb90d-8fa2-4aa9-b884-ff0a6351a697";
+        final String name            = "MobileAsset";
+        final String description     = "An asset not restricted to a single physical location.";
+        final String descriptionGUID = null;
+
+        // TODO
+        return null;
+    }
+
+    private ClassificationDef  getFixedLocationClassification()
+    {
+        final String guid = "bc111963-80c7-444f-9715-946c03142dd2";
+        final String name            = "FixedLocation";
+        final String description     = "A location linked to a physical place.";
+        final String descriptionGUID = null;
+
+        // TODO
+        return null;
+    }
+
+    private ClassificationDef  getSecureLocationClassification()
+    {
+        final String guid = "e7b563c0-fcdd-4ba7-a046-eecf5c4638b8";
+        final String name            = "SecureLocation";
+        final String description     = "A location that protects the assets in its care.";
+        final String descriptionGUID = null;
+
+        // TODO
+        return null;
+    }
+
+    private ClassificationDef  getCyberLocationClassification()
+    {
+        final String guid = "f9ec3633-8ac8-480b-aa6d-5e674b9e1b17";
+        final String name            = "CyberLocation";
+        final String description     = "A digital location.";
+        final String descriptionGUID = null;
+
+        // TODO
+        return null;
+    }
+
+
+    /*
+     * -------------------------------------------------------------------------------------------------------
+     */
+
+
+    /**
+     * 0030 Hosts and Platforms describe the Software and Hardware platforms hosting Assets.
+     */
+    private void add0030HostsAndPlatforms()
+    {
+        this.archiveBuilder.addEnumDef(getEndiannessEnum());
+
+        this.archiveBuilder.addEntityDef(getITInfrastructureEntity());
+        this.archiveBuilder.addEntityDef(getHostEntity());
+        this.archiveBuilder.addEntityDef(getOperatingPlatformEntity());
+
+        this.archiveBuilder.addRelationshipDef(getHostLocationRelationship());
+        this.archiveBuilder.addRelationshipDef(getHostOperatingPlatformRelationship());
+    }
+
+    private EnumDef  getEndiannessEnum()
+    {
+        final String guid = "e5612c3a-49bd-4148-8f67-cfdf145d5fd8";
+        final String name = "Endianness";
+        final String description = "Defines the sequential order in which bytes are arranged into larger numerical values when stored in memory or when transmitted over digital links.";
+        final String descriptionGUID = null;
+
+        EnumDef enumDef = getEmptyEnumDef(guid, name, description, descriptionGUID);
+
+        ArrayList<EnumElementDef> elementDefs    = new ArrayList();
+        EnumElementDef            elementDef;
+
+        final int    element1Ordinal         = 0;
+        final String element1Value           = "Big Endian";
+        final String element1Description     = "Bits or bytes order from the big end.";
+        final String element1DescriptionGUID = null;
+
+        elementDef = getEnumElementDef(element1Ordinal, element1Value, element1Description, element1DescriptionGUID);
+        elementDefs.add(elementDef);
+
+        final int    element2Ordinal         = 1;
+        final String element2Value           = "Little Endian";
+        final String element2Description     = "Bits or bytes ordered from the little end.";
+        final String element2DescriptionGUID = null;
+
+        elementDef = getEnumElementDef(element2Ordinal, element2Value, element2Description, element2DescriptionGUID);
+        elementDefs.add(elementDef);
+
+        return enumDef;
+    }
+
+    private EntityDef  getITInfrastructureEntity()
+    {
+        final String guid = "151e6dd1-54a0-4b7f-a072-85caa09d1dda";
+        final String name            = "ITInfrastructure";
+        final String description     = "Hardware and base software that supports an IT system.";
+        final String descriptionGUID = null;
+
+        // TODO
+        return null;
+    }
+
+    private EntityDef  getHostEntity()
+    {
+        final String guid = "1abd16db-5b8a-4fd9-aee5-205db3febe99";
+        final String name            = "Host";
+        final String description     = "Named IT infrastructure system that supports multiple software servers.";
+        final String descriptionGUID = null;
+
+        // TODO
+        return null;
+    }
+
+    private EntityDef  getOperatingPlatformEntity()
+    {
+        final String guid = "bd96a997-8d78-42f6-adf7-8239bc98501c";
+        final String name            = "OperatingPlatform";
+        final String description     = "Characteristics of the operating system in use within a host.";
+        final String descriptionGUID = null;
+
+        // TODO
+        return null;
+    }
+
+    private RelationshipDef  getHostLocationRelationship()
+    {
+        final String guid = "f3066075-9611-4886-9244-32cc6eb07ea9";
+        final String name            = "HostLocation";
+        final String description     = "Defines the location of a host.";
+        final String descriptionGUID = null;
+
+        // TODO
+        return null;
+    }
+
+    private RelationshipDef  getHostOperatingPlatformRelationship()
+    {
+        final String guid = "b9179df5-6e23-4581-a8b0-2919e6322b12";
+        final String name            = "HostOperatingPlatform";
+        final String description     = "Identifies the operating platform for a host.";
+        final String descriptionGUID = null;
+
+        // TODO
+        return null;
+    }
+
+    /*
+     * -------------------------------------------------------------------------------------------------------
+     */
+
+
+    /**
+     * 0035 Complex Hosts describe virtualization and clustering options for Hosts.
+     */
+    private void add0035ComplexHosts()
+    {
+        this.archiveBuilder.addEntityDef(getHostClusterEntity());
+        this.archiveBuilder.addEntityDef(getVirtualContainerEntity());
+
+        this.archiveBuilder.addRelationshipDef(getHostClusterMemberRelationship());
+        this.archiveBuilder.addRelationshipDef(getDeployedVirtualContainerRelationship());
+    }
+
+    private EntityDef  getHostClusterEntity()
+    {
+        final String guid = "9794f42f-4c9f-4fe6-be84-261f0a7de890";
+        final String name            = "HostCluster";
+        final String description     = "A group of hosts operating together to provide a scalable platform.";
+        final String descriptionGUID = null;
+        // TODO
+        return null;
+    }
+
+    private EntityDef  getVirtualContainerEntity()
+    {
+        final String guid = "e2393236-100f-4ac0-a5e6-ce4e96c521e7";
+        final String name            = "VirtualContainer";
+        final String description     = "Container-based virtual host.";
+        final String descriptionGUID = null;
+
+        // TODO
+        return null;
+    }
+
+    private RelationshipDef  getHostClusterMemberRelationship()
+    {
+        final String guid = "1a1c3933-a583-4b0c-9e42-c3691296a8e0";
+        final String name            = "HostClusterMember";
+        final String description     = "Identifies a host as a member of a host cluster.";
+        final String descriptionGUID = null;
+
+        // TODO
+        return null;
+    }
+
+    private RelationshipDef  getDeployedVirtualContainerRelationship()
+    {
+        final String guid = "4b981d89-e356-4d9b-8f17-b3a8d5a86676";
+        final String name            = "DeployedVirtualContainer";
+        final String description     = "Identifies the real host where a virtual container is deployed to.";
+        final String descriptionGUID = null;
+
+        // TODO
+        return null;
+    }
+
+    /*
+     * -------------------------------------------------------------------------------------------------------
+     */
+
+
+    /**
+     * 0040 Software Servers describe the structure of a software server and its capabilities.
+     */
+    private void add0040SoftwareServers()
+    {
+        this.archiveBuilder.addEnumDef(getOperationalStatusEnum());
+
+        this.archiveBuilder.addEntityDef(getSoftwareServerEntity());
+        this.archiveBuilder.addEntityDef(getEndpointEntity());
+        this.archiveBuilder.addEntityDef(getSoftwareServerCapabilityEntity());
+
+        this.archiveBuilder.addRelationshipDef(getServerDeploymentRelationship());
+        this.archiveBuilder.addRelationshipDef(getServerSupportedCapabilityRelationship());
+        this.archiveBuilder.addRelationshipDef(getServerEndpointRelationship());
+    }
+
+
+    private EnumDef  getOperationalStatusEnum()
+    {
+        final String guid = "24e1e33e-9250-4a6c-8b07-05c7adec3a1d";
+        final String name = "OperationalStatus";
+        final String description = "Defines whether a component is operational.";
+        final String descriptionGUID = null;
+
+        EnumDef enumDef = getEmptyEnumDef(guid, name, description, descriptionGUID);
+
+        ArrayList<EnumElementDef> elementDefs    = new ArrayList();
+        EnumElementDef            elementDef;
+
+        final int    element1Ordinal         = 0;
+        final String element1Value           = "Disabled";
+        final String element1Description     = "The component is not operational.";
+        final String element1DescriptionGUID = null;
+
+        elementDef = getEnumElementDef(element1Ordinal, element1Value, element1Description, element1DescriptionGUID);
+        elementDefs.add(elementDef);
+
+        final int    element2Ordinal         = 1;
+        final String element2Value           = "Enabled";
+        final String element2Description     = "The component is operational.";
+        final String element2DescriptionGUID = null;
+
+        elementDef = getEnumElementDef(element2Ordinal, element2Value, element2Description, element2DescriptionGUID);
+        elementDefs.add(elementDef);
+
+        return enumDef;
+    }
+
+
+    private EntityDef  getSoftwareServerEntity()
+    {
+        final String guid = "aa7c7884-32ce-4991-9c41-9778f1fec6aa";
+        final String name            = "SoftwareServer";
+        final String description     = "Software services to support a runtime environment for applications and data stores.";
+        final String descriptionGUID = null;
+
+        // TODO
+        return null;
+    }
+
+
+    private EntityDef  getEndpointEntity()
+    {
+        final String guid = "dbc20663-d705-4ff0-8424-80c262c6b8e7";
+        final String name            = "Endpoint";
+        final String description     = "Description of the network address and related information needed to call a software service.";
+        final String descriptionGUID = null;
+
+        // TODO
+        return null;
+    }
+
+
+    private EntityDef  getSoftwareServerCapabilityEntity()
+    {
+        final String guid = "fe30a033-8f86-4d17-8986-e6166fa24177";
+        final String name            = "SoftwareServerCapability";
+        final String description     = "A software capability such as an application, that is deployed to a software server.";
+        final String descriptionGUID = null;
+
+        // TODO
+        return null;
+    }
+
+
+    private RelationshipDef  getServerDeploymentRelationship()
+    {
+        final String guid = "d909eb3b-5205-4180-9f63-122a65b30738";
+        final String name            = "ServerDeployment";
+        final String description     = "Defines the host that a software server is deployed to.";
+        final String descriptionGUID = null;
+
+        // TODO
+        return null;
+    }
+
+    private RelationshipDef  getServerSupportedCapabilityRelationship()
+    {
+        final String guid = "8b7d7da5-0668-4174-a43b-8f8c6c068dd0";
+        final String name            = "ServerSupportedCapability";
+        final String description     = "Identifies a software capability that is deployed to a software server.";
+        final String descriptionGUID = null;
+
+        // TODO
+        return null;
+    }
+
+    private RelationshipDef  getServerEndpointRelationship()
+    {
+        final String guid = "2b8bfab4-8023-4611-9833-82a0dc95f187";
+        final String name            = "ServerEndpoint";
+        final String description     = "Defines an endpoint associated with a server.";
+        final String descriptionGUID = null;
+
+        // TODO
+        return null;
+    }
+
+    /*
+     * -------------------------------------------------------------------------------------------------------
+     */
+
+
+    /**
+     * 0045 Servers and Assets defines the relationships between SoftwareServers and Assets.
+     */
+    private void add0045ServersAndAssets()
+    {
+        this.archiveBuilder.addEnumDef(getServerAssetUseTypeEnum());
+
+        this.archiveBuilder.addRelationshipDef(getServerAssetUseRelationship());
+    }
+
+
+    private EnumDef  getServerAssetUseTypeEnum()
+    {
+        final String guid = "09439481-9489-467c-9ae5-178a6e0b6b5a";
+        final String name            = "ServerAssetUse";
+        final String description     = "Defines how a server capability may use an asset.";
+        final String descriptionGUID = null;
+
+        // TODO
+        return null;
+    }
+
+    private RelationshipDef  getServerAssetUseRelationship()
+    {
+        final String guid = "92b75926-8e9a-46c7-9d98-89009f622397";
+        final String name            = "AssetServerUse";
+        final String description     = "Defines that a server capability is using an asset.";
+        final String descriptionGUID = null;
+
+        // TODO
+        return null;
+    }
+
+    /*
+     * -------------------------------------------------------------------------------------------------------
+     */
+
+
+    /**
+     * 0070 Networks and Gateways provide a very simple network model.
+     */
+    private void add0070NetworksAndGateways()
+    {
+        this.archiveBuilder.addEntityDef(getNetworkEntity());
+        this.archiveBuilder.addEntityDef(getNetworkGatewayEntity());
+
+        this.archiveBuilder.addRelationshipDef(getHostNetworkRelationship());
+        this.archiveBuilder.addRelationshipDef(getNetworkGatewayLinkRelationship());
+    }
+
+    private EntityDef  getNetworkEntity()
+    {
+        final String guid = "e0430f59-f021-411a-9d81-883e1ff3f6f6";
+        final String name            = "ITInfrastructure";
+        final String description     = "Hardware and base software that supports an IT system.";
+        final String descriptionGUID = null;
+
+        // TODO
+        return null;
+    }
+
+    private EntityDef  getNetworkGatewayEntity()
+    {
+        final String guid = "9bbae94d-e109-4c96-b072-4f97123f04fd";
+
+        // TODO
+        return null;
+    }
+
+    private RelationshipDef  getHostNetworkRelationship()
+    {
+        final String guid = "f2bd7401-c064-41ac-862c-e5bcdc98fa1e";
+
+        // TODO
+        return null;
+    }
+
+
+    private RelationshipDef  getNetworkGatewayLinkRelationship()
+    {
+        final String guid = "5bece460-1fa6-41fb-a29f-fdaf65ec8ce3";
+
+        // TODO
+        return null;
+    }
+
+    /*
+     * -------------------------------------------------------------------------------------------------------
+     */
+
+    /**
+     * 0090 Cloud Platforms and Services provides classifications for infrastructure to allow cloud platforms
+     * and services to be identified.
+     */
+    private void add0090CloudPlatformsAndServices()
+    {
+        this.archiveBuilder.addClassificationDef(getCloudProviderClassification());
+        this.archiveBuilder.addClassificationDef(getCloudPlatformClassification());
+        this.archiveBuilder.addClassificationDef(getCloudServiceClassification());
+    }
+
+    private ClassificationDef  getCloudProviderClassification()
+    {
+        final String guid = "a2bfdd08-d0a8-49db-bc97-7f2406281046";
+
+        // TODO
+        return null;
+    }
+
+    private ClassificationDef  getCloudPlatformClassification()
+    {
+        final String guid = "1b8f8511-e606-4f65-86d3-84891706ad12";
+
+        // TODO
+        return null;
+    }
+
+    private ClassificationDef  getCloudServiceClassification()
+    {
+        final String guid = "337e7b1a-ad4b-4818-aa3e-0ff3307b2fbe";
+
+        // TODO
+        return null;
+    }
+
+    /*
+     * ========================================
+     * AREA 1 - collaboration
+     */
+
+    private void addArea1Types()
+    {
+        this.add0110Actors();
+        this.add0120Collections();
+        this.add0130Projects();
+        this.add0135Meetings();
+        this.add0140Communities();
+        this.add0150Feedback();
+        this.add0160Notes();
+    }
+
+
+    /*
+     * -------------------------------------------------------------------------------------------------------
+     */
+
+    /**
+     * 0110 Actors describe the people and their relationships who are using the Assets.
+     */
+    private void add0110Actors()
+    {
+        this.archiveBuilder.addEnumDef(getCrowdSourcingRoleEnum());
+        this.archiveBuilder.addEnumDef(getContactMethodTypeEnum());
+
+        this.archiveBuilder.addEntityDef(getActorProfileEntity());
+        this.archiveBuilder.addEntityDef(getTeamEntity());
+        this.archiveBuilder.addEntityDef(getPersonEntity());
+        this.archiveBuilder.addEntityDef(getUserIdentityEntity());
+        this.archiveBuilder.addEntityDef(getContactDetailsEntity());
+
+        this.archiveBuilder.addRelationshipDef(getContactThroughRelationship());
+        this.archiveBuilder.addRelationshipDef(getLeadershipRelationship());
+        this.archiveBuilder.addRelationshipDef(getPeerRelationship());
+        this.archiveBuilder.addRelationshipDef(getProfileIdentityRelationship());
+        this.archiveBuilder.addRelationshipDef(getContributorRelationship());
+    }
+
+    private EnumDef  getCrowdSourcingRoleEnum()
+    {
+        final String guid = "0ded50c2-17cc-4ecf-915e-908e66dbb27f";
+
+        // TODO
+        return null;
+    }
+
+    private EnumDef  getContactMethodTypeEnum()
+    {
+        final String guid = "30e7d8cd-df01-46e8-9247-a24c5650910d";
+
+        // TODO
+        return null;
+    }
+
+    private EntityDef  getActorProfileEntity()
+    {
+        final String guid = "5a2f38dc-d69d-4a6f-ad26-ac86f118fa35";
+
+        // TODO
+        return null;
+    }
+
+    private EntityDef  getTeamEntity()
+    {
+        final String guid = "36db26d5-aba2-439b-bc15-d62d373c5db6";
+
+        // TODO
+        return null;
+    }
+
+    private EntityDef  getPersonEntity()
+    {
+        final String guid = "ac406bf8-e53e-49f1-9088-2af28bbbd285";
+
+        // TODO
+        return null;
+    }
+
+    private EntityDef  getUserIdentityEntity()
+    {
+        final String guid = "fbe95779-1f3c-4ac6-aa9d-24963ff16282";
+
+        // TODO
+        return null;
+    }
+
+    private EntityDef  getContactDetailsEntity()
+    {
+        final String guid = "79296df8-645a-4ef7-a011-912d1cdcf75a";
+
+        // TODO
+        return null;
+    }
+
+    private RelationshipDef  getContactThroughRelationship()
+    {
+        final String guid = "6cb9af43-184e-4dfa-854a-1572bcf0fe75";
+
+        // TODO
+        return null;
+    }
+
+    private RelationshipDef  getLeadershipRelationship()
+    {
+        final String guid = "5ebc4fb2-b62a-4269-8f18-e9237a2119ca";
+
+        // TODO
+        return null;
+    }
+
+    private RelationshipDef  getPeerRelationship()
+    {
+        final String guid = "4a316abe-bccd-4d11-ad5a-4bfb4079b80b";
+
+        // TODO
+        return null;
+    }
+
+    private RelationshipDef  getProfileIdentityRelationship()
+    {
+        final String guid = "01664609-e777-4079-b543-6baffe910ff1";
+
+        // TODO
+        return null;
+    }
+
+    private RelationshipDef  getContributorRelationship()
+    {
+        final String guid = "4db83564-b200-4956-94a4-c95a5c30e65a";
+
+        // TODO
+        return null;
+    }
+
+    /*
+     * -------------------------------------------------------------------------------------------------------
+     */
+
+
+    /**
+     * 0120 Collections defines how to group related Referenceables together
+     */
+    private void add0120Collections()
+    {
+        this.archiveBuilder.addEnumDef(getOrderByEnum());
+
+        this.archiveBuilder.addEntityDef(getCollectionEntity());
+
+        this.archiveBuilder.addRelationshipDef(getCollectionMembershipRelationship());
+        this.archiveBuilder.addRelationshipDef(getActorCollectionRelationship());
+
+        this.archiveBuilder.addClassificationDef(getFolderClassification());
+        this.archiveBuilder.addClassificationDef(getSetClassification());
+    }
+
+
+    private EnumDef  getOrderByEnum()
+    {
+        final String guid = "1d412439-4272-4a7e-a940-1065f889fc56";
+
+        // TODO
+        return null;
+    }
+
+    private EntityDef  getCollectionEntity()
+    {
+        final String guid = "347005ba-2b35-4670-b5a7-12c9ebed0cf7";
+
+        // TODO
+        return null;
+    }
+
+    private RelationshipDef  getCollectionMembershipRelationship()
+    {
+        final String guid = "5cabb76a-e25b-4bb5-8b93-768bbac005af";
+
+        // TODO
+        return null;
+    }
+
+    private RelationshipDef  getActorCollectionRelationship()
+    {
+        final String guid = "73cf5658-6a73-4ebc-8f4d-44fdfac0b437";
+
+        // TODO
+        return null;
+    }
+
+    private ClassificationDef  getFolderClassification()
+    {
+        final String guid = "3c0fa687-8a63-4c8e-8bda-ede9c78be6c7";
+
+        // TODO
+        return null;
+    }
+
+    private ClassificationDef  getSetClassification()
+    {
+        final String guid = "3947f08d-7412-4022-81fc-344a20dfbb26";
+
+        // TODO
+        return null;
+    }
+
+    /*
+     * -------------------------------------------------------------------------------------------------------
+     */
+
+
+    /**
+     * 0130 Projects describes the structure of a project and related collections.
+     */
+    private void add0130Projects()
+    {
+        this.archiveBuilder.addEntityDef(getProjectEntity());
+
+        this.archiveBuilder.addRelationshipDef(getProjectHierarchyRelationship());
+        this.archiveBuilder.addRelationshipDef(getProjectDependencyRelationship());
+        this.archiveBuilder.addRelationshipDef(getProjectTeamRelationship());
+        this.archiveBuilder.addRelationshipDef(getProjectResourcesRelationship());
+        this.archiveBuilder.addRelationshipDef(getProjectScopeRelationship());
+
+        this.archiveBuilder.addClassificationDef(getTaskClassification());
+        this.archiveBuilder.addClassificationDef(getCampaignClassification());
+    }
+
+    private EntityDef  getProjectEntity()
+    {
+        final String guid = "0799569f-0c16-4a1f-86d9-e2e89568f7fd";
+
+        // TODO
+        return null;
+    }
+
+    private RelationshipDef  getProjectHierarchyRelationship()
+    {
+        final String guid = "8f1134f6-b9fe-4971-bc57-6e1b8b302b55";
+
+        // TODO
+        return null;
+    }
+
+    private RelationshipDef  getProjectDependencyRelationship()
+    {
+        final String guid = "5b6a56f1-68e2-4e10-85f0-fda47a4263fd";
+
+        // TODO
+        return null;
+    }
+
+    private RelationshipDef  getProjectTeamRelationship()
+    {
+        final String guid = "746875af-2e41-4d1f-864b-35265df1d5dc";
+
+        // TODO
+        return null;
+    }
+
+    private RelationshipDef  getProjectResourcesRelationship()
+    {
+        final String guid = "03d25e7b-1c5b-4352-a472-33aa0ddcad4d";
+
+        // TODO
+        return null;
+    }
+
+    private RelationshipDef  getProjectScopeRelationship()
+    {
+        final String guid = "bc63ac45-b4d0-4fba-b583-92859de77dd8";
+
+        // TODO
+        return null;
+    }
+
+    private ClassificationDef  getTaskClassification()
+    {
+        final String guid = "2312b668-3670-4845-a140-ef88d5a6db0c";
+
+        // TODO
+        return null;
+    }
+
+    private ClassificationDef  getCampaignClassification()
+    {
+        final String guid = "41437629-8609-49ef-8930-8c435c912572";
+
+        // TODO
+        return null;
+    }
+
+    /*
+     * -------------------------------------------------------------------------------------------------------
+     */
+
+
+    /**
+     * 0135 Meetings defines how to record meetings and todos.
+     */
+    private void add0135Meetings()
+    {
+        this.archiveBuilder.addEnumDef(getToDoEnum());
+
+        this.archiveBuilder.addEntityDef(getMeetingEntity());
+        this.archiveBuilder.addEntityDef(getToDoEntity());
+
+        this.archiveBuilder.addRelationshipDef(getMeetingOnReferenceableRelationship());
+        this.archiveBuilder.addRelationshipDef(getTodoOnReferenceableRelationship());
+        this.archiveBuilder.addRelationshipDef(getProjectMeetingRelationship());
+    }
+
+
+    private EnumDef  getToDoEnum()
+    {
+        final String guid = "7197ea39-334d-403f-a70b-d40231092df7";
+
+        // TODO
+        return null;
+    }
+
+    private EntityDef  getMeetingEntity()
+    {
+        final String guid = "6bf90c79-32f4-47ad-959c-8fff723fe744";
+
+        // TODO
+        return null;
+    }
+
+    private EntityDef  getToDoEntity()
+    {
+        final String guid = "93dbc58d-c826-4bc2-b36f-195148d46f86";
+
+        // TODO
+        return null;
+    }
+
+    private RelationshipDef  getMeetingOnReferenceableRelationship()
+    {
+        final String guid = "a05f918e-e7e2-419d-8016-5b37406df63a";
+
+        // TODO
+        return null;
+    }
+
+    private RelationshipDef  getTodoOnReferenceableRelationship()
+    {
+        final String guid = "aca1277b-bf1c-42f5-9b3b-fbc2c9047325";
+
+        // TODO
+        return null;
+    }
+
+    private RelationshipDef  getProjectMeetingRelationship()
+    {
+        final String guid = "af2b5fab-8f83-4a2b-b749-1e6219f61f79";
+
+        // TODO
+        return null;
+    }
+
+    /*
+     * -------------------------------------------------------------------------------------------------------
+     */
+
+
+    /**
+     * 0140 Communities describe communities of people who have similar interests.
+     */
+    private void add0140Communities()
+    {
+        this.archiveBuilder.addEnumDef(getCommunityMembershipTypeEnum());
+
+        this.archiveBuilder.addEntityDef(getCommunityEntity());
+
+        this.archiveBuilder.addRelationshipDef(getCommunityMembershipRelationship());
+        this.archiveBuilder.addRelationshipDef(getCommunityResourcesRelationship());
+    }
+
+
+    private EnumDef  getCommunityMembershipTypeEnum()
+    {
+        final String guid = "b0ef45bf-d12b-4b6f-add6-59c14648d750";
+
+        // TODO
+        return null;
+    }
+
+    private EntityDef  getCommunityEntity()
+    {
+        final String guid = "fbd42379-f6c3-4f08-b6f7-378565cda993";
+
+        // TODO
+        return null;
+    }
+
+    private RelationshipDef  getCommunityMembershipRelationship()
+    {
+        final String guid = "7c7da1a3-01b3-473e-972e-606eff0cb112";
+
+        // TODO
+        return null;
+    }
+
+    private RelationshipDef  getCommunityResourcesRelationship()
+    {
+        final String guid = "484d4fb9-4927-4926-8e6d-03e6c9885254";
+
+        // TODO
+        return null;
+    }
+
+    /*
+     * -------------------------------------------------------------------------------------------------------
+     */
+
+
+    /**
+     * 0150 Feedback provides all of the collaborative feedback and attachments that can be made by the user
+     * community of the Assets.
+     */
+    private void add0150Feedback()
+    {
+        this.archiveBuilder.addEnumDef(getStarRatingEnum());
+        this.archiveBuilder.addEnumDef(getCommentTypeEnum());
+
+        this.archiveBuilder.addEntityDef(getRatingEntity());
+        this.archiveBuilder.addEntityDef(getCommentEntity());
+        this.archiveBuilder.addEntityDef(getLikeEntity());
+        this.archiveBuilder.addEntityDef(getInformalTagEntity());
+        this.archiveBuilder.addEntityDef(getPrivateTagEntity());
+
+        this.archiveBuilder.addRelationshipDef(getAttachRatingRelationship());
+        this.archiveBuilder.addRelationshipDef(getAttachedCommentRelationship());
+        this.archiveBuilder.addRelationshipDef(getAttachedLikeRelationship());
+        this.archiveBuilder.addRelationshipDef(getAcceptedAnswerRelationship());
+        this.archiveBuilder.addRelationshipDef(getAttachedTagRelationship());
+    }
+
+
+    private EnumDef  getStarRatingEnum()
+    {
+        final String guid = "77fea3ef-6ec1-4223-8408-38567e9d3c93";
+
+        // TODO
+        return null;
+    }
+
+    private EnumDef  getCommentTypeEnum()
+    {
+        final String guid = "06d5032e-192a-4f77-ade1-a4b97926e867";
+
+        // TODO
+        return null;
+    }
+
+    private EntityDef  getRatingEntity()
+    {
+        final String guid = "7299d721-d17f-4562-8286-bcd451814478";
+
+        // TODO
+        return null;
+    }
+
+    private EntityDef  getCommentEntity()
+    {
+        final String guid = "1a226073-9c84-40e4-a422-fbddb9b84278";
+
+        // TODO
+        return null;
+    }
+
+    private EntityDef  getLikeEntity()
+    {
+        final String guid = "deaa5ca0-47a0-483d-b943-d91c76744e01";
+
+        // TODO
+        return null;
+    }
+
+    private EntityDef  getInformalTagEntity()
+    {
+        final String guid = "ba846a7b-2955-40bf-952b-2793ceca090a";
+
+        // TODO
+        return null;
+    }
+
+    private EntityDef  getPrivateTagEntity()
+    {
+        final String guid = "9b3f5443-2475-4522-bfda-8f1f17e9a6c3";
+
+        // TODO
+        return null;
+    }
+
+    private RelationshipDef  getAttachRatingRelationship()
+    {
+        final String guid = "0aaad9e9-9cc5-4ad8-bc2e-c1099bab6344";
+
+        // TODO
+        return null;
+    }
+
+    private RelationshipDef  getAttachedCommentRelationship()
+    {
+        final String guid = "0d90501b-bf29-4621-a207-0c8c953bdac9";
+
+        // TODO
+        return null;
+    }
+
+    private RelationshipDef  getAttachedLikeRelationship()
+    {
+        final String guid = "e2509715-a606-415d-a995-61d00503dad4";
+
+        // TODO
+        return null;
+    }
+
+    private RelationshipDef  getAcceptedAnswerRelationship()
+    {
+        final String guid = "ecf1a3ca-adc5-4747-82cf-10ec590c5c69";
+
+        // TODO
+        return null;
+    }
+
+    private RelationshipDef  getAttachedTagRelationship()
+    {
+        final String guid = "4b1641c4-3d1a-4213-86b2-d6968b6c65ab";
+
+        // TODO
+        return null;
+    }
+
+
+
+    /*
+     * -------------------------------------------------------------------------------------------------------
+     */
+
+
+    /**
+     * 0160 Notes describes notelogs and notes within them.  Notes are kept but the owners/stewards working on the
+     * Assets.
+     */
+    private void add0160Notes()
+    {
+        this.archiveBuilder.addEntityDef(getNoteEntryEntity());
+        this.archiveBuilder.addEntityDef(getNoteLogEntity());
+
+        this.archiveBuilder.addRelationshipDef(getAttachedNoteLogRelationship());
+        this.archiveBuilder.addRelationshipDef(getAttachedNoteLogEntryRelationship());
+    }
+
+    private EntityDef  getNoteEntryEntity()
+    {
+        final String guid = "2a84d94c-ac6f-4be1-a72a-07dcec7b1fe3";
+
+        // TODO
+        return null;
+    }
+
+    private EntityDef  getNoteLogEntity()
+    {
+        final String guid = "646727c7-9ad4-46fa-b660-265489ad96c6";
+
+        // TODO
+        return null;
+    }
+
+    private RelationshipDef  getAttachedNoteLogRelationship()
+    {
+        final String guid = "4f798c0c-6769-4a2d-b489-d2714d89e0a4";
+
+        // TODO
+        return null;
+    }
+
+    private RelationshipDef  getAttachedNoteLogEntryRelationship()
+    {
+        final String guid = "38edecc6-f385-4574-8144-524a44e3e712";
+
+        // TODO
+        return null;
+    }
+
+    /*
+     * ========================================
+     * AREA 2 - connectors and assets
+     */
+
+    /**
+     * Area 2 covers the different types of Assets and the Connection information used by the Open Connector Framework
+     * (OCF).
+     */
+    private void addArea2Types()
+    {
+        this.add0201ConnectorsAndConnections();
+        this.add0205ConnectionLinkage();
+        this.add0210DataStores();
+        this.add0211DataSets();
+        this.add0212DeployedAPIs();
+        this.add0215SoftwareComponents();
+        this.add0217AutomatedProcesses();
+        this.add0220FilesAndFolders();
+        this.add0221DocumentStores();
+        this.add0222GraphStores();
+        this.add0223EventsAndLogs();
+        this.add0224Databases();
+        this.add0225MetadataRepositories();
+        this.add0227Keystores();
+        this.add0230CodeTables();
+        this.add0235InfomationView();
+        this.add0237InformationSet();
+        this.add0239Reports();
+        this.add0240ApplicationsAndProcesses();
+        this.add0250DataProcessingEngines();
+        this.add0260Transformations();
+        this.add0265AnalyticsAssets();
+        this.add0270IoTAssets();
+        this.add0280ModelAssets();
+    }
+
+    /*
+     * -------------------------------------------------------------------------------------------------------
+     */
+
+    /**
+     * 0201 Connectors and Connections defines the details of the Connection that describes the connector type
+     * and endpoint for a specific connector instance.
+     */
+    void add0201ConnectorsAndConnections()
+    {
+        this.archiveBuilder.addEntityDef(getConnectionEntity());
+        this.archiveBuilder.addEntityDef(getConnectorTypeEntity());
+
+        this.archiveBuilder.addRelationshipDef(getConnectionEndpointRelationship());
+        this.archiveBuilder.addRelationshipDef(getConnectionConnectorTypeRelationship());
+    }
+
+    private EntityDef  getConnectionEntity()
+    {
+        final String guid = "114e9f8f-5ff3-4c32-bd37-a7eb42712253";
+
+        // TODO
+        return null;
+    }
+
+    private EntityDef  getConnectorTypeEntity()
+    {
+        final String guid = "954421eb-33a6-462d-a8ca-b5709a1bd0d4";
+
+        // TODO
+        return null;
+    }
+
+    private RelationshipDef  getConnectionEndpointRelationship()
+    {
+        final String guid = "887a7132-d6bc-4b92-a483-e80b60c86fb2";
+
+        // TODO
+        return null;
+    }
+
+    private RelationshipDef  getConnectionConnectorTypeRelationship()
+    {
+        final String guid = "e542cfc1-0b4b-42b9-9921-f0a5a88aaf96";
+
+        // TODO
+        return null;
+    }
+
+
+    /*
+     * -------------------------------------------------------------------------------------------------------
+     */
+
+    /**
+     * 0205 Connection Links defines the relationship between the connection and an Asset, plus the nesting
+     * of connections for information virtualization support.
+     */
+    void add0205ConnectionLinkage()
+    {
+        this.archiveBuilder.addEntityDef(getVirtualConnectionEntity());
+
+        this.archiveBuilder.addRelationshipDef(getEmbeddedConnectionRelationship());
+        this.archiveBuilder.addRelationshipDef(getConnectionsToAssetRelationship());
+    }
+
+    private EntityDef  getVirtualConnectionEntity()
+    {
+        final String guid = "82f9c664-e59d-484c-a8f3-17088c23a2f3";
+
+        // TODO
+        return null;
+    }
+
+    private RelationshipDef  getEmbeddedConnectionRelationship()
+    {
+        final String guid = "eb6dfdd2-8c6f-4f0d-a17d-f6ce4799f64f";
+
+        // TODO
+        return null;
+    }
+
+    private RelationshipDef  getConnectionsToAssetRelationship()
+    {
+        final String guid = "e777d660-8dbe-453e-8b83-903771f054c0";
+
+        // TODO
+        return null;
+    }
+
+    /*
+     * -------------------------------------------------------------------------------------------------------
+     *

<TRUNCATED>