package ag.kcmedia; import org.apache.log4j.Logger; import com.webobjects.appserver.WOComponent; import com.webobjects.appserver.WOContext; import com.webobjects.eoaccess.EOAdaptor; import com.webobjects.eoaccess.EOAttribute; import com.webobjects.eoaccess.EOEntity; import com.webobjects.eoaccess.EOJoin; import com.webobjects.eoaccess.EOModel; import com.webobjects.eoaccess.EOModelGroup; import com.webobjects.eoaccess.EORelationship; import com.webobjects.eoaccess.EOSchemaGeneration; import com.webobjects.foundation.NSArray; import com.webobjects.foundation.NSMutableArray; /** * Class for Component EOModeler. * * @binding sample sample binding explanation * * @created ak on Fri Jul 26 2002 */ public class EOModeler extends WOComponent { /** logging support */ private static final Logger log = Logger.getLogger(EOModeler.class); /** * Public constructor. * @param context the context */ public EOModeler(WOContext context) { super(context); } protected String modelPath; public void setModelPath(String value) { modelPath = value; modelGroup = new EOModelGroup(); model = modelGroup.addModelWithPath(modelPath); prototypes = model.entityNamed("EOPrototypes"); if(prototypes == null) prototypes = model.entityNamed("EOJDBCPrototypes"); } public String modelPath() { if(modelPath == null) { modelPath = context().request().stringFormValueForKey("modelPath"); if(modelPath == null) { modelPath = "/Volumes/Home/Roots/AHLogic.framework/Resources/armehaut.eomodeld"; } //setModelPath(modelPath); log.info(modelPath); } return modelPath; } public boolean showTableNames = false; public EOModelGroup modelGroup; public EOModel model; public EOEntity entity; public EOEntity selectedEntity; public EOEntity subEntity; public EOEntity targetEntity; public EOAttribute attribute; public EORelationship relationship; public EOEntity destinationEntity; public EOAttribute prototype; public EOEntity prototypes; public String entityName = "NewEntity"; public String sql; public NSArray attributesUsedInRelationships; @Override public void awake() { super.awake(); modelPath(); attributesUsedInRelationships = null; } /*** relationships **********/ public void setRelationshipIsToMany(boolean value) { relationship.setToMany(value); } public boolean relationshipIsToMany() { return relationship.isToMany(); } public void setRelationshipName(String value) { relationship.setName(value); } public String relationshipName() { return relationship.name(); } public boolean relationshipIsClassProperty() { return selectedEntity.classProperties().containsObject(relationship); } public void setRelationshipIsClassProperty(boolean value) { updateClassProperties(selectedEntity,relationship,value); } /*** attributes **********/ public void setAttributePrototype(EOAttribute value) { String oldName = attribute.columnName(); attribute.setPrototype(value); attribute.setColumnName(oldName); } public EOAttribute attributePrototype() { return attribute.prototype(); } public NSArray attributesUsedInRelationships() { if(attributesUsedInRelationships == null) { NSMutableArray array = new NSMutableArray((NSArray)valueForKeyPath("model.entities.relationships.joins.sourceAttribute")); array.addObject(valueForKeyPath("model.entities.relationships.joins.destinationAttribute")); attributesUsedInRelationships = (NSArray)array.valueForKeyPath("@flatten"); } return attributesUsedInRelationships; } public boolean attributeHasRelationships() { return attributesUsedInRelationships().containsObject(attribute); } public void setAttributeName(String value) { attribute.setColumnName(value); attribute.setName(value); } public String attributeName() { return attribute.name(); } public boolean attributeIsPrimaryKey() { return selectedEntity.primaryKeyAttributes().containsObject(attribute); } public boolean attributeIsClassProperty() { return selectedEntity.classProperties().containsObject(attribute); } public void setAttributeIsClassProperty(boolean value) { updateClassProperties(selectedEntity,attribute,value); } public String selectedEntityString() { String string = "none"; try { if(selectedEntity != null) return selectedEntity.toString(); } catch(Exception ex) { string = "" + ex; } return string; } /*** actions **********/ public WOComponent addAttribute() { addAttributeNamed(selectedEntity, "attributeName", null); return null; } public EOAttribute addAttributeNamed(EOEntity entity, String name, EOAttribute prototype) { EOAttribute a = new EOAttribute(); a.setName(name); entity.addAttribute(a); if(prototype != null) a.setPrototype(prototype); a.setColumnName(name.toLowerCase()); updateClassProperties(entity,a,false); return a; } public void updateClassProperties(EOEntity entity, Object o, boolean add) { NSMutableArray array = entity.classProperties().mutableClone(); boolean contains = array.containsObject(o); if(add && !contains) { array.addObject(o); entity.setClassProperties(array); } else if(!add && contains){ array.removeObject(o); entity.setClassProperties(array); } } public void addRelationship(EOEntity selectedEntity, EOEntity targetEntity, EOAttribute foreignAttribute, boolean isToMany, boolean addBack) { String targetName = targetEntity.name().toLowerCase(); String selectedName = selectedEntity.name().toLowerCase(); EOAttribute selectedPK = (EOAttribute)selectedEntity.primaryKeyAttributes().objectAtIndex(0); if(foreignAttribute == null) { foreignAttribute = addAttributeNamed(targetEntity, selectedName+"id", selectedPK.prototype()); } EORelationship relationship = new EORelationship(); relationship.setName(targetName+(isToMany ? "s" : "")); selectedEntity.addRelationship(relationship); EOJoin join = new EOJoin(selectedPK, foreignAttribute); relationship.addJoin(join); relationship.setToMany(isToMany); relationship.setJoinSemantic(EORelationship.InnerJoin); if(addBack) { relationship = new EORelationship(); join = new EOJoin(foreignAttribute,selectedPK); relationship.setName(selectedName); targetEntity.addRelationship(relationship); relationship.addJoin(join); relationship.setToMany(false); relationship.setJoinSemantic(EORelationship.InnerJoin); } } public void addBackRelationship(EOEntity selectedEntity, EOEntity targetEntity, EOAttribute foreignAttribute, boolean isToMany, boolean addBack) { EORelationship relationship = new EORelationship(); String targetName = targetEntity.name().toLowerCase(); String selectedName = selectedEntity.name().toLowerCase(); EOAttribute selectedPK = (EOAttribute)targetEntity.primaryKeyAttributes().objectAtIndex(0); if(foreignAttribute == null) { foreignAttribute = addAttributeNamed(selectedEntity, targetName+"id", selectedPK.prototype()); } relationship.setName(targetName+(isToMany ? "s" : "")); selectedEntity.addRelationship(relationship); EOJoin join = new EOJoin(foreignAttribute,selectedPK); relationship.addJoin(join); relationship.setToMany(isToMany); relationship.setJoinSemantic(EORelationship.InnerJoin); } public void addRelationship(EOAttribute foreignAttribute, boolean isToMany, boolean addBack) { addRelationship(selectedEntity, targetEntity, foreignAttribute, isToMany, addBack); } public WOComponent addBackToOneRelationship() { addBackRelationship(selectedEntity,targetEntity,null,false,false); return null; } public WOComponent addBackToManyRelationship() { addBackRelationship(selectedEntity,targetEntity,null,true,false); return null; } public WOComponent addToOneRelationship() { addRelationship(null, false, false); return null; } public WOComponent addToManyRelationship() { addRelationship(null, true, false); return null; } public WOComponent addToOneWithBackRelationship() { addRelationship(null, false, true); return null; } public WOComponent addToManyWithBackRelationship() { addRelationship(null, true, true); return null; } public EORelationship addFlattenedRelationshipWithNamePathToEntity(String name, String path, EOEntity entity) { relationship = new EORelationship(); relationship.setName(name); relationship.setDefinition(path); relationship.setJoinSemantic(EORelationship.InnerJoin); selectedEntity.addRelationship(relationship); return relationship; } public EOEntity addFlattenedManyToManyRelationship(EOEntity selectedEntity, EOEntity targetEntity) { String name = "X"+selectedEntity.name()+targetEntity.name(); name = name.toLowerCase() + "s"; EOEntity intermediate = addManyToManyRelationship(selectedEntity, targetEntity); updateClassProperties(selectedEntity, selectedEntity.relationshipNamed(name), false); updateClassProperties(targetEntity, targetEntity.relationshipNamed(name), false); relationship = addFlattenedRelationshipWithNamePathToEntity(selectedEntity.name().toLowerCase()+"s", name + "." + targetEntity.name().toLowerCase(), selectedEntity); relationship = addFlattenedRelationshipWithNamePathToEntity(targetEntity.name().toLowerCase()+"s", name + "." + selectedEntity.name().toLowerCase(), targetEntity); return intermediate; } public EOEntity addManyToManyRelationship(EOEntity selectedEntity, EOEntity targetEntity) { EOEntity intermediate = new EOEntity(); String name = "X"+selectedEntity.name()+targetEntity.name(); intermediate.setName(name); intermediate.setExternalName(name.toLowerCase()); model.addEntity(intermediate); addRelationship(selectedEntity,intermediate,null,true,true); addRelationship(targetEntity,intermediate,null,true,true); intermediate.setPrimaryKeyAttributes(intermediate.attributes()); intermediate.setName(name); intermediate.setClassProperties(new NSArray()); return intermediate; } public EOEntity addEntityWithName(EOModel model, String entityName) { entity = new EOEntity(); entity.setName(entityName); entity.setExternalName(entityName.toLowerCase()); model.addEntity(entity); EOAttribute oid = new EOAttribute(); NSArray pks = new NSArray(oid); entity.setPrimaryKeyAttributes(pks); oid.setPrototype(prototypes.attributeNamed("id")); oid.setColumnName("oid"); oid.setName("oid"); entity.addAttribute(oid); return entity; } public WOComponent addFlattenedManyToManyRelationship() { addFlattenedManyToManyRelationship(selectedEntity, targetEntity); return null; } public WOComponent addManyToManyRelationship() { addManyToManyRelationship(selectedEntity, targetEntity); return null; } public WOComponent update() { sql = ""; try { EOAdaptor adaptor = EOAdaptor.adaptorWithModel(model); EOSchemaGeneration synchronizationFactory = adaptor.synchronizationFactory(); NSArray array = synchronizationFactory.createTableStatementsForEntityGroup(new NSArray(selectedEntity)); sql = ((NSArray)array.valueForKeyPath("statement")).componentsJoinedByString(";\n"); } catch(Exception ex) { sql = "" + ex; } return null; } public WOComponent selectEntity() { selectedEntity = entity; return null; } public WOComponent removeAttribute() { selectedEntity.removeAttribute(attribute); return null; } public WOComponent removeRelationship() { selectedEntity.removeRelationship(relationship); return null; } public WOComponent removeEntity() { model.removeEntity(selectedEntity); selectedEntity = null; return null; } public String entityName() { return selectedEntity.name(); } public void setEntityName(String name) { selectedEntity.setName(name); selectedEntity.setExternalName(name.toLowerCase()); } public WOComponent addEntity() { selectedEntity = addEntityWithName(model, entityName); return null; } public WOComponent selectDestinationEntity() { selectedEntity = relationship.destinationEntity(); return null; } }