Author: niklas
Date: Tue Nov 6 08:03:42 2007
New Revision: 592475
URL: http://svn.apache.org/viewvc?rev=592475&view=rev
Log:
DIRMINA-463: Changed StateMachineFactory to make it simpler to specify the
transition annotation to use. Removed IoHandlerStateMachineFactory and
IoFilterStateMachineFactory.
Added:
mina/trunk/statemachine/src/main/java/org/apache/mina/statemachine/annotation/TransitionAnnotation.java
(with props)
Removed:
mina/trunk/statemachine/src/main/java/org/apache/mina/statemachine/IoFilterStateMachineFactory.java
mina/trunk/statemachine/src/main/java/org/apache/mina/statemachine/IoHandlerStateMachineFactory.java
Modified:
mina/trunk/example/src/main/java/org/apache/mina/example/tapedeck/Main.java
mina/trunk/statemachine/src/main/java/org/apache/mina/statemachine/StateMachineFactory.java
mina/trunk/statemachine/src/main/java/org/apache/mina/statemachine/annotation/IoFilterTransition.java
mina/trunk/statemachine/src/main/java/org/apache/mina/statemachine/annotation/IoHandlerTransition.java
mina/trunk/statemachine/src/main/java/org/apache/mina/statemachine/annotation/Transition.java
mina/trunk/statemachine/src/test/java/org/apache/mina/statemachine/StateMachineFactoryTest.java
mina/trunk/statemachine/src/test/java/org/apache/mina/statemachine/StateMachineProxyFactoryTest.java
Modified:
mina/trunk/example/src/main/java/org/apache/mina/example/tapedeck/Main.java
URL:
http://svn.apache.org/viewvc/mina/trunk/example/src/main/java/org/apache/mina/example/tapedeck/Main.java?rev=592475&r1=592474&r2=592475&view=diff
==============================================================================
--- mina/trunk/example/src/main/java/org/apache/mina/example/tapedeck/Main.java
(original)
+++ mina/trunk/example/src/main/java/org/apache/mina/example/tapedeck/Main.java
Tue Nov 6 08:03:42 2007
@@ -24,9 +24,10 @@
import org.apache.mina.common.IoHandler;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.TextLineEncoder;
-import org.apache.mina.statemachine.IoHandlerStateMachineFactory;
import org.apache.mina.statemachine.StateMachine;
+import org.apache.mina.statemachine.StateMachineFactory;
import org.apache.mina.statemachine.StateMachineProxyFactory;
+import org.apache.mina.statemachine.annotation.IoHandlerTransition;
import org.apache.mina.statemachine.context.IoSessionStateContextLookup;
import org.apache.mina.statemachine.context.StateContext;
import org.apache.mina.statemachine.context.StateContextFactory;
@@ -34,8 +35,8 @@
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
/**
- * Simple example on how to build a state machine for MINA's [EMAIL PROTECTED]
IoHandler}
- * interface.
+ * Simple example demonstrating how to build a state machine for MINA's
+ * [EMAIL PROTECTED] IoHandler} interface.
*
* @author The Apache MINA Project ([EMAIL PROTECTED])
* @version $Rev$, $Date$
@@ -45,7 +46,8 @@
private static final int PORT = 12345;
private static IoHandler createIoHandler() {
- StateMachine sm =
IoHandlerStateMachineFactory.create(TapeDeckServer.EMPTY, new TapeDeckServer());
+ StateMachine sm =
StateMachineFactory.getInstance(IoHandlerTransition.class)
+ .create(TapeDeckServer.EMPTY, new
TapeDeckServer());
return (IoHandler) StateMachineProxyFactory.create(IoHandler.class,
sm,
new IoSessionStateContextLookup(new StateContextFactory() {
Modified:
mina/trunk/statemachine/src/main/java/org/apache/mina/statemachine/StateMachineFactory.java
URL:
http://svn.apache.org/viewvc/mina/trunk/statemachine/src/main/java/org/apache/mina/statemachine/StateMachineFactory.java?rev=592475&r1=592474&r2=592475&view=diff
==============================================================================
---
mina/trunk/statemachine/src/main/java/org/apache/mina/statemachine/StateMachineFactory.java
(original)
+++
mina/trunk/statemachine/src/main/java/org/apache/mina/statemachine/StateMachineFactory.java
Tue Nov 6 08:03:42 2007
@@ -33,6 +33,7 @@
import java.util.Map;
import org.apache.mina.statemachine.annotation.Transition;
+import org.apache.mina.statemachine.annotation.TransitionAnnotation;
import org.apache.mina.statemachine.annotation.Transitions;
import org.apache.mina.statemachine.event.Event;
import org.apache.mina.statemachine.transition.MethodTransition;
@@ -40,7 +41,7 @@
/**
* Creates [EMAIL PROTECTED] StateMachine}s by reading [EMAIL PROTECTED]
org.apache.mina.statemachine.annotation.State},
- * [EMAIL PROTECTED] Transition} and [EMAIL PROTECTED] Transitions}
annotations from one or more arbitrary
+ * [EMAIL PROTECTED] Transition} and [EMAIL PROTECTED] Transitions} (or
equivalent) annotations from one or more arbitrary
* objects.
*
*
@@ -48,8 +49,23 @@
* @version $Rev$, $Date$
*/
public class StateMachineFactory {
+ private final Class<? extends Annotation> transitionAnnotation;
+ private final Class<? extends Annotation> transitionsAnnotation;
- private StateMachineFactory() {
+ protected StateMachineFactory(Class<? extends Annotation>
transitionAnnotation,
+ Class<? extends Annotation> transitionsAnnotation) {
+ this.transitionAnnotation = transitionAnnotation;
+ this.transitionsAnnotation = transitionsAnnotation;
+ }
+
+ public static StateMachineFactory getInstance(Class<? extends Annotation>
transitionAnnotation) {
+ TransitionAnnotation a =
transitionAnnotation.getAnnotation(TransitionAnnotation.class);
+ if (a == null) {
+ throw new IllegalArgumentException("The annotation class "
+ + transitionAnnotation + " has not been annotated with the
"
+ + TransitionAnnotation.class.getName() + " annotation");
+ }
+ return new StateMachineFactory(transitionAnnotation, a.value());
}
/**
@@ -60,7 +76,7 @@
* state machine.
* @return the [EMAIL PROTECTED] StateMachine} object.
*/
- public static StateMachine create(Object handler) {
+ public StateMachine create(Object handler) {
return create(handler, new Object[0]);
}
@@ -73,7 +89,7 @@
* state machine.
* @return the [EMAIL PROTECTED] StateMachine} object.
*/
- public static StateMachine create(String start, Object handler) {
+ public StateMachine create(String start, Object handler) {
return create(start, handler, new Object[0]);
}
@@ -87,7 +103,7 @@
* annotations describing the state machine.
* @return the [EMAIL PROTECTED] StateMachine} object.
*/
- public static StateMachine create(Object handler, Object... handlers) {
+ public StateMachine create(Object handler, Object... handlers) {
return create("start", handler, handlers);
}
@@ -102,31 +118,7 @@
* annotations describing the state machine.
* @return the [EMAIL PROTECTED] StateMachine} object.
*/
- public static StateMachine create(String start, Object handler, Object...
handlers) {
- return create(Transition.class, Transitions.class, start, handler,
handlers);
- }
-
- /**
- * Creates a new [EMAIL PROTECTED] StateMachine} from the specified
handler objects and
- * using the [EMAIL PROTECTED] State} with the specified id as start
state. Use this
- * method if you want to use your own alternatives to the [EMAIL
PROTECTED] Transition}
- * and [EMAIL PROTECTED] Transitions} annotations.
- *
- * @param transitionAnnotation the annotation to use instead of [EMAIL
PROTECTED] Transition}.
- * The annotation must have the same parameters as [EMAIL
PROTECTED] Transition}
- * but the <code>on</code> parameter may be of an enum type instead
of string.
- * @param transitionsAnnotation the annotation to use instead of [EMAIL
PROTECTED] Transitions}.
- * The annotation must have the same parameters as [EMAIL
PROTECTED] Transitions}.
- * @param start the id of the start [EMAIL PROTECTED] State} to use.
- * @param handler the first object containing the annotations describing
the
- * state machine.
- * @param handlers zero or more additional objects containing the
- * annotations describing the state machine.
- * @return the [EMAIL PROTECTED] StateMachine} object.
- */
- public static StateMachine create(Class<? extends Annotation>
transitionAnnotation,
- Class<? extends Annotation> transitionsAnnotation,
- String start, Object handler, Object... handlers) {
+ public StateMachine create(String start, Object handler, Object...
handlers) {
Map<String, State> states = new HashMap<String, State>();
List<Object> handlersList = new ArrayList<Object>(1 + handlers.length);
Modified:
mina/trunk/statemachine/src/main/java/org/apache/mina/statemachine/annotation/IoFilterTransition.java
URL:
http://svn.apache.org/viewvc/mina/trunk/statemachine/src/main/java/org/apache/mina/statemachine/annotation/IoFilterTransition.java?rev=592475&r1=592474&r2=592475&view=diff
==============================================================================
---
mina/trunk/statemachine/src/main/java/org/apache/mina/statemachine/annotation/IoFilterTransition.java
(original)
+++
mina/trunk/statemachine/src/main/java/org/apache/mina/statemachine/annotation/IoFilterTransition.java
Tue Nov 6 08:03:42 2007
@@ -39,9 +39,8 @@
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
[EMAIL PROTECTED](IoFilterTransitions.class)
public @interface IoFilterTransition {
- public static final String SELF = "__self__";
-
/**
* Specifies the ids of one or more events handled by the annotated
method. If
* not specified the handler method will be executed for any event.
@@ -59,7 +58,7 @@
* executing the annotated method. If not specified the [EMAIL PROTECTED]
StateMachine}
* will remain in the same state.
*/
- String next() default SELF;
+ String next() default Transition.SELF;
/**
* The weight used to order handler annotations which match the same event
Modified:
mina/trunk/statemachine/src/main/java/org/apache/mina/statemachine/annotation/IoHandlerTransition.java
URL:
http://svn.apache.org/viewvc/mina/trunk/statemachine/src/main/java/org/apache/mina/statemachine/annotation/IoHandlerTransition.java?rev=592475&r1=592474&r2=592475&view=diff
==============================================================================
---
mina/trunk/statemachine/src/main/java/org/apache/mina/statemachine/annotation/IoHandlerTransition.java
(original)
+++
mina/trunk/statemachine/src/main/java/org/apache/mina/statemachine/annotation/IoHandlerTransition.java
Tue Nov 6 08:03:42 2007
@@ -39,9 +39,8 @@
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
[EMAIL PROTECTED](IoHandlerTransitions.class)
public @interface IoHandlerTransition {
- public static final String SELF = "__self__";
-
/**
* Specifies the ids of one or more events handled by the annotated
method. If
* not specified the handler method will be executed for any event.
@@ -59,7 +58,7 @@
* executing the annotated method. If not specified the [EMAIL PROTECTED]
StateMachine}
* will remain in the same state.
*/
- String next() default SELF;
+ String next() default Transition.SELF;
/**
* The weight used to order handler annotations which match the same event
Modified:
mina/trunk/statemachine/src/main/java/org/apache/mina/statemachine/annotation/Transition.java
URL:
http://svn.apache.org/viewvc/mina/trunk/statemachine/src/main/java/org/apache/mina/statemachine/annotation/Transition.java?rev=592475&r1=592474&r2=592475&view=diff
==============================================================================
---
mina/trunk/statemachine/src/main/java/org/apache/mina/statemachine/annotation/Transition.java
(original)
+++
mina/trunk/statemachine/src/main/java/org/apache/mina/statemachine/annotation/Transition.java
Tue Nov 6 08:03:42 2007
@@ -36,6 +36,7 @@
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
[EMAIL PROTECTED](Transitions.class)
public @interface Transition {
public static final String SELF = "__self__";
Added:
mina/trunk/statemachine/src/main/java/org/apache/mina/statemachine/annotation/TransitionAnnotation.java
URL:
http://svn.apache.org/viewvc/mina/trunk/statemachine/src/main/java/org/apache/mina/statemachine/annotation/TransitionAnnotation.java?rev=592475&view=auto
==============================================================================
---
mina/trunk/statemachine/src/main/java/org/apache/mina/statemachine/annotation/TransitionAnnotation.java
(added)
+++
mina/trunk/statemachine/src/main/java/org/apache/mina/statemachine/annotation/TransitionAnnotation.java
Tue Nov 6 08:03:42 2007
@@ -0,0 +1,40 @@
+/*
+ * 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.mina.statemachine.annotation;
+
+import java.lang.annotation.Annotation;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Annotation used to mark other annotations as being transition annotations.
+ * The annotation used to group transition annotations must be given as
+ * parameter.
+ *
+ * @author The Apache MINA Project ([EMAIL PROTECTED])
+ * @version $Rev$, $Date$
+ */
[EMAIL PROTECTED](RetentionPolicy.RUNTIME)
[EMAIL PROTECTED](ElementType.ANNOTATION_TYPE)
+public @interface TransitionAnnotation {
+ Class<? extends Annotation> value();
+}
Propchange:
mina/trunk/statemachine/src/main/java/org/apache/mina/statemachine/annotation/TransitionAnnotation.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange:
mina/trunk/statemachine/src/main/java/org/apache/mina/statemachine/annotation/TransitionAnnotation.java
------------------------------------------------------------------------------
svn:keywords = Rev Date Id
Modified:
mina/trunk/statemachine/src/test/java/org/apache/mina/statemachine/StateMachineFactoryTest.java
URL:
http://svn.apache.org/viewvc/mina/trunk/statemachine/src/test/java/org/apache/mina/statemachine/StateMachineFactoryTest.java?rev=592475&r1=592474&r2=592475&view=diff
==============================================================================
---
mina/trunk/statemachine/src/test/java/org/apache/mina/statemachine/StateMachineFactoryTest.java
(original)
+++
mina/trunk/statemachine/src/test/java/org/apache/mina/statemachine/StateMachineFactoryTest.java
Tue Nov 6 08:03:42 2007
@@ -57,7 +57,7 @@
public void testCreate() throws Exception {
States states = new States();
- StateMachine sm = StateMachineFactory.create(States.A, states);
+ StateMachine sm =
StateMachineFactory.getInstance(Transition.class).create(States.A, states);
State a = sm.getState(States.A);
State b = sm.getState(States.B);
Modified:
mina/trunk/statemachine/src/test/java/org/apache/mina/statemachine/StateMachineProxyFactoryTest.java
URL:
http://svn.apache.org/viewvc/mina/trunk/statemachine/src/test/java/org/apache/mina/statemachine/StateMachineProxyFactoryTest.java?rev=592475&r1=592474&r2=592475&view=diff
==============================================================================
---
mina/trunk/statemachine/src/test/java/org/apache/mina/statemachine/StateMachineProxyFactoryTest.java
(original)
+++
mina/trunk/statemachine/src/test/java/org/apache/mina/statemachine/StateMachineProxyFactoryTest.java
Tue Nov 6 08:03:42 2007
@@ -99,7 +99,7 @@
public void testTapeDeckStateMachineAnnotations() throws Exception {
TapeDeckStateMachineHandler handler = new
TapeDeckStateMachineHandler();
- StateMachine sm =
StateMachineFactory.create(TapeDeckStateMachineHandler.S1, handler);
+ StateMachine sm =
StateMachineFactory.getInstance(Transition.class).create(TapeDeckStateMachineHandler.S1,
handler);
TapeDeck player = (TapeDeck)
StateMachineProxyFactory.create(TapeDeck.class, sm);
player.insert("Kings of convenience - Riot on an empty street");