blob: 775fb1638c0773c1593cd7800c40a3790b85150b [file] [log] [blame]
Hyunsun Mooneaf75e62016-09-27 16:40:23 -07001/*
2 * Copyright 2016-present Open Networking Laboratory
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
Hyunsun Moonfd5a24e2016-10-19 19:15:48 -070016package org.opencord.cordvtn.api.dependency;
Hyunsun Mooneaf75e62016-09-27 16:40:23 -070017
18import com.google.common.base.MoreObjects;
Hyunsun Moonfd5a24e2016-10-19 19:15:48 -070019import org.opencord.cordvtn.api.net.VtnNetwork;
Hyunsun Mooneaf75e62016-09-27 16:40:23 -070020
21import java.util.Objects;
22
23import static com.google.common.base.Preconditions.checkNotNull;
24
25/**
26 * Representation of a dependency between two networks, subscriber and provider.
27 */
28public final class Dependency {
29
30 public enum Type {
31 BIDIRECTIONAL,
32 UNIDIRECTIONAL
33 }
34
35 private final VtnNetwork subscriber;
36 private final VtnNetwork provider;
37 private final Type type;
38
39 private Dependency(VtnNetwork subscriber, VtnNetwork provider, Type type) {
40 this.subscriber = subscriber;
41 this.provider = provider;
42 this.type = type;
43 }
44
45 /**
46 * Returns subscriber network.
47 *
48 * @return vtn network
49 */
50 public VtnNetwork subscriber() {
51 return subscriber;
52 }
53
54 /**
55 * Returns provider network.
56 *
57 * @return vtn network
58 */
59 public VtnNetwork provider() {
60 return provider;
61 }
62
63 /**
64 * Returns direct access type between subscriber and provider networks.
65 *
66 * @return type
67 */
68 public Type type() {
69 return type;
70 }
71
72 @Override
73 public boolean equals(Object obj) {
74 if (this == obj) {
75 return true;
76 }
77
78 if (obj instanceof Dependency) {
79 Dependency that = (Dependency) obj;
80 if (Objects.equals(subscriber, that.subscriber) &&
81 Objects.equals(provider, that.provider) &&
82 Objects.equals(type, that.type)) {
83 return true;
84 }
85 }
86 return false;
87 }
88
89 @Override
90 public int hashCode() {
91 return Objects.hash(subscriber, provider, type);
92 }
93
94 @Override
95 public String toString() {
96 return MoreObjects.toStringHelper(getClass())
97 .add("subscriber", subscriber.id())
98 .add("provider", provider.id())
99 .add("type", type)
100 .toString();
101 }
102
103 /**
104 * Returns new dependency builder instance.
105 *
106 * @return dependency
107 */
108 public static Builder builder() {
109 return new Builder();
110 }
111
112 /**
113 * Builder of the dependency entities.
114 */
115 public static final class Builder {
116 private VtnNetwork subscriber;
117 private VtnNetwork provider;
118 private Type type;
119
120 private Builder() {
121 }
122
123 /**
124 * Builds an immutable dependency.
125 *
126 * @return dependency instance
127 */
128 public Dependency build() {
129 checkNotNull(subscriber);
130 checkNotNull(provider);
131 checkNotNull(type);
132
133 return new Dependency(subscriber, provider, type);
134 }
135
136 /**
137 * Returns dependency with the supplied subscriber.
138 *
139 * @param subscriber subscriber network
140 * @return dependency builder
141 */
142 public Builder subscriber(VtnNetwork subscriber) {
143 this.subscriber = subscriber;
144 return this;
145 }
146
147 /**
148 * Returns dependency with the supplied provider.
149 *
150 * @param provider provider network
151 * @return dependency builder
152 */
153 public Builder provider(VtnNetwork provider) {
154 this.provider = provider;
155 return this;
156 }
157
158 /**
159 * Returns dependency with the supplied type.
160 *
161 * @param type type
162 * @return dependency builder
163 */
164 public Builder type(Type type) {
165 this.type = type;
166 return this;
167 }
168 }
169}