Bug 4105: Add public EntityOwnershipService interface
[controller.git] / opendaylight / md-sal / sal-common-api / src / main / java / org / opendaylight / controller / md / sal / common / api / clustering / Entity.java
1 /*
2  * Copyright (c) 2015 Cisco 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
9 package org.opendaylight.controller.md.sal.common.api.clustering;
10
11 import com.google.common.base.Preconditions;
12 import javax.annotation.Nonnull;
13 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
14
15 /**
16  * <p></p>
17  * A clustered Entity is something which is shared by multiple applications across a cluster. An Entity has a type
18  * and an identifier.
19  * </p>
20  * <p>
21  * The type describes the type of the Entity where examples of a type maybe "openflow" or "netconf"
22  * etc. An Entity type could be tied to how exactly an application shares and "owns" an entity. For example we may want
23  * an application which deals with the openflow entity to be assigned ownership of that entity based on a first come
24  * first served basis. On the other hand for netconf entity types we may want applications to gain ownership based on
25  * a load balancing approach. While this mechanism of assigning a ownership acquisition strategy is not finalized the
26  * intention is that the entity type will play a role in determining the strategy and thus should be put in place.
27  * </p>
28  * <p>
29  * The identifier is a YangInstanceIdentifier. The reason for the choice of YangInstanceIdentifier is because it
30  * can easily be used to represent a data node. For example an inventory node represents a shared entity and it is best
31  * referenced by the YangInstanceIdentifier if the inventory node stored in the data store.
32  * </p>
33  */
34 public final class Entity {
35
36     private final String type;
37     private final YangInstanceIdentifier id;
38
39     /**
40      * Construct a new Entity
41      *
42      * @param type the type of the entity
43      * @param id the identifier of the entity
44      */
45     public Entity(@Nonnull String type, @Nonnull YangInstanceIdentifier id) {
46         this.type = Preconditions.checkNotNull(type, "type should not be null");
47         this.id = Preconditions.checkNotNull(id, "id should not be null");
48     }
49
50     /**
51      *
52      * @return id of entity
53      */
54     @Nonnull
55     public YangInstanceIdentifier getId(){
56         return id;
57     }
58
59     /**
60      *
61      * @return type of entity
62      */
63     @Nonnull
64     public String getType(){
65         return type;
66     }
67
68     @Override
69     public boolean equals(Object o) {
70         if (this == o) {
71             return true;
72         }
73
74         if (o == null || getClass() != o.getClass()) {
75             return false;
76         }
77
78         Entity entity = (Entity) o;
79
80         if (!id.equals(entity.id)) {
81             return false;
82         }
83
84         if (!type.equals(entity.type)) {
85             return false;
86         }
87
88         return true;
89     }
90
91     @Override
92     public int hashCode() {
93         int result = type != null ? type.hashCode() : 0;
94         result = 31 * result + (id != null ? id.hashCode() : 0);
95         return result;
96     }
97
98     @Override
99     public String toString() {
100         final StringBuilder sb = new StringBuilder("Entity{");
101         sb.append("type='").append(type).append('\'');
102         sb.append(", id=").append(id);
103         sb.append('}');
104         return sb.toString();
105     }
106 }