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