package org.jboss.tools.hibernate.runtime.common; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import org.jboss.tools.hibernate.runtime.spi.IJoin; import org.jboss.tools.hibernate.runtime.spi.IPersistentClass; import org.jboss.tools.hibernate.runtime.spi.IProperty; import org.jboss.tools.hibernate.runtime.spi.ITable; import org.jboss.tools.hibernate.runtime.spi.IValue; public abstract class AbstractPersistentClassFacade extends AbstractFacade implements IPersistentClass { protected IProperty identifierProperty = null; protected IPersistentClass rootClass = null; protected HashSet<IProperty> propertyClosures = null; protected IPersistentClass superClass = null; protected HashMap<String, IProperty> properties = null; protected ITable table = null; protected IValue discriminator = null; protected IValue identifier = null; protected HashSet<IJoin> joins = null; protected IProperty version = null; protected HashSet<IPersistentClass> subclasses = null; protected ITable rootTable = null; public AbstractPersistentClassFacade( IFacadeFactory facadeFactory, Object target) { super(facadeFactory, target); } @Override public String getClassName() { return (String)Util.invokeMethod( getTarget(), "getClassName", new Class[] {}, new Object[] {}); } @Override public String getEntityName() { return (String)Util.invokeMethod( getTarget(), "getEntityName", new Class[] {}, new Object[] {}); } @Override public boolean isAssignableToRootClass() { return getRootClassClass().isAssignableFrom(getTarget().getClass()); } @Override public boolean isRootClass() { return getTarget().getClass() == getRootClassClass(); } @Override public IProperty getIdentifierProperty() { if (identifierProperty == null) { Object targetIdentifierProperty = Util.invokeMethod( getTarget(), "getIdentifierProperty", new Class[] {}, new Object[] {}); if (targetIdentifierProperty != null) { identifierProperty = getFacadeFactory().createProperty(targetIdentifierProperty); } } return identifierProperty; } @Override public boolean hasIdentifierProperty() { return (boolean)Util.invokeMethod( getTarget(), "hasIdentifierProperty", new Class[] {}, new Object[] {}); } @Override public boolean isInstanceOfRootClass() { return getRootClassClass().isAssignableFrom(getTarget().getClass()); } @Override public boolean isInstanceOfSubclass() { return getSubclassClass().isAssignableFrom(getTarget().getClass()); } @Override public IPersistentClass getRootClass() { if (rootClass == null) { Object targetRootClass = Util.invokeMethod( getTarget(), "getRootClass", new Class[] {}, new Object[] {}); if (targetRootClass != null) { rootClass = getFacadeFactory().createPersistentClass(targetRootClass); } } return rootClass; } @Override public Iterator<IProperty> getPropertyClosureIterator() { if (propertyClosures == null) { initializePropertyClosures(); } return propertyClosures.iterator(); } @Override public IPersistentClass getSuperclass() { if (superClass == null) { Object targetSuperclass = Util.invokeMethod( getTarget(), "getSuperclass", new Class[] {}, new Object[] {}); if (targetSuperclass != null) { superClass = getFacadeFactory().createPersistentClass(targetSuperclass); } } return superClass; } public void setSuperClass(IPersistentClass superClass) { this.superClass = superClass; } @Override public Iterator<IProperty> getPropertyIterator() { if (properties == null) { initializeProperties(); } return properties.values().iterator(); } @Override public IProperty getProperty(String string) { if (properties == null) { initializeProperties(); } return properties.get(string); } @Override public ITable getTable() { if (table == null) { Object targetTable = Util.invokeMethod( getTarget(), "getTable", new Class[] {}, new Object[] {}); if (targetTable != null) { table = getFacadeFactory().createTable(targetTable); } } return table; } @Override public Boolean isAbstract() { return (Boolean)Util.invokeMethod( getTarget(), "isAbstract", new Class[] {}, new Object[] {}); } @Override public IValue getDiscriminator() { if (discriminator == null) { Object targetDiscriminator = Util.invokeMethod( getTarget(), "getDiscriminator", new Class[] {}, new Object[] {}); if (discriminator != null) { discriminator = getFacadeFactory().createValue(targetDiscriminator); } } return discriminator; } @Override public IValue getIdentifier() { if (identifier == null) { Object targetIdentifier = Util.invokeMethod( getTarget(), "getIdentifier", new Class[] {}, new Object[] {}); if (targetIdentifier != null) { identifier = getFacadeFactory().createValue(targetIdentifier); } } return identifier; } @Override public Iterator<IJoin> getJoinIterator() { if (joins == null) { initializeJoins(); } return joins.iterator(); } @Override public IProperty getVersion() { if (version == null) { Object targetVersion = Util.invokeMethod( getTarget(), "getVersion", new Class[] {}, new Object[] {}); if (version != null) { version = getFacadeFactory().createProperty(targetVersion); } } return version; } @Override public void setClassName(String className) { Util.invokeMethod( getTarget(), "setClassName", new Class[] { String.class }, new Object[] { className }); } @Override public void setEntityName(String entityName) { Util.invokeMethod( getTarget(), "setEntityName", new Class[] { String.class }, new Object[] { entityName }); } @Override public void setDiscriminatorValue(String value) { Util.invokeMethod( getTarget(), "setDiscriminatorValue", new Class[] { String.class }, new Object[] { value }); } @Override public void setAbstract(Boolean b) { Util.invokeMethod( getTarget(), "setAbstract", new Class[] { Boolean.class }, new Object[] { b }); } @Override public void addProperty(IProperty property) { Object propertyTarget = Util.invokeMethod( property, "getTarget", new Class[] {}, new Object[] {}); Util.invokeMethod(getTarget(), "addProperty", new Class[] { getPropertyClass() }, new Object[] { propertyTarget }); properties = null; propertyClosures = null; } @Override public boolean isInstanceOfJoinedSubclass() { return getJoinedSubclassClass().isAssignableFrom(getTarget().getClass()); } @Override public void setTable(ITable table) { if (isInstanceOfRootClass() || isInstanceOfJoinedSubclass()) { Object tableTarget = Util.invokeMethod( table, "getTarget", new Class[] {}, new Object[] {}); Util.invokeMethod( getTarget(), "setTable", new Class[] { getTableClass() }, new Object[] { tableTarget }); } } @Override public void setKey(IValue value) { Object valueTarget = Util.invokeMethod( value, "getTarget", new Class[] {}, new Object[] {}); Util.invokeMethod( getTarget(), "setKey", new Class[] { getKeyValueClass() }, new Object[] { valueTarget }); } public boolean isInstanceOfSpecialRootClass() { return false; } @Override public IProperty getProperty() { throw new RuntimeException("getProperty() is only allowed on SpecialRootClass"); //$NON-NLS-1$ } @Override public IProperty getParentProperty() { throw new RuntimeException("getProperty() is only allowed on SpecialRootClass"); //$NON-NLS-1$ } @Override public void setIdentifierProperty(IProperty property) { Object propertyTarget = Util.invokeMethod( property, "getTarget", new Class[] {}, new Object[] {}); Util.invokeMethod( getTarget(), "setIdentifierProperty", new Class[] { getPropertyClass() }, new Object[] { propertyTarget }); identifierProperty = property; } @Override public void setIdentifier(IValue value) { Object valueTarget = Util.invokeMethod( value, "getTarget", new Class[] {}, new Object[] {}); Util.invokeMethod( getTarget(), "setIdentifier", new Class[] { getKeyValueClass() }, new Object[] { valueTarget }); identifier = value; } @Override public void setDiscriminator(IValue discr) { Object discrTarget = Util.invokeMethod( discr, "getTarget", new Class[] {}, new Object[] {}); Util.invokeMethod( getTarget(), "setDiscriminator", new Class[] { getValueClass() }, new Object[] { discrTarget }); discriminator = discr; } @Override public void setProxyInterfaceName(String name) { Util.invokeMethod( getTarget(), "setProxyInterfaceName", new Class[] { String.class }, new Object[] { name }); } @Override public void setLazy(boolean b) { Util.invokeMethod( getTarget(), "setLazy", new Class[] { boolean.class }, new Object[] { b }); } @Override public Iterator<IPersistentClass> getSubclassIterator() { if (subclasses == null) { initializeSubclasses(); } return subclasses.iterator(); } @Override public ITable getRootTable() { if (rootTable == null) { Object targetRootTable = Util.invokeMethod( getTarget(), "getRootTable", new Class[] {}, new Object[] {}); if (targetRootTable != null) { rootTable = getFacadeFactory().createTable(targetRootTable); } } return rootTable; } @Override public boolean isCustomDeleteCallable() { return (boolean)Util.invokeMethod( getTarget(), "isCustomDeleteCallable", new Class[] {}, new Object[] {}); } @Override public boolean isCustomInsertCallable() { return (boolean)Util.invokeMethod( getTarget(), "isCustomInsertCallable", new Class[] {}, new Object[] {}); } @Override public boolean isCustomUpdateCallable() { return (boolean)Util.invokeMethod( getTarget(), "isCustomUpdateCallable", new Class[] {}, new Object[] {}); } @Override public boolean isDiscriminatorInsertable() { return (boolean)Util.invokeMethod( getTarget(), "isDiscriminatorInsertable", new Class[] {}, new Object[] {}); } @Override public boolean isDiscriminatorValueNotNull() { return (boolean)Util.invokeMethod( getTarget(), "isDiscriminatorValueNotNull", new Class[] {}, new Object[] {}); } @Override public boolean isDiscriminatorValueNull() { return (boolean)Util.invokeMethod( getTarget(), "isDiscriminatorValueNull", new Class[] {}, new Object[] {}); } @Override public boolean isExplicitPolymorphism() { return (boolean)Util.invokeMethod( getTarget(), "isExplicitPolymorphism", new Class[] {}, new Object[] {}); } @Override public boolean isForceDiscriminator() { return (boolean)Util.invokeMethod( getTarget(), "isForceDiscriminator", new Class[] {}, new Object[] {}); } @Override public boolean isInherited() { return (boolean)Util.invokeMethod( getTarget(), "isInherited", new Class[] {}, new Object[] {}); } @Override public boolean isJoinedSubclass() { return (boolean)Util.invokeMethod( getTarget(), "isJoinedSubclass", new Class[] {}, new Object[] {}); } @Override public boolean isLazy() { return (boolean)Util.invokeMethod( getTarget(), "isLazy", new Class[] {}, new Object[] {}); } @Override public boolean isLazyPropertiesCacheable() { return (boolean)Util.invokeMethod( getTarget(), "isLazyPropertiesCacheable", new Class[] {}, new Object[] {}); } @Override public boolean isMutable() { return (boolean)Util.invokeMethod( getTarget(), "isMutable", new Class[] {}, new Object[] {}); } @Override public boolean isPolymorphic() { return (boolean)Util.invokeMethod( getTarget(), "isPolymorphic", new Class[] {}, new Object[] {}); } @Override public boolean isVersioned() { return (boolean)Util.invokeMethod( getTarget(), "isVersioned", new Class[] {}, new Object[] {}); } @Override public int getBatchSize() { return (int)Util.invokeMethod( getTarget(), "getBatchSize", new Class[] {}, new Object[] {}); } @Override public String getCacheConcurrencyStrategy() { return (String)Util.invokeMethod( getTarget(), "getCacheConcurrencyStrategy", new Class[] {}, new Object[] {}); } @Override public String getCustomSQLDelete() { return (String)Util.invokeMethod( getTarget(), "getCustomSQLDelete", new Class[] {}, new Object[] {}); } @Override public String getCustomSQLInsert() { return (String)Util.invokeMethod( getTarget(), "getCustomSQLInsert", new Class[] {}, new Object[] {}); } @Override public String getCustomSQLUpdate() { return (String)Util.invokeMethod( getTarget(), "getCustomSQLUpdate", new Class[] {}, new Object[] {}); } @Override public String getDiscriminatorValue() { return (String)Util.invokeMethod( getTarget(), "getDiscriminatorValue", new Class[] {}, new Object[] {}); } @Override public String getLoaderName() { return (String)Util.invokeMethod( getTarget(), "getLoaderName", new Class[] {}, new Object[] {}); } @Override public String getWhere() { return (String)Util.invokeMethod( getTarget(), "getWhere", new Class[] {}, new Object[] {}); } @Override public int getOptimisticLockMode() { return (int)Util.invokeMethod( getTarget(), "getOptimisticLockMode", new Class[] {}, new Object[] {}); } protected Class<?> getRootClassClass() { return Util.getClass(getRootClassClassName(), getFacadeFactoryClassLoader()); } protected Class<?> getSubclassClass() { return Util.getClass(getSubclassClassName(), getFacadeFactoryClassLoader()); } protected Class<?> getPropertyClass() { return Util.getClass(getPropertyClassName(), getFacadeFactoryClassLoader()); } protected Class<?> getJoinedSubclassClass() { return Util.getClass(getJoinedSubclassClassName(), getFacadeFactoryClassLoader()); } protected Class<?> getTableClass() { return Util.getClass(getTableClassName(), getFacadeFactoryClassLoader()); } protected Class<?> getKeyValueClass() { return Util.getClass(getKeyValueClassName(), getFacadeFactoryClassLoader()); } protected Class<?> getValueClass() { return Util.getClass(getValueClassName(), getFacadeFactoryClassLoader()); } protected String getRootClassClassName() { return "org.hibernate.mapping.RootClass"; } protected String getSubclassClassName() { return "org.hibernate.mapping.Subclass"; } protected String getPropertyClassName() { return "org.hibernate.mapping.Property"; } protected String getJoinedSubclassClassName() { return "org.hibernate.mapping.JoinedSubclass"; } protected String getTableClassName() { return "org.hibernate.mapping.Table"; } protected String getKeyValueClassName() { return "org.hibernate.mapping.KeyValue"; } protected String getValueClassName() { return "org.hibernate.mapping.Value"; } protected void initializePropertyClosures() { propertyClosures = new HashSet<IProperty>(); Iterator<?> targetPropertyClosures = (Iterator<?>)Util.invokeMethod( getTarget(), "getPropertyClosureIterator", new Class[] {}, new Object[] {}); while (targetPropertyClosures.hasNext()) { propertyClosures.add( getFacadeFactory().createProperty( targetPropertyClosures.next())); } } protected void initializeProperties() { properties = new HashMap<String, IProperty>(); Iterator<?> targetPropertyIterator = (Iterator<?>)Util.invokeMethod( getTarget(), "getPropertyIterator", new Class[] {}, new Object[] {}); while (targetPropertyIterator.hasNext()) { Object property = targetPropertyIterator.next(); String propertyName = (String)Util.invokeMethod( property, "getName", new Class[] {}, new Object[] {}); properties.put( propertyName, getFacadeFactory().createProperty(property)); } } protected void initializeJoins() { joins = new HashSet<IJoin>(); Iterator<?> targetJoinIterator = (Iterator<?>)Util.invokeMethod( getTarget(), "getJoinIterator", new Class[] {}, new Object[] {}); while (targetJoinIterator.hasNext()) { joins.add(getFacadeFactory().createJoin(targetJoinIterator.next())); } } protected void initializeSubclasses() { subclasses = new HashSet<IPersistentClass>(); Iterator<?> targetSubclassIterator = (Iterator<?>)Util.invokeMethod( getTarget(), "getSubclassIterator", new Class[] {}, new Object[] {}); while (targetSubclassIterator.hasNext()) { subclasses.add(getFacadeFactory().createPersistentClass( targetSubclassIterator.next())); } } }