2 * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
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
9 package org.opendaylight.controller.md.sal.common.api.clustering;
11 import com.google.common.base.Preconditions;
12 import java.io.Serializable;
13 import javax.annotation.Nonnull;
14 import org.opendaylight.yangtools.yang.common.QName;
15 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
18 * A clustered Entity is something which is shared by multiple applications across a cluster. An Entity has a type
22 * The type describes the type of the Entity where examples of a type maybe "openflow" or "netconf"
23 * etc. An Entity type could be tied to how exactly an application shares and "owns" an entity. For example we may want
24 * an application which deals with the openflow entity to be assigned ownership of that entity based on a first come
25 * first served basis. On the other hand for netconf entity types we may want applications to gain ownership based on
26 * a load balancing approach. While this mechanism of assigning a ownership acquisition strategy is not finalized the
27 * intention is that the entity type will play a role in determining the strategy and thus should be put in place.
30 * The identifier is a YangInstanceIdentifier. The reason for the choice of YangInstanceIdentifier is because it
31 * can easily be used to represent a data node. For example an inventory node represents a shared entity and it is best
32 * referenced by the YangInstanceIdentifier if the inventory node is stored in the data store.
35 * Note that an entity identifier must conform to a valid yang schema. If there is no existing yang schema to
36 * represent an entity, the general-entity yang model can be used.
38 public final class Entity implements Serializable {
39 private static final long serialVersionUID = 1L;
41 private static final QName ENTITY_QNAME =
42 org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.core.general.entity.rev150820.Entity.QNAME;
43 private static final QName ENTITY_NAME = QName.create(ENTITY_QNAME, "name");
45 private final String type;
46 private final YangInstanceIdentifier id;
49 * Construct an Entity with a YangInstanceIdentifier.
51 * @param type the type of the entity
52 * @param id the identifier of the entity
54 public Entity(@Nonnull String type, @Nonnull YangInstanceIdentifier id) {
55 this.type = Preconditions.checkNotNull(type, "type should not be null");
56 this.id = Preconditions.checkNotNull(id, "id should not be null");
60 * Construct an Entity with an with a name. The general-entity schema is used to construct the
61 * YangInstanceIdentifier.
63 * @param type the type of the entity
64 * @param entityName the name of the entity used to construct a general-entity YangInstanceIdentifier
66 public Entity(@Nonnull String type, @Nonnull String entityName) {
67 this.type = Preconditions.checkNotNull(type, "type should not be null");
68 this.id = YangInstanceIdentifier.builder().node(ENTITY_QNAME).nodeWithKey(ENTITY_QNAME, ENTITY_NAME,
69 Preconditions.checkNotNull(entityName, "entityName should not be null")).build();
74 * @return id of entity
77 public YangInstanceIdentifier getId(){
83 * @return type of entity
86 public String getType(){
91 public boolean equals(Object o) {
96 if (o == null || getClass() != o.getClass()) {
100 Entity entity = (Entity) o;
102 if (!id.equals(entity.id)) {
106 if (!type.equals(entity.type)) {
114 public int hashCode() {
115 return 31 * type.hashCode() + id.hashCode();
119 public String toString() {
120 final StringBuilder sb = new StringBuilder("Entity{");
121 sb.append("type='").append(type).append('\'');
122 sb.append(", id=").append(id);
124 return sb.toString();