/*PLEASE DO NOT EDIT THIS CODE*/
/*This code was generated using the UMPLE @UMPLE_VERSION@ modeling language!*/

package example;

public class StateMachineTest
{

  //------------------------
  // MEMBER VARIABLES
  //------------------------

  //StateMachineTest Attributes
  private int v;

  //StateMachineTest State Machines
  public enum Status { S1, S2, S3 }
  public enum StatusS1 { Null, S1A, S1B }
  public enum StatusS1S1B { Null, S1B1, S1B2 }
  public enum StatusS2 { Null, S2A, S2B, S2C }
  private Status status;
  private StatusS1 statusS1;
  private StatusS1S1B statusS1S1B;
  private StatusS2 statusS2;

  //------------------------
  // CONSTRUCTOR
  //------------------------

  public StateMachineTest()
  {
    v = 0;
    setStatusS1(StatusS1.Null);
    setStatusS1S1B(StatusS1S1B.Null);
    setStatusS2(StatusS2.Null);
    setStatus(Status.S1);
  }

  //------------------------
  // INTERFACE
  //------------------------

  public boolean setV(int aV)
  {
    boolean wasSet = false;
    v = aV;
    wasSet = true;
    return wasSet;
  }

  public int getV()
  {
    return v;
  }

  public String getStatusFullName()
  {
    String answer = status.toString();
    if (statusS1 != StatusS1.Null) { answer += "." + statusS1.toString(); }
    if (statusS1S1B != StatusS1S1B.Null) { answer += "." + statusS1S1B.toString(); }
    if (statusS2 != StatusS2.Null) { answer += "." + statusS2.toString(); }
    return answer;
  }

  public Status getStatus()
  {
    return status;
  }

  public StatusS1 getStatusS1()
  {
    return statusS1;
  }

  public StatusS1S1B getStatusS1S1B()
  {
    return statusS1S1B;
  }

  public StatusS2 getStatusS2()
  {
    return statusS2;
  }

  public boolean e2()
  {
    boolean wasEventProcessed = false;
    
    Status aStatus = status;
    StatusS2 aStatusS2 = statusS2;
    switch (aStatus)
    {
      case S1:
        exitStatus();
        setStatusS2(StatusS2.S2C);
        wasEventProcessed = true;
        break;
      case S3:
        exitStatus();
        setStatus(Status.S2);
        wasEventProcessed = true;
        break;
      default:
        // Other states do respond to this event
    }

    switch (aStatusS2)
    {
      case S2C:
        exitStatus();
        setStatus(Status.S3);
        wasEventProcessed = true;
        break;
      default:
        // Other states do respond to this event
    }

    return wasEventProcessed;
  }

  public boolean e1()
  {
    boolean wasEventProcessed = false;
    
    Status aStatus = status;
    StatusS1 aStatusS1 = statusS1;
    StatusS1S1B aStatusS1S1B = statusS1S1B;
    StatusS2 aStatusS2 = statusS2;
    switch (aStatus)
    {
      case S3:
        exitStatus();
        setStatusS1(StatusS1.S1A);
        wasEventProcessed = true;
        break;
      default:
        // Other states do respond to this event
    }

    switch (aStatusS1)
    {
      case S1A:
        exitStatus();
        setStatus(Status.S2);
        wasEventProcessed = true;
        break;
      default:
        // Other states do respond to this event
    }

    switch (aStatusS1S1B)
    {
      case S1B2:
        if (v>4)
        {
          exitStatusS1();
          setStatus(Status.S3);
          wasEventProcessed = true;
          break;
        }
        if (v<1)
        {
          exitStatusS1();
          setStatus(Status.S2);
          wasEventProcessed = true;
          break;
        }
        break;
      default:
        // Other states do respond to this event
    }

    switch (aStatusS2)
    {
      case S2A:
        setStatus(Status.S2);
        wasEventProcessed = true;
        break;
      case S2C:
        setV(5);
        setStatusS2(StatusS2.S2B);
        wasEventProcessed = true;
        break;
      default:
        // Other states do respond to this event
    }

    return wasEventProcessed;
  }

  public boolean e3()
  {
    boolean wasEventProcessed = false;
    
    Status aStatus = status;
    StatusS1S1B aStatusS1S1B = statusS1S1B;
    StatusS2 aStatusS2 = statusS2;
    switch (aStatus)
    {
      case S3:
        exitStatus();
        setStatusS2(StatusS2.S2C);
        wasEventProcessed = true;
        break;
      default:
        // Other states do respond to this event
    }

    switch (aStatusS1S1B)
    {
      case S1B1:
        exitStatusS1();
        setStatusS2(StatusS2.S2B);
        wasEventProcessed = true;
        break;
      case S1B2:
        exitStatusS1();
        setStatusS1(StatusS1.S1A);
        wasEventProcessed = true;
        break;
      default:
        // Other states do respond to this event
    }

    switch (aStatusS2)
    {
      case S2A:
        exitStatus();
        setStatusS1S1B(StatusS1S1B.S1B1);
        wasEventProcessed = true;
        break;
      default:
        // Other states do respond to this event
    }

    return wasEventProcessed;
  }

  public boolean e5()
  {
    boolean wasEventProcessed = false;
    
    Status aStatus = status;
    StatusS1 aStatusS1 = statusS1;
    StatusS2 aStatusS2 = statusS2;
    switch (aStatus)
    {
      case S3:
        exitStatus();
        setStatus(Status.S1);
        wasEventProcessed = true;
        break;
      default:
        // Other states do respond to this event
    }

    switch (aStatusS1)
    {
      case S1B:
        exitStatusS1();
        setStatusS1(StatusS1.S1A);
        wasEventProcessed = true;
        break;
      default:
        // Other states do respond to this event
    }

    switch (aStatusS2)
    {
      case S2C:
        exitStatus();
        setV(2);
        setStatus(Status.S3);
        wasEventProcessed = true;
        break;
      default:
        // Other states do respond to this event
    }

    return wasEventProcessed;
  }

  private boolean enterS1()
  {
    boolean wasEventProcessed = false;
    
    StatusS1 aStatusS1 = statusS1;
    StatusS1S1B aStatusS1S1B = statusS1S1B;
    switch (aStatusS1)
    {
      case Null:
        setStatusS1(StatusS1.S1A);
        wasEventProcessed = true;
        break;
      default:
        // Other states do respond to this event
    }

    switch (aStatusS1S1B)
    {
      case Null:
        setStatusS1S1B(StatusS1S1B.S1B1);
        wasEventProcessed = true;
        break;
      default:
        // Other states do respond to this event
    }

    return wasEventProcessed;
  }

  private boolean exitS1()
  {
    boolean wasEventProcessed = false;
    
    StatusS1 aStatusS1 = statusS1;
    StatusS1S1B aStatusS1S1B = statusS1S1B;
    switch (aStatusS1)
    {
      case S1A:
        setStatusS1(StatusS1.Null);
        wasEventProcessed = true;
        break;
      case S1B:
        setStatusS1(StatusS1.Null);
        wasEventProcessed = true;
        break;
      default:
        // Other states do respond to this event
    }

    switch (aStatusS1S1B)
    {
      case S1B1:
        setStatusS1S1B(StatusS1S1B.Null);
        wasEventProcessed = true;
        break;
      case S1B2:
        setStatusS1S1B(StatusS1S1B.Null);
        wasEventProcessed = true;
        break;
      default:
        // Other states do respond to this event
    }

    return wasEventProcessed;
  }

  public boolean e4()
  {
    boolean wasEventProcessed = false;
    
    StatusS1S1B aStatusS1S1B = statusS1S1B;
    StatusS2 aStatusS2 = statusS2;
    switch (aStatusS1S1B)
    {
      case S1B1:
        setStatusS1S1B(StatusS1S1B.S1B2);
        wasEventProcessed = true;
        break;
      case S1B2:
        setStatusS1S1B(StatusS1S1B.S1B1);
        wasEventProcessed = true;
        break;
      default:
        // Other states do respond to this event
    }

    switch (aStatusS2)
    {
      case S2A:
        exitStatus();
        setStatus(Status.S1);
        wasEventProcessed = true;
        break;
      case S2B:
        setStatusS2(StatusS2.S2A);
        wasEventProcessed = true;
        break;
      case S2C:
        setStatusS2(StatusS2.S2B);
        wasEventProcessed = true;
        break;
      default:
        // Other states do respond to this event
    }

    return wasEventProcessed;
  }

  private boolean enterS2()
  {
    boolean wasEventProcessed = false;
    
    StatusS2 aStatusS2 = statusS2;
    switch (aStatusS2)
    {
      case Null:
        setStatusS2(StatusS2.S2A);
        wasEventProcessed = true;
        break;
      default:
        // Other states do respond to this event
    }

    return wasEventProcessed;
  }

  private boolean exitS2()
  {
    boolean wasEventProcessed = false;
    
    StatusS2 aStatusS2 = statusS2;
    switch (aStatusS2)
    {
      case S2A:
        setStatusS2(StatusS2.Null);
        wasEventProcessed = true;
        break;
      case S2B:
        setStatusS2(StatusS2.Null);
        wasEventProcessed = true;
        break;
      case S2C:
        setStatusS2(StatusS2.Null);
        wasEventProcessed = true;
        break;
      default:
        // Other states do respond to this event
    }

    return wasEventProcessed;
  }

  private void exitStatus()
  {
    switch(status)
    {
      case S1:
        exitS1();
        break;
      case S2:
        exitS2();
        setV(6);
        break;
      case S3:
        setV(3);
        break;
    }
  }

  private void setStatus(Status aStatus)
  {
    if( aStatus.equals(Status.S3) )
      System.err.println("entry=" + aStatus + ",v=" + v);
    if( status != null && status.equals(Status.S3) && !aStatus.equals(Status.S3) )
      System.err.println("exit=" + status + ",v=" + v);
    status = aStatus;

    // entry actions and do activities
    switch(status)
    {
      case S1:
        if (statusS1 == StatusS1.Null) { setStatusS1(StatusS1.S1A); }
        break;
      case S2:
        if (statusS2 == StatusS2.Null) { setStatusS2(StatusS2.S2A); }
        break;
    }
  }

  private void exitStatusS1()
  {
    switch(statusS1)
    {
      case S1B:
        exitS1();
        break;
    }
  }

  private void setStatusS1(StatusS1 aStatusS1)
  {
    statusS1 = aStatusS1;
    if (status != Status.S1 && aStatusS1 != StatusS1.Null) { setStatus(Status.S1); }

    // entry actions and do activities
    switch(statusS1)
    {
      case S1B:
        if (statusS1S1B == StatusS1S1B.Null) { setStatusS1S1B(StatusS1S1B.S1B1); }
        break;
    }
  }

  private void setStatusS1S1B(StatusS1S1B aStatusS1S1B)
  {
    statusS1S1B = aStatusS1S1B;
    if (statusS1 != StatusS1.S1B && aStatusS1S1B != StatusS1S1B.Null) { setStatusS1(StatusS1.S1B); }

    // entry actions and do activities
    switch(statusS1S1B)
    {
      case S1B1:
        setV(0);
        break;
    }
  }

  private void setStatusS2(StatusS2 aStatusS2)
  {
    statusS2 = aStatusS2;
    if (status != Status.S2 && aStatusS2 != StatusS2.Null) { setStatus(Status.S2); }
  }

  public void delete()
  {}


  public String toString()
  {
    String outputString = "";
	  
    return super.toString() + "["+
            "v" + ":" + getV()+ "]"
     + outputString;
  }
}
