use of org.whole.lang.pojo.model.Type in project whole by wholeplatform.
the class PojoUtils method create.
@SuppressWarnings("unchecked")
public static <E extends IEntity> E create(Object fromObject, Type type, Library library) {
// map product type
ProductDeclaration productDeclaration = findProductDeclaration(type, library);
E toIEntity = PojoUtils.<E>createEntity(productDeclaration, library);
// translate contents as needed
switch(productDeclaration.wGetEntityDescriptor().getOrdinal()) {
case PojoDeclaration_ord:
translate(fromObject, toIEntity, (PojoDeclaration) productDeclaration, library);
break;
case EnumDeclaration_ord:
EnumValue enumValue = DefaultDataTypePersistenceParser.instance.parseEnumValue(toIEntity.wGetEntityDescriptor(), fromObject.toString());
toIEntity.wSetValue(enumValue);
break;
case // TODO
AnnotationDeclaration_ord:
break;
case DataTypeDeclaration_ord:
Type elementType;
switch(type.wGetEntityDescriptor().getOrdinal()) {
case PrimitiveType_ord:
case ReferenceType_ord:
toIEntity.wSetValue(fromObject);
break;
case ArrayType_ord:
ArrayType arrayType = (ArrayType) type;
elementType = arrayType.getElementType();
for (int i = 0; i < Array.getLength(fromObject); i++) toIEntity.wAdd(create(Array.get(fromObject, i), elementType, library));
break;
case CollectionType_ord:
CollectionType collectionType = (CollectionType) type;
Collection<Object> fromCollection = (Collection<Object>) fromObject;
elementType = collectionType.getElementType();
for (Object element : fromCollection) toIEntity.wAdd(create(element, elementType, library));
break;
case MapType_ord:
MapType mapType = (MapType) type;
Map<Object, Object> fromMap = (Map<Object, Object>) fromObject;
Type keyType = mapType.getKeyType();
elementType = mapType.getValueType();
for (Entry<Object, Object> element : fromMap.entrySet()) // FIXME workaround for Java 8 compiler
toIEntity.wSet(// FIXME workaround for Java 8 compiler
(IEntity) create(element.getKey(), keyType, library), create(element.getValue(), elementType, library));
break;
}
break;
}
return toIEntity;
}
use of org.whole.lang.pojo.model.Type in project whole by wholeplatform.
the class PojoUtils method create.
/*
* expects a normalized library
*/
public static Object create(IEntity fromEntity, Library library) {
// find product type
EntityDescriptor<?> ed = fromEntity.wGetEntityDescriptor();
ProductDeclaration productDeclaration = findProductDeclarationByTemplateName(ed, library);
if (productDeclaration == null)
throw new IllegalStateException("Cannot find type mapping for entity: " + fromEntity);
// translate contents as needed
Object toObject = null;
switch(productDeclaration.wGetEntityDescriptor().getOrdinal()) {
case PojoDeclaration_ord:
toObject = createInstance(fromEntity, (PojoDeclaration) productDeclaration, library);
translate(fromEntity, toObject, (PojoDeclaration) productDeclaration, library);
break;
case EnumDeclaration_ord:
String enumValue = DefaultDataTypePersistenceParser.instance.unparseEnumValue(fromEntity.wGetEntityDescriptor(), fromEntity.wEnumValue());
toObject = createEnumValue((EnumDeclaration) productDeclaration, enumValue);
break;
case // TODO
AnnotationDeclaration_ord:
break;
case DataTypeDeclaration_ord:
Type type = ((DataTypeDeclaration) productDeclaration).getName();
switch(type.wGetEntityDescriptor().getOrdinal()) {
case PrimitiveType_ord:
case ReferenceType_ord:
toObject = fromEntity.wGetValue();
break;
case ArrayType_ord:
toObject = Array.newInstance(getClass(((ArrayType) type).getElementType()), fromEntity.wSize());
for (int i = 0; i < fromEntity.wSize(); i++) {
IEntity element = fromEntity.wGet(i);
Array.set(toObject, i, create(element, library));
}
break;
case CollectionType_ord:
Collection<Object> toCollection = ((CollectionType) type).getCollectionInterface().getValue().equals(CollectionInterfaceEnum.Set) ? new HashSet<Object>() : new ArrayList<Object>();
IEntityIterator<IEntity> ci = IteratorFactory.childIterator();
ci.reset(fromEntity);
for (IEntity feature : ci) toCollection.add(create(feature, library));
toObject = toCollection;
break;
case MapType_ord:
Map<Object, Object> toMap = new HashMap<Object, Object>();
for (int i = 0; i < fromEntity.wSize(); i++) {
IEntity key = fromEntity.wGet(i);
IEntity value = fromEntity.wGet(key);
toMap.put(create(key, library), create(value, library));
}
toObject = toMap;
break;
}
break;
}
return toObject;
}
use of org.whole.lang.pojo.model.Type in project whole by wholeplatform.
the class PojoNormalizerVisitor method createDefaultTypeInParameters.
public static void createDefaultTypeInParameters(Library entity, IBindingManager bindings) {
Path findAllParametersWithoutType = (Path) PojoTemplateManager.instance().create("findAllParametersWithoutType");
Path findParameterType = (Path) PojoTemplateManager.instance().create("findPropertyType");
bindings.wEnterScope();
for (Parameter parameter : BehaviorUtils.<Parameter>compileAndLazyEvaluate(findAllParametersWithoutType, entity, bindings)) {
PojoDeclaration pojo = (PojoDeclaration) bindings.wGet("pojo");
Type type = BehaviorUtils.<Type>evaluateFirstResult(findParameterType, pojo, bindings);
if (type != null)
parameter.setType(EntityUtils.clone(type));
else
throw new IllegalArgumentException("Missing " + bindings.wStringValue("name") + " property in " + pojo.getName().wStringValue() + " pojo declaration");
}
bindings.wExitScope();
}
use of org.whole.lang.pojo.model.Type in project whole by wholeplatform.
the class PojoNormalizerVisitor method addMappingDataTypes.
public static void addMappingDataTypes(Library entity, IBindingManager bindings, FreshNameGenerator entityNameGenerator) {
Path findNonPrimitiveTypes = (Path) PojoTemplateManager.instance().create("findAllPropertyTypes");
bindings.wEnterScope();
for (Type type : BehaviorUtils.<Type>compileAndLazyEvaluate(findNonPrimitiveTypes, entity, bindings)) addMappingDataType(type, entity, bindings, entityNameGenerator);
bindings.wExitScope();
}
use of org.whole.lang.pojo.model.Type in project whole by wholeplatform.
the class Helpers method toPojoType.
public static Type toPojoType(IEntity javaType, IEntity packageName) {
PojoEntityFactory pef = PojoEntityFactory.instance;
switch(javaType.wGetEntityDescriptor().getOrdinal()) {
case JavaEntityDescriptorEnum.SimpleType_ord:
case JavaEntityDescriptorEnum.QualifiedType_ord:
String javaTypeName = DataTypeUtils.getAsPersistenceString(javaType);
String packageNameString = packageName.wStringValue();
String typeName = (javaTypeName.indexOf('.') == -1 ? (StringUtils.isAmbiguous(javaTypeName) ? "java.lang" : packageNameString) + "." : "") + javaTypeName;
if (StringUtils.isString(typeName))
return pef.createPrimitiveType(PrimitiveTypeEnum.String);
else if ("java.util.Set".equals(typeName))
return pef.createCollectionType(pef.createCollectionInterface(CollectionInterfaceEnum.Set), pef.createReferenceType("java.lang.Object"));
else if ("java.util.List".equals(typeName))
return pef.createCollectionType(pef.createCollectionInterface(CollectionInterfaceEnum.List), pef.createReferenceType("java.lang.Object"));
else if ("java.util.Map".equals(typeName))
return pef.createMapType(pef.createReferenceType("java.lang.Object"), pef.createReferenceType("java.lang.Object"));
else
return pef.createReferenceType(typeName);
case JavaEntityDescriptorEnum.PrimitiveType_ord:
return (Type) DataTypeUtils.convertCloneIfParented(JavaEntityFactory.instance.createPrimitiveType(((PrimitiveType) javaType).getValue()), PojoEntityDescriptorEnum.PrimitiveType);
case JavaEntityDescriptorEnum.ArrayType_ord:
ArrayType arrayType = (ArrayType) javaType;
return pef.createArrayType(toPojoType(arrayType.getComponentType(), packageName));
case JavaEntityDescriptorEnum.ParameterizedType_ord:
ParameterizedType parameterizedType = (ParameterizedType) javaType;
Types typeArguments = parameterizedType.getTypeArguments();
Type pojoType = toPojoType(parameterizedType.getType(), packageName);
if (Matcher.matchImpl(PojoEntityDescriptorEnum.CollectionType, pojoType) && typeArguments.wSize() == 1)
((CollectionType) pojoType).setElementType(toPojoType(typeArguments.wGet(0), packageName));
else if (Matcher.matchImpl(PojoEntityDescriptorEnum.MapType, pojoType) && typeArguments.wSize() == 2) {
((MapType) pojoType).setKeyType(toPojoType(typeArguments.wGet(0), packageName));
((MapType) pojoType).setValueType(toPojoType(typeArguments.wGet(1), packageName));
}
return pojoType;
default:
throw new IllegalStateException("cannot convert java type to pojo type: " + javaType);
}
}
Aggregations