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