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