package com.gammastream.validity;
import java.util.Enumeration;
import com.webobjects.appserver.xml.WOXMLCoder;
import com.webobjects.appserver.xml.WOXMLCoding;
import com.webobjects.appserver.xml.WOXMLDecoder;
import com.webobjects.eoaccess.EOAttribute;
import com.webobjects.eoaccess.EOEntity;
import com.webobjects.eoaccess.EORelationship;
import com.webobjects.eocontrol.EOClassDescription;
import com.webobjects.eocontrol.EOEditingContext;
import com.webobjects.eocontrol.EOEnterpriseObject;
import com.webobjects.foundation.NSArray;
import com.webobjects.foundation.NSLog;
import com.webobjects.foundation.NSMutableArray;
/**
* GSVEntity is the data structure associated with a paritcular table or EOEntity in an EOModel.
*
* @author GammaStream Technologies, Inc.
*/
public final class GSVEntity implements WOXMLCoding {
//persistant entity attributes
private GSVModel _model;
private String _name;
private NSMutableArray _attributes;
/**
* Creates a new GSVEntity.
*
* @param model The GSVModel this GSVEntity belongs to.
* @param entityname The name of the GSVEntity.
* @exception java.lang.IllegalArgumentException EOEntity does not exsit in EOModel
*/
public GSVEntity(GSVModel model, String entityname) throws IllegalArgumentException{
if(this.validateEntityForName(model,entityname)){
_model = model;
_name = entityname;
_attributes = new NSMutableArray();
}else{
throw new IllegalArgumentException("EOEntity named '"+ entityname +"' does not exist in EOModel for path: "+model.eomodelPath());
}
}
/**
* Private
*/
private boolean validateEntityForName(GSVModel model, String name){
return ( model.eomodelGroup().modelNamed(model.eomodelName()).entityNamed(name)!=null );
}
/**
* Returns the GSVModel the GSVEntity belongs to.
*
* @return GSVModel the GSVEntity belongs to.
* @see #setModel
*/
public GSVModel model(){
return _model;
}
/**
* Sets the GSVModel the GSVEntity belongs to.
*
* @param newModel GSVModel for the GSVEntity
* @see #model
*/
public void setModel(GSVModel newModel){
_model = newModel;
}
/**
* Returns the name of the GSVEntity.
*
* @return Returns the name of the GSVEntity.
*/
public String name(){
return _name;
}
/**
* Returns the attributes for this entity.
*
* @return Returns the GSVEntity attributes.
* @see #addAttribute
* @see #removeAttribute
*/
public NSMutableArray attributes(){
return _attributes;
}
/**
* Adds the attribute to this entity.
*
* @param newAtt The attribute to add.
* @see #attributes
* @see #removeAttribute
*/
public void addAttribute(GSVAttribute newAtt){
_attributes.addObject(newAtt);
}
/**
* Removes the attribute from this entity.
*
* @param oldAtt The attribute to remove.
* @see #attributes
* @see #addAttribute
*/
public void removeAttribute(GSVAttribute oldAtt){
_attributes.removeObject(oldAtt);
}
/**
* Returns the attribute with the provided name.
*
* @param name The name of the attribute you wish to fetch.
* @return Returns the attribute witht he provided name or null if one was not found.
*/
public GSVAttribute attributeNamed(String name){
GSVAttribute currentAttribute = null;
for(int i=0;i<_attributes.count();i++){
currentAttribute = (GSVAttribute)_attributes.objectAtIndex(i);
if(currentAttribute.name().equals(name))
return currentAttribute;
}
return null;
}
/******************************** WOXMLCoding Impl ********************************/
/**
* WOXMLCoding Impl
*
* @param coder WOXMLCoder
*
* @see #GSVEntity
*/
public void encodeWithWOXMLCoder(WOXMLCoder coder) {
coder.encodeObjectForKey(_model, "Model");
coder.encodeObjectForKey(_name, "Name");
coder.encodeObjectForKey(_attributes.immutableClone(), "Attributes");
}
/**
* WOXMLCoding Impl
*
* @param decoder WOXMLDecoder
*
* @see #encodeWithWOXMLCoder
*/
public GSVEntity(WOXMLDecoder decoder) {
_model = (GSVModel)decoder.decodeObjectForKey("Model");
_name = (String)decoder.decodeObjectForKey("Name");
_attributes = new NSMutableArray((NSArray)decoder.decodeObjectForKey("Attributes"));
}
/**
* WOXMLCoding Impl
*/
public Class classForCoder() {
try{
return Class.forName("com.gammastream.validity.GSVEntity");
}catch(ClassNotFoundException e){
return null;
}
}
public void init(GSVModel model, EOEntity eoentity) {
NSArray myattributes = attributes().immutableClone();
for ( Enumeration e = myattributes.objectEnumerator(); e.hasMoreElements();) {
GSVAttribute attribute = (GSVAttribute)e.nextElement();
//NSLog.debug.appendln("checking attribute"+eoentity.name()+"."+attribute.name());
EOAttribute a = eoentity.attributeNamed(attribute.name());
EORelationship p = eoentity.relationshipNamed(attribute.name());
if (a == null) {
NSLog.out.appendln("attribute "+attribute.name() + " does not exist in entity " + name() + " (anymore?), deleted from Valididy model");
removeAttribute(attribute);
} else if (p != null) {
NSLog.out.appendln("attribute "+attribute.name() + " in entity " + name() + " is (now?) an relationship which cannot have a validation rule, deleted from Valididy model");
removeAttribute(attribute);
} else {
EOEditingContext ec = new EOEditingContext();
ec.lock();
try {
if (attribute == null) {
NSLog.debug.appendln("attribute == null");
} else if (attribute.name() == null) {
NSLog.debug.appendln("attribute.name() == null, attribute = "+attribute);
} else {
//NSLog.debug.appendln("checking eo="+eoentity.name()+", attributename="+attribute.name());
EOClassDescription eoclassdescription = EOClassDescription.classDescriptionForEntityName(eoentity.name());
EOEnterpriseObject eoenterpriseobject = eoclassdescription.createInstanceWithEditingContext(null, null);
eoenterpriseobject.valueForKeyPath(attribute.name());
}
} catch (com.webobjects.foundation.NSKeyValueCoding.UnknownKeyException e1) {
//NSLog.debug.appendln(e1);
NSLog.out.appendln("attribute "+attribute.name() + " does not exist in entity " + name() + " anymore, deleted from Valididy model");
removeAttribute(attribute);
} catch (Exception e1) {
} finally {
ec.unlock();
ec.dispose();
}
}
}
}
}