bfb39330aec756ff4336a9c85a1a0474581494d4
[netconf.git] / netconf / sal-netconf-connector / src / main / java / org / opendaylight / netconf / sal / connect / util / RemoteDeviceId.java
1 /*
2  * Copyright (c) 2014 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 package org.opendaylight.netconf.sal.connect.util;
9
10 import com.google.common.base.Preconditions;
11 import java.net.InetSocketAddress;
12 import org.opendaylight.controller.config.api.ModuleIdentifier;
13 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Host;
14 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.HostBuilder;
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.network.topology.topology.topology.types.TopologyNetconf;
20 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
21 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId;
22 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
23 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey;
24 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
25 import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
26 import org.opendaylight.yangtools.yang.common.QName;
27 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
28
29 public final class RemoteDeviceId {
30
31     private final String name;
32     private final org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier path;
33     private final InstanceIdentifier<Node> bindingPath;
34     private final NodeKey key;
35     private final org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier topologyPath;
36     private final InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang
37             .network.topology.rev131021.network.topology.topology.Node> topologyBindingPath;
38     private InetSocketAddress address;
39     private Host host;
40
41     public RemoteDeviceId(final ModuleIdentifier identifier, InetSocketAddress address) {
42         this(Preconditions.checkNotNull(identifier).getInstanceName());
43         this.address = address;
44         this.host = buildHost();
45     }
46
47     private RemoteDeviceId(final String name) {
48         this.name = Preconditions.checkNotNull(name);
49         this.key = new NodeKey(new NodeId(name));
50         this.path = createBIPath(name);
51         this.bindingPath = createBindingPath(key);
52         this.topologyPath = createBIPathForTopology(name);
53         this.topologyBindingPath = createBindingPathForTopology(key);
54     }
55
56     public RemoteDeviceId(final String name, InetSocketAddress address) {
57         this(name);
58         this.address = address;
59         this.host = buildHost();
60     }
61
62     private static InstanceIdentifier<Node> createBindingPath(final NodeKey key) {
63         return InstanceIdentifier.builder(Nodes.class).child(Node.class, key).build();
64     }
65
66     private static org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier createBIPath(final String name) {
67         final org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.InstanceIdentifierBuilder builder =
68                 org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.builder();
69         builder.node(Nodes.QNAME).node(Node.QNAME)
70                 .nodeWithKey(Node.QNAME, QName.create(Node.QNAME.getNamespace(), Node.QNAME.getRevision(), "id"), name);
71
72         return builder.build();
73     }
74
75     private static InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network
76             .topology.rev131021.network.topology.topology.Node> createBindingPathForTopology(final NodeKey key) {
77         final InstanceIdentifier<NetworkTopology> networkTopology =
78                 InstanceIdentifier.builder(NetworkTopology.class).build();
79         final KeyedInstanceIdentifier<Topology, TopologyKey> topology = networkTopology
80                 .child(Topology.class, new TopologyKey(new TopologyId(TopologyNetconf.QNAME.getLocalName())));
81         return topology
82                 .child(org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang
83                         .network.topology.rev131021.network.topology.topology.Node.class,
84                         new org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network
85                                 .topology.topology.NodeKey(new org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang
86                                 .network.topology.rev131021.NodeId(key.getId().getValue())));
87     }
88
89     private static org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier createBIPathForTopology(
90             final String name) {
91         final org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.InstanceIdentifierBuilder builder =
92                 org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.builder();
93         builder
94                 .node(NetworkTopology.QNAME)
95                 .node(Topology.QNAME)
96                 .nodeWithKey(Topology.QNAME, QName.create(Topology.QNAME, "topology-id"),
97                         TopologyNetconf.QNAME.getLocalName())
98                 .node(org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang
99                         .network.topology.rev131021.network.topology.topology.Node.QNAME)
100                 .nodeWithKey(org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang
101                         .network.topology.rev131021.network.topology.topology.Node.QNAME,
102                         QName.create(org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang
103                                 .network.topology.rev131021.network.topology.topology.Node.QNAME, "node-id"), name);
104         return builder.build();
105     }
106
107     private Host buildHost() {
108         return HostBuilder.getDefaultInstance(address.getHostString());
109     }
110
111     public String getName() {
112         return name;
113     }
114
115     public InstanceIdentifier<Node> getBindingPath() {
116         return bindingPath;
117     }
118
119     public org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier getPath() {
120         return path;
121     }
122
123     public NodeKey getBindingKey() {
124         return key;
125     }
126
127     public InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang
128             .network.topology.rev131021.network.topology.topology.Node> getTopologyBindingPath() {
129         return topologyBindingPath;
130     }
131
132     public YangInstanceIdentifier getTopologyPath() {
133         return topologyPath;
134     }
135
136     public InetSocketAddress getAddress() {
137         return address;
138     }
139
140     public Host getHost() {
141         return host;
142     }
143
144     @Override
145     public String toString() {
146         return "RemoteDevice{" + name + '}';
147     }
148
149     @Override
150     public boolean equals(final Object obj) {
151         if (this == obj) {
152             return true;
153         }
154         if (!(obj instanceof RemoteDeviceId)) {
155             return false;
156         }
157
158         final RemoteDeviceId that = (RemoteDeviceId) obj;
159
160         if (!name.equals(that.name)) {
161             return false;
162         }
163         return bindingPath.equals(that.bindingPath);
164     }
165
166     @Override
167     public int hashCode() {
168         int result = name.hashCode();
169         result = 31 * result + bindingPath.hashCode();
170         return result;
171     }
172 }