/** Invoked by transformed DSL creation rules */ public <T> void create(String modelPathString, Class<T> type, Closure<?> closure) { SourceLocation sourceLocation = ruleLocationExtractor.transform(closure); ModelPath modelPath = ModelPath.path(modelPathString); ModelRuleDescriptor descriptor = toDescriptor(sourceLocation, modelPath); try { NodeInitializerRegistry nodeInitializerRegistry = modelRegistry.realize( DefaultNodeInitializerRegistry.DEFAULT_REFERENCE.getPath(), DefaultNodeInitializerRegistry.DEFAULT_REFERENCE.getType()); NodeInitializer nodeInitializer = nodeInitializerRegistry.getNodeInitializer(ModelType.of(type)); modelRegistry.create( ModelCreators.of(modelPath, nodeInitializer).descriptor(descriptor).build()); } catch (ModelTypeInitializationException e) { throw new InvalidModelRuleDeclarationException(descriptor, e); } registerAction(modelPath, type, descriptor, ModelActionRole.Initialize, closure); }
private static <P> ModelRegistrations.Builder managedRegistrationBuilder( ModelPath childPath, ManagedProperty<P> property, NodeInitializerRegistry nodeInitializerRegistry, ModelType<?> publicType) { return ModelRegistrations.of( childPath, nodeInitializerRegistry.getNodeInitializer( forProperty(property.getType(), property, publicType))); }
private <P> void validateProperty( ModelSchema<P> propertySchema, ManagedProperty<P> property, NodeInitializerRegistry nodeInitializerRegistry) { if (propertySchema instanceof ManagedImplSchema) { if (!property.isWritable()) { if (isCollectionOfManagedTypes(propertySchema)) { CollectionSchema<P, ?> propertyCollectionsSchema = (CollectionSchema<P, ?>) propertySchema; ModelType<?> elementType = propertyCollectionsSchema.getElementType(); nodeInitializerRegistry.ensureHasInitializer( forProperty(elementType, property, bindings.getPublicSchema().getType())); } if (property.isDeclaredAsHavingUnmanagedType()) { throw new UnmanagedPropertyMissingSetterException(property.getName()); } } } else if (!shouldHaveANodeInitializer(property, propertySchema) && !property.isWritable() && !isNamePropertyOfANamedType(property)) { throw new ReadonlyImmutableManagedPropertyException( bindings.getPublicSchema().getType(), property.getName(), property.getType()); } }