~ubuntu-branches/ubuntu/raring/eucalyptus/raring

« back to all changes in this revision

Viewing changes to clc/modules/msgs/src/main/java/com/eucalyptus/util/fsm/Transitions.java

  • Committer: Package Import Robot
  • Author(s): Brian Thomason
  • Date: 2011-11-29 13:17:52 UTC
  • mfrom: (1.2.1 upstream)
  • mto: This revision was merged to the branch mainline in revision 185.
  • Revision ID: package-import@ubuntu.com-20111129131752-rq31al3ntutv2vvl
Tags: upstream-3.0.999beta1
ImportĀ upstreamĀ versionĀ 3.0.999beta1

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
package com.eucalyptus.util.fsm;
 
2
 
 
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;
 
13
 
 
14
public class Transitions {
 
15
  private static Logger LOG = Logger.getLogger( Transitions.class );
 
16
  
 
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( ) );
 
19
  }
 
20
  
 
21
  public static <P extends HasName<P>> TransitionListener<P> callbackAsListener( final Callback<P> p ) {
 
22
    return new TransitionListener<P>( ) {
 
23
      
 
24
      @Override
 
25
      public boolean before( P parent ) {
 
26
        return true;
 
27
      }
 
28
      
 
29
      @Override
 
30
      public void leave( P parent ) {
 
31
        try {
 
32
          p.fire( parent );
 
33
        } catch ( Exception ex ) {
 
34
          LOG.error( ex );
 
35
          Logs.extreme( ).error( ex, ex );
 
36
        }
 
37
      }
 
38
      
 
39
      @Override
 
40
      public void enter( P parent ) {}
 
41
      
 
42
      @Override
 
43
      public void after( P parent ) {}
 
44
    };
 
45
  }
 
46
  
 
47
  private enum SimpleTransitions implements TransitionAction {
 
48
    NOOP {
 
49
      public void leave( HasName parent, Completion transitionCallback ) {
 
50
        transitionCallback.fire( );
 
51
      }
 
52
      
 
53
      public String toString( ) {
 
54
        return "TransitionAction.noop";
 
55
      }
 
56
      
 
57
      @Override
 
58
      public boolean before( HasName parent ) {
 
59
        return true;
 
60
      }
 
61
      
 
62
      @Override
 
63
      public void enter( HasName parent ) {}
 
64
      
 
65
      @Override
 
66
      public void after( HasName parent ) {}
 
67
    },
 
68
    OUTOFBAND {
 
69
      @Override
 
70
      public void leave( HasName parent, Completion transitionCallback ) {}
 
71
      
 
72
      public String toString( ) {
 
73
        return "TransitionAction.OUTOFBAND";
 
74
      }
 
75
      
 
76
      @Override
 
77
      public boolean before( HasName parent ) {
 
78
        return true;
 
79
      }
 
80
      
 
81
      @Override
 
82
      public void enter( HasName parent ) {}
 
83
      
 
84
      @Override
 
85
      public void after( HasName parent ) {}
 
86
      
 
87
    };
 
88
  }
 
89
  
 
90
  public static <P extends HasName<P>> TransitionAction<P> noop( ) {
 
91
    return SimpleTransitions.NOOP;
 
92
  }
 
93
  
 
94
  public static <P extends HasName<P>> TransitionListener<P> predicateAsBeforeListener( final Predicate<P> predicate ) {
 
95
    TransitionListener<P> listener = new TransitionListener<P>( ) {
 
96
      @Override
 
97
      public boolean before( P parent ) {
 
98
        return predicate.apply( parent );
 
99
      }
 
100
      
 
101
      @Override
 
102
      public void leave( P parent ) {}
 
103
      
 
104
      @Override
 
105
      public void enter( P parent ) {}
 
106
      
 
107
      @Override
 
108
      public void after( P parent ) {}
 
109
    };
 
110
    return listener;
 
111
  }
 
112
  
 
113
  public static <P extends HasName<P>> TransitionAction<P> callbackAsAction( final Callback<P> callback ) {
 
114
    TransitionAction<P> action = new AbstractTransitionAction<P>( ) {
 
115
      @Override
 
116
      public void leave( P parent, Callback.Completion transitionCallback ) {
 
117
        try {
 
118
          callback.fire( parent );
 
119
          transitionCallback.fire( );
 
120
        } catch ( RuntimeException ex ) {
 
121
          LOG.error( ex );
 
122
          transitionCallback.fireException( ex );
 
123
        }
 
124
      }
 
125
    };
 
126
    return action;
 
127
  }
 
128
  
 
129
  public static <P extends HasName<P>> TransitionAction<P> callableAsAction( final Callable<P> callable ) {
 
130
    return callbackAsAction( Callbacks.forCallable( callable ) );
 
131
  }
 
132
  
 
133
  public static <P extends HasName<P>> TransitionAction<P> runnableAsAction( final Runnable runnable ) {
 
134
    return callbackAsAction( Callbacks.forRunnable( runnable ) );
 
135
  }
 
136
  
 
137
  public static <P extends HasName<P>> TransitionAction<P> predicateAsAction( final Predicate<P> predicate ) {
 
138
    TransitionAction<P> action = new AbstractTransitionAction<P>( ) {
 
139
      @Override
 
140
      public void leave( P parent, Callback.Completion transitionCallback ) {
 
141
        try {
 
142
          if ( !predicate.apply( parent ) ) {
 
143
            transitionCallback.fireException( Transitions.exceptionOnCondition( "Transition condition failed for " + parent + " on condition ", predicate ) );
 
144
          } else {
 
145
            transitionCallback.fire( );
 
146
          }
 
147
        } catch ( RuntimeException ex ) {
 
148
          Logs.extreme( ).error( ex, ex );
 
149
          transitionCallback.fireException( ex );
 
150
        }
 
151
      }
 
152
    };
 
153
    return action;
 
154
  }
 
155
}