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

Valery Kharseko
06.12.2025 d7e652c1013c88be63967d2c849bd066f38cdd0c
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
/*
 * The contents of this file are subject to the terms of the Common Development and
 * Distribution License (the License). You may not use this file except in compliance with the
 * License.
 *
 * You can obtain a copy of the License at legal/CDDLv1.0.txt. See the License for the
 * specific language governing permission and limitations under the License.
 *
 * When distributing Covered Software, include this CDDL Header Notice in each file and include
 * the License file at legal/CDDLv1.0.txt. If applicable, add the following below the CDDL
 * Header, with the fields enclosed by brackets [] replaced by your own identifying
 * information: "Portions Copyright [year] [name of copyright owner]".
 *
 * 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;
    }
  }
}