mirror of https://github.com/OpenIdentityPlatform/OpenDJ.git

Jean-Noël Rouvignac
14.03.2015 f6f67fe1cb1f1f08c392de2e4565ec1a89dd182a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License, Version 1.0 only
 * (the "License").  You may not use this file except in compliance
 * with the License.
 *
 * You can obtain a copy of the license at legal-notices/CDDLv1_0.txt
 * or http://forgerock.org/license/CDDLv1.0.html.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at legal-notices/CDDLv1_0.txt.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information:
 *      Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 *
 *
 *      Copyright 2008 Sun Microsystems, Inc.
 */
package org.opends.server.replication.common;
 
/**
 * This class contains static methods to implement the DS status state machine.
 * They are used to validate the transitions of the state machine according to
 * the current status and event, and to compute the new status.
 * - Status (states of the state machine) are defined in ServerStatus enum
 * - Events are defined in StateMachineEvent enum
 */
public class StatusMachine
{
 
  /**
   * Checks if a given status is valid as an entering status for the state
   * machine.
   * @param initStatus Initial status to check.
   * @return True if the passed status is a valid initial status.
   */
  public static boolean isValidInitialStatus(ServerStatus initStatus)
  {
    switch (initStatus)
    {
      case NORMAL_STATUS:
      case DEGRADED_STATUS:
      case BAD_GEN_ID_STATUS:
        return true;
    }
 
    return false;
  }
 
  /**
   * Computes the new status of the state machine according to the current
   * status and the new generated event.
   * @param curStatus The current status we start from.
   * @param event The event that must make the current status evolve.
   * @return The newly computed status. If the state transition is impossible
   * according to state machine, special INVALID_STATUS is returned.
   */
  public static ServerStatus computeNewStatus(ServerStatus curStatus,
    StatusMachineEvent event)
  {
    switch (curStatus)
    {
      // From NOT_CONNECTED_STATUS
      case NOT_CONNECTED_STATUS:
        switch (event)
        {
          case TO_NOT_CONNECTED_STATUS_EVENT:
            return ServerStatus.NOT_CONNECTED_STATUS;
          case TO_NORMAL_STATUS_EVENT:
            return ServerStatus.NORMAL_STATUS;
          case TO_DEGRADED_STATUS_EVENT:
            return ServerStatus.DEGRADED_STATUS;
          case TO_BAD_GEN_ID_STATUS_EVENT:
            return ServerStatus.BAD_GEN_ID_STATUS;
          default:
            return ServerStatus.INVALID_STATUS;
        }
      // From NORMAL_STATUS
      case NORMAL_STATUS:
        switch (event)
        {
          case TO_NOT_CONNECTED_STATUS_EVENT:
            return ServerStatus.NOT_CONNECTED_STATUS;
          case TO_NORMAL_STATUS_EVENT:
            return ServerStatus.NORMAL_STATUS;
          case TO_DEGRADED_STATUS_EVENT:
            return ServerStatus.DEGRADED_STATUS;
          case TO_FULL_UPDATE_STATUS_EVENT:
            return ServerStatus.FULL_UPDATE_STATUS;
          case TO_BAD_GEN_ID_STATUS_EVENT:
            return ServerStatus.BAD_GEN_ID_STATUS;
          default:
            return ServerStatus.INVALID_STATUS;
        }
      // From DEGRADED_STATUS
      case DEGRADED_STATUS:
        switch (event)
        {
          case TO_NOT_CONNECTED_STATUS_EVENT:
            return ServerStatus.NOT_CONNECTED_STATUS;
          case TO_NORMAL_STATUS_EVENT:
            return ServerStatus.NORMAL_STATUS;
          case TO_DEGRADED_STATUS_EVENT:
            return ServerStatus.DEGRADED_STATUS;
          case TO_FULL_UPDATE_STATUS_EVENT:
            return ServerStatus.FULL_UPDATE_STATUS;
          case TO_BAD_GEN_ID_STATUS_EVENT:
            return ServerStatus.BAD_GEN_ID_STATUS;
          default:
            return ServerStatus.INVALID_STATUS;
        }
      // From FULL_UPDATE_STATUS
      case FULL_UPDATE_STATUS:
        switch (event)
        {
          case TO_NOT_CONNECTED_STATUS_EVENT:
            return ServerStatus.NOT_CONNECTED_STATUS;
          case TO_FULL_UPDATE_STATUS_EVENT:
            return ServerStatus.FULL_UPDATE_STATUS;
          default:
            return ServerStatus.INVALID_STATUS;
        }
      // From BAD_GEN_ID_STATUS
      case BAD_GEN_ID_STATUS:
        switch (event)
        {
          case TO_NOT_CONNECTED_STATUS_EVENT:
            return ServerStatus.NOT_CONNECTED_STATUS;
          case TO_FULL_UPDATE_STATUS_EVENT:
            return ServerStatus.FULL_UPDATE_STATUS;
          case TO_BAD_GEN_ID_STATUS_EVENT:
            return ServerStatus.BAD_GEN_ID_STATUS;
          default:
            return ServerStatus.INVALID_STATUS;
        }
      default:
        return ServerStatus.INVALID_STATUS;
    }
  }
}