notify-dpml AT lists.ibiblio.org
Subject: DPML Notify
List archive
svn commit: r1674 - in development/laboratory/planet/components/fsm: . api/src/main/net/dpml/fsm basic/src/main/net/dpml/fsm/basic basic/src/test/net/dpml/fsm/basic/test demo/trafficlight/src/main/net/dpml/fsm/trafficlight
- From: niclas AT netcompartner.com
- To: notify-dpml AT lists.ibiblio.org
- Subject: svn commit: r1674 - in development/laboratory/planet/components/fsm: . api/src/main/net/dpml/fsm basic/src/main/net/dpml/fsm/basic basic/src/test/net/dpml/fsm/basic/test demo/trafficlight/src/main/net/dpml/fsm/trafficlight
- Date: Tue, 01 Feb 2005 08:20:34 +0100
Author: niclas
Date: Tue Feb 1 08:20:33 2005
New Revision: 1674
Added:
development/laboratory/planet/components/fsm/api/src/main/net/dpml/fsm/AbstractState.java
(contents, props changed)
development/laboratory/planet/components/fsm/basic/src/main/net/dpml/fsm/basic/SimpleState.java
(contents, props changed)
Removed:
development/laboratory/planet/components/fsm/basic/src/main/net/dpml/fsm/basic/StateImpl.java
Modified:
development/laboratory/planet/components/fsm/api/src/main/net/dpml/fsm/State.java
development/laboratory/planet/components/fsm/basic/src/main/net/dpml/fsm/basic/CommandRuleComponent.java
development/laboratory/planet/components/fsm/basic/src/main/net/dpml/fsm/basic/StateComponent.java
development/laboratory/planet/components/fsm/basic/src/main/net/dpml/fsm/basic/StateMachineImpl.java
development/laboratory/planet/components/fsm/basic/src/test/net/dpml/fsm/basic/test/AbstractTransitionTC.java
development/laboratory/planet/components/fsm/basic/src/test/net/dpml/fsm/basic/test/StateTestCase.java
development/laboratory/planet/components/fsm/basic/src/test/net/dpml/fsm/basic/test/TransitionComponentTestCase.java
development/laboratory/planet/components/fsm/basic/src/test/net/dpml/fsm/basic/test/TransitionImplTestCase.java
development/laboratory/planet/components/fsm/demo/trafficlight/src/main/net/dpml/fsm/trafficlight/Timer.java
development/laboratory/planet/components/fsm/index.xml
Log:
Adjustments to the FSM.
Added:
development/laboratory/planet/components/fsm/api/src/main/net/dpml/fsm/AbstractState.java
==============================================================================
--- (empty file)
+++
development/laboratory/planet/components/fsm/api/src/main/net/dpml/fsm/AbstractState.java
Tue Feb 1 08:20:33 2005
@@ -0,0 +1,115 @@
+/*
+ * Copyright 2004-2005 Niclas Hedhman.
+ *
+ * Licensed 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 net.dpml.fsm;
+
+import java.util.Locale;
+import java.util.ResourceBundle;
+
+import net.dpml.fsm.AbstractState;
+import net.dpml.fsm.State;
+import net.dpml.fsm.StateMachine;
+
+import net.dpml.lang.NullArgumentException;
+
+
+/**
+ * This is an Abstract base class, suitable to extend and override the
entry()
+ * and exit methods.
+ * <p/>
+ * The Name and Description is read from the java.util.ResourceBundle named
+ * "net.dpml.fsm.Resources", and can be either a properties file, or a
+ * net.dpml.i18n.BundleHandler. </p>
+ * <p/>
+ * For each "identity", i.e. each StateImpl, you need to have two resource
strings, with the same
+ * name as the identity, prepended with ".name" and ".description"
respectively. Example; </p>
+ * <code><pre>
+ * normal.name=Normal
+ * normal.description=This is the Normal state, where it is waiting for a
command.
+ * print.name=Printing
+ * print.description=In this state, the printing rendering is in progress.
It will leave \
+ * this state when all data has been delivered to the output buffers.
+ * error.name=Failure
+ * error.description=Something has gone wrong and it is set into an error
state. Reset command
+ * required.
+ * </pre></code>
+ */
+public abstract class AbstractState
+ implements State
+{
+ private String m_identity;
+
+ public AbstractState( String identity )
+ throws NullArgumentException
+ {
+ if( identity == null )
+ {
+ throw new NullArgumentException( "identity" );
+ }
+
+ m_identity = identity;
+ }
+
+ public String getIdentity()
+ {
+ return m_identity;
+ }
+
+ public String getName( Locale locale, ClassLoader cl )
+ {
+ String name = StateMachine.BUNDLE_NAME;
+ ResourceBundle bundle = ResourceBundle.getBundle( name , locale, cl
);
+ return bundle.getString( m_identity + ".name" );
+ }
+
+ public String getDescription( Locale locale, ClassLoader cl )
+ {
+ String name = StateMachine.BUNDLE_NAME;
+ ResourceBundle bundle = ResourceBundle.getBundle( name, locale, cl );
+ return bundle.getString( m_identity + ".description" );
+ }
+
+ public String toString()
+ {
+ return "State[" + m_identity + "]";
+ }
+
+ public boolean equals( Object o )
+ {
+ if( o == null )
+ {
+ System.out.println( "fail null" );
+ return false;
+ }
+ if( ! (o instanceof State) )
+ {
+ System.out.println( "fail instanceof" );
+ return false;
+ }
+ State other = (State) o;
+ return m_identity.equals( other.getIdentity() );
+ }
+
+ public int hashCode()
+ {
+ int idHash = m_identity.hashCode();
+ int hash = idHash + ( ( idHash & 31 ) * 621836151 );
+ return hash;
+ }
+
+}
Modified:
development/laboratory/planet/components/fsm/api/src/main/net/dpml/fsm/State.java
==============================================================================
---
development/laboratory/planet/components/fsm/api/src/main/net/dpml/fsm/State.java
(original)
+++
development/laboratory/planet/components/fsm/api/src/main/net/dpml/fsm/State.java
Tue Feb 1 08:20:33 2005
@@ -41,6 +41,12 @@
* error.description=Something has gone wrong and it is set into an error
state. Reset command
* required.
* </pre></code>
+ * <p>
+ * The equals() and hashCode() contract for State implementations MUST obey
that
+ * two States with the same "identity" (returned by getIdentity() method)
ARE the
+ * same State. From this also follows that one need to pay attention to
defining
+ * the identity namespace, to avoid conflicts.
+ * </p>
*/
public interface State extends Serializable
{
Modified:
development/laboratory/planet/components/fsm/basic/src/main/net/dpml/fsm/basic/CommandRuleComponent.java
==============================================================================
---
development/laboratory/planet/components/fsm/basic/src/main/net/dpml/fsm/basic/CommandRuleComponent.java
(original)
+++
development/laboratory/planet/components/fsm/basic/src/main/net/dpml/fsm/basic/CommandRuleComponent.java
Tue Feb 1 08:20:33 2005
@@ -19,11 +19,8 @@
package net.dpml.fsm.basic;
import net.dpml.fsm.TransitionRule;
-
import net.dpml.lang.NullArgumentException;
-
import net.dpml.parameters.Parameters;
-import net.dpml.parameters.ParameterException;
/**
* The CommandRule is a plain rule, that checks if the Command string is of
a particular and
Added:
development/laboratory/planet/components/fsm/basic/src/main/net/dpml/fsm/basic/SimpleState.java
==============================================================================
--- (empty file)
+++
development/laboratory/planet/components/fsm/basic/src/main/net/dpml/fsm/basic/SimpleState.java
Tue Feb 1 08:20:33 2005
@@ -0,0 +1,69 @@
+/*
+ * Copyright 2004-2005 Niclas Hedhman.
+ *
+ * Licensed 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 net.dpml.fsm.basic;
+
+import java.util.Locale;
+import java.util.ResourceBundle;
+
+import net.dpml.fsm.AbstractState;
+import net.dpml.fsm.State;
+import net.dpml.fsm.StateMachine;
+
+import net.dpml.lang.NullArgumentException;
+
+
+/**
+ * This class represents each State internal in the StateMachine.
+ * <p/>
+ * The Name and Description is read from the java.util.ResourceBundle named
+ * "net.dpml.fsm.Resources", and can be either a properties file, or a
+ * net.dpml.i18n.BundleHandler. </p>
+ * <p/>
+ * For each "identity", i.e. each StateImpl, you need to have two resource
strings, with the same
+ * name as the identity, prepended with ".name" and ".description"
respectively. Example; </p>
+ * <code><pre>
+ * normal.name=Normal
+ * normal.description=This is the Normal state, where it is waiting for a
command.
+ * print.name=Printing
+ * print.description=In this state, the printing rendering is in progress.
It will leave \
+ * this state when all data has been delivered to the output buffers.
+ * error.name=Failure
+ * error.description=Something has gone wrong and it is set into an error
state. Reset command
+ * required.
+ * </pre></code>
+ */
+public class SimpleState extends AbstractState
+ implements State
+{
+ public SimpleState( String identity )
+ throws NullArgumentException
+ {
+ super( identity );
+ }
+
+ public void entry()
+ {
+ // default: No action.
+ }
+
+ public void exit()
+ {
+ // default: No action.
+ }
+}
Modified:
development/laboratory/planet/components/fsm/basic/src/main/net/dpml/fsm/basic/StateComponent.java
==============================================================================
---
development/laboratory/planet/components/fsm/basic/src/main/net/dpml/fsm/basic/StateComponent.java
(original)
+++
development/laboratory/planet/components/fsm/basic/src/main/net/dpml/fsm/basic/StateComponent.java
Tue Feb 1 08:20:33 2005
@@ -18,19 +18,14 @@
package net.dpml.fsm.basic;
-import java.util.Locale;
-import java.util.ResourceBundle;
-
-import net.dpml.fsm.State;
-import net.dpml.fsm.StateMachine;
-
-import net.dpml.lang.NullArgumentException;
-
import net.dpml.context.Context;
import net.dpml.context.ContextException;
+import net.dpml.fsm.AbstractState;
+import net.dpml.fsm.State;
+
/**
- * This class represents each State internal in the StateMachine.
+ * This component represents each State internal in the StateMachine.
* <p/>
* The Name and Description is read from the java.util.ResourceBundle named
* "net.dpml.fsm.Resources", and can be either a properties file, or a
@@ -52,7 +47,7 @@
* @metro.component name="state" lifestyle="singleton"
* @metro.service type="net.dpml.fsm.State"
*/
-public class StateComponent extends StateImpl
+public class StateComponent extends AbstractState
implements State
{
/**
@@ -63,5 +58,15 @@
{
super( (String) ctx.get( "urn:metro:name" ) );
}
+
+ public void entry()
+ {
+ // Default: do nothing
+ }
+
+ public void exit()
+ {
+ // Default: do nothing
+ }
}
Modified:
development/laboratory/planet/components/fsm/basic/src/main/net/dpml/fsm/basic/StateMachineImpl.java
==============================================================================
---
development/laboratory/planet/components/fsm/basic/src/main/net/dpml/fsm/basic/StateMachineImpl.java
(original)
+++
development/laboratory/planet/components/fsm/basic/src/main/net/dpml/fsm/basic/StateMachineImpl.java
Tue Feb 1 08:20:33 2005
@@ -23,7 +23,7 @@
import java.util.Iterator;
import java.util.TreeSet;
import java.util.WeakHashMap;
-import net.dpml.activity.Startable;
+
import net.dpml.fsm.State;
import net.dpml.fsm.StateMachine;
import net.dpml.fsm.Transition;
Modified:
development/laboratory/planet/components/fsm/basic/src/test/net/dpml/fsm/basic/test/AbstractTransitionTC.java
==============================================================================
---
development/laboratory/planet/components/fsm/basic/src/test/net/dpml/fsm/basic/test/AbstractTransitionTC.java
(original)
+++
development/laboratory/planet/components/fsm/basic/src/test/net/dpml/fsm/basic/test/AbstractTransitionTC.java
Tue Feb 1 08:20:33 2005
@@ -18,34 +18,24 @@
package net.dpml.fsm.basic.test;
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-
import java.util.Collection;
import java.util.Locale;
import junit.framework.TestCase;
-
import net.dpml.fsm.State;
import net.dpml.fsm.StateMachine;
import net.dpml.fsm.Transition;
import net.dpml.fsm.TransitionEvent;
import net.dpml.fsm.TransitionListener;
-
import net.dpml.fsm.basic.CommandRuleImpl;
-import net.dpml.fsm.basic.StateImpl;
-import net.dpml.fsm.basic.TransitionImpl;
-
-import net.dpml.lang.NullArgumentException;
+import net.dpml.fsm.basic.SimpleState;
public class AbstractTransitionTC extends TestCase
{
- protected StateImpl m_state1;
- protected StateImpl m_state2;
- protected StateImpl m_state3;
- protected StateImpl m_state4;
+ protected SimpleState m_state1;
+ protected SimpleState m_state2;
+ protected SimpleState m_state3;
+ protected SimpleState m_state4;
protected Transition m_transition1;
protected Transition m_transition2;
Modified:
development/laboratory/planet/components/fsm/basic/src/test/net/dpml/fsm/basic/test/StateTestCase.java
==============================================================================
---
development/laboratory/planet/components/fsm/basic/src/test/net/dpml/fsm/basic/test/StateTestCase.java
(original)
+++
development/laboratory/planet/components/fsm/basic/src/test/net/dpml/fsm/basic/test/StateTestCase.java
Tue Feb 1 08:20:33 2005
@@ -27,7 +27,7 @@
import junit.framework.TestCase;
-import net.dpml.fsm.basic.StateImpl;
+import net.dpml.fsm.basic.SimpleState;
import net.dpml.fsm.basic.StateComponent;
import net.dpml.lang.NullArgumentException;
@@ -44,7 +44,7 @@
public void testConstructor()
{
- StateImpl state = new StateImpl( "test" );
+ SimpleState state = new SimpleState( "test" );
String identity = state.getIdentity();
assertEquals( "Indentity invalid.", "test", identity );
}
@@ -55,7 +55,7 @@
Context ctx = new TestContext( "test-identity" );
StateComponent state1 = new StateComponent( ctx );
- StateImpl state2 = new StateImpl( "test-identity" );
+ SimpleState state2 = new SimpleState( "test-identity" );
assertEquals( "equals not same for Component", state1, state2 );
}
@@ -63,7 +63,7 @@
{
try
{
- StateImpl state = new StateImpl( null );
+ SimpleState state = new SimpleState( null );
fail( "NullArgumentException was expected." );
} catch( NullArgumentException e )
{
@@ -77,8 +77,8 @@
Locale en = Locale.US;
Locale sv = new Locale( "sv" );
- StateImpl state1 = new StateImpl( "test" );
- StateImpl state2 = new StateImpl( "test2" );
+ SimpleState state1 = new SimpleState( "test" );
+ SimpleState state2 = new SimpleState( "test2" );
assertEquals( "name_en", "SomeName", state1.getName( en, cl ) );
assertEquals( "description_en", "SomeDescription",
state1.getDescription( en, cl ) );
@@ -93,36 +93,36 @@
public void testToString()
{
- StateImpl state = new StateImpl( "test2" );
+ SimpleState state = new SimpleState( "test2" );
assertEquals( "toString", "State[test2]", state.toString() );
}
public void testEquals()
{
- StateImpl state1 = new StateImpl( "test-state" );
- StateImpl state2 = new StateImpl( "test-state" );
+ SimpleState state1 = new SimpleState( "test-state" );
+ SimpleState state2 = new SimpleState( "test-state" );
assertEquals( "equals not true", state1, state2 );
- state1 = new StateImpl( "test-state" );
- state2 = new StateImpl( "test-stat" );
+ state1 = new SimpleState( "test-state" );
+ state2 = new SimpleState( "test-stat" );
assertTrue( "equals true (ignore case)", ! state1.equals( state2 ) );
}
public void testHashCode()
{
- StateImpl state1 = new StateImpl( "test-state" );
- StateImpl state2 = new StateImpl( "test-state" );
+ SimpleState state1 = new SimpleState( "test-state" );
+ SimpleState state2 = new SimpleState( "test-state" );
assertEquals( "hashCode not same", state1.hashCode(),
state2.hashCode() );
- state1 = new StateImpl( "test-state" );
- state2 = new StateImpl( "test-stat" );
+ state1 = new SimpleState( "test-state" );
+ state2 = new SimpleState( "test-stat" );
assertTrue( "hashCode same (ignore case)", state1.hashCode() !=
state2.hashCode() );
}
public void testSerialization()
throws Exception
{
- StateImpl state1 = new StateImpl( "test-state" );
+ SimpleState state1 = new SimpleState( "test-state" );
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream( baos );
oos.writeObject( state1 );
@@ -132,7 +132,7 @@
byte[] ba = baos.toByteArray();
ByteArrayInputStream bais = new ByteArrayInputStream( ba );
ObjectInputStream ois = new ObjectInputStream( bais );
- StateImpl state2 = (StateImpl) ois.readObject();
+ SimpleState state2 = (SimpleState) ois.readObject();
ois.close();
assertEquals( "serialization", state1, state2 );
}
Modified:
development/laboratory/planet/components/fsm/basic/src/test/net/dpml/fsm/basic/test/TransitionComponentTestCase.java
==============================================================================
---
development/laboratory/planet/components/fsm/basic/src/test/net/dpml/fsm/basic/test/TransitionComponentTestCase.java
(original)
+++
development/laboratory/planet/components/fsm/basic/src/test/net/dpml/fsm/basic/test/TransitionComponentTestCase.java
Tue Feb 1 08:20:33 2005
@@ -22,22 +22,16 @@
import net.dpml.context.Context;
import net.dpml.context.ContextException;
-
import net.dpml.fsm.State;
import net.dpml.fsm.StateMachine;
import net.dpml.fsm.TransitionRule;
-
import net.dpml.fsm.basic.CommandRuleImpl;
-import net.dpml.fsm.basic.StateImpl;
+import net.dpml.fsm.basic.SimpleState;
import net.dpml.fsm.basic.TransitionComponent;
-
import net.dpml.logging.Logger;
import net.dpml.logging.provider.ConsoleLogger;
-
-import net.dpml.service.ServiceManager;
import net.dpml.service.ServiceException;
-
-import net.dpml.parameters.impl.DefaultParameters;
+import net.dpml.service.ServiceManager;
public class TransitionComponentTestCase extends AbstractTransitionTC
@@ -50,10 +44,10 @@
m_rule2 = new CommandRuleImpl( "prev", 101, false );
StateMachine fsm = new TestStateMachine();
- m_state1 = new StateImpl( "state1" );
- m_state2 = new StateImpl( "state2" );
- m_state3 = new StateImpl( "state3" );
- m_state4 = new StateImpl( "state4" );
+ m_state1 = new SimpleState( "state1" );
+ m_state2 = new SimpleState( "state2" );
+ m_state3 = new SimpleState( "state3" );
+ m_state4 = new SimpleState( "state4" );
Context ctx1 = new TestContext( "transition1" );
Context ctx2 = new TestContext( "transition2" );
Modified:
development/laboratory/planet/components/fsm/basic/src/test/net/dpml/fsm/basic/test/TransitionImplTestCase.java
==============================================================================
---
development/laboratory/planet/components/fsm/basic/src/test/net/dpml/fsm/basic/test/TransitionImplTestCase.java
(original)
+++
development/laboratory/planet/components/fsm/basic/src/test/net/dpml/fsm/basic/test/TransitionImplTestCase.java
Tue Feb 1 08:20:33 2005
@@ -19,7 +19,7 @@
package net.dpml.fsm.basic.test;
import net.dpml.fsm.basic.CommandRuleImpl;
-import net.dpml.fsm.basic.StateImpl;
+import net.dpml.fsm.basic.SimpleState;
import net.dpml.fsm.basic.TransitionImpl;
import net.dpml.logging.Logger;
@@ -33,10 +33,10 @@
m_rule1 = new CommandRuleImpl( "next", 100, false );
m_rule2 = new CommandRuleImpl( "prev", 101, false );
- m_state1 = new StateImpl( "state1" );
- m_state2 = new StateImpl( "state2" );
- m_state3 = new StateImpl( "state3" );
- m_state4 = new StateImpl( "state4" );
+ m_state1 = new SimpleState( "state1" );
+ m_state2 = new SimpleState( "state2" );
+ m_state3 = new SimpleState( "state3" );
+ m_state4 = new SimpleState( "state4" );
m_transition1 = new TransitionImpl( m_state1, m_state2,
"transition1", m_rule1, logger );
m_transition2 = new TransitionImpl( m_state1, m_state2,
"transition1", m_rule1, logger );
Modified:
development/laboratory/planet/components/fsm/demo/trafficlight/src/main/net/dpml/fsm/trafficlight/Timer.java
==============================================================================
---
development/laboratory/planet/components/fsm/demo/trafficlight/src/main/net/dpml/fsm/trafficlight/Timer.java
(original)
+++
development/laboratory/planet/components/fsm/demo/trafficlight/src/main/net/dpml/fsm/trafficlight/Timer.java
Tue Feb 1 08:20:33 2005
@@ -18,26 +18,18 @@
package net.dpml.fsm.trafficlight;
-import java.io.Serializable;
-
import java.text.SimpleDateFormat;
-
-import java.util.ArrayList;
import java.util.Date;
import java.util.Locale;
import net.dpml.activity.Startable;
-
-import net.dpml.parameters.Parameters;
-
-import net.dpml.service.ServiceException;
-import net.dpml.service.ServiceManager;
-
import net.dpml.fsm.State;
import net.dpml.fsm.StateMachine;
import net.dpml.fsm.Transition;
import net.dpml.fsm.TransitionEvent;
import net.dpml.fsm.TransitionListener;
+import net.dpml.service.ServiceException;
+import net.dpml.service.ServiceManager;
/**
* @metro.component name="timer" lifestyle="singleton" collection="hard"
Modified: development/laboratory/planet/components/fsm/index.xml
==============================================================================
--- development/laboratory/planet/components/fsm/index.xml (original)
+++ development/laboratory/planet/components/fsm/index.xml Tue Feb 1
08:20:33 2005
@@ -23,6 +23,14 @@
<import uri="artifact:module:dpml/magic/dpml-magic#SNAPSHOT"/>
<import uri="artifact:module:dpml/transit/dpml-transit#SNAPSHOT"/>
+ <resource>
+ <info>
+ <group>jgraph</group>
+ <name>jgraph</name>
+ <version>5.3.1</version>
+ </info>
+ </resource>
+
<project file="module.xml">
<info>
<group>dpml/fsm</group>
@@ -75,6 +83,26 @@
</plugins>
</project>
+ <project basedir="view">
+ <info>
+ <group>dpml/fsm</group>
+ <name>dpml-fsm-view</name>
+ <version>1.0.0</version>
+ </info>
+ <dependencies>
+ <include key="dpml-composition-api" />
+ <include key="dpml-context-api" />
+ <include key="dpml-parameters-api" />
+ <include key="dpml-service-api" />
+ <include key="dpml-fsm-api" />
+ <include key="dpml-service-api" />
+ <include key="jgraph" />
+ </dependencies>
+ <plugins>
+ <include key="dpml-meta-tools"/>
+ </plugins>
+ </project>
+
<project basedir="demo/trafficlight">
<info>
<group>dpml/fsm/demo</group>
- svn commit: r1674 - in development/laboratory/planet/components/fsm: . api/src/main/net/dpml/fsm basic/src/main/net/dpml/fsm/basic basic/src/test/net/dpml/fsm/basic/test demo/trafficlight/src/main/net/dpml/fsm/trafficlight, niclas, 02/01/2005
Archive powered by MHonArc 2.6.24.