blob: 848ae23f92a3c6992ea3931a36f68b2e8b831c68 [file] [log] [blame]
/*
* 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.directory.api.asn1.ber.grammar;
import org.apache.directory.api.asn1.ber.Asn1Container;
import org.apache.directory.api.asn1.ber.tlv.UniversalTag;
import org.apache.directory.api.asn1.util.Asn1StringUtils;
/**
* Define a transition between two states of a grammar. It stores the next
* state, and the action to execute while executing the transition.
*
* @param C The container type
*
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
*/
public class GrammarTransition<C extends Asn1Container>
{
/** The action associated to the transition */
private Action<C> action;
/** The previous state */
private Enum<?> previousState;
/** The current state */
private Enum<?> currentState;
/** The current tag */
private int currentTag;
/**
* Creates a new GrammarTransition object.
*
* @param previousState the previous state
* @param currentState The current state
* @param currentTag the current TLV's tag
* @param action The action to execute. It could be null.
*/
public GrammarTransition( Enum<?> previousState, Enum<?> currentState, int currentTag, Action<C> action )
{
this.previousState = previousState;
this.currentState = currentState;
this.action = action;
this.currentTag = currentTag;
}
/**
* Creates a new GrammarTransition object.
*
* @param previousState the previous state
* @param currentState The current state
* @param currentTag the current TLV's tag
*/
public GrammarTransition( Enum<?> previousState, Enum<?> currentState, int currentTag )
{
this.previousState = previousState;
this.currentState = currentState;
this.currentTag = currentTag;
}
/**
* Creates a new GrammarTransition object.
*
* @param previousState the previous state
* @param currentState The current state
* @param currentTag the current TLV's tag
* @param action The action to execute. It could be null.
*/
public GrammarTransition( Enum<?> previousState, Enum<?> currentState, UniversalTag currentTag, Action<C> action )
{
this.previousState = previousState;
this.currentState = currentState;
this.action = action;
this.currentTag = currentTag.getValue();
}
/**
* Creates a new GrammarTransition object.
*
* @param previousState the previous state
* @param currentState The current state
* @param currentTag the current TLV's tag
*/
public GrammarTransition( Enum<?> previousState, Enum<?> currentState, UniversalTag currentTag )
{
this.previousState = previousState;
this.currentState = currentState;
this.currentTag = currentTag.getValue();
}
/**
* Tells if the transition has an associated action.
*
* @return <code>true</code> if an action has been associated to the transition
*/
public boolean hasAction()
{
return action != null;
}
/**
* @return Returns the action associated with the transition
*/
public Action<C> getAction()
{
return action;
}
/**
* @return The current state
*/
public Enum<?> getCurrentState()
{
return currentState;
}
/**
* @return The previous state
*/
public Enum<?> getPreviousState()
{
return previousState;
}
/**
* @return A representation of the transition as a string.
*/
@Override
public String toString()
{
StringBuilder sb = new StringBuilder();
sb.append( "Transition from state <" ).append( previousState ).append( "> " );
sb.append( "to state <" ).append( currentState ).append( ">, " );
sb.append( "tag <" ).append( Asn1StringUtils.dumpByte( ( byte ) currentTag ) ).append( ">, " );
sb.append( "action : " );
if ( action == null )
{
sb.append( "no action" );
}
else
{
sb.append( action );
}
return sb.toString();
}
}