You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by "Mikhail Fursov (JIRA)" <ji...@apache.org> on 2006/07/27 13:20:14 UTC

[jira] Updated: (HARMONY-420) improper listener notification in java.beans.VetoableChangeSupport

     [ http://issues.apache.org/jira/browse/HARMONY-420?page=all ]

Mikhail Fursov updated HARMONY-420:
-----------------------------------

    Attachment: diff

Here is a diff with bugfix and minimimized testcase

Note that the command 'ant -Dbuild.module beans test' does not run org.apache.harmony.beans.tests.java.beans testsuite by some unknown reason..

> improper listener notification in java.beans.VetoableChangeSupport
> ------------------------------------------------------------------
>
>                 Key: HARMONY-420
>                 URL: http://issues.apache.org/jira/browse/HARMONY-420
>             Project: Harmony
>          Issue Type: Bug
>          Components: Classlib
>         Environment: Harmony Class Library, J9
>            Reporter: Maxim Berkultsev
>            Priority: Minor
>         Attachments: diff
>
>
> VetoableChangeSupport functionality is not covered completely
> Following test code is under examination
> ----------------------------------------------
> import java.beans.*; 
> public class VetoableChangeSupportTest  {
> 	
> 	private VetoableChangeSupport support = new VetoableChangeSupport(this);
> 	
> 	private PropertyChangeEvent event;
> 	
> 	private String vetoedPropertyName = "property1";
> 	
> 	private Integer basicOldValue = new Integer(1);
> 	private Integer basicNewValue = new Integer(2);
> 	
> 	public static void main(String[] args) { 
> 		new VetoableChangeSupportTest().run(); 
> 	} 
> 	void run(){
> 		support.addVetoableChangeListener(new VetoableChangeListener() {
> 			public void vetoableChange(PropertyChangeEvent e) throws PropertyVetoException { 
> 				event = e; 
> 				String propertyName = e.getPropertyName();
> 				
> 				Integer oldValue = (Integer) e.getOldValue();
> 				Integer newValue = (Integer) e.getNewValue();
> 				
> 				System.out.println("in the first listener with property named = "
> 					+ propertyName
> 					+ " and old value = "
> 					+ oldValue
> 					+ " and new value = "
> 					+ newValue
> 				);
> 				
> 				
> 				if(propertyName.equals(vetoedPropertyName) && newValue.equals(basicNewValue)) { 
> 					System.out.println("in the first listener with property named = "
> 						+ propertyName
> 						+ " and old value = "
> 						+ oldValue
> 						+ " and new value = "
> 						+ newValue
> 						+ " exception is thrown"
> 					);
> 					throw new PropertyVetoException(propertyName + " change is vetoed.", e);
> 				}
> 			}
> 		});
> 		
> 		support.addVetoableChangeListener(new VetoableChangeListener() {
> 			public void vetoableChange(PropertyChangeEvent e) throws PropertyVetoException { 
> 				event = e; 
> 				String propertyName = e.getPropertyName();
> 				
> 				Integer oldValue = (Integer) e.getOldValue();
> 				Integer newValue = (Integer) e.getNewValue();
> 				
> 				System.out.println("in the second listener with property named = "
> 					+ propertyName
> 					+ " and old value = "
> 					+ oldValue
> 					+ " and new value = "
> 					+ newValue
> 				);
> 				
> 				if(propertyName.equals(vetoedPropertyName) && newValue.equals(basicOldValue)) {
> 					System.out.println("in the second listener with property named = "
> 						+ propertyName
> 						+ " and old value = "
> 						+ oldValue
> 						+ " and new value = "
> 						+ newValue
> 						+ " exception is thrown"
> 					);
> 					throw new PropertyVetoException(propertyName + " change is vetoed.", e);
> 				}
> 			}
> 		});
> 		
> 		try {
> 			support.fireVetoableChange(vetoedPropertyName, basicNewValue, basicOldValue);
> 		} catch(PropertyVetoException pve) {
> 			System.out.println("PropertyVetoException is finally thrown.");
> 		}
> 	}
> 	
> } 
> ----------------------------------------------
> For j9 + ClassLib the output of the test is
> in the first listener with property named = property1 and old value = 2 and new value = 1
> in the second listener with property named = property1 and old value = 2 and new value = 1
> in the second listener with property named = property1 and old value = 2 and new value = 1 exception is thrown
> in the first listener with property named = property1 and old value = 1 and new value = 2
> in the first listener with property named = property1 and old value = 1 and new value = 2 exception is thrown
> PropertyVetoException is finally thrown.
> For RI
> in the first listener with property named = property1 and old value = 2 and new value = 1
> in the second listener with property named = property1 and old value = 2 and new value = 1
> in the second listener with property named = property1 and old value = 2 and new value = 1 exception is thrown
> in the first listener with property named = property1 and old value = 1 and new value = 2
> in the first listener with property named = property1 and old value = 1 and new value = 2 exception is thrown
> in the second listener with property named = property1 and old value = 1 and new value = 2
> PropertyVetoException is finally thrown.
> Looks like the second listener is not notified after the PropertyVetoException is thrown for the second time

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira