blob: d7608b92d1436d17ef1fed404baf9846aecf7a82 [file] [log] [blame]
HIGUCHI Yuta34a3f692016-01-09 21:08:57 -08001/*
2 * Copyright 2016 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 */
16package org.onosproject.net.optical.device;
17
18import static com.google.common.base.Preconditions.checkNotNull;
19import static com.google.common.base.Preconditions.checkState;
20import static org.slf4j.LoggerFactory.getLogger;
21
22import java.util.Map;
23import java.util.Optional;
24import org.onlab.osgi.DefaultServiceDirectory;
25import org.onosproject.net.Device;
26import org.onosproject.net.Port;
27import org.onosproject.net.device.DeviceService;
28import org.onosproject.net.driver.AbstractBehaviour;
29import org.onosproject.net.driver.DriverData;
30import org.onosproject.net.optical.OchPort;
HIGUCHI Yuta4c0ef6b2016-05-02 19:45:41 -070031import org.onosproject.net.optical.OduCltPort;
HIGUCHI Yuta95d83e82016-04-26 12:13:48 -070032import org.onosproject.net.optical.OmsPort;
HIGUCHI Yuta34a3f692016-01-09 21:08:57 -080033import org.onosproject.net.optical.OpticalDevice;
HIGUCHI Yuta5be3e822016-05-03 13:51:42 -070034import org.onosproject.net.optical.OtuPort;
HIGUCHI Yuta34a3f692016-01-09 21:08:57 -080035import org.onosproject.net.optical.device.port.OchPortMapper;
HIGUCHI Yuta4c0ef6b2016-05-02 19:45:41 -070036import org.onosproject.net.optical.device.port.OduCltPortMapper;
HIGUCHI Yuta95d83e82016-04-26 12:13:48 -070037import org.onosproject.net.optical.device.port.OmsPortMapper;
HIGUCHI Yuta5be3e822016-05-03 13:51:42 -070038import org.onosproject.net.optical.device.port.OtuPortMapper;
HIGUCHI Yuta34a3f692016-01-09 21:08:57 -080039import org.onosproject.net.optical.device.port.PortMapper;
40import org.onosproject.net.optical.utils.ForwardingDevice;
41import org.slf4j.Logger;
42
43import com.google.common.annotations.Beta;
44import com.google.common.base.MoreObjects;
45import com.google.common.collect.ImmutableMap;
46
47// FIXME This needs to be moved back to org.onosproject.net.optical.impl
48// after optical driver package separation process is complete.
49/**
50 * Implementation of {@link OpticalDevice}.
51 * <p>
52 * Currently supports
53 * <ul>
54 * <li> {@link OchPort}
55 * </ul>
56 */
57@Beta
58public class DefaultOpticalDevice
59 extends AbstractBehaviour
60 implements OpticalDevice, ForwardingDevice {
61
62 private static final Logger log = getLogger(DefaultOpticalDevice.class);
63
64 // shared Port type handler map.
65 // TODO Is there a use case, where we need to differentiate this map per Device?
66 private static final Map<Class<? extends Port>, PortMapper<? extends Port>> MAPPERS
67 = ImmutableMap.<Class<? extends Port>, PortMapper<? extends Port>>builder()
68 .put(OchPort.class, new OchPortMapper())
HIGUCHI Yuta95d83e82016-04-26 12:13:48 -070069 .put(OmsPort.class, new OmsPortMapper())
HIGUCHI Yuta4c0ef6b2016-05-02 19:45:41 -070070 .put(OduCltPort.class, new OduCltPortMapper())
HIGUCHI Yuta5be3e822016-05-03 13:51:42 -070071 .put(OtuPort.class, new OtuPortMapper())
HIGUCHI Yuta34a3f692016-01-09 21:08:57 -080072 // TODO add other optical port type here
73 .build();
74
75
76
77 // effectively final
78 private Device delegate;
79
80 // Default constructor required as a Behaviour.
81 public DefaultOpticalDevice() {}
82
83 @Override
84 public Device delegate() {
85 if (delegate == null) {
86 // dirty work around.
87 // wanted to pass delegate Device at construction,
88 // but was not possible. A Behaviour requires no-arg constructor.
89 checkState(data() != null, "DriverData must exist");
90 DriverData data = data();
91 DeviceService service = DefaultServiceDirectory.getService(DeviceService.class);
92 delegate = checkNotNull(service.getDevice(data.deviceId()),
93 "No Device found for %s", data.deviceId());
94 }
95 return delegate;
96 }
97
98 @Override
99 public <T extends Port> boolean portIs(Port port, Class<T> portClass) {
100
101 PortMapper<? extends Port> mapper = MAPPERS.get(portClass);
102 if (mapper != null) {
103 return mapper.is(port);
104 }
105 return false;
106 }
107
108 @Override
109 public <T extends Port> Optional<T> portAs(Port port, Class<T> portClass) {
110 PortMapper<? extends Port> mapper = MAPPERS.get(portClass);
111 if (mapper != null) {
112 return (Optional<T>) (mapper.as(port));
113 }
114 return Optional.empty();
115 }
116
117 @Override
118 public Port port(Port port) {
119 for (PortMapper<? extends Port> mapper : MAPPERS.values()) {
120 if (mapper.is(port)) {
121 return mapper.as(port).map(Port.class::cast).orElse(port);
122 }
123 }
124 return port;
125 }
126
127 @Override
128 public boolean equals(Object obj) {
129 return delegate().equals(obj);
130 }
131
132 @Override
133 public int hashCode() {
134 return delegate().hashCode();
135 }
136
137 @Override
138 public String toString() {
139 return MoreObjects.toStringHelper(this)
140 .add("delegate", delegate)
141 .toString();
142 }
143}