diff options
| author | Benjamin Culkin <scorpress@gmail.com> | 2024-05-20 17:58:16 -0400 |
|---|---|---|
| committer | Benjamin Culkin <scorpress@gmail.com> | 2024-05-20 17:58:16 -0400 |
| commit | 40a9d99496e098562f090fb7ffce9e749011b131 (patch) | |
| tree | 437df24d65470582e943e494a52db8ed65a881ae /projects/net.wotonomy.persistence/src/main/java/net/wotonomy/control/EOClassDescription.java | |
| parent | ff072dfe782f6f22123cd4ba050828d35c0d0fbd (diff) | |
Formatting pass
Diffstat (limited to 'projects/net.wotonomy.persistence/src/main/java/net/wotonomy/control/EOClassDescription.java')
| -rw-r--r-- | projects/net.wotonomy.persistence/src/main/java/net/wotonomy/control/EOClassDescription.java | 990 |
1 files changed, 446 insertions, 544 deletions
diff --git a/projects/net.wotonomy.persistence/src/main/java/net/wotonomy/control/EOClassDescription.java b/projects/net.wotonomy.persistence/src/main/java/net/wotonomy/control/EOClassDescription.java index cd07ebb..79019de 100644 --- a/projects/net.wotonomy.persistence/src/main/java/net/wotonomy/control/EOClassDescription.java +++ b/projects/net.wotonomy.persistence/src/main/java/net/wotonomy/control/EOClassDescription.java @@ -28,574 +28,476 @@ import net.wotonomy.foundation.internal.Introspector; import net.wotonomy.foundation.internal.WotonomyException; /** -* EOClassDescription provides meta-information about a class -* and is used to customize certain behaviors within wotonomy -* and specifically within editing contexts and object stores. -* <br><br> -* -* The default implementation works for most well-formed java beans, -* but you will want to create your own subclass most typically -* to customize the toOne and toMany relationships for your -* class to ensure that an entire graph of objects is not -* persisted in order to perist a single object. -* <br><br> -* -* The easiest way to register your subclass is to create it -* in the same package as the class it describes but with -* a "ClassDesc" suffix. For example, "my.package.MyEntity" -* would be described by "my.package.MyEntityClassDesc". <br><br> -* -* Note that while the interface is the same, the implementation -* of this class differs substantially from the specification -* in order to be more useful for java classes. -* -* @author michael@mpowers.net -* @author $Author: cgruber $ -* @version $Revision: 900 $ -*/ -public class EOClassDescription -{ - /** - * A delete rule specifying that object(s) that reference - * this object should have those references set to null - * when this object is deleted. - */ - public static final int DeleteRuleNullify = 0; - - /** - * A delete rule specifying that object(s) referenced by - * this object should also be deleted when this object - * is deleted. - */ - public static final int DeleteRuleCascade = 1; - - /** - * A delete rule specicying that this object should - * not be allowed to be deleted if it references any - * object(s). - */ - public static final int DeleteRuleDeny = 2; - - /** - * A delete rule specifying that no action be taken - * when this object is deleted. This is the default. - */ - public static final int DeleteRuleNoAction = 3; - - /** - * Notification fired when a class description has been requested - * for a class. Observers should watch for this notification and - * call registerClassDescription so that class descriptions can be - * loaded on-demand. - * The notification's object is the requested class and the - * user info dictionary is null. - */ - public static final String ClassDescriptionNeededForClassNotification = - "ClassDescriptionNeededForClassNotification"; - - /** - * Notification fired when a class description has been requested - * for an entity name. Observers should watch for this notification and - * call registerClassDescription so that class descriptions can be - * loaded on-demand. - * The notification's object is the requested name and the - * user info dictionary is null. - */ - public static final String ClassDescriptionNeededForEntityNameNotification = - "ClassDescriptionNeededForEntityNameNotification"; + * EOClassDescription provides meta-information about a class and is used to + * customize certain behaviors within wotonomy and specifically within editing + * contexts and object stores. <br> + * <br> + * + * The default implementation works for most well-formed java beans, but you + * will want to create your own subclass most typically to customize the toOne + * and toMany relationships for your class to ensure that an entire graph of + * objects is not persisted in order to perist a single object. <br> + * <br> + * + * The easiest way to register your subclass is to create it in the same package + * as the class it describes but with a "ClassDesc" suffix. For example, + * "my.package.MyEntity" would be described by "my.package.MyEntityClassDesc". + * <br> + * <br> + * + * Note that while the interface is the same, the implementation of this class + * differs substantially from the specification in order to be more useful for + * java classes. + * + * @author michael@mpowers.net + * @author $Author: cgruber $ + * @version $Revision: 900 $ + */ +public class EOClassDescription { + /** + * A delete rule specifying that object(s) that reference this object should + * have those references set to null when this object is deleted. + */ + public static final int DeleteRuleNullify = 0; + + /** + * A delete rule specifying that object(s) referenced by this object should also + * be deleted when this object is deleted. + */ + public static final int DeleteRuleCascade = 1; + + /** + * A delete rule specicying that this object should not be allowed to be deleted + * if it references any object(s). + */ + public static final int DeleteRuleDeny = 2; + + /** + * A delete rule specifying that no action be taken when this object is deleted. + * This is the default. + */ + public static final int DeleteRuleNoAction = 3; + + /** + * Notification fired when a class description has been requested for a class. + * Observers should watch for this notification and call + * registerClassDescription so that class descriptions can be loaded on-demand. + * The notification's object is the requested class and the user info dictionary + * is null. + */ + public static final String ClassDescriptionNeededForClassNotification = "ClassDescriptionNeededForClassNotification"; + + /** + * Notification fired when a class description has been requested for an entity + * name. Observers should watch for this notification and call + * registerClassDescription so that class descriptions can be loaded on-demand. + * The notification's object is the requested name and the user info dictionary + * is null. + */ + public static final String ClassDescriptionNeededForEntityNameNotification = "ClassDescriptionNeededForEntityNameNotification"; public EOClassDescription() { super(); } - /** - * Returns the class description that corresponds to the specified class. - * If the class description has not already been loaded, a - * ClassDescriptionNeededForClassNotification is posted. - * If the class description is still not found, the class' loader - * is consulted for a class in the same package and named the same as the - * specified class but appended with "ClassDesc", e.g. "EmployeeObjectClassDesc". - * If the class description is still not found, a class description is - * returned that uses java bean introspection to provide reasonable values. - */ - public static EOClassDescription classDescriptionForClass( - Class aClass ) - { - if ( classMap == null ) classMap = new HashMap(); - EOClassDescription result = (EOClassDescription) classMap.get( aClass ); - if ( result == null ) - { - // if not found, post notification - NSNotificationCenter.defaultCenter().postNotification( - ClassDescriptionNeededForClassNotification, aClass, null ); - result = (EOClassDescription) classMap.get( aClass ); - } - if ( result == null ) - { - // if not found, look for similarly named class - String className = aClass.getName() + ClassNameSuffix; - Class classDesc; - try - { - classDesc = aClass.getClassLoader().loadClass( className ); - if ( classDesc != null ) - { - result = (EOClassDescription) classDesc.newInstance(); - registerClassDescription( result, aClass ); - } - } - catch ( Exception exc ) - { - // ignore exceptions and resume - } - } - if ( result == null ) - { - // if not found, default to this class - result = new EOClassDescription( aClass ); - registerClassDescription( result, aClass ); - } - return result; - } - - /** - * Returns the class description that corresponds to the specified - * entity name. If the class description has not already been - * loaded, a ClassDescriptionNeededForEntityNameNotification is posted. - * Returns null if no class description can be found for the entity name. - */ - public static EOClassDescription classDescriptionForEntityName( - String aName ) - { - if ( entityMap == null ) entityMap = new HashMap(); - EOClassDescription result = (EOClassDescription) entityMap.get( aName ); - if ( result == null ) - { - // if not found, post notification - NSNotificationCenter.defaultCenter().postNotification( - ClassDescriptionNeededForEntityNameNotification, aName, null ); - result = (EOClassDescription) entityMap.get( aName ); - } - return result; - } - - /** - * Clears all cached class descriptions so that new requests - * for class descriptions will be re-loaded on-demand. - */ - public static void invalidateClassDescriptionCache() - { - classMap.clear(); - entityMap.clear(); - } - - /** - * Registers the specified class descriptiong for the specified class. - * Nulls are not allowed - to clear the cache call invalidateClassDescriptionCache(). - */ - public static void registerClassDescription( - EOClassDescription description, - Class aClass ) - { - if ( classMap == null ) classMap = new HashMap(); - if ( entityMap == null ) entityMap = new HashMap(); - description.theClass = aClass; - classMap.put( aClass, description ); - entityMap.put( description.entityName(), description ); - } + /** + * Returns the class description that corresponds to the specified class. If the + * class description has not already been loaded, a + * ClassDescriptionNeededForClassNotification is posted. If the class + * description is still not found, the class' loader is consulted for a class in + * the same package and named the same as the specified class but appended with + * "ClassDesc", e.g. "EmployeeObjectClassDesc". If the class description is + * still not found, a class description is returned that uses java bean + * introspection to provide reasonable values. + */ + public static EOClassDescription classDescriptionForClass(Class aClass) { + if (classMap == null) + classMap = new HashMap(); + EOClassDescription result = (EOClassDescription) classMap.get(aClass); + if (result == null) { + // if not found, post notification + NSNotificationCenter.defaultCenter().postNotification(ClassDescriptionNeededForClassNotification, aClass, + null); + result = (EOClassDescription) classMap.get(aClass); + } + if (result == null) { + // if not found, look for similarly named class + String className = aClass.getName() + ClassNameSuffix; + Class classDesc; + try { + classDesc = aClass.getClassLoader().loadClass(className); + if (classDesc != null) { + result = (EOClassDescription) classDesc.newInstance(); + registerClassDescription(result, aClass); + } + } catch (Exception exc) { + // ignore exceptions and resume + } + } + if (result == null) { + // if not found, default to this class + result = new EOClassDescription(aClass); + registerClassDescription(result, aClass); + } + return result; + } -/* - public static Object classDelegate() - { - throw new WotonomyException( "Not implemented yet." ); - } - - public static void setClassDelegate( - Object aDelegate) - { - throw new WotonomyException( "Not implemented yet." ); - } -*/ - - /** - * The string appended to the java class name when - * searching the class path for an appropriate description. - */ - private final static String ClassNameSuffix = "ClassDesc"; - - private static Map classMap; - private static Map entityMap; - - protected Class theClass; - private NSMutableArray attributes; - - /** - * Constructor may only be called by subclasses. - */ - protected EOClassDescription( Class aClass ) - { - theClass = aClass; - } - - /** - * Returns a List of all the attributes for this class. - * This implementation reflects on the java class to produce - * a list of attributes, and then removes those keys that - * are returned by toOneRelationshipKeys and toManyRelationhipKeys. - */ - public NSArray attributeKeys() - { - if ( attributes == null ) - { - NSMutableArray readProperties = new NSMutableArray(); - String[] read = Introspector.getReadPropertiesForClass( theClass ); - for ( int i = 0; i < read.length; i++ ) - { - readProperties.addObject( read[i] ); - } - - attributes = new NSMutableArray(); - String[] write = Introspector.getWritePropertiesForClass( theClass ); - for ( int i = 0; i < write.length; i++ ) - { - attributes.addObject( write[i] ); - } - - // only use properties on both lists: read/write - attributes.retainAll( readProperties ); - - // remove relationship keys - attributes.removeAll( toOneRelationshipKeys() ); - attributes.removeAll( toManyRelationshipKeys() ); - } - return attributes; - } - - /** - * This method is called when the specified object has been - * fetched into the specified editing context. Fetch means - * an object was fetched using a fetch specification - it is - * not the same thing as an insertion. - * This implementation does nothing. - */ - public void awakeObjectFromFetch( - Object object, - EOEditingContext anEditingContext ) - { - } - - /** - * This method is called when the specified object has been - * inserted into the specified editing context. Insertion - * means an object was inserted by a display group - it does - * not mean the same thing as a fetch. - * This implementation does nothing. - */ - public void awakeObjectFromInsertion( - Object object, - EOEditingContext anEditingContext ) - { - // does nothing - } - - /** - * Returns the class decription for the object referenced - * by the specified relationship key, or null if the - * class description cannot be determined for that key. - * This implementation returns null. - */ - public EOClassDescription classDescriptionForDestinationKey( - String detailKey ) - { - return null; - } - - /** - * Creates a new instance of the class represented by this - * class description, registering it with the specified - * editing context and global id. The class description - * may not keep references to the newly created object. - * The editing context and/or the id may be null. - * This implementation constructs a new instance of the class - * and registers it with the specified editing context. - * If the global id is specified, the object will be populated - * with the appropriate data, otherwise the object will be - * treated as a newly inserted object. - * If no editing context is specified, the global id is - * ignored and the new instance of the class is returned. - */ - public Object createInstanceWithEditingContext( - EOEditingContext anEditingContext, - EOGlobalID globalID ) - { + /** + * Returns the class description that corresponds to the specified entity name. + * If the class description has not already been loaded, a + * ClassDescriptionNeededForEntityNameNotification is posted. Returns null if no + * class description can be found for the entity name. + */ + public static EOClassDescription classDescriptionForEntityName(String aName) { + if (entityMap == null) + entityMap = new HashMap(); + EOClassDescription result = (EOClassDescription) entityMap.get(aName); + if (result == null) { + // if not found, post notification + NSNotificationCenter.defaultCenter().postNotification(ClassDescriptionNeededForEntityNameNotification, + aName, null); + result = (EOClassDescription) entityMap.get(aName); + } + return result; + } + + /** + * Clears all cached class descriptions so that new requests for class + * descriptions will be re-loaded on-demand. + */ + public static void invalidateClassDescriptionCache() { + classMap.clear(); + entityMap.clear(); + } + + /** + * Registers the specified class descriptiong for the specified class. Nulls are + * not allowed - to clear the cache call invalidateClassDescriptionCache(). + */ + public static void registerClassDescription(EOClassDescription description, Class aClass) { + if (classMap == null) + classMap = new HashMap(); + if (entityMap == null) + entityMap = new HashMap(); + description.theClass = aClass; + classMap.put(aClass, description); + entityMap.put(description.entityName(), description); + } + + /* + * public static Object classDelegate() { throw new WotonomyException( + * "Not implemented yet." ); } + * + * public static void setClassDelegate( Object aDelegate) { throw new + * WotonomyException( "Not implemented yet." ); } + */ + + /** + * The string appended to the java class name when searching the class path for + * an appropriate description. + */ + private final static String ClassNameSuffix = "ClassDesc"; + + private static Map classMap; + private static Map entityMap; + + protected Class theClass; + private NSMutableArray attributes; + + /** + * Constructor may only be called by subclasses. + */ + protected EOClassDescription(Class aClass) { + theClass = aClass; + } + + /** + * Returns a List of all the attributes for this class. This implementation + * reflects on the java class to produce a list of attributes, and then removes + * those keys that are returned by toOneRelationshipKeys and + * toManyRelationhipKeys. + */ + public NSArray attributeKeys() { + if (attributes == null) { + NSMutableArray readProperties = new NSMutableArray(); + String[] read = Introspector.getReadPropertiesForClass(theClass); + for (int i = 0; i < read.length; i++) { + readProperties.addObject(read[i]); + } + + attributes = new NSMutableArray(); + String[] write = Introspector.getWritePropertiesForClass(theClass); + for (int i = 0; i < write.length; i++) { + attributes.addObject(write[i]); + } + + // only use properties on both lists: read/write + attributes.retainAll(readProperties); + + // remove relationship keys + attributes.removeAll(toOneRelationshipKeys()); + attributes.removeAll(toManyRelationshipKeys()); + } + return attributes; + } + + /** + * This method is called when the specified object has been fetched into the + * specified editing context. Fetch means an object was fetched using a fetch + * specification - it is not the same thing as an insertion. This implementation + * does nothing. + */ + public void awakeObjectFromFetch(Object object, EOEditingContext anEditingContext) { + } + + /** + * This method is called when the specified object has been inserted into the + * specified editing context. Insertion means an object was inserted by a + * display group - it does not mean the same thing as a fetch. This + * implementation does nothing. + */ + public void awakeObjectFromInsertion(Object object, EOEditingContext anEditingContext) { + // does nothing + } + + /** + * Returns the class decription for the object referenced by the specified + * relationship key, or null if the class description cannot be determined for + * that key. This implementation returns null. + */ + public EOClassDescription classDescriptionForDestinationKey(String detailKey) { + return null; + } + + /** + * Creates a new instance of the class represented by this class description, + * registering it with the specified editing context and global id. The class + * description may not keep references to the newly created object. The editing + * context and/or the id may be null. This implementation constructs a new + * instance of the class and registers it with the specified editing context. If + * the global id is specified, the object will be populated with the appropriate + * data, otherwise the object will be treated as a newly inserted object. If no + * editing context is specified, the global id is ignored and the new instance + * of the class is returned. + */ + public Object createInstanceWithEditingContext(EOEditingContext anEditingContext, EOGlobalID globalID) { //System.out.println( "createInstanceWithEditingContext: " + this + " : " + theClass ); - Object result = null; - try - { - result = theClass.newInstance(); - if ( anEditingContext != null ) - { - if ( globalID != null ) - { - if ( result instanceof EOEnterpriseObject ) - { - ((EOEnterpriseObject)result).awakeFromFetch( anEditingContext ); - } - // register in editing context - anEditingContext.recordObject( result, globalID ); - } - else // no global id specified - { - if ( result instanceof EOEnterpriseObject ) - { - ((EOEnterpriseObject)result).awakeFromInsertion( anEditingContext ); - } - // register as new object in editing context - anEditingContext.insertObject( result ); - } - } - } - catch ( Exception exc ) - { - // error instantiating - throw new WotonomyException( exc ); - } - return result; - } - -/* - public NSFormatter defaultFormatterForKey( - String key ) - { - throw new WotonomyException( "Not implemented yet." ); - } -*/ - - /** - * Returns the delete rule to be used for the specified - * relationship key. - * This implementation returns DeleteRuleNoAction. - */ - public int deleteRuleForRelationshipKey( - String relationshipKey ) - { - return DeleteRuleNoAction; - } - - /** - * Returns a human-readable title for the specified key. - * For example, displayNameForKey( "firstName" ) might - * return "First Name". - * This implementation attempts to construct such a string - * from the key, uppercasing the first character and - * inserting spaces before subsequent uppercase characters. - */ - public String displayNameForKey( - String key ) - { - if ( key == null ) return ""; - if ( key.length() == 0 ) return ""; - - StringBuffer result = new StringBuffer(); - result.append( Character.toUpperCase( key.charAt(0) ) ); - - char c; - int len = key.length(); - for ( int i = 1; i < len; i++ ) - { - c = key.charAt(i); - if ( Character.isUpperCase( c ) ) - { - result.append( ' ' ); - } - result.append( c ); - } - - return result.toString(); - } - - /** - * Returns a human-readable title for the class of objects - * that this class description represents. For example, - * class CustomerObject might return "Customer". - * This implementation returns the class name. - */ - public String entityName() - { - String result = theClass.getName(); - int index = result.lastIndexOf( "." ); - if ( index == -1 ) return result; - return result.substring( index+1 ); - } - - /** - * Returns the fetch specification associated with this - * class description that corresponds to the specified name, - * or null if not found. - * This implementation returns null. - */ - public EOFetchSpecification fetchSpecificationNamed( - String aString ) - { - return null; - } - - /** - * Returns the relationship key by which the object at the - * other end of the specified relationship key refers to - * this object, or null if not found. - * This implementation returns null. - */ - public String inverseForRelationshipKey( - String relationshipKey ) - { - return null; - } - - public boolean ownsDestinationObjectsForRelationshipKey( - String relationshipKey ) - { - throw new WotonomyException( "Not implemented yet." ); - } - - /** - * Called when this object has been deleted from the - * specified editing context. The delete rules for this - * object's relationships should be executed. - */ - public void propagateDeleteForObject( - Object object, - EOEditingContext anEditingContext ) - { - throw new WotonomyException( "Not implemented yet." ); - } - - /** - * Returns a List of the "to many" relationships for - * this class. - * This implementation returns an empty list. - */ - public NSArray toManyRelationshipKeys() - { - return NSArray.EmptyArray; - } - - /** - * Returns a List of the "to one" relationships for - * this class. - * This implementation returns an empty list. - */ - public NSArray toOneRelationshipKeys() - { - return NSArray.EmptyArray; - } - - /** - * Returns a human-readable description of the specified object - * that should not exceed 60 characters. - * This implementation returns anObject.toString(). - */ - public String userPresentableDescriptionForObject( - Object anObject ) - { - return anObject.toString(); - } - - /** - * Verifies that the specified object may be deleted. - * Throws an exception with a user-readable error message - * if the delete operation should not be allowed. - * This implementation does nothing. - */ - public void validateObjectForDelete( - Object object ) - { - // does nothing - } - - /** - * Verifies that the specified object may be saved. - * Throws an exception with a user-readable error message - * if the save operation should not be allowed. - * This implementation does nothing. - */ - public void validateObjectForSave( - Object object ) - { - // does nothing - } - - /** - * Validates the specified value for the specified key on this - * this class. Returns null if the value is acceptable, or - * returns an object that should be used in place of the specified - * object, or throws an exception with a user-readable error message - * if no acceptable value can be determined. - * This implementation returns null. - */ - public Object validateValueForKey( Object value, String key) - { - return null; - } - - /** - * Returns the Java Class that this description describes. - * NOTE: This method is not in the specification. - */ - public Class getDescribedClass() - { - return theClass; - } - + Object result = null; + try { + result = theClass.newInstance(); + if (anEditingContext != null) { + if (globalID != null) { + if (result instanceof EOEnterpriseObject) { + ((EOEnterpriseObject) result).awakeFromFetch(anEditingContext); + } + // register in editing context + anEditingContext.recordObject(result, globalID); + } else // no global id specified + { + if (result instanceof EOEnterpriseObject) { + ((EOEnterpriseObject) result).awakeFromInsertion(anEditingContext); + } + // register as new object in editing context + anEditingContext.insertObject(result); + } + } + } catch (Exception exc) { + // error instantiating + throw new WotonomyException(exc); + } + return result; + } + + /* + * public NSFormatter defaultFormatterForKey( String key ) { throw new + * WotonomyException( "Not implemented yet." ); } + */ + + /** + * Returns the delete rule to be used for the specified relationship key. This + * implementation returns DeleteRuleNoAction. + */ + public int deleteRuleForRelationshipKey(String relationshipKey) { + return DeleteRuleNoAction; + } + + /** + * Returns a human-readable title for the specified key. For example, + * displayNameForKey( "firstName" ) might return "First Name". This + * implementation attempts to construct such a string from the key, uppercasing + * the first character and inserting spaces before subsequent uppercase + * characters. + */ + public String displayNameForKey(String key) { + if (key == null) + return ""; + if (key.length() == 0) + return ""; + + StringBuffer result = new StringBuffer(); + result.append(Character.toUpperCase(key.charAt(0))); + + char c; + int len = key.length(); + for (int i = 1; i < len; i++) { + c = key.charAt(i); + if (Character.isUpperCase(c)) { + result.append(' '); + } + result.append(c); + } + + return result.toString(); + } + + /** + * Returns a human-readable title for the class of objects that this class + * description represents. For example, class CustomerObject might return + * "Customer". This implementation returns the class name. + */ + public String entityName() { + String result = theClass.getName(); + int index = result.lastIndexOf("."); + if (index == -1) + return result; + return result.substring(index + 1); + } + + /** + * Returns the fetch specification associated with this class description that + * corresponds to the specified name, or null if not found. This implementation + * returns null. + */ + public EOFetchSpecification fetchSpecificationNamed(String aString) { + return null; + } + + /** + * Returns the relationship key by which the object at the other end of the + * specified relationship key refers to this object, or null if not found. This + * implementation returns null. + */ + public String inverseForRelationshipKey(String relationshipKey) { + return null; + } + + public boolean ownsDestinationObjectsForRelationshipKey(String relationshipKey) { + throw new WotonomyException("Not implemented yet."); + } + + /** + * Called when this object has been deleted from the specified editing context. + * The delete rules for this object's relationships should be executed. + */ + public void propagateDeleteForObject(Object object, EOEditingContext anEditingContext) { + throw new WotonomyException("Not implemented yet."); + } + + /** + * Returns a List of the "to many" relationships for this class. This + * implementation returns an empty list. + */ + public NSArray toManyRelationshipKeys() { + return NSArray.EmptyArray; + } + + /** + * Returns a List of the "to one" relationships for this class. This + * implementation returns an empty list. + */ + public NSArray toOneRelationshipKeys() { + return NSArray.EmptyArray; + } + + /** + * Returns a human-readable description of the specified object that should not + * exceed 60 characters. This implementation returns anObject.toString(). + */ + public String userPresentableDescriptionForObject(Object anObject) { + return anObject.toString(); + } + + /** + * Verifies that the specified object may be deleted. Throws an exception with a + * user-readable error message if the delete operation should not be allowed. + * This implementation does nothing. + */ + public void validateObjectForDelete(Object object) { + // does nothing + } + + /** + * Verifies that the specified object may be saved. Throws an exception with a + * user-readable error message if the save operation should not be allowed. This + * implementation does nothing. + */ + public void validateObjectForSave(Object object) { + // does nothing + } + + /** + * Validates the specified value for the specified key on this this class. + * Returns null if the value is acceptable, or returns an object that should be + * used in place of the specified object, or throws an exception with a + * user-readable error message if no acceptable value can be determined. This + * implementation returns null. + */ + public Object validateValueForKey(Object value, String key) { + return null; + } + + /** + * Returns the Java Class that this description describes. NOTE: This method is + * not in the specification. + */ + public Class getDescribedClass() { + return theClass; + } + } /* - * $Log$ - * Revision 1.3 2006/02/18 22:46:44 cgruber - * Add Surrogate map from .util into control's internal package, and fix imports. + * $Log$ Revision 1.3 2006/02/18 22:46:44 cgruber Add Surrogate map from .util + * into control's internal package, and fix imports. * - * Revision 1.2 2006/02/16 16:47:14 cgruber - * Move some classes in to "internal" packages and re-work imports, etc. + * Revision 1.2 2006/02/16 16:47:14 cgruber Move some classes in to "internal" + * packages and re-work imports, etc. * - * Also use UnsupportedOperationExceptions where appropriate, instead of WotonomyExceptions. + * Also use UnsupportedOperationExceptions where appropriate, instead of + * WotonomyExceptions. * - * Revision 1.1 2006/02/16 13:19:57 cgruber - * Check in all sources in eclipse-friendly maven-enabled packages. + * Revision 1.1 2006/02/16 13:19:57 cgruber Check in all sources in + * eclipse-friendly maven-enabled packages. * - * Revision 1.11 2003/08/08 05:50:32 chochos - * theClass is protected instead of private + * Revision 1.11 2003/08/08 05:50:32 chochos theClass is protected instead of + * private * - * Revision 1.10 2003/08/08 00:37:44 chochos - * default constructor is needed by subclasses + * Revision 1.10 2003/08/08 00:37:44 chochos default constructor is needed by + * subclasses * - * Revision 1.9 2001/12/20 18:55:46 mpowers - * Hooks for awakeFromInsertion and awakeFromFetch. + * Revision 1.9 2001/12/20 18:55:46 mpowers Hooks for awakeFromInsertion and + * awakeFromFetch. * - * Revision 1.8 2001/12/01 23:51:45 mpowers - * Corrected createWithEditingContext. + * Revision 1.8 2001/12/01 23:51:45 mpowers Corrected createWithEditingContext. * - * Revision 1.7 2001/11/25 22:43:38 mpowers - * Corrected createInstanceWithEditingContext. + * Revision 1.7 2001/11/25 22:43:38 mpowers Corrected + * createInstanceWithEditingContext. * - * Revision 1.6 2001/04/29 02:29:31 mpowers - * Debugging relationship faulting. + * Revision 1.6 2001/04/29 02:29:31 mpowers Debugging relationship faulting. * - * Revision 1.5 2001/04/28 22:17:51 mpowers - * Revised PropertyDataSource to be EOClassDescription-aware. + * Revision 1.5 2001/04/28 22:17:51 mpowers Revised PropertyDataSource to be + * EOClassDescription-aware. * - * Revision 1.4 2001/04/28 14:12:23 mpowers - * Refactored cloning/copying into KeyValueCodingUtilities. + * Revision 1.4 2001/04/28 14:12:23 mpowers Refactored cloning/copying into + * KeyValueCodingUtilities. * - * Revision 1.3 2001/04/27 23:37:20 mpowers - * Now using EOClassDescription in the EODataSource class, as we should. + * Revision 1.3 2001/04/27 23:37:20 mpowers Now using EOClassDescription in the + * EODataSource class, as we should. * - * Revision 1.2 2001/04/27 00:27:42 mpowers - * Partial implementation. + * Revision 1.2 2001/04/27 00:27:42 mpowers Partial implementation. * - * Revision 1.1 2001/03/29 03:29:49 mpowers - * Now using KeyValueCoding and Support instead of Introspector. + * Revision 1.1 2001/03/29 03:29:49 mpowers Now using KeyValueCoding and Support + * instead of Introspector. * * */ - - |
