Bug 6540 - HotFix for IsolatedLeader message handler
[mdsal.git] / entityownership / mdsal-eos-common-api / src / main / java / org / opendaylight / mdsal / eos / common / api / EntityOwnershipChangeState.java
1 /*
2  * Copyright (c) 2015 Brocade Communications Systems, Inc. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8 package org.opendaylight.mdsal.eos.common.api;
9
10 import com.google.common.base.Preconditions;
11 import com.google.common.collect.ImmutableMap;
12 import com.google.common.collect.ImmutableMap.Builder;
13 import java.util.Map;
14
15 /**
16  * Enumerates the ownership change states for an entity.
17  *
18  * @author Thomas Pantelis
19  */
20 public enum EntityOwnershipChangeState {
21     /**
22      * The local process instance has been granted ownership.
23      */
24     LOCAL_OWNERSHIP_GRANTED(false, true, true),
25
26     /**
27      * The local process instance has lost ownership and another process instance is now the owner.
28      */
29     LOCAL_OWNERSHIP_LOST_NEW_OWNER(true, false, true),
30
31     /**
32      * The local process instance has lost ownership and there are no longer any candidates for the entity and
33      * thus has no owner.
34      */
35     LOCAL_OWNERSHIP_LOST_NO_OWNER(true, false, false),
36
37     /**
38      * The local process instance ownership has not changed but some other aspect has changed (for example inJeopardy).
39      */
40     LOCAL_OWNERSHIP_RETAINED_WITH_NO_CHANGE(true, true, true),
41
42     /**
43      * Entity ownership has transitioned to another process instance and this instance was not the previous owner.
44      */
45     REMOTE_OWNERSHIP_CHANGED(false, false, true),
46
47     /**
48      * A remote process instance has lost ownership and there are no longer any candidates for the entity and
49      * thus has no owner.
50      */
51     REMOTE_OWNERSHIP_LOST_NO_OWNER(false, false, false);
52
53     private static final Map<Key, EntityOwnershipChangeState> BY_KEY;
54     static {
55         final Builder<Key, EntityOwnershipChangeState> builder = ImmutableMap.<Key, EntityOwnershipChangeState>builder();
56         for(final EntityOwnershipChangeState e: values()) {
57             builder.put(new Key(e.wasOwner, e.isOwner, e.hasOwner), e);
58         }
59
60         BY_KEY = builder.build();
61     }
62
63     private final boolean wasOwner;
64     private final boolean isOwner;
65     private final boolean hasOwner;
66
67     private EntityOwnershipChangeState(final boolean wasOwner, final boolean isOwner, final boolean hasOwner) {
68         this.wasOwner = wasOwner;
69         this.isOwner = isOwner;
70         this.hasOwner = hasOwner;
71     }
72
73     /**
74      * Returns the previous ownership status of the entity for this process instance.
75      * @return true if this process was the owner of the entity at the time this notification was generated
76      */
77     public boolean wasOwner() {
78         return wasOwner;
79     }
80
81     /**
82      * Returns the current ownership status of the entity for this process instance.
83      * @return true if this process is now the owner of the entity
84      */
85     public boolean isOwner() {
86         return isOwner;
87     }
88
89     /**
90      * Returns the current ownership status of the entity across all process instances.
91      * @return true if the entity has an owner which may or may not be this process. If false, then
92      *         the entity has no candidates and thus no owner.
93      */
94     public boolean hasOwner() {
95         return hasOwner;
96     }
97
98     @Override
99     public String toString() {
100         return name() + " [wasOwner=" + wasOwner + ", isOwner=" + isOwner + ", hasOwner=" + hasOwner + "]";
101     }
102
103     public static EntityOwnershipChangeState from(final boolean wasOwner, final boolean isOwner, final boolean hasOwner) {
104         final EntityOwnershipChangeState state = BY_KEY.get(new Key(wasOwner, isOwner, hasOwner));
105         Preconditions.checkArgument(state != null, "Invalid combination of wasOwner: %s, isOwner: %s, hasOwner: %s",
106                 wasOwner, isOwner, hasOwner);
107         return state;
108     }
109
110     private static final class Key {
111         private final boolean wasOwner;
112         private final boolean isOwner;
113         private final boolean hasOwner;
114
115         Key(final boolean wasOwner, final boolean isOwner, final boolean hasOwner) {
116             this.wasOwner = wasOwner;
117             this.isOwner = isOwner;
118             this.hasOwner = hasOwner;
119         }
120
121         @Override
122         public int hashCode() {
123             final int prime = 31;
124             int result = 1;
125             result = prime * result + (hasOwner ? 1231 : 1237);
126             result = prime * result + (isOwner ? 1231 : 1237);
127             result = prime * result + (wasOwner ? 1231 : 1237);
128             return result;
129         }
130
131         @Override
132         public boolean equals(final Object obj) {
133             final Key other = (Key) obj;
134             return hasOwner == other.hasOwner && isOwner == other.isOwner && wasOwner == other.wasOwner;
135         }
136     }
137 }