Author: rahul Date: Tue Jan 8 12:43:38 2008 New Revision: 610138 URL: http://svn.apache.org/viewvc?rev=610138&view=rev Log: Attempt to simplify the NotificationRegistry using a new Observable marker interface. * NBC (commit message marker to help dig up commits that break compatibility, so these can be easily revisited) * TODO Use J5 for
Added: commons/proper/scxml/branches/J5/src/main/java/org/apache/commons/scxml/model/Observable.java (with props) Modified: commons/proper/scxml/branches/J5/src/main/java/org/apache/commons/scxml/NotificationRegistry.java commons/proper/scxml/branches/J5/src/main/java/org/apache/commons/scxml/SCXMLExecutor.java commons/proper/scxml/branches/J5/src/main/java/org/apache/commons/scxml/model/SCXML.java commons/proper/scxml/branches/J5/src/main/java/org/apache/commons/scxml/model/Transition.java commons/proper/scxml/branches/J5/src/main/java/org/apache/commons/scxml/model/TransitionTarget.java Modified: commons/proper/scxml/branches/J5/src/main/java/org/apache/commons/scxml/NotificationRegistry.java URL: http://svn.apache.org/viewvc/commons/proper/scxml/branches/J5/src/main/java/org/apache/commons/scxml/NotificationRegistry.java?rev=610138&r1=610137&r2=610138&view=diff ============================================================================== --- commons/proper/scxml/branches/J5/src/main/java/org/apache/commons/scxml/NotificationRegistry.java (original) +++ commons/proper/scxml/branches/J5/src/main/java/org/apache/commons/scxml/NotificationRegistry.java Tue Jan 8 12:43:38 2008 @@ -17,13 +17,14 @@ package org.apache.commons.scxml; import java.io.Serializable; +import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.Map; import java.util.Set; -import org.apache.commons.scxml.model.SCXML; +import org.apache.commons.scxml.model.Observable; import org.apache.commons.scxml.model.Transition; import org.apache.commons.scxml.model.TransitionTarget; @@ -46,13 +47,13 @@ /** * The Map of all listeners keyed by Observable. */ - private Map regs = new HashMap(); + private final Map<Observable, Set<SCXMLListener>> regs; /** * Constructor. */ public NotificationRegistry() { - super(); + this.regs = Collections.synchronizedMap(new HashMap<Observable, Set<SCXMLListener>>()); } /** @@ -61,11 +62,10 @@ * @param source The observable this listener wants to listen to * @param lst The listener */ - synchronized void addListener(final Object source, - final SCXMLListener lst) { - Set entries = (Set) regs.get(source); + synchronized void addListener(final Observable source, final SCXMLListener lst) { + Set<SCXMLListener> entries = regs.get(source); if (entries == null) { - entries = new HashSet(); + entries = new HashSet<SCXMLListener>(); regs.put(source, entries); } entries.add(lst); @@ -77,9 +77,8 @@ * @param source The observable this listener wants to stop listening to * @param lst The listener */ - synchronized void removeListener(final Object source, - final SCXMLListener lst) { - Set entries = (Set) regs.get(source); + synchronized void removeListener(final Observable source, final SCXMLListener lst) { + Set<SCXMLListener> entries = regs.get(source); if (entries != null) { entries.remove(lst); if (entries.size() == 0) { @@ -92,41 +91,15 @@ * Inform all relevant listeners that a TransitionTarget has been * entered. * - * @param observable The Observable - * @param state The TransitionTarget that was entered - */ - public void fireOnEntry(final TransitionTarget observable, - final TransitionTarget state) { - Object source = observable; - fireOnEntry(source, state); - } - - /** - * Inform all relevant listeners that a TransitionTarget has been - * entered. - * - * @param observable The Observable - * @param state The TransitionTarget that was entered - */ - public void fireOnEntry(final SCXML observable, - final TransitionTarget state) { - Object source = observable; - fireOnEntry(source, state); - } - - /** - * Inform all relevant listeners that a TransitionTarget has been - * entered. - * * @param source The Observable * @param state The TransitionTarget that was entered */ - private synchronized void fireOnEntry(final Object source, + public synchronized void fireOnEntry(final Observable source, final TransitionTarget state) { - Set entries = (Set) regs.get(source); + Set<SCXMLListener> entries = regs.get(source); if (entries != null) { - for (Iterator iter = entries.iterator(); iter.hasNext();) { - SCXMLListener lst = (SCXMLListener) iter.next(); + for (Iterator<SCXMLListener> iter = entries.iterator(); iter.hasNext();) { + SCXMLListener lst = iter.next(); lst.onEntry(state); } } @@ -136,41 +109,15 @@ * Inform all relevant listeners that a TransitionTarget has been * exited. * - * @param observable The Observable - * @param state The TransitionTarget that was exited - */ - public void fireOnExit(final TransitionTarget observable, - final TransitionTarget state) { - Object source = observable; - fireOnExit(source, state); - } - - /** - * Inform all relevant listeners that a TransitionTarget has been - * exited. - * - * @param observable The Observable - * @param state The TransitionTarget that was exited - */ - public void fireOnExit(final SCXML observable, - final TransitionTarget state) { - Object source = observable; - fireOnExit(source, state); - } - - /** - * Inform all relevant listeners that a TransitionTarget has been - * exited. - * * @param source The Observable * @param state The TransitionTarget that was exited */ - private synchronized void fireOnExit(final Object source, + public synchronized void fireOnExit(final Observable source, final TransitionTarget state) { - Set entries = (Set) regs.get(source); + Set<SCXMLListener> entries = regs.get(source); if (entries != null) { - for (Iterator iter = entries.iterator(); iter.hasNext();) { - SCXMLListener lst = (SCXMLListener) iter.next(); + for (Iterator<SCXMLListener> iter = entries.iterator(); iter.hasNext();) { + SCXMLListener lst = iter.next(); lst.onExit(state); } } @@ -179,48 +126,18 @@ /** * Inform all relevant listeners of a transition that has occured. * - * @param observable The Observable - * @param from The source TransitionTarget - * @param to The destination TransitionTarget - * @param transition The Transition that was taken - */ - public void fireOnTransition(final Transition observable, - final TransitionTarget from, final TransitionTarget to, - final Transition transition) { - Object source = observable; - fireOnTransition(source, from, to, transition); - } - - /** - * Inform all relevant listeners of a transition that has occured. - * - * @param observable The Observable - * @param from The source TransitionTarget - * @param to The destination TransitionTarget - * @param transition The Transition that was taken - */ - public void fireOnTransition(final SCXML observable, - final TransitionTarget from, final TransitionTarget to, - final Transition transition) { - Object source = observable; - fireOnTransition(source, from, to, transition); - } - - /** - * Inform all relevant listeners of a transition that has occured. - * * @param source The Observable * @param from The source TransitionTarget * @param to The destination TransitionTarget * @param transition The Transition that was taken */ - private synchronized void fireOnTransition(final Object source, + public synchronized void fireOnTransition(final Observable source, final TransitionTarget from, final TransitionTarget to, final Transition transition) { - Set entries = (Set) regs.get(source); + Set<SCXMLListener> entries = regs.get(source); if (entries != null) { - for (Iterator iter = entries.iterator(); iter.hasNext();) { - SCXMLListener lst = (SCXMLListener) iter.next(); + for (Iterator<SCXMLListener> iter = entries.iterator(); iter.hasNext();) { + SCXMLListener lst = iter.next(); lst.onTransition(from, to, transition); } } Modified: commons/proper/scxml/branches/J5/src/main/java/org/apache/commons/scxml/SCXMLExecutor.java URL: http://svn.apache.org/viewvc/commons/proper/scxml/branches/J5/src/main/java/org/apache/commons/scxml/SCXMLExecutor.java?rev=610138&r1=610137&r2=610138&view=diff ============================================================================== --- commons/proper/scxml/branches/J5/src/main/java/org/apache/commons/scxml/SCXMLExecutor.java (original) +++ commons/proper/scxml/branches/J5/src/main/java/org/apache/commons/scxml/SCXMLExecutor.java Tue Jan 8 12:43:38 2008 @@ -29,6 +29,7 @@ import org.apache.commons.scxml.model.Datamodel; import org.apache.commons.scxml.model.History; import org.apache.commons.scxml.model.ModelException; +import org.apache.commons.scxml.model.Observable; import org.apache.commons.scxml.model.SCXML; import org.apache.commons.scxml.model.State; import org.apache.commons.scxml.model.Transition; @@ -404,76 +405,23 @@ } /** - * Add a listener to the document root. + * Add a listener to the [EMAIL PROTECTED] Observable}. * - * @param scxml The document root to attach listener to. + * @param observable The [EMAIL PROTECTED] Observable} to attach the listener to. * @param listener The SCXMLListener. */ - public void addListener(final SCXML scxml, final SCXMLListener listener) { - Object observable = scxml; + public void addListener(final Observable observable, final SCXMLListener listener) { scInstance.getNotificationRegistry().addListener(observable, listener); } /** - * Remove this listener from the document root. + * Remove this listener from the [EMAIL PROTECTED] Observable}. * - * @param scxml The document root. + * @param scxml The [EMAIL PROTECTED] Observable}. * @param listener The SCXMLListener to be removed. */ - public void removeListener(final SCXML scxml, + public void removeListener(final Observable observable, final SCXMLListener listener) { - Object observable = scxml; - scInstance.getNotificationRegistry().removeListener(observable, - listener); - } - - /** - * Add a listener to this transition target. - * - * @param transitionTarget The <code>TransitionTarget</code> to - * attach listener to. - * @param listener The SCXMLListener. - */ - public void addListener(final TransitionTarget transitionTarget, - final SCXMLListener listener) { - Object observable = transitionTarget; - scInstance.getNotificationRegistry().addListener(observable, listener); - } - - /** - * Remove this listener for this transition target. - * - * @param transitionTarget The <code>TransitionTarget</code>. - * @param listener The SCXMLListener to be removed. - */ - public void removeListener(final TransitionTarget transitionTarget, - final SCXMLListener listener) { - Object observable = transitionTarget; - scInstance.getNotificationRegistry().removeListener(observable, - listener); - } - - /** - * Add a listener to this transition. - * - * @param transition The <code>Transition</code> to attach listener to. - * @param listener The SCXMLListener. - */ - public void addListener(final Transition transition, - final SCXMLListener listener) { - Object observable = transition; - scInstance.getNotificationRegistry().addListener(observable, listener); - } - - /** - * Remove this listener for this transition. - * - * @param transition The <code>Transition</code>. - * @param listener The SCXMLListener to be removed. - */ - public void removeListener(final Transition transition, - final SCXMLListener listener) { - Object observable = transition; scInstance.getNotificationRegistry().removeListener(observable, listener); } Added: commons/proper/scxml/branches/J5/src/main/java/org/apache/commons/scxml/model/Observable.java URL: http://svn.apache.org/viewvc/commons/proper/scxml/branches/J5/src/main/java/org/apache/commons/scxml/model/Observable.java?rev=610138&view=auto ============================================================================== --- commons/proper/scxml/branches/J5/src/main/java/org/apache/commons/scxml/model/Observable.java (added) +++ commons/proper/scxml/branches/J5/src/main/java/org/apache/commons/scxml/model/Observable.java Tue Jan 8 12:43:38 2008 @@ -0,0 +1,29 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.commons.scxml.model; + +/** + * Marker interface to flag elements of the SCXML object model whose progress + * can be observed using the [EMAIL PROTECTED] NotificationRegistry}. These include + * individual [EMAIL PROTECTED] TransitionTarget}s, [EMAIL PROTECTED] Transition}s or entire state + * machines, [EMAIL PROTECTED] SCXML}. + * + */ +public interface Observable { + +} + Propchange: commons/proper/scxml/branches/J5/src/main/java/org/apache/commons/scxml/model/Observable.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: commons/proper/scxml/branches/J5/src/main/java/org/apache/commons/scxml/model/Observable.java ------------------------------------------------------------------------------ svn:keywords = Date Author Id Revision HeadURL Modified: commons/proper/scxml/branches/J5/src/main/java/org/apache/commons/scxml/model/SCXML.java URL: http://svn.apache.org/viewvc/commons/proper/scxml/branches/J5/src/main/java/org/apache/commons/scxml/model/SCXML.java?rev=610138&r1=610137&r2=610138&view=diff ============================================================================== --- commons/proper/scxml/branches/J5/src/main/java/org/apache/commons/scxml/model/SCXML.java (original) +++ commons/proper/scxml/branches/J5/src/main/java/org/apache/commons/scxml/model/SCXML.java Tue Jan 8 12:43:38 2008 @@ -29,7 +29,7 @@ * root". * */ -public class SCXML implements Serializable { +public class SCXML implements Serializable, Observable { /** * Serial version UID. Modified: commons/proper/scxml/branches/J5/src/main/java/org/apache/commons/scxml/model/Transition.java URL: http://svn.apache.org/viewvc/commons/proper/scxml/branches/J5/src/main/java/org/apache/commons/scxml/model/Transition.java?rev=610138&r1=610137&r2=610138&view=diff ============================================================================== --- commons/proper/scxml/branches/J5/src/main/java/org/apache/commons/scxml/model/Transition.java (original) +++ commons/proper/scxml/branches/J5/src/main/java/org/apache/commons/scxml/model/Transition.java Tue Jan 8 12:43:38 2008 @@ -28,7 +28,7 @@ * */ public class Transition extends Executable - implements NamespacePrefixesHolder { + implements NamespacePrefixesHolder, Observable { /** * Serial version UID. Modified: commons/proper/scxml/branches/J5/src/main/java/org/apache/commons/scxml/model/TransitionTarget.java URL: http://svn.apache.org/viewvc/commons/proper/scxml/branches/J5/src/main/java/org/apache/commons/scxml/model/TransitionTarget.java?rev=610138&r1=610137&r2=610138&view=diff ============================================================================== --- commons/proper/scxml/branches/J5/src/main/java/org/apache/commons/scxml/model/TransitionTarget.java (original) +++ commons/proper/scxml/branches/J5/src/main/java/org/apache/commons/scxml/model/TransitionTarget.java Tue Jan 8 12:43:38 2008 @@ -25,7 +25,7 @@ * <target> for a <transition>, such as State or Parallel. * */ -public abstract class TransitionTarget implements Serializable { +public abstract class TransitionTarget implements Serializable, Observable { /** * Identifier for this transition target. Other parts of the SCXML