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);
}
}
Aggregations