/*
Wotonomy: OpenStep design patterns for pure Java applications.
Copyright (C) 2000 Blacksmith, Inc.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, see http://www.gnu.org
*/
package net.wotonomy.web;
/**
* A pure java implementation of WOAssociation.
*
*
* A WOAssociation represents the mapping of a property on a WOComponent to a
* property on a WOAssociation. For example:
*
*
* MyAssociation: WOString { value = currentCustomer.location.city };
*
*
* This example represents a WOAssociation between the value field on a WOString
* element and the city property of the location property of the currentCustomer
* property of a WOComponent.
*
*
* To resolve values, a property accessor method will be used in preference to a
* public field, if both exist. Any null value in the path will produce null.
*
*
*
* A mapping represented in quotation marks: { value = "This is a test." } is
* considered a constant value.
*
* @author michael@mpowers.net
* @author $Author: cgruber $
* @version $Revision: 893 $
*/
public class WOAssociation implements java.io.Serializable {
protected Object value;
protected String path;
/**
* The default constructor. The static factory methods should be used to create
* instances of WOAssociation.
*/
protected WOAssociation() {
value = null;
path = null;
}
/**
* Creates a WOAssociation that maps to a constant value.
*/
public static WOAssociation associationWithValue(Object anObject) {
WOAssociation result = new WOAssociation();
result.value = anObject;
return result;
}
/**
* Creates a WOAssociation that maps to the specified key path. If the path is
* null, the association will map to null. Throws an exception if the property
* cannot be resolved.
*/
public static WOAssociation associationWithKeyPath(String aString) {
WOAssociation result = new WOAssociation();
result.path = aString;
return result;
}
/**
* Returns the value for this association's key path in the specified component,
* or null if any value in the path is null or if the key path is null.
*/
public Object valueInComponent(WOComponent aComponent) {
if (aComponent == null)
return null;
if (value != null)
return value;
if (path != null)
return aComponent.valueForKey(path);
throw new RuntimeException("WOAssociation: neither value nor path specified!");
}
/**
* Sets the property in the specified component to the specified value. Throws
* an exception if the property cannot be resolved.
*/
public void setValue(Object aValue, WOComponent aComponent) {
if (path != null) {
aComponent.takeValueForKey(aValue, path);
return;
}
throw new RuntimeException("WOAssociation: tried to set value but no path was specified!");
}
/**
* Returns true if this association is writable; that is, returns true if this
* association is not constant.
*/
public boolean isValueSettable() {
return (path != null);
}
/**
* Returns true if this association is constant and therefore read-only.
*/
public boolean isValueConstant() {
return (path == null);
}
/**
* For debugging purposes.
*/
public String toString() {
if (path != null) {
return "[WOAssociation:" + path + "]";
}
return "[WOAssociation:\"" + value + "\"]";
}
}
/*
* $Log$ Revision 1.1 2006/02/16 13:22:22 cgruber Check in all sources in
* eclipse-friendly maven-enabled packages.
*
* Revision 1.6 2003/01/24 20:13:22 mpowers Now accepting immutable NSDictionary
* in constructor, not Map.
*
* Revision 1.5 2003/01/17 22:55:08 mpowers Straighted out the parent binding
* issue (I think). Fixes for woextensions compatibility.
*
* Revision 1.3 2003/01/15 19:50:49 mpowers Fixed issues with WOSession and
* Serializable. Can now persist sessions between classloaders (hot swap of
* class impls).
*
* Revision 1.2 2003/01/14 15:51:48 mpowers Removed value() method from
* WOAssociaton.
*
* Revision 1.1.1.1 2000/12/21 15:52:50 mpowers Contributing wotonomy.
*
* Revision 1.3 2000/12/20 16:25:49 michael Added log to all files.
*
*
*/