Skip to Content.
Sympa Menu

notify-dpml - svn commit: r1549 - in development/laboratory/planet/components/transitionmachine: . api/src/main/net/dpml/transitionmachine basic/src/main/net/dpml/transitionmachine/basic demo/trafficlight/src/main/net/dpml/transitionmachine/trafficlight

notify-dpml AT lists.ibiblio.org

Subject: DPML Notify

List archive

Chronological Thread  
  • From: niclas AT netcompartner.com
  • To: notify-dpml AT lists.ibiblio.org
  • Subject: svn commit: r1549 - in development/laboratory/planet/components/transitionmachine: . api/src/main/net/dpml/transitionmachine basic/src/main/net/dpml/transitionmachine/basic demo/trafficlight/src/main/net/dpml/transitionmachine/trafficlight
  • Date: Fri, 21 Jan 2005 19:44:18 +0100

Author: niclas
Date: Fri Jan 21 19:44:17 2005
New Revision: 1549

Modified:

development/laboratory/planet/components/transitionmachine/api/src/main/net/dpml/transitionmachine/State.java

development/laboratory/planet/components/transitionmachine/api/src/main/net/dpml/transitionmachine/Transition.java

development/laboratory/planet/components/transitionmachine/api/src/main/net/dpml/transitionmachine/TransitionMachine.java

development/laboratory/planet/components/transitionmachine/basic/src/main/net/dpml/transitionmachine/basic/StateImpl.java

development/laboratory/planet/components/transitionmachine/basic/src/main/net/dpml/transitionmachine/basic/TransitionComponent.java

development/laboratory/planet/components/transitionmachine/basic/src/main/net/dpml/transitionmachine/basic/TransitionImpl.java

development/laboratory/planet/components/transitionmachine/basic/src/main/net/dpml/transitionmachine/basic/TransitionMachineImpl.java

development/laboratory/planet/components/transitionmachine/demo/trafficlight/src/main/net/dpml/transitionmachine/trafficlight/TrafficLight.java
development/laboratory/planet/components/transitionmachine/index.xml
Log:
Transition now responsible to notify State for entry and exit, plus notify
the listeners.

Modified:
development/laboratory/planet/components/transitionmachine/api/src/main/net/dpml/transitionmachine/State.java
==============================================================================
---
development/laboratory/planet/components/transitionmachine/api/src/main/net/dpml/transitionmachine/State.java
(original)
+++
development/laboratory/planet/components/transitionmachine/api/src/main/net/dpml/transitionmachine/State.java
Fri Jan 21 19:44:17 2005
@@ -79,4 +79,15 @@
*/
String getDescription( Locale locale );

+ /** Called by the TransitionMachine when this State is entered.
+ * exit() on the "end" State is always called before entry() on the
+ * "begin" State of the Transition.
+ */
+ void entry();
+
+ /** Called by the TransitionMachine when this State is exited.
+ * exit() on the "end" State is always called before entry() on the
+ * "begin" State of the Transition.
+ */
+ void exit();
}

Modified:
development/laboratory/planet/components/transitionmachine/api/src/main/net/dpml/transitionmachine/Transition.java
==============================================================================
---
development/laboratory/planet/components/transitionmachine/api/src/main/net/dpml/transitionmachine/Transition.java
(original)
+++
development/laboratory/planet/components/transitionmachine/api/src/main/net/dpml/transitionmachine/Transition.java
Fri Jan 21 19:44:17 2005
@@ -63,4 +63,6 @@
void addTransitionListener( TransitionListener listener );

void removeTransitionListener( TransitionListener listener );
+
+ State execute( Object source, TransitionMachine machine );
}

Modified:
development/laboratory/planet/components/transitionmachine/api/src/main/net/dpml/transitionmachine/TransitionMachine.java
==============================================================================
---
development/laboratory/planet/components/transitionmachine/api/src/main/net/dpml/transitionmachine/TransitionMachine.java
(original)
+++
development/laboratory/planet/components/transitionmachine/api/src/main/net/dpml/transitionmachine/TransitionMachine.java
Fri Jan 21 19:44:17 2005
@@ -49,26 +49,43 @@
* distributed environment.
*/
void trigger( Object source, String commandString );
-
+
+ /** Returns the State the TransitionMachine currently is in.
+ * @return instance of the current state, or null if the current state is
+ * unknown, which happens after the creation of the
TransitionMachine
+ * and whenever the current state is is no longer part of the
model.
+ */
State getCurrentState();

+ /** Add a Transition to the TransitionMachine model.
+ * @param transition The transition to be added.
+ */
void addTransition( Transition transition );

+ /** Add a Transition collection to the TransitionMachine model.
+ * Each element in the <code>transition</code> collection must
+ * implement the Transition interface.
+ *
+ * @param transitions The collection of transitions to be added.
+ */
void addTransitions( Collection transitions );

+ /** Remove a Transition from the TransitionMachine model.
+ * @param transition The transition to be removed.
+ */
void removeTransition( Transition transition );

+ /** Remove all Transitions from the TransitionMachine model.
+ * After this method is called, the current state will be unknown.
+ */
void removeAllTransitions();

+
void addTransitionListener( TransitionListener listener, String
transitionId );

void removeTransitionListener( TransitionListener listener, String
transitionId );

void removeTransitionListener( TransitionListener listener );

- void start();
-
- void stop();
-
void reset( State initialState );
}

Modified:
development/laboratory/planet/components/transitionmachine/basic/src/main/net/dpml/transitionmachine/basic/StateImpl.java
==============================================================================
---
development/laboratory/planet/components/transitionmachine/basic/src/main/net/dpml/transitionmachine/basic/StateImpl.java
(original)
+++
development/laboratory/planet/components/transitionmachine/basic/src/main/net/dpml/transitionmachine/basic/StateImpl.java
Fri Jan 21 19:44:17 2005
@@ -83,4 +83,14 @@
ResourceBundle bundle = ResourceBundle.getBundle(
TransitionMachine.BUNDLE_NAME, locale );
return bundle.getString( m_identity + ".description" );
}
+
+ public void entry()
+ {
+ // default: No action.
+ }
+
+ public void exit()
+ {
+ // default: No action.
+ }
}

Modified:
development/laboratory/planet/components/transitionmachine/basic/src/main/net/dpml/transitionmachine/basic/TransitionComponent.java
==============================================================================
---
development/laboratory/planet/components/transitionmachine/basic/src/main/net/dpml/transitionmachine/basic/TransitionComponent.java
(original)
+++
development/laboratory/planet/components/transitionmachine/basic/src/main/net/dpml/transitionmachine/basic/TransitionComponent.java
Fri Jan 21 19:44:17 2005
@@ -1,18 +1,25 @@

package net.dpml.transitionmachine.basic;

+import java.util.ArrayList;
+import java.util.Iterator;
import java.util.Locale;
import java.util.ResourceBundle;
-import java.util.ArrayList;
+
import net.dpml.context.Context;
import net.dpml.context.ContextException;
+
+import net.dpml.logging.Logger;
+
import net.dpml.service.ServiceException;
import net.dpml.service.ServiceManager;
-import net.dpml.transitionmachine.Transition;
+
import net.dpml.transitionmachine.State;
+import net.dpml.transitionmachine.Transition;
+import net.dpml.transitionmachine.TransitionEvent;
+import net.dpml.transitionmachine.TransitionListener;
import net.dpml.transitionmachine.TransitionMachine;
import net.dpml.transitionmachine.TransitionRule;
-import net.dpml.transitionmachine.TransitionListener;

/**
* @metro.component name="transition" lifestyle="transient" collection="hard"
@@ -21,11 +28,12 @@
public class TransitionComponent
implements Transition
{
- private State m_beginState;
- private State m_endState;
- private String m_identity;
- private TransitionRule m_Rule;
- private ArrayList m_listeners;
+ private State m_beginState;
+ private State m_endState;
+ private String m_identity;
+ private TransitionRule m_Rule;
+ private ArrayList m_listeners;
+ private Logger m_logger;

/**
* @param man The ServiceManager for this component.
@@ -36,22 +44,25 @@
* @throws ServiceException if the "begin" and "end" StateImpl
dependencies can not be
* satisfied.
*
+ * @metro.logger name="transitionmachine"
+ *
* @metro.entry key="urn:metro:name"
* type="java.lang.String"
* @metro.dependency key="begin" type="net.dpml.transitionmachine.State"
* @metro.dependency key="end" type="net.dpml.transitionmachine.State"
- * @metro.dependency key="sm"
type="net.dpml.transitionmachine.TransitionMachine"
+ * @metro.dependency key="tm"
type="net.dpml.transitionmachine.TransitionMachine"
* @metro.dependency key="rule"
type="net.dpml.transitionmachine.TransitionRule"
*/
- public TransitionComponent( ServiceManager man, Context ctx )
+ public TransitionComponent( ServiceManager man, Context ctx, Logger
logger )
throws ContextException, ServiceException
{
+ m_logger = logger;
m_identity = (String) ctx.get( "urn:metro:name" );
State beginState = (State) man.lookup( "begin" );
m_beginState = beginState;
State endState = (State) man.lookup( "end" );
m_endState = endState;
- TransitionMachine sm = (TransitionMachine) man.lookup( "sm" );
+ TransitionMachine sm = (TransitionMachine) man.lookup( "tm" );
sm.addTransition( this );
m_Rule = (TransitionRule) man.lookup( "rule" );

@@ -90,11 +101,38 @@
return bundle.getString( m_identity + ".description" );
}

+ public State execute( Object source, TransitionMachine tm )
+ {
+ m_beginState.exit();
+ m_endState.entry();
+
+ TransitionEvent event = new TransitionEvent( source, this, tm );
+ Iterator list;
+ synchronized( m_listeners )
+ {
+ list = m_listeners.iterator();
+ }
+ while( list.hasNext() )
+ {
+ try
+ {
+ TransitionListener listener = (TransitionListener)
list.next();
+ listener.transition( event );
+ } catch( Exception e )
+ {
+ m_logger.error( "Exception in TransitionListener.", e );
+ }
+ }
+ return m_endState;
+ }
+
public void addTransitionListener( TransitionListener listener )
{
synchronized( m_listeners )
{
- m_listeners.add( listener );
+ ArrayList clone = (ArrayList) m_listeners.clone();
+ clone.add( listener );
+ m_listeners = clone;
}
}

@@ -102,7 +140,9 @@
{
synchronized( m_listeners )
{
- m_listeners.add( listener );
+ ArrayList clone = (ArrayList) m_listeners.clone();
+ clone.remove( listener );
+ m_listeners = clone;
}
}


Modified:
development/laboratory/planet/components/transitionmachine/basic/src/main/net/dpml/transitionmachine/basic/TransitionImpl.java
==============================================================================
---
development/laboratory/planet/components/transitionmachine/basic/src/main/net/dpml/transitionmachine/basic/TransitionImpl.java
(original)
+++
development/laboratory/planet/components/transitionmachine/basic/src/main/net/dpml/transitionmachine/basic/TransitionImpl.java
Fri Jan 21 19:44:17 2005
@@ -1,18 +1,26 @@

package net.dpml.transitionmachine.basic;

+import java.util.ArrayList;
+import java.util.Iterator;
import java.util.Locale;
import java.util.ResourceBundle;
-import java.util.ArrayList;

import net.dpml.lang.NullArgumentException;

-import net.dpml.transitionmachine.Transition;
+import net.dpml.logging.Logger;
+
import net.dpml.transitionmachine.State;
+import net.dpml.transitionmachine.Transition;
+import net.dpml.transitionmachine.TransitionEvent;
+import net.dpml.transitionmachine.TransitionListener;
import net.dpml.transitionmachine.TransitionMachine;
import net.dpml.transitionmachine.TransitionRule;
-import net.dpml.transitionmachine.TransitionListener;

+/** A non-Metro implementation of a basic Transition.
+ * This is the equivalent of the TransitionComponent, except that it does not
+ * use Metro for looking up state and identity.
+ */
public class TransitionImpl
implements Transition
{
@@ -21,7 +29,7 @@
private String m_identity;
private TransitionRule m_rule;
private ArrayList m_listeners;
-
+ private Logger m_logger;
/*
* Non-Metro constructor.
*
@@ -31,8 +39,9 @@
* @param rule The TransitionRule for this transition to activate.
*/
public TransitionImpl( State beginState, State endState, String identity,
- TransitionRule rule )
+ TransitionRule rule, Logger logger )
{
+ m_logger = logger;
if( beginState == null )
{
throw new NullArgumentException( "beginState" );
@@ -83,11 +92,38 @@
return bundle.getString( m_identity + ".description" );
}

+ public State execute( Object source, TransitionMachine tm )
+ {
+ m_beginState.exit();
+ m_endState.entry();
+
+ TransitionEvent event = new TransitionEvent( source, this, tm );
+ Iterator list;
+ synchronized( m_listeners )
+ {
+ list = m_listeners.iterator();
+ }
+ while( list.hasNext() )
+ {
+ try
+ {
+ TransitionListener listener = (TransitionListener)
list.next();
+ listener.transition( event );
+ } catch( Exception e )
+ {
+ m_logger.error( "Exception in TransitionListener.", e );
+ }
+ }
+ return m_endState;
+ }
+
public void addTransitionListener( TransitionListener listener )
{
synchronized( m_listeners )
{
- m_listeners.add( listener );
+ ArrayList clone = (ArrayList) m_listeners.clone();
+ clone.add( listener );
+ m_listeners = clone;
}
}

@@ -95,7 +131,9 @@
{
synchronized( m_listeners )
{
- m_listeners.add( listener );
+ ArrayList clone = (ArrayList) m_listeners.clone();
+ clone.remove( listener );
+ m_listeners = clone;
}
}


Modified:
development/laboratory/planet/components/transitionmachine/basic/src/main/net/dpml/transitionmachine/basic/TransitionMachineImpl.java
==============================================================================
---
development/laboratory/planet/components/transitionmachine/basic/src/main/net/dpml/transitionmachine/basic/TransitionMachineImpl.java
(original)
+++
development/laboratory/planet/components/transitionmachine/basic/src/main/net/dpml/transitionmachine/basic/TransitionMachineImpl.java
Fri Jan 21 19:44:17 2005
@@ -38,11 +38,10 @@
* @metro.service type="net.dpml.transitionmachine.TransitionMachine"
*/
public class TransitionMachineImpl
- implements TransitionMachine, Startable
+ implements TransitionMachine
{
private HashMap m_transitions;
private WeakHashMap m_crossIndex;
- private boolean m_running;
private State m_currentState;

public TransitionMachineImpl()
@@ -58,17 +57,18 @@
*/
public void trigger( Object source, String commandString )
{
+ Transition transition = null;
synchronized( this )
{
Collection bucket = (Collection) m_crossIndex.get(
m_currentState );
Iterator iterator = bucket.iterator();
while( iterator.hasNext() )
{
- Transition transition = (Transition) iterator.next();
+ transition = (Transition) iterator.next();
TransitionRule rule = transition.getTransitionRule();
if( rule.isTransition( commandString ) )
{
- m_currentState = transition.getEndState();
+ m_currentState = transition.execute( source, this );
break;
}
}
@@ -79,13 +79,9 @@
{
return m_currentState;
}
-
+
public void addTransition( Transition transition )
{
- if( m_running )
- throw new IllegalStateException(
- "Unable to modify the State Machine while it is running."
- );
synchronized( this )
{
String id = transition.getIdentity();
@@ -105,16 +101,12 @@
while( iterator.hasNext() )
{
Transition transition = (Transition) iterator.next();
- removeTransition( transition );
+ addTransition( transition );
}
}

public void removeTransition( Transition transition )
{
- if( m_running )
- throw new IllegalStateException(
- "Unable to modify the State Machine while it is running."
- );
synchronized( this )
{
String id = transition.getIdentity();
@@ -133,6 +125,7 @@
{
m_transitions.clear();
m_crossIndex.clear();
+ m_currentState = null;
}
}

@@ -164,16 +157,6 @@
}
}

- public void start()
- {
- m_running = true;
- }
-
- public void stop()
- {
- m_running = false;
- }
-
public void reset( State initialState )
{
synchronized( this )

Modified:
development/laboratory/planet/components/transitionmachine/demo/trafficlight/src/main/net/dpml/transitionmachine/trafficlight/TrafficLight.java
==============================================================================
---
development/laboratory/planet/components/transitionmachine/demo/trafficlight/src/main/net/dpml/transitionmachine/trafficlight/TrafficLight.java
(original)
+++
development/laboratory/planet/components/transitionmachine/demo/trafficlight/src/main/net/dpml/transitionmachine/trafficlight/TrafficLight.java
Fri Jan 21 19:44:17 2005
@@ -110,18 +110,16 @@
{
return m_type;
}
-
+
public void setType( boolean type )
{
- m_transitionMachine.stop();
m_type = type;
if( type )
international();
else
swedish();
- m_transitionMachine.start();
}
-
+
/**
* Sets international sequencing system.
*/

Modified: development/laboratory/planet/components/transitionmachine/index.xml
==============================================================================
--- development/laboratory/planet/components/transitionmachine/index.xml
(original)
+++ development/laboratory/planet/components/transitionmachine/index.xml
Fri Jan 21 19:44:17 2005
@@ -18,7 +18,7 @@
limitations under the License.
-->

-<index>
+<index key="dpml-transitionmachine">
<import uri="artifact:module:dpml/metro/dpml-metro#SNAPSHOT"/>
<import uri="artifact:module:dpml/magic/dpml-magic#SNAPSHOT"/>
<import uri="artifact:module:dpml/transit/dpml-transit#SNAPSHOT"/>
@@ -35,8 +35,7 @@
<include key="dpml-magic-checkstyle"/>
</plugins>
<dependencies>
- <include key="dpml-transit"/>
- <include key="dpml-util" />
+<!-- <include key="dpml-transit"/> -->
</dependencies>
</project>

@@ -64,6 +63,7 @@
<dependencies>
<include key="dpml-activity-api" />
<include key="dpml-context-api" />
+ <include key="dpml-logging-api" />
<include key="dpml-parameters-api" />
<include key="dpml-service-api" />
<include key="dpml-transitionmachine-api" />



  • svn commit: r1549 - in development/laboratory/planet/components/transitionmachine: . api/src/main/net/dpml/transitionmachine basic/src/main/net/dpml/transitionmachine/basic demo/trafficlight/src/main/net/dpml/transitionmachine/trafficlight, niclas, 01/21/2005

Archive powered by MHonArc 2.6.24.

Top of Page