use of org.qi4j.api.common.MetaInfo in project qi4j-sdk by Qi4j.
the class ValueTypeFactory method newValueType.
@SuppressWarnings({ "raw", "unchecked" })
public ValueType newValueType(Type type, Class declaringClass, Class compositeType, LayerModel layer, ModuleModel module) {
ValueType valueType = null;
if (CollectionType.isCollection(type)) {
if (type instanceof ParameterizedType) {
ParameterizedType pt = (ParameterizedType) type;
Type collectionType = pt.getActualTypeArguments()[0];
if (collectionType instanceof TypeVariable) {
TypeVariable collectionTypeVariable = (TypeVariable) collectionType;
collectionType = Classes.resolveTypeVariable(collectionTypeVariable, declaringClass, compositeType);
}
ValueType collectedType = newValueType(collectionType, declaringClass, compositeType, layer, module);
valueType = new CollectionType(Classes.RAW_CLASS.map(type), collectedType);
} else {
valueType = new CollectionType(Classes.RAW_CLASS.map(type), newValueType(Object.class, declaringClass, compositeType, layer, module));
}
} else if (MapType.isMap(type)) {
if (type instanceof ParameterizedType) {
ParameterizedType pt = (ParameterizedType) type;
Type keyType = pt.getActualTypeArguments()[0];
if (keyType instanceof TypeVariable) {
TypeVariable keyTypeVariable = (TypeVariable) keyType;
keyType = Classes.resolveTypeVariable(keyTypeVariable, declaringClass, compositeType);
}
ValueType keyedType = newValueType(keyType, declaringClass, compositeType, layer, module);
Type valType = pt.getActualTypeArguments()[1];
if (valType instanceof TypeVariable) {
TypeVariable valueTypeVariable = (TypeVariable) valType;
valType = Classes.resolveTypeVariable(valueTypeVariable, declaringClass, compositeType);
}
ValueType valuedType = newValueType(valType, declaringClass, compositeType, layer, module);
valueType = new MapType(Classes.RAW_CLASS.map(type), keyedType, valuedType);
} else {
valueType = new MapType(Classes.RAW_CLASS.map(type), newValueType(Object.class, declaringClass, compositeType, layer, module), newValueType(Object.class, declaringClass, compositeType, layer, module));
}
} else if (ValueCompositeType.isValueComposite(type)) {
// Find ValueModel in module/layer/used layers
ValueModel model = new ValueFinder(layer, module, Classes.RAW_CLASS.map(type)).getFoundModel();
if (model == null) {
if (type.equals(ValueComposite.class)) {
// Create default model
MixinsModel mixinsModel = new MixinsModel();
Iterable valueComposite = (Iterable) Iterables.iterable(ValueComposite.class);
ValueStateModel valueStateModel = new ValueStateModel(new PropertiesModel(), new AssociationsModel(), new ManyAssociationsModel(), new NamedAssociationsModel());
model = new ValueModel(valueComposite, Visibility.application, new MetaInfo(), mixinsModel, valueStateModel, new CompositeMethodsModel(mixinsModel));
} else {
throw new InvalidApplicationException("[" + module.name() + "] Could not find ValueComposite of type " + type);
}
}
return model.valueType();
} else if (EnumType.isEnum(type)) {
valueType = new EnumType(Classes.RAW_CLASS.map(type));
} else {
valueType = new ValueType(Classes.RAW_CLASS.map(type));
}
return valueType;
}
use of org.qi4j.api.common.MetaInfo in project qi4j-sdk by Qi4j.
the class MetaInfoDeclaration method metaInfoFor.
@Override
public MetaInfo metaInfoFor(AccessibleObject accessor) {
for (Map.Entry<Class<?>, InfoHolder<?>> entry : mixinPropertyDeclarations.entrySet()) {
InfoHolder<?> holder = entry.getValue();
MetaInfo metaInfo = holder.metaInfoFor(accessor);
if (metaInfo != null) {
Class<?> mixinType = entry.getKey();
return metaInfo.withAnnotations(mixinType).withAnnotations(accessor).withAnnotations(accessor instanceof Method ? ((Method) accessor).getReturnType() : ((Field) accessor).getType());
}
}
// TODO is this code reached at all??
Class<?> declaringType = ((Member) accessor).getDeclaringClass();
return new MetaInfo().withAnnotations(declaringType).withAnnotations(accessor).withAnnotations(accessor instanceof Method ? ((Method) accessor).getReturnType() : ((Field) accessor).getType());
}
use of org.qi4j.api.common.MetaInfo in project qi4j-sdk by Qi4j.
the class EntityAssemblyImpl method newAssociationModel.
public AssociationModel newAssociationModel(AccessibleObject accessor, Iterable<Class<? extends Constraint<?, ?>>> constraintClasses) {
Iterable<Annotation> annotations = Annotations.findAccessorAndTypeAnnotationsIn(accessor);
boolean optional = first(filter(isType(Optional.class), annotations)) != null;
// Constraints for Association references
ValueConstraintsModel valueConstraintsModel = constraintsFor(annotations, GenericAssociationInfo.associationTypeOf(accessor), ((Member) accessor).getName(), optional, constraintClasses, accessor);
ValueConstraintsInstance valueConstraintsInstance = null;
if (valueConstraintsModel.isConstrained()) {
valueConstraintsInstance = valueConstraintsModel.newInstance();
}
// Constraints for the Association itself
valueConstraintsModel = constraintsFor(annotations, Association.class, ((Member) accessor).getName(), optional, constraintClasses, accessor);
ValueConstraintsInstance associationValueConstraintsInstance = null;
if (valueConstraintsModel.isConstrained()) {
associationValueConstraintsInstance = valueConstraintsModel.newInstance();
}
MetaInfo metaInfo = associationDeclarations.metaInfoFor(accessor);
AssociationModel associationModel = new AssociationModel(accessor, valueConstraintsInstance, associationValueConstraintsInstance, metaInfo);
return associationModel;
}
use of org.qi4j.api.common.MetaInfo in project qi4j-sdk by Qi4j.
the class EntityAssemblyImpl method newNamedAssociationModel.
public NamedAssociationModel newNamedAssociationModel(AccessibleObject accessor, Iterable<Class<? extends Constraint<?, ?>>> constraintClasses) {
Iterable<Annotation> annotations = Annotations.findAccessorAndTypeAnnotationsIn(accessor);
boolean optional = first(filter(isType(Optional.class), annotations)) != null;
// Constraints for entities in NamedAssociation
ValueConstraintsModel valueConstraintsModel = constraintsFor(annotations, GenericAssociationInfo.associationTypeOf(accessor), ((Member) accessor).getName(), optional, constraintClasses, accessor);
ValueConstraintsInstance valueConstraintsInstance = null;
if (valueConstraintsModel.isConstrained()) {
valueConstraintsInstance = valueConstraintsModel.newInstance();
}
// Constraints for the NamedAssociation itself
valueConstraintsModel = constraintsFor(annotations, NamedAssociation.class, ((Member) accessor).getName(), optional, constraintClasses, accessor);
ValueConstraintsInstance namedValueConstraintsInstance = null;
if (valueConstraintsModel.isConstrained()) {
namedValueConstraintsInstance = valueConstraintsModel.newInstance();
}
MetaInfo metaInfo = namedAssociationDeclarations.metaInfoFor(accessor);
NamedAssociationModel associationModel = new NamedAssociationModel(accessor, valueConstraintsInstance, namedValueConstraintsInstance, metaInfo);
return associationModel;
}
use of org.qi4j.api.common.MetaInfo in project qi4j-sdk by Qi4j.
the class EntityAssemblyImpl method newPropertyModel.
@Override
protected PropertyModel newPropertyModel(AccessibleObject accessor, Iterable<Class<? extends Constraint<?, ?>>> constraintClasses) {
Iterable<Annotation> annotations = Annotations.findAccessorAndTypeAnnotationsIn(accessor);
boolean optional = first(filter(isType(Optional.class), annotations)) != null;
ValueConstraintsModel valueConstraintsModel = constraintsFor(annotations, GenericPropertyInfo.propertyTypeOf(accessor), ((Member) accessor).getName(), optional, constraintClasses, accessor);
ValueConstraintsInstance valueConstraintsInstance = null;
if (valueConstraintsModel.isConstrained()) {
valueConstraintsInstance = valueConstraintsModel.newInstance();
}
MetaInfo metaInfo = stateDeclarations.metaInfoFor(accessor);
Object defaultValue = stateDeclarations.initialValueOf(accessor);
boolean useDefaults = metaInfo.get(UseDefaults.class) != null || stateDeclarations.useDefaults(accessor);
boolean immutable = this.immutable || metaInfo.get(Immutable.class) != null;
PropertyModel propertyModel = new PropertyModel(accessor, immutable, useDefaults, valueConstraintsInstance, metaInfo, defaultValue);
return propertyModel;
}
Aggregations