@Override public ClassDescriptorMap getClassDescriptorMap() { if (classDescriptorMap == null) { ClassDescriptorMap classDescriptorMap = new ClassDescriptorMap(this); classDescriptorMap.addFactory(new ValueHolderDescriptorFactory( classDescriptorMap)); // since ClassDescriptorMap is not synchronized, we need to prefill it with // entity proxies here. for (DataMap map : maps) { for (String entityName : map.getObjEntityMap().keySet()) { classDescriptorMap.getDescriptor(entityName); } } this.classDescriptorMap = classDescriptorMap; } return classDescriptorMap; } }
/** * Creates a descriptor wrapper that will compile the underlying descriptor * on demand. Using proxy indirection is needed to compile relationships of * descriptors to other descriptors that are not compiled yet. */ protected ClassDescriptor createProxyDescriptor(String entityName) { ClassDescriptor descriptor = new LazyClassDescriptorDecorator(this, entityName); addDescriptor(entityName, descriptor); return descriptor; }
/** * Checks whether decorated descriptor is initialized, and if not, creates it using * parent {@link ClassDescriptorMap}. */ protected void checkDescriptorInitialized() { if (descriptor == null) { descriptor = descriptorMap.createDescriptor(entityName); } }
/** * Returns ClassDescriptor for the ObjEntity matching the name. Returns null * if no matching entity exists. * * @since 1.2 */ public ClassDescriptor getClassDescriptor(String entityName) { if (entityName == null) { throw new IllegalArgumentException("Null entityName"); } return getClassDescriptorMap().getDescriptor(entityName); }
protected ClassDescriptor getDescriptor(ObjEntity entity, Class<?> entityClass) { String superEntityName = entity.getSuperEntityName(); ClassDescriptor superDescriptor = (superEntityName != null) ? descriptorMap.getDescriptor(superEntityName) : null; EntityInheritanceTree inheritanceTree = descriptorMap.getResolver().getInheritanceTree( descriptor.getEntity().getName()); descriptor.setEntityInheritanceTree(inheritanceTree);
public Class<?> getObjectClass() { // note that we can resolve Object class without triggering descriptor resolution. // This is very helpful when compiling POJO relationships if (descriptor == null) { ObjEntity entity = descriptorMap.getResolver().getObjEntity(entityName); if (entity != null) { return entity.getJavaClass(); } } checkDescriptorInitialized(); return descriptor.getObjectClass(); }
/** * Caches descriptor definition. */ public void addDescriptor(String entityName, ClassDescriptor descriptor) { if (descriptor == null) { removeDescriptor(entityName); } else { descriptors.put(entityName, descriptor); } }
public ClassDescriptor getDescriptor(String entityName) { if (entityName == null) { throw new NullPointerException("Null 'entityName'"); } ClassDescriptor cached = descriptors.get(entityName); if (cached != null) { return cached; } return createProxyDescriptor(entityName); }
@Override protected void createToManySetProperty( PersistentDescriptor descriptor, ObjRelationship relationship) { ClassDescriptor targetDescriptor = descriptorMap.getDescriptor(relationship .getTargetEntityName()); descriptor.addDeclaredProperty(new DataObjectToManyProperty( relationship, targetDescriptor, faultFactory.getSetFault())); }
public ClassDescriptor getDescriptor(String entityName) { ObjEntity entity = descriptorMap.getResolver().getObjEntity(entityName); if (entity == null) { throw new CayenneRuntimeException("Unmapped entity: %s", entityName); } Class<?> entityClass = entity.getJavaClass(); return getDescriptor(entity, entityClass); }
/** * Returns an object that compiles and stores {@link ClassDescriptor} * instances for all entities. * * @since 3.0 */ public ClassDescriptorMap getClassDescriptorMap() { if (classDescriptorMap == null) { synchronized (this) { if (classDescriptorMap == null) { ClassDescriptorMap classDescriptorMap = new ClassDescriptorMap(this); FaultFactory faultFactory = new SingletonFaultFactory(); // add factories in reverse of the desired chain order classDescriptorMap.addFactory(new ValueHolderDescriptorFactory(classDescriptorMap)); classDescriptorMap.addFactory(new DataObjectDescriptorFactory(classDescriptorMap, faultFactory)); // since ClassDescriptorMap is not synchronized, we need to // prefill // it with entity proxies here. for (DataMap map : maps) { for (String entityName : map.getObjEntityMap().keySet()) { classDescriptorMap.getDescriptor(entityName); } } this.classDescriptorMap = classDescriptorMap; } } } return classDescriptorMap; }
@Override protected void createToManyCollectionProperty( PersistentDescriptor descriptor, ObjRelationship relationship) { ClassDescriptor targetDescriptor = descriptorMap.getDescriptor(relationship .getTargetEntityName()); descriptor.addDeclaredProperty(new DataObjectToManyProperty( relationship, targetDescriptor, faultFactory.getCollectionFault())); }
@Override protected void createToManyListProperty( PersistentDescriptor descriptor, ObjRelationship relationship) { ClassDescriptor targetDescriptor = descriptorMap.getDescriptor(relationship .getTargetEntityName()); descriptor.addDeclaredProperty(new DataObjectToManyProperty( relationship, targetDescriptor, faultFactory.getListFault())); }
@Override protected void createToOneProperty( PersistentDescriptor descriptor, ObjRelationship relationship) { ClassDescriptor targetDescriptor = descriptorMap.getDescriptor(relationship .getTargetEntityName()); descriptor.addDeclaredProperty(new DataObjectToOneProperty( relationship, targetDescriptor, faultFactory.getToOneFault())); }
@Override protected void createToManyMapProperty( PersistentDescriptor descriptor, ObjRelationship relationship) { ClassDescriptor targetDescriptor = descriptorMap.getDescriptor(relationship .getTargetEntityName()); Accessor mapKeyAccessor = createMapKeyAccessor(relationship, targetDescriptor); descriptor.addDeclaredProperty(new DataObjectToManyMapProperty( relationship, targetDescriptor, faultFactory.getMapFault(mapKeyAccessor), mapKeyAccessor)); }
@Override protected void createToManyCollectionProperty( PersistentDescriptor descriptor, ObjRelationship relationship) { ClassDescriptor targetDescriptor = descriptorMap.getDescriptor(relationship .getTargetEntityName()); String reverseName = relationship.getReverseRelationshipName(); Accessor accessor = createAccessor(descriptor, relationship.getName(), List.class); descriptor.addDeclaredProperty(new ValueHolderListProperty( descriptor, targetDescriptor, accessor, reverseName)); }
protected void indexSubclassDescriptors(PersistentDescriptor descriptor, EntityInheritanceTree inheritanceTree) { if (inheritanceTree != null) { for (EntityInheritanceTree child : inheritanceTree.getChildren()) { ObjEntity childEntity = child.getEntity(); descriptor.addSubclassDescriptor(childEntity.getClassName(), descriptorMap.getDescriptor(childEntity.getName())); indexSubclassDescriptors(descriptor, child); } } }
@Override protected void createToManySetProperty( PersistentDescriptor descriptor, ObjRelationship relationship) { ClassDescriptor targetDescriptor = descriptorMap.getDescriptor(relationship .getTargetEntityName()); String reverseName = relationship.getReverseRelationshipName(); Accessor accessor = createAccessor(descriptor, relationship.getName(), Set.class); descriptor.addDeclaredProperty(new ValueHolderSetProperty( descriptor, targetDescriptor, accessor, reverseName)); }
@Override protected void createToManyListProperty( PersistentDescriptor descriptor, ObjRelationship relationship) { ClassDescriptor targetDescriptor = descriptorMap.getDescriptor(relationship .getTargetEntityName()); String reverseName = relationship.getReverseRelationshipName(); Accessor accessor = createAccessor(descriptor, relationship.getName(), List.class); descriptor.addDeclaredProperty(new ValueHolderListProperty( descriptor, targetDescriptor, accessor, reverseName)); }
@Override protected void createToOneProperty( PersistentDescriptor descriptor, ObjRelationship relationship) { ClassDescriptor targetDescriptor = descriptorMap.getDescriptor(relationship .getTargetEntityName()); String reverseName = relationship.getReverseRelationshipName(); Accessor accessor = createAccessor( descriptor, relationship.getName(), ValueHolder.class); PropertyDescriptor property = new ValueHolderProperty( descriptor, targetDescriptor, accessor, reverseName); descriptor.addDeclaredProperty(property); } }