You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@directory.apache.org by Trustin Lee <tr...@gmail.com> on 2006/11/23 02:20:25 UTC

Re: svn commit: r478209 - in /directory/sandbox/niklas/mina-sm/src/main/java/org/apache/mina/sm: BreakAndCallException.java BreakAndReturnException.java StateControl.java StateMachine.java

You could move this code to https://svn.apache.org/repos/asf/mina/sandbox.
:)

Trustin

On 11/23/06, niklas@apache.org <ni...@apache.org> wrote:
>
> Author: niklas
> Date: Wed Nov 22 08:12:24 2006
> New Revision: 478209
>
> URL: http://svn.apache.org/viewvc?view=rev&rev=478209
> Log:
> Implemented breakAndCall()/breakAndReturn()
>
> Added:
>     directory/sandbox/niklas/mina-sm/src/main/java/org/apache/mina/sm/BreakAndCallException.java
> (with props)
>     directory/sandbox/niklas/mina-sm/src/main/java/org/apache/mina/sm/BreakAndReturnException.java
> (with props)
> Modified:
>
>     directory/sandbox/niklas/mina-sm/src/main/java/org/apache/mina/sm/StateControl.java
>
>     directory/sandbox/niklas/mina-sm/src/main/java/org/apache/mina/sm/StateMachine.java
>
> Added:
> directory/sandbox/niklas/mina-sm/src/main/java/org/apache/mina/sm/BreakAndCallException.java
> URL:
> http://svn.apache.org/viewvc/directory/sandbox/niklas/mina-sm/src/main/java/org/apache/mina/sm/BreakAndCallException.java?view=auto&rev=478209
>
> ==============================================================================
> ---
> directory/sandbox/niklas/mina-sm/src/main/java/org/apache/mina/sm/BreakAndCallException.java
> (added)
> +++
> directory/sandbox/niklas/mina-sm/src/main/java/org/apache/mina/sm/BreakAndCallException.java
> Wed Nov 22 08:12:24 2006
> @@ -0,0 +1,62 @@
> +/*
> + *   @(#) $Id$
> + *
> + *   Copyright 2006 The Apache Software Foundation
> + *
> + *   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 org.apache.mina.sm;
> +
> +/**
> + *
> + * @author The Apache Directory Project (mina-dev@directory.apache.org)
> + * @version $Rev$, $Date$
> + */
> +public class BreakAndCallException extends RuntimeException
> +{
> +    private final String stateId;
> +    private final String returnToStateId;
> +    private final boolean now;
> +
> +    public BreakAndCallException( String stateId, boolean now )
> +    {
> +        this( stateId, null, now );
> +    }
> +
> +    public BreakAndCallException( String stateId, String returnToStateId,
> boolean now )
> +    {
> +        if( stateId == null )
> +        {
> +            throw new NullPointerException( "stateId" );
> +        }
> +        this.stateId = stateId;
> +        this.returnToStateId = returnToStateId;
> +        this.now = now;
> +    }
> +
> +    public boolean isNow()
> +    {
> +        return now;
> +    }
> +
> +    public String getStateId()
> +    {
> +        return stateId;
> +    }
> +
> +    public String getReturnToStateId()
> +    {
> +        return returnToStateId;
> +    }
> +}
>
> Propchange:
> directory/sandbox/niklas/mina-sm/src/main/java/org/apache/mina/sm/BreakAndCallException.java
>
> ------------------------------------------------------------------------------
>     svn:keywords = Id
>
> Added:
> directory/sandbox/niklas/mina-sm/src/main/java/org/apache/mina/sm/BreakAndReturnException.java
> URL:
> http://svn.apache.org/viewvc/directory/sandbox/niklas/mina-sm/src/main/java/org/apache/mina/sm/BreakAndReturnException.java?view=auto&rev=478209
>
> ==============================================================================
> ---
> directory/sandbox/niklas/mina-sm/src/main/java/org/apache/mina/sm/BreakAndReturnException.java
> (added)
> +++
> directory/sandbox/niklas/mina-sm/src/main/java/org/apache/mina/sm/BreakAndReturnException.java
> Wed Nov 22 08:12:24 2006
> @@ -0,0 +1,39 @@
> +/*
> + *   @(#) $Id$
> + *
> + *   Copyright 2006 The Apache Software Foundation
> + *
> + *   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 org.apache.mina.sm;
> +
> +/**
> + *
> + * @author The Apache Directory Project (mina-dev@directory.apache.org)
> + * @version $Rev$, $Date$
> + */
> +public class BreakAndReturnException extends RuntimeException
> +{
> +    private final boolean now;
> +
> +    public BreakAndReturnException( boolean now )
> +    {
> +        this.now = now;
> +    }
> +
> +    public boolean isNow()
> +    {
> +        return now;
> +    }
> +}
>
> Propchange:
> directory/sandbox/niklas/mina-sm/src/main/java/org/apache/mina/sm/BreakAndReturnException.java
>
> ------------------------------------------------------------------------------
>     svn:keywords = Id
>
> Modified:
> directory/sandbox/niklas/mina-sm/src/main/java/org/apache/mina/sm/StateControl.java
> URL:
> http://svn.apache.org/viewvc/directory/sandbox/niklas/mina-sm/src/main/java/org/apache/mina/sm/StateControl.java?view=diff&rev=478209&r1=478208&r2=478209
>
> ==============================================================================
> ---
> directory/sandbox/niklas/mina-sm/src/main/java/org/apache/mina/sm/StateControl.java
> (original)
> +++
> directory/sandbox/niklas/mina-sm/src/main/java/org/apache/mina/sm/StateControl.java
> Wed Nov 22 08:12:24 2006
> @@ -41,4 +41,34 @@
>      {
>          throw new BreakAndGotoException( state, false );
>      }
> +
> +    public static void breakAndCallNow( String state )
> +    {
> +        throw new BreakAndCallException( state, true );
> +    }
> +
> +    public static void breakAndCallNext( String state )
> +    {
> +        throw new BreakAndCallException( state, false );
> +    }
> +
> +    public static void breakAndCallNow( String state, String returnTo )
> +    {
> +        throw new BreakAndCallException( state, returnTo, true );
> +    }
> +
> +    public static void breakAndCallNext( String state, String returnTo )
> +    {
> +        throw new BreakAndCallException( state, returnTo, false );
> +    }
> +
> +    public static void breakAndReturnNow()
> +    {
> +        throw new BreakAndReturnException( true );
> +    }
> +
> +    public static void breakAndReturnNext()
> +    {
> +        throw new BreakAndReturnException( false );
> +    }
> }
>
> Modified:
> directory/sandbox/niklas/mina-sm/src/main/java/org/apache/mina/sm/StateMachine.java
> URL:
> http://svn.apache.org/viewvc/directory/sandbox/niklas/mina-sm/src/main/java/org/apache/mina/sm/StateMachine.java?view=diff&rev=478209&r1=478208&r2=478209
>
> ==============================================================================
> ---
> directory/sandbox/niklas/mina-sm/src/main/java/org/apache/mina/sm/StateMachine.java
> (original)
> +++
> directory/sandbox/niklas/mina-sm/src/main/java/org/apache/mina/sm/StateMachine.java
> Wed Nov 22 08:12:24 2006
> @@ -23,6 +23,7 @@
> import java.util.HashMap;
> import java.util.LinkedList;
> import java.util.Map;
> +import java.util.Stack;
>
> import org.apache.mina.sm.context.StateContext;
> import org.apache.mina.sm.event.Event;
> @@ -39,6 +40,7 @@
> public class StateMachine
> {
>      private static final Logger log = LoggerFactory.getLogger(
> StateMachine.class );
> +    private static final String CALL_STACK = StateMachine.class.getName()
> + ".callStack";
>
>      private final State startState;
>      private final Map<String, State> states;
> @@ -202,6 +204,68 @@
>                  }
>                  return;
>              }
> +            catch( BreakAndCallException bace )
> +            {
> +                State newState = getState( bace.getStateId() );
> +
> +                Stack<State> callStack = getCallStack( context );
> +                State returnTo = bace.getReturnToStateId() != null
> +                    ? getState( bace.getReturnToStateId() ) :
> context.getCurrentState();
> +                callStack.push( returnTo );
> +
> +                if( bace.isNow() )
> +                {
> +                    if( log.isDebugEnabled() )
> +                    {
> +                        log.debug( "BreakAndCallException thrown in "
> +                                + "transition " + t
> +                                + ". Moving to state " + newState.getId()
> +                                + " now." );
> +                    }
> +                    handle( newState, event );
> +                }
> +                else
> +                {
> +                    if( log.isDebugEnabled() )
> +                    {
> +                        log.debug( "BreakAndCallException thrown in "
> +                                + "transition " + t
> +                                + ". Moving to state " + newState.getId()
> +                                + " next." );
> +                    }
> +                    setCurrentState( context, newState );
> +                }
> +                return;
> +            }
> +            catch( BreakAndReturnException bare )
> +            {
> +                Stack<State> callStack = getCallStack( context );
> +                State newState = callStack.pop();
> +
> +                if( bare.isNow() )
> +                {
> +                    if( log.isDebugEnabled() )
> +                    {
> +                        log.debug( "BreakAndReturnException thrown in "
> +                                + "transition " + t
> +                                + ". Moving to state " + newState.getId()
> +                                + " now." );
> +                    }
> +                    handle( newState, event );
> +                }
> +                else
> +                {
> +                    if( log.isDebugEnabled() )
> +                    {
> +                        log.debug( "BreakAndReturnException thrown in "
> +                                + "transition " + t
> +                                + ". Moving to state " + newState.getId()
> +                                + " next." );
> +                    }
> +                    setCurrentState( context, newState );
> +                }
> +                return;
> +            }
>          }
>
>          /*
> @@ -217,6 +281,17 @@
>          {
>              throw new UnhandledEventException( "Unhandled event: " +
> event );
>          }
> +    }
> +
> +    private Stack<State> getCallStack( StateContext context )
> +    {
> +        Stack<State> callStack = ( Stack<State> ) context.getAttribute(
> CALL_STACK );
> +        if( callStack == null )
> +        {
> +            callStack = new Stack<State>();
> +            context.setAttribute( CALL_STACK, callStack );
> +        }
> +        return callStack;
>      }
>
>      private void setCurrentState( StateContext context, State newState )
>
>
>


-- 
what we call human nature is actually human habit
--
http://gleamynode.net/
--
PGP key fingerprints:
* E167 E6AF E73A CBCE EE41  4A29 544D DE48 FE95 4E7E
* B693 628E 6047 4F8F CFA4  455E 1C62 A7DC 0255 ECA6