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 addPropertyLink( MutableModelNode modelNode, ManagedProperty<P> property, ModelSchemaStore schemaStore, NodeInitializerRegistry nodeInitializerRegistry) { ModelType<P> propertyType = property.getType(); ModelSchema<P> propertySchema = schemaStore.getSchema(propertyType); ModelType<T> publicType = bindings.getPublicSchema().getType(); validateProperty(propertySchema, property, nodeInitializerRegistry); ModelPath childPath = modelNode.getPath().child(property.getName()); if (propertySchema instanceof ManagedImplSchema) { if (!property.isWritable()) { ModelRegistrations.Builder builder = managedRegistrationBuilder(childPath, property, nodeInitializerRegistry, publicType); addLink(modelNode, builder, property.isInternal()); } else { if (propertySchema instanceof ScalarCollectionSchema) { ModelRegistrations.Builder builder = managedRegistrationBuilder(childPath, property, nodeInitializerRegistry, publicType); addLink(modelNode, builder, property.isInternal()); } else { modelNode.addReference(property.getName(), propertyType, modelNode.getDescriptor()); } } } else { ModelRegistrations.Builder registrationBuilder; if (shouldHaveANodeInitializer(property, propertySchema)) { registrationBuilder = managedRegistrationBuilder(childPath, property, nodeInitializerRegistry, publicType); } else { registrationBuilder = ModelRegistrations.of(childPath); } registrationBuilder.withProjection(new UnmanagedModelProjection<P>(propertyType)); addLink(modelNode, registrationBuilder, property.isInternal()); } }
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()); } }