Search in sources :

Example 1 with TypeAlreadyExistsException

use of com.thinkbiganalytics.metadata.modeshape.TypeAlreadyExistsException in project kylo by Teradata.

the class JcrExtensibleTypeProvider method buildType.

/**
 * Builds the type defined by the specified builder.
 *
 * @param builder the builder for the type
 * @return the type
 * @throws MetadataRepositoryException if the repository is unavailable
 * @throws TypeAlreadyExistsException  if a type with the same name already exists
 */
@Nonnull
private ExtensibleType buildType(@Nonnull final TypeBuilder builder) {
    try {
        // Remove existing type and subgraph
        if (builder.node != null) {
            builder.node.remove();
        }
        // Get or create the type node
        final Session session = getSession();
        final Node typeNode;
        if (!session.nodeExists(JcrUtil.path(session.getRootNode().getPath(), ExtensionsConstants.TYPES + "/" + builder.name).toString())) {
            typeNode = session.getRootNode().addNode(ExtensionsConstants.TYPES + "/" + builder.name, ExtensionsConstants.TYPE_DESCRIPTOR_TYPE);
        } else {
            throw new TypeAlreadyExistsException(builder.name);
        }
        // Update type metadata
        if (builder.displayName != null) {
            typeNode.setProperty(JcrExtensibleType.NAME, builder.displayName);
        }
        if (builder.description != null) {
            typeNode.setProperty(JcrExtensibleType.DESCRIPTION, builder.description);
        }
        // Update type definition
        final NodeTypeManager typeMgr = session.getWorkspace().getNodeTypeManager();
        final NodeTypeTemplate nodeTemplate = typeMgr.createNodeTypeTemplate();
        nodeTemplate.setName(builder.name);
        if (builder.supertype != null) {
            final JcrExtensibleType superImpl = (JcrExtensibleType) builder.supertype;
            final String supername = superImpl.getJcrName();
            nodeTemplate.setDeclaredSuperTypeNames(new String[] { ExtensionsConstants.EXTENSIBLE_ENTITY_TYPE, supername });
        } else {
            nodeTemplate.setDeclaredSuperTypeNames(new String[] { ExtensionsConstants.EXTENSIBLE_ENTITY_TYPE });
        }
        // Update field definitions
        @SuppressWarnings("unchecked") final List<PropertyDefinitionTemplate> propertyDefinitionTemplates = nodeTemplate.getPropertyDefinitionTemplates();
        for (final FieldBuilder bldr : builder.fieldBuilders) {
            // Create field
            PropertyDefinitionTemplate propDef = typeMgr.createPropertyDefinitionTemplate();
            propDef.setName(bldr.name);
            propDef.setRequiredType(asCode(bldr.type));
            propDef.setMandatory(bldr.required);
            propDef.setMultiple(bldr.collection);
            propertyDefinitionTemplates.add(propDef);
            // Set field metadata
            Node fieldNode = typeNode.addNode(bldr.name, ExtensionsConstants.FIELD_DESCRIPTOR_TYPE);
            for (final Map.Entry<String, String> entry : bldr.metadata.entrySet()) {
                fieldNode.setProperty(entry.getKey(), entry.getValue());
            }
        }
        NodeType nodeType = typeMgr.registerNodeType(nodeTemplate, true);
        return new JcrExtensibleType(typeNode, nodeType);
    } catch (RepositoryException e) {
        throw new MetadataRepositoryException("Failed to create type: " + builder.name, e);
    }
}
Also used : MetadataRepositoryException(com.thinkbiganalytics.metadata.modeshape.MetadataRepositoryException) NodeTypeManager(javax.jcr.nodetype.NodeTypeManager) Node(javax.jcr.Node) MetadataRepositoryException(com.thinkbiganalytics.metadata.modeshape.MetadataRepositoryException) RepositoryException(javax.jcr.RepositoryException) NodeTypeTemplate(javax.jcr.nodetype.NodeTypeTemplate) PropertyDefinitionTemplate(javax.jcr.nodetype.PropertyDefinitionTemplate) TypeAlreadyExistsException(com.thinkbiganalytics.metadata.modeshape.TypeAlreadyExistsException) NodeType(javax.jcr.nodetype.NodeType) HashMap(java.util.HashMap) Map(java.util.Map) Session(javax.jcr.Session) Nonnull(javax.annotation.Nonnull)

Aggregations

MetadataRepositoryException (com.thinkbiganalytics.metadata.modeshape.MetadataRepositoryException)1 TypeAlreadyExistsException (com.thinkbiganalytics.metadata.modeshape.TypeAlreadyExistsException)1 HashMap (java.util.HashMap)1 Map (java.util.Map)1 Nonnull (javax.annotation.Nonnull)1 Node (javax.jcr.Node)1 RepositoryException (javax.jcr.RepositoryException)1 Session (javax.jcr.Session)1 NodeType (javax.jcr.nodetype.NodeType)1 NodeTypeManager (javax.jcr.nodetype.NodeTypeManager)1 NodeTypeTemplate (javax.jcr.nodetype.NodeTypeTemplate)1 PropertyDefinitionTemplate (javax.jcr.nodetype.PropertyDefinitionTemplate)1