1
package com.eucalyptus.util.fsm;
3
import java.util.concurrent.Callable;
4
import org.apache.log4j.Logger;
5
import com.eucalyptus.component.Component;
6
import com.eucalyptus.records.Logs;
7
import com.eucalyptus.util.Callback;
8
import com.eucalyptus.util.HasName;
9
import com.eucalyptus.util.Callback.Completion;
10
import com.eucalyptus.util.async.Callbacks;
11
import com.google.common.base.Predicate;
12
import com.google.common.util.concurrent.Callables;
14
public class Transitions {
15
private static Logger LOG = Logger.getLogger( Transitions.class );
17
private static TransitionException exceptionOnCondition( String message, Predicate p ) {
18
return new TransitionException( "Transition rejected because constraint check is false: " + message + " for class " + p.getClass( ) );
21
public static <P extends HasName<P>> TransitionListener<P> callbackAsListener( final Callback<P> p ) {
22
return new TransitionListener<P>( ) {
25
public boolean before( P parent ) {
30
public void leave( P parent ) {
33
} catch ( Exception ex ) {
35
Logs.extreme( ).error( ex, ex );
40
public void enter( P parent ) {}
43
public void after( P parent ) {}
47
private enum SimpleTransitions implements TransitionAction {
49
public void leave( HasName parent, Completion transitionCallback ) {
50
transitionCallback.fire( );
53
public String toString( ) {
54
return "TransitionAction.noop";
58
public boolean before( HasName parent ) {
63
public void enter( HasName parent ) {}
66
public void after( HasName parent ) {}
70
public void leave( HasName parent, Completion transitionCallback ) {}
72
public String toString( ) {
73
return "TransitionAction.OUTOFBAND";
77
public boolean before( HasName parent ) {
82
public void enter( HasName parent ) {}
85
public void after( HasName parent ) {}
90
public static <P extends HasName<P>> TransitionAction<P> noop( ) {
91
return SimpleTransitions.NOOP;
94
public static <P extends HasName<P>> TransitionListener<P> predicateAsBeforeListener( final Predicate<P> predicate ) {
95
TransitionListener<P> listener = new TransitionListener<P>( ) {
97
public boolean before( P parent ) {
98
return predicate.apply( parent );
102
public void leave( P parent ) {}
105
public void enter( P parent ) {}
108
public void after( P parent ) {}
113
public static <P extends HasName<P>> TransitionAction<P> callbackAsAction( final Callback<P> callback ) {
114
TransitionAction<P> action = new AbstractTransitionAction<P>( ) {
116
public void leave( P parent, Callback.Completion transitionCallback ) {
118
callback.fire( parent );
119
transitionCallback.fire( );
120
} catch ( RuntimeException ex ) {
122
transitionCallback.fireException( ex );
129
public static <P extends HasName<P>> TransitionAction<P> callableAsAction( final Callable<P> callable ) {
130
return callbackAsAction( Callbacks.forCallable( callable ) );
133
public static <P extends HasName<P>> TransitionAction<P> runnableAsAction( final Runnable runnable ) {
134
return callbackAsAction( Callbacks.forRunnable( runnable ) );
137
public static <P extends HasName<P>> TransitionAction<P> predicateAsAction( final Predicate<P> predicate ) {
138
TransitionAction<P> action = new AbstractTransitionAction<P>( ) {
140
public void leave( P parent, Callback.Completion transitionCallback ) {
142
if ( !predicate.apply( parent ) ) {
143
transitionCallback.fireException( Transitions.exceptionOnCondition( "Transition condition failed for " + parent + " on condition ", predicate ) );
145
transitionCallback.fire( );
147
} catch ( RuntimeException ex ) {
148
Logs.extreme( ).error( ex, ex );
149
transitionCallback.fireException( ex );