From: <jg...@us...> - 2006-10-04 09:05:51
|
Revision: 76 http://svn.sourceforge.net/surveyforge/?rev=76&view=rev Author: jgongo Date: 2006-10-04 02:05:42 -0700 (Wed, 04 Oct 2006) Log Message: ----------- 1. Correct synchronization between bean and bean context 2. Bug fix in get/set value methods Modified Paths: -------------- trunk/surveyforge-util/src/main/java/org/surveyforge/util/jgoodies/JXPathBeanAdapter.java Modified: trunk/surveyforge-util/src/main/java/org/surveyforge/util/jgoodies/JXPathBeanAdapter.java =================================================================== --- trunk/surveyforge-util/src/main/java/org/surveyforge/util/jgoodies/JXPathBeanAdapter.java 2006-10-04 08:56:58 UTC (rev 75) +++ trunk/surveyforge-util/src/main/java/org/surveyforge/util/jgoodies/JXPathBeanAdapter.java 2006-10-04 09:05:42 UTC (rev 76) @@ -128,46 +128,46 @@ * <strong>Basic Examples:</strong> * * <pre> - * // Direct access, ignores changes - * Address address = new Address() - * JXPathBeanAdapter adapter = new JXPathBeanAdapter(address); - * adapter.setValue("street", "Broadway"); - * System.out.println(address.getStreet()); // Prints "Broadway" - * address.setStreet("Franz-Josef-Str."); - * System.out.println(adapter.getValue("street")); // Prints "Franz-Josef-Str." - * - * - * //Direct access, observes changes - * JXPathBeanAdapter adapter = new JXPathBeanAdapter(address, true); - * - * - * // Indirect access, ignores changes - * ValueHolder addressHolder = new ValueHolder(address1); - * JXPathBeanAdapter adapter = new JXPathBeanAdapter(addressHolder); - * adapter.setValue("street", "Broadway"); // Sets the street in address1 - * System.out.println(address1.getStreet()); // Prints "Broadway" - * adapter.setBean(address2); - * adapter.setValue("street", "Robert-Koch-Str."); // Sets the street in address2 - * System.out.println(address2.getStreet()); // Prints "Robert-Koch-Str." - * - * - * // Indirect access, observes changes - * ValueHolder addressHolder = new ValueHolder(); - * JXPathBeanAdapter adapter = new JXPathBeanAdapter(addressHolder, true); - * addressHolder.setValue(address1); - * address1.setStreet("Broadway"); - * System.out.println(adapter.getValue("street")); // Prints "Broadway" - * - * - * // Access through ValueModels - * Address address = new Address(); - * JXPathBeanAdapter adapter = new JXPathBeanAdapter(address); - * ValueModel streetModel = adapter.getValueModel("street"); - * ValueModel cityModel = adapter.getValueModel("city"); - * streetModel.setValue("Broadway"); - * System.out.println(address.getStreet()); // Prints "Broadway" - * address.setCity("Hamburg"); - * System.out.println(cityModel.getValue()); // Prints "Hamburg" + * // Direct access, ignores changes + * Address address = new Address() + * JXPathBeanAdapter adapter = new JXPathBeanAdapter(address); + * adapter.setValue("street", "Broadway"); + * System.out.println(address.getStreet()); // Prints "Broadway" + * address.setStreet("Franz-Josef-Str."); + * System.out.println(adapter.getValue("street")); // Prints "Franz-Josef-Str." + * + * + * //Direct access, observes changes + * JXPathBeanAdapter adapter = new JXPathBeanAdapter(address, true); + * + * + * // Indirect access, ignores changes + * ValueHolder addressHolder = new ValueHolder(address1); + * JXPathBeanAdapter adapter = new JXPathBeanAdapter(addressHolder); + * adapter.setValue("street", "Broadway"); // Sets the street in address1 + * System.out.println(address1.getStreet()); // Prints "Broadway" + * adapter.setBean(address2); + * adapter.setValue("street", "Robert-Koch-Str."); // Sets the street in address2 + * System.out.println(address2.getStreet()); // Prints "Robert-Koch-Str." + * + * + * // Indirect access, observes changes + * ValueHolder addressHolder = new ValueHolder(); + * JXPathBeanAdapter adapter = new JXPathBeanAdapter(addressHolder, true); + * addressHolder.setValue(address1); + * address1.setStreet("Broadway"); + * System.out.println(adapter.getValue("street")); // Prints "Broadway" + * + * + * // Access through ValueModels + * Address address = new Address(); + * JXPathBeanAdapter adapter = new JXPathBeanAdapter(address); + * ValueModel streetModel = adapter.getValueModel("street"); + * ValueModel cityModel = adapter.getValueModel("city"); + * streetModel.setValue("Broadway"); + * System.out.println(address.getStreet()); // Prints "Broadway" + * address.setCity("Hamburg"); + * System.out.println(cityModel.getValue()); // Prints "Hamburg" * </pre> * * <strong>Adapter Chain Example:</strong> <br> @@ -315,7 +315,7 @@ */ private PropertyChangeListener propertyChangeHandler; - private final JXPathContext beanContext; + private JXPathContext beanContext; // Instance creation **************************************************** @@ -920,7 +920,10 @@ */ private Object getValue0( Object bean, String propertyName ) { - return this.beanContext.getValue( propertyName ); + if( bean == this.getBean( ) ) + return this.beanContext.getValue( propertyName ); + else + return JXPathContext.newContext( bean ).getValue( propertyName ); // return getValue0( bean, getPropertyDescriptor( bean, propertyName ) ); } @@ -969,7 +972,10 @@ */ private void setValue0( Object bean, String propertyName, Object newValue ) throws PropertyVetoException { - this.beanContext.setValue( propertyName, newValue ); + if( bean == this.getBean( ) ) + this.beanContext.setValue( propertyName, newValue ); + else + JXPathContext.newContext( bean ).setValue( propertyName, newValue ); // setValue0( bean, getPropertyDescriptor( bean, propertyName ), newValue ); } @@ -1032,6 +1038,7 @@ public void propertyChange( PropertyChangeEvent evt ) { Object newBean = evt.getNewValue( ) != null ? evt.getNewValue( ) : getBean( ); + JXPathBeanAdapter.this.beanContext = JXPathContext.newContext( newBean ); setBean0( storedOldBean, newBean ); storedOldBean = newBean; } @@ -1084,35 +1091,31 @@ /** * Holds the name of the adapted property. */ - private final String propertyName; + private final String propertyName; /** * Holds the optional name of the property's getter. Used to create the PropertyDescriptor. Also used to reject potential misuse of * {@link JXPathBeanAdapter#getValueModel(String)} and {@link JXPathBeanAdapter#getValueModel(String, String, String)}. See the * latter methods for details. */ - final String getterName; + final String getterName; /** * Holds the optional name of the property's setter. Used to create the PropertyDescriptor. Also used to reject potential misuse of * {@link JXPathBeanAdapter#getValueModel(String)} and {@link JXPathBeanAdapter#getValueModel(String, String, String)}. See the * latter methods for details. */ - final String setterName; + final String setterName; /** * Describes the property accessor; basically a getter and setter. */ -// private PropertyDescriptor cachedPropertyDescriptor; - + // private PropertyDescriptor cachedPropertyDescriptor; /** * Holds the bean class associated with the cached property descriptor. */ -// private Class cachedBeanClass; - - + // private Class cachedBeanClass; // Instance Creation -------------------------------------------------- - SimplePropertyAdapter( String propertyName, String getterName, String setterName ) { this.propertyName = propertyName; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |