use of org.whole.lang.pojo.model.Constructor in project whole by wholeplatform.
the class PojoUtils method findConstructor.
public static Constructor findConstructor(PojoDeclaration pojoDeclaration) {
IBindingManager bindings = BindingManagerFactory.instance.createArguments();
Expression findParameterByTemplate = (Expression) PojoTemplateManager.instance().create("findParameterByTemplate");
List<Constructor> constructors = getConstructors(pojoDeclaration);
int[] supportedFields = new int[constructors.size()];
Expression findAllReadOnlyFields = (Expression) PojoTemplateManager.instance().create("findAllReadOnlyFields");
IEntityIterator<Name> iterator = BehaviorUtils.<Name>compileAndLazyEvaluate(findAllReadOnlyFields, pojoDeclaration, bindings);
int readOnlyFieldCount = 0;
while (iterator.hasNext()) {
iterator.next();
for (int i = 0; i < supportedFields.length; i++) if (BehaviorUtils.evaluateFirstResult(findParameterByTemplate, constructors.get(i), bindings) != null)
supportedFields[i]++;
readOnlyFieldCount++;
}
for (int i = 0; i < supportedFields.length; i++) if (supportedFields[i] >= readOnlyFieldCount)
return constructors.get(i);
return constructors.get(supportedFields.length - 1);
}
use of org.whole.lang.pojo.model.Constructor in project whole by wholeplatform.
the class ConstructorPart method getModelSpecificChildren.
protected List<IEntity> getModelSpecificChildren() {
List<IEntity> list = new ArrayList<IEntity>(1);
Constructor entity = getModelEntity();
list.add(entity.getParameters());
return list;
}
use of org.whole.lang.pojo.model.Constructor in project whole by wholeplatform.
the class PojoUtils method getConstructors.
public static List<Constructor> getConstructors(PojoDeclaration pojoDeclaration) {
Constructors constructors = pojoDeclaration.getConstructors();
List<Constructor> constructorsList = new ArrayList<Constructor>(constructors.wSize());
IEntityIterator<Constructor> i = IteratorFactory.<Constructor>childIterator();
i.reset(constructors);
for (Constructor constructor : i) constructorsList.add(constructor);
Collections.sort(constructorsList, new Comparator<Constructor>() {
public int compare(Constructor c1, Constructor c2) {
return c1.getParameters().wSize() - c2.getParameters().wSize();
}
});
return constructorsList;
}
use of org.whole.lang.pojo.model.Constructor in project whole by wholeplatform.
the class PojoUtils method createInstanceUsingConstructor.
public static Object createInstanceUsingConstructor(IEntity fromEntity, PojoDeclaration pojoDeclaration, Library library) throws Exception {
ReferenceType referenceType = pojoDeclaration.getName();
Class<?> clazz = Class.forName(referenceType.getValue(), true, ReflectionFactory.getPlatformClassLoader());
Constructor constructor = findConstructor(pojoDeclaration);
int params = constructor.getParameters().wSize();
List<Class<?>> parameterTypes = new ArrayList<Class<?>>(params);
List<Object> initargs = new ArrayList<Object>(params);
IBindingManager bindings = BindingManagerFactory.instance.createArguments();
Expression findPropertyByTemplate = (Expression) PojoTemplateManager.instance().create("findPropertyByTemplate");
Expression findParameterByTemplate = (Expression) PojoTemplateManager.instance().create("findParameterByTemplate");
IEntityIterator<Parameter> iterator = BehaviorUtils.<Parameter>compileAndLazyEvaluate(findParameterByTemplate, constructor, bindings);
while (iterator.hasNext()) {
iterator.next();
Property property = BehaviorUtils.<Property>evaluateFirstResult(findPropertyByTemplate, pojoDeclaration, bindings);
Type type = property.getType();
Name template = property.getTemplate();
FeatureDescriptor fd = fromEntity.wGetEntityDescriptor().getFeatureDescriptorEnum().valueOf(template.wStringValue());
IEntity fieldEntity = fromEntity.wGet(fd);
parameterTypes.add(getClass(type));
initargs.add(Matcher.match(PrimitiveType, type) ? fieldEntity.wGetValue() : create(fieldEntity, library));
}
return clazz.getConstructor(parameterTypes.toArray(new Class<?>[0])).newInstance(initargs.toArray());
}
Aggregations