/* 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. * * */