Committed by
Gerrit Code Review
ONOS-3650 Device driver multiple inheritance
Change-Id: Ib7b72d44533d4e63c4122662b50485243562aa21
Showing
17 changed files
with
294 additions
and
26 deletions
... | @@ -16,8 +16,11 @@ | ... | @@ -16,8 +16,11 @@ |
16 | package org.onosproject.net.driver; | 16 | package org.onosproject.net.driver; |
17 | 17 | ||
18 | import com.google.common.collect.ImmutableMap; | 18 | import com.google.common.collect.ImmutableMap; |
19 | +import com.google.common.collect.Lists; | ||
19 | import com.google.common.collect.Maps; | 20 | import com.google.common.collect.Maps; |
21 | +import org.slf4j.Logger; | ||
20 | 22 | ||
23 | +import java.util.List; | ||
21 | import java.util.Map; | 24 | import java.util.Map; |
22 | import java.util.Objects; | 25 | import java.util.Objects; |
23 | import java.util.Set; | 26 | import java.util.Set; |
... | @@ -26,14 +29,17 @@ import static com.google.common.base.MoreObjects.toStringHelper; | ... | @@ -26,14 +29,17 @@ import static com.google.common.base.MoreObjects.toStringHelper; |
26 | import static com.google.common.base.Preconditions.checkArgument; | 29 | import static com.google.common.base.Preconditions.checkArgument; |
27 | import static com.google.common.base.Preconditions.checkNotNull; | 30 | import static com.google.common.base.Preconditions.checkNotNull; |
28 | import static com.google.common.collect.ImmutableMap.copyOf; | 31 | import static com.google.common.collect.ImmutableMap.copyOf; |
32 | +import static org.slf4j.LoggerFactory.getLogger; | ||
29 | 33 | ||
30 | /** | 34 | /** |
31 | * Default implementation of extensible driver. | 35 | * Default implementation of extensible driver. |
32 | */ | 36 | */ |
33 | public class DefaultDriver implements Driver { | 37 | public class DefaultDriver implements Driver { |
34 | 38 | ||
39 | + private final Logger log = getLogger(getClass()); | ||
40 | + | ||
35 | private final String name; | 41 | private final String name; |
36 | - private final Driver parent; | 42 | + private final List<Driver> parents; |
37 | 43 | ||
38 | private final String manufacturer; | 44 | private final String manufacturer; |
39 | private final String hwVersion; | 45 | private final String hwVersion; |
... | @@ -53,12 +59,37 @@ public class DefaultDriver implements Driver { | ... | @@ -53,12 +59,37 @@ public class DefaultDriver implements Driver { |
53 | * @param behaviours device behaviour classes | 59 | * @param behaviours device behaviour classes |
54 | * @param properties properties for configuration of device behaviour classes | 60 | * @param properties properties for configuration of device behaviour classes |
55 | */ | 61 | */ |
62 | + @Deprecated | ||
56 | public DefaultDriver(String name, Driver parent, String manufacturer, | 63 | public DefaultDriver(String name, Driver parent, String manufacturer, |
57 | String hwVersion, String swVersion, | 64 | String hwVersion, String swVersion, |
58 | Map<Class<? extends Behaviour>, Class<? extends Behaviour>> behaviours, | 65 | Map<Class<? extends Behaviour>, Class<? extends Behaviour>> behaviours, |
59 | Map<String, String> properties) { | 66 | Map<String, String> properties) { |
60 | this.name = checkNotNull(name, "Name cannot be null"); | 67 | this.name = checkNotNull(name, "Name cannot be null"); |
61 | - this.parent = parent; | 68 | + this.parents = parent == null ? null : Lists.newArrayList(parent); |
69 | + this.manufacturer = checkNotNull(manufacturer, "Manufacturer cannot be null"); | ||
70 | + this.hwVersion = checkNotNull(hwVersion, "HW version cannot be null"); | ||
71 | + this.swVersion = checkNotNull(swVersion, "SW version cannot be null"); | ||
72 | + this.behaviours = copyOf(checkNotNull(behaviours, "Behaviours cannot be null")); | ||
73 | + this.properties = copyOf(checkNotNull(properties, "Properties cannot be null")); | ||
74 | + } | ||
75 | + | ||
76 | + /** | ||
77 | + * Creates a driver with the specified name. | ||
78 | + * | ||
79 | + * @param name driver name | ||
80 | + * @param parents optional parent drivers | ||
81 | + * @param manufacturer device manufacturer | ||
82 | + * @param hwVersion device hardware version | ||
83 | + * @param swVersion device software version | ||
84 | + * @param behaviours device behaviour classes | ||
85 | + * @param properties properties for configuration of device behaviour classes | ||
86 | + */ | ||
87 | + public DefaultDriver(String name, List<Driver> parents, String manufacturer, | ||
88 | + String hwVersion, String swVersion, | ||
89 | + Map<Class<? extends Behaviour>, Class<? extends Behaviour>> behaviours, | ||
90 | + Map<String, String> properties) { | ||
91 | + this.name = checkNotNull(name, "Name cannot be null"); | ||
92 | + this.parents = parents == null || parents.isEmpty() ? null : parents; | ||
62 | this.manufacturer = checkNotNull(manufacturer, "Manufacturer cannot be null"); | 93 | this.manufacturer = checkNotNull(manufacturer, "Manufacturer cannot be null"); |
63 | this.hwVersion = checkNotNull(hwVersion, "HW version cannot be null"); | 94 | this.hwVersion = checkNotNull(hwVersion, "HW version cannot be null"); |
64 | this.swVersion = checkNotNull(swVersion, "SW version cannot be null"); | 95 | this.swVersion = checkNotNull(swVersion, "SW version cannot be null"); |
... | @@ -68,7 +99,7 @@ public class DefaultDriver implements Driver { | ... | @@ -68,7 +99,7 @@ public class DefaultDriver implements Driver { |
68 | 99 | ||
69 | @Override | 100 | @Override |
70 | public Driver merge(Driver other) { | 101 | public Driver merge(Driver other) { |
71 | - checkArgument(parent == null || Objects.equals(parent, other.parent()), | 102 | + checkArgument(parents == null || Objects.equals(parent(), other.parent()), |
72 | "Parent drivers are not the same"); | 103 | "Parent drivers are not the same"); |
73 | 104 | ||
74 | // Merge the behaviours. | 105 | // Merge the behaviours. |
... | @@ -81,7 +112,8 @@ public class DefaultDriver implements Driver { | ... | @@ -81,7 +112,8 @@ public class DefaultDriver implements Driver { |
81 | ImmutableMap.Builder<String, String> properties = ImmutableMap.builder(); | 112 | ImmutableMap.Builder<String, String> properties = ImmutableMap.builder(); |
82 | properties.putAll(this.properties).putAll(other.properties()); | 113 | properties.putAll(this.properties).putAll(other.properties()); |
83 | 114 | ||
84 | - return new DefaultDriver(name, other.parent(), manufacturer, hwVersion, swVersion, | 115 | + return new DefaultDriver(name, other.parents(), |
116 | + manufacturer, hwVersion, swVersion, | ||
85 | ImmutableMap.copyOf(behaviours), properties.build()); | 117 | ImmutableMap.copyOf(behaviours), properties.build()); |
86 | } | 118 | } |
87 | 119 | ||
... | @@ -107,7 +139,12 @@ public class DefaultDriver implements Driver { | ... | @@ -107,7 +139,12 @@ public class DefaultDriver implements Driver { |
107 | 139 | ||
108 | @Override | 140 | @Override |
109 | public Driver parent() { | 141 | public Driver parent() { |
110 | - return parent; | 142 | + return parents == null ? null : parents.get(0); |
143 | + } | ||
144 | + | ||
145 | + @Override | ||
146 | + public List<Driver> parents() { | ||
147 | + return parents; | ||
111 | } | 148 | } |
112 | 149 | ||
113 | @Override | 150 | @Override |
... | @@ -123,7 +160,8 @@ public class DefaultDriver implements Driver { | ... | @@ -123,7 +160,8 @@ public class DefaultDriver implements Driver { |
123 | @Override | 160 | @Override |
124 | public boolean hasBehaviour(Class<? extends Behaviour> behaviourClass) { | 161 | public boolean hasBehaviour(Class<? extends Behaviour> behaviourClass) { |
125 | return behaviours.containsKey(behaviourClass) || | 162 | return behaviours.containsKey(behaviourClass) || |
126 | - (parent != null && parent.hasBehaviour(behaviourClass)); | 163 | + (parents != null && parents.stream() |
164 | + .filter(parent -> parent.hasBehaviour(behaviourClass)).count() > 0); | ||
127 | } | 165 | } |
128 | 166 | ||
129 | @Override | 167 | @Override |
... | @@ -132,8 +170,14 @@ public class DefaultDriver implements Driver { | ... | @@ -132,8 +170,14 @@ public class DefaultDriver implements Driver { |
132 | T behaviour = createBehaviour(data, null, behaviourClass); | 170 | T behaviour = createBehaviour(data, null, behaviourClass); |
133 | if (behaviour != null) { | 171 | if (behaviour != null) { |
134 | return behaviour; | 172 | return behaviour; |
135 | - } else if (parent != null) { | 173 | + } else if (parents != null) { |
136 | - return parent.createBehaviour(data, behaviourClass); | 174 | + for (Driver parent : Lists.reverse(parents)) { |
175 | + try { | ||
176 | + return parent.createBehaviour(data, behaviourClass); | ||
177 | + } catch (IllegalArgumentException e) { | ||
178 | + log.debug("Parent {} does not support behaviour {}", parent, behaviourClass); | ||
179 | + } | ||
180 | + } | ||
137 | } | 181 | } |
138 | throw new IllegalArgumentException(behaviourClass.getName() + " not supported"); | 182 | throw new IllegalArgumentException(behaviourClass.getName() + " not supported"); |
139 | } | 183 | } |
... | @@ -144,8 +188,14 @@ public class DefaultDriver implements Driver { | ... | @@ -144,8 +188,14 @@ public class DefaultDriver implements Driver { |
144 | T behaviour = createBehaviour(handler.data(), handler, behaviourClass); | 188 | T behaviour = createBehaviour(handler.data(), handler, behaviourClass); |
145 | if (behaviour != null) { | 189 | if (behaviour != null) { |
146 | return behaviour; | 190 | return behaviour; |
147 | - } else if (parent != null) { | 191 | + } else if (parents != null && !parents.isEmpty()) { |
148 | - return parent.createBehaviour(handler, behaviourClass); | 192 | + for (Driver parent : Lists.reverse(parents)) { |
193 | + try { | ||
194 | + return parent.createBehaviour(handler, behaviourClass); | ||
195 | + } catch (IllegalArgumentException e) { | ||
196 | + log.debug("Parent {} does not support behaviour {}", parent, behaviourClass); | ||
197 | + } | ||
198 | + } | ||
149 | } | 199 | } |
150 | throw new IllegalArgumentException(behaviourClass.getName() + " not supported"); | 200 | throw new IllegalArgumentException(behaviourClass.getName() + " not supported"); |
151 | } | 201 | } |
... | @@ -202,7 +252,7 @@ public class DefaultDriver implements Driver { | ... | @@ -202,7 +252,7 @@ public class DefaultDriver implements Driver { |
202 | public String toString() { | 252 | public String toString() { |
203 | return toStringHelper(this) | 253 | return toStringHelper(this) |
204 | .add("name", name) | 254 | .add("name", name) |
205 | - .add("parent", parent) | 255 | + .add("parents", parents) |
206 | .add("manufacturer", manufacturer) | 256 | .add("manufacturer", manufacturer) |
207 | .add("hwVersion", hwVersion) | 257 | .add("hwVersion", hwVersion) |
208 | .add("swVersion", swVersion) | 258 | .add("swVersion", swVersion) | ... | ... |
... | @@ -17,6 +17,7 @@ package org.onosproject.net.driver; | ... | @@ -17,6 +17,7 @@ package org.onosproject.net.driver; |
17 | 17 | ||
18 | import org.onosproject.net.Annotations; | 18 | import org.onosproject.net.Annotations; |
19 | 19 | ||
20 | +import java.util.List; | ||
20 | import java.util.Map; | 21 | import java.util.Map; |
21 | import java.util.Set; | 22 | import java.util.Set; |
22 | 23 | ||
... | @@ -40,9 +41,18 @@ public interface Driver extends Annotations { | ... | @@ -40,9 +41,18 @@ public interface Driver extends Annotations { |
40 | * | 41 | * |
41 | * @return parent driver; null if driver has no parent | 42 | * @return parent driver; null if driver has no parent |
42 | */ | 43 | */ |
44 | + @Deprecated | ||
43 | Driver parent(); | 45 | Driver parent(); |
44 | 46 | ||
45 | /** | 47 | /** |
48 | + * Returns all the parent drivers from which this driver inherits behaviours | ||
49 | + * and properties. | ||
50 | + * | ||
51 | + * @return list of parent drivers; null if driver has no parent | ||
52 | + */ | ||
53 | + List<Driver> parents(); | ||
54 | + | ||
55 | + /** | ||
46 | * Returns the device manufacturer name. | 56 | * Returns the device manufacturer name. |
47 | * | 57 | * |
48 | * @return manufacturer name | 58 | * @return manufacturer name | ... | ... |
... | @@ -16,6 +16,7 @@ | ... | @@ -16,6 +16,7 @@ |
16 | package org.onosproject.net.driver; | 16 | package org.onosproject.net.driver; |
17 | 17 | ||
18 | import com.google.common.collect.ImmutableMap; | 18 | import com.google.common.collect.ImmutableMap; |
19 | +import com.google.common.collect.Lists; | ||
19 | import com.google.common.collect.Maps; | 20 | import com.google.common.collect.Maps; |
20 | import org.apache.commons.configuration.ConfigurationException; | 21 | import org.apache.commons.configuration.ConfigurationException; |
21 | import org.apache.commons.configuration.HierarchicalConfiguration; | 22 | import org.apache.commons.configuration.HierarchicalConfiguration; |
... | @@ -23,7 +24,10 @@ import org.apache.commons.configuration.XMLConfiguration; | ... | @@ -23,7 +24,10 @@ import org.apache.commons.configuration.XMLConfiguration; |
23 | 24 | ||
24 | import java.io.IOException; | 25 | import java.io.IOException; |
25 | import java.io.InputStream; | 26 | import java.io.InputStream; |
27 | +import java.util.Arrays; | ||
28 | +import java.util.List; | ||
26 | import java.util.Map; | 29 | import java.util.Map; |
30 | +import java.util.stream.Collectors; | ||
27 | 31 | ||
28 | /** | 32 | /** |
29 | * Utility capable of reading driver configuration XML resources and producing | 33 | * Utility capable of reading driver configuration XML resources and producing |
... | @@ -126,13 +130,22 @@ public class XmlDriverLoader { | ... | @@ -126,13 +130,22 @@ public class XmlDriverLoader { |
126 | public DefaultDriver loadDriver(HierarchicalConfiguration driverCfg, | 130 | public DefaultDriver loadDriver(HierarchicalConfiguration driverCfg, |
127 | DriverResolver resolver) { | 131 | DriverResolver resolver) { |
128 | String name = driverCfg.getString(NAME); | 132 | String name = driverCfg.getString(NAME); |
129 | - String parentName = driverCfg.getString(EXTENDS); | 133 | + String parentsString = driverCfg.getString(EXTENDS, ""); |
134 | + List<Driver> parents = Lists.newArrayList(); | ||
135 | + if (!parentsString.equals("")) { | ||
136 | + List<String> parentsNames; | ||
137 | + if (parentsString.contains(",")) { | ||
138 | + parentsNames = Arrays.asList(parentsString.replace(" ", "").split(",")); | ||
139 | + } else { | ||
140 | + parentsNames = Lists.newArrayList(parentsString); | ||
141 | + } | ||
142 | + parents = parentsNames.stream().map(parent -> (parent != null) ? | ||
143 | + resolve(parent, resolver) : null).collect(Collectors.toList()); | ||
144 | + } | ||
130 | String manufacturer = driverCfg.getString(MFG, ""); | 145 | String manufacturer = driverCfg.getString(MFG, ""); |
131 | String hwVersion = driverCfg.getString(HW, ""); | 146 | String hwVersion = driverCfg.getString(HW, ""); |
132 | String swVersion = driverCfg.getString(SW, ""); | 147 | String swVersion = driverCfg.getString(SW, ""); |
133 | - | 148 | + return new DefaultDriver(name, parents, manufacturer, hwVersion, swVersion, |
134 | - Driver parent = parentName != null ? resolve(parentName, resolver) : null; | ||
135 | - return new DefaultDriver(name, parent, manufacturer, hwVersion, swVersion, | ||
136 | parseBehaviours(driverCfg), | 149 | parseBehaviours(driverCfg), |
137 | parseProperties(driverCfg)); | 150 | parseProperties(driverCfg)); |
138 | } | 151 | } | ... | ... |
... | @@ -20,6 +20,8 @@ import org.junit.Before; | ... | @@ -20,6 +20,8 @@ import org.junit.Before; |
20 | import org.junit.Test; | 20 | import org.junit.Test; |
21 | import org.onosproject.net.DeviceId; | 21 | import org.onosproject.net.DeviceId; |
22 | 22 | ||
23 | +import java.util.ArrayList; | ||
24 | + | ||
23 | import static org.junit.Assert.*; | 25 | import static org.junit.Assert.*; |
24 | import static org.onosproject.net.DeviceId.deviceId; | 26 | import static org.onosproject.net.DeviceId.deviceId; |
25 | 27 | ||
... | @@ -32,7 +34,7 @@ public class DefaultDriverDataTest { | ... | @@ -32,7 +34,7 @@ public class DefaultDriverDataTest { |
32 | 34 | ||
33 | @Before | 35 | @Before |
34 | public void setUp() { | 36 | public void setUp() { |
35 | - ddc = new DefaultDriver("foo.bar", null, "Circus", "lux", "1.2a", | 37 | + ddc = new DefaultDriver("foo.bar", new ArrayList<>(), "Circus", "lux", "1.2a", |
36 | ImmutableMap.of(TestBehaviour.class, | 38 | ImmutableMap.of(TestBehaviour.class, |
37 | TestBehaviourImpl.class), | 39 | TestBehaviourImpl.class), |
38 | ImmutableMap.of("foo", "bar")); | 40 | ImmutableMap.of("foo", "bar")); | ... | ... |
... | @@ -19,6 +19,8 @@ import com.google.common.collect.ImmutableMap; | ... | @@ -19,6 +19,8 @@ import com.google.common.collect.ImmutableMap; |
19 | import org.junit.Before; | 19 | import org.junit.Before; |
20 | import org.junit.Test; | 20 | import org.junit.Test; |
21 | 21 | ||
22 | +import java.util.ArrayList; | ||
23 | + | ||
22 | import static org.junit.Assert.assertSame; | 24 | import static org.junit.Assert.assertSame; |
23 | import static org.junit.Assert.assertTrue; | 25 | import static org.junit.Assert.assertTrue; |
24 | 26 | ||
... | @@ -30,7 +32,7 @@ public class DefaultDriverHandlerTest { | ... | @@ -30,7 +32,7 @@ public class DefaultDriverHandlerTest { |
30 | 32 | ||
31 | @Before | 33 | @Before |
32 | public void setUp() { | 34 | public void setUp() { |
33 | - ddc = new DefaultDriver("foo.bar", null, "Circus", "lux", "1.2a", | 35 | + ddc = new DefaultDriver("foo.bar", new ArrayList<>(), "Circus", "lux", "1.2a", |
34 | ImmutableMap.of(TestBehaviour.class, | 36 | ImmutableMap.of(TestBehaviour.class, |
35 | TestBehaviourImpl.class, | 37 | TestBehaviourImpl.class, |
36 | TestBehaviourTwo.class, | 38 | TestBehaviourTwo.class, | ... | ... |
... | @@ -18,6 +18,7 @@ package org.onosproject.net.driver; | ... | @@ -18,6 +18,7 @@ package org.onosproject.net.driver; |
18 | import com.google.common.collect.ImmutableMap; | 18 | import com.google.common.collect.ImmutableMap; |
19 | import org.junit.Test; | 19 | import org.junit.Test; |
20 | 20 | ||
21 | +import java.util.ArrayList; | ||
21 | import java.util.Set; | 22 | import java.util.Set; |
22 | 23 | ||
23 | import static com.google.common.collect.ImmutableSet.of; | 24 | import static com.google.common.collect.ImmutableSet.of; |
... | @@ -28,15 +29,15 @@ public class DefaultDriverProviderTest { | ... | @@ -28,15 +29,15 @@ public class DefaultDriverProviderTest { |
28 | @Test | 29 | @Test |
29 | public void basics() { | 30 | public void basics() { |
30 | DefaultDriverProvider ddp = new DefaultDriverProvider(); | 31 | DefaultDriverProvider ddp = new DefaultDriverProvider(); |
31 | - DefaultDriver one = new DefaultDriver("foo.bar", null, "Circus", "lux", "1.2a", | 32 | + DefaultDriver one = new DefaultDriver("foo.bar", new ArrayList<>(), "Circus", "lux", "1.2a", |
32 | ImmutableMap.of(TestBehaviour.class, | 33 | ImmutableMap.of(TestBehaviour.class, |
33 | TestBehaviourImpl.class), | 34 | TestBehaviourImpl.class), |
34 | ImmutableMap.of("foo", "bar")); | 35 | ImmutableMap.of("foo", "bar")); |
35 | - DefaultDriver two = new DefaultDriver("foo.bar", null, "", "", "", | 36 | + DefaultDriver two = new DefaultDriver("foo.bar", new ArrayList<>(), "", "", "", |
36 | ImmutableMap.of(TestBehaviourTwo.class, | 37 | ImmutableMap.of(TestBehaviourTwo.class, |
37 | TestBehaviourTwoImpl.class), | 38 | TestBehaviourTwoImpl.class), |
38 | ImmutableMap.of("goo", "wee")); | 39 | ImmutableMap.of("goo", "wee")); |
39 | - DefaultDriver three = new DefaultDriver("goo.foo", null, "BigTop", "better", "2.2", | 40 | + DefaultDriver three = new DefaultDriver("goo.foo", new ArrayList<>(), "BigTop", "better", "2.2", |
40 | ImmutableMap.of(TestBehaviourTwo.class, | 41 | ImmutableMap.of(TestBehaviourTwo.class, |
41 | TestBehaviourTwoImpl.class), | 42 | TestBehaviourTwoImpl.class), |
42 | ImmutableMap.of("goo", "gee")); | 43 | ImmutableMap.of("goo", "gee")); | ... | ... |
... | @@ -18,6 +18,8 @@ package org.onosproject.net.driver; | ... | @@ -18,6 +18,8 @@ package org.onosproject.net.driver; |
18 | import com.google.common.collect.ImmutableMap; | 18 | import com.google.common.collect.ImmutableMap; |
19 | import org.junit.Test; | 19 | import org.junit.Test; |
20 | 20 | ||
21 | +import java.util.ArrayList; | ||
22 | + | ||
21 | import static org.junit.Assert.assertEquals; | 23 | import static org.junit.Assert.assertEquals; |
22 | import static org.junit.Assert.assertTrue; | 24 | import static org.junit.Assert.assertTrue; |
23 | import static org.onosproject.net.driver.DefaultDriverDataTest.DEVICE_ID; | 25 | import static org.onosproject.net.driver.DefaultDriverDataTest.DEVICE_ID; |
... | @@ -26,7 +28,7 @@ public class DefaultDriverTest { | ... | @@ -26,7 +28,7 @@ public class DefaultDriverTest { |
26 | 28 | ||
27 | @Test | 29 | @Test |
28 | public void basics() { | 30 | public void basics() { |
29 | - DefaultDriver ddp = new DefaultDriver("foo.base", null, "Circus", "lux", "1.2a", | 31 | + DefaultDriver ddp = new DefaultDriver("foo.base", new ArrayList<>(), "Circus", "lux", "1.2a", |
30 | ImmutableMap.of(TestBehaviour.class, | 32 | ImmutableMap.of(TestBehaviour.class, |
31 | TestBehaviourImpl.class, | 33 | TestBehaviourImpl.class, |
32 | TestBehaviourTwo.class, | 34 | TestBehaviourTwo.class, |
... | @@ -62,12 +64,12 @@ public class DefaultDriverTest { | ... | @@ -62,12 +64,12 @@ public class DefaultDriverTest { |
62 | 64 | ||
63 | @Test | 65 | @Test |
64 | public void merge() { | 66 | public void merge() { |
65 | - DefaultDriver one = new DefaultDriver("foo.bar", null, "Circus", "lux", "1.2a", | 67 | + DefaultDriver one = new DefaultDriver("foo.bar", new ArrayList<>(), "Circus", "lux", "1.2a", |
66 | ImmutableMap.of(TestBehaviour.class, | 68 | ImmutableMap.of(TestBehaviour.class, |
67 | TestBehaviourImpl.class), | 69 | TestBehaviourImpl.class), |
68 | ImmutableMap.of("foo", "bar")); | 70 | ImmutableMap.of("foo", "bar")); |
69 | Driver ddc = | 71 | Driver ddc = |
70 | - one.merge(new DefaultDriver("foo.bar", null, "", "", "", | 72 | + one.merge(new DefaultDriver("foo.bar", new ArrayList<>(), "", "", "", |
71 | ImmutableMap.of(TestBehaviourTwo.class, | 73 | ImmutableMap.of(TestBehaviourTwo.class, |
72 | TestBehaviourTwoImpl.class), | 74 | TestBehaviourTwoImpl.class), |
73 | ImmutableMap.of("goo", "wee"))); | 75 | ImmutableMap.of("goo", "wee"))); | ... | ... |
1 | +/* | ||
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 | + */ | ||
16 | +package org.onosproject.net.driver; | ||
17 | + | ||
18 | +/** | ||
19 | + * Test behaviour. | ||
20 | + */ | ||
21 | +public class TestBehaviourImpl2 extends AbstractHandlerBehaviour implements TestBehaviour { | ||
22 | +} |
1 | +/* | ||
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 | + */ | ||
16 | +package org.onosproject.net.driver; | ||
17 | + | ||
18 | +/** | ||
19 | + * Test behaviour. | ||
20 | + */ | ||
21 | +public interface TestBehaviourThree extends HandlerBehaviour { | ||
22 | +} |
1 | +/* | ||
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 | + */ | ||
16 | +package org.onosproject.net.driver; | ||
17 | + | ||
18 | +/** | ||
19 | + * Test behaviour. | ||
20 | + */ | ||
21 | +public class TestBehaviourThreeImpl extends AbstractHandlerBehaviour implements TestBehaviourThree { | ||
22 | +} |
... | @@ -16,6 +16,7 @@ | ... | @@ -16,6 +16,7 @@ |
16 | package org.onosproject.net.driver; | 16 | package org.onosproject.net.driver; |
17 | 17 | ||
18 | import org.junit.Test; | 18 | import org.junit.Test; |
19 | +import org.onosproject.net.DeviceId; | ||
19 | 20 | ||
20 | import java.io.IOException; | 21 | import java.io.IOException; |
21 | import java.io.InputStream; | 22 | import java.io.InputStream; |
... | @@ -77,4 +78,38 @@ public class XmlDriverLoaderTest { | ... | @@ -77,4 +78,38 @@ public class XmlDriverLoaderTest { |
77 | driver.createBehaviour(new DefaultDriverData(driver, DEVICE_ID), TestBehaviour.class); | 78 | driver.createBehaviour(new DefaultDriverData(driver, DEVICE_ID), TestBehaviour.class); |
78 | } | 79 | } |
79 | 80 | ||
81 | + @Test | ||
82 | + public void multipleDrivers() throws IOException { | ||
83 | + XmlDriverLoader loader = new XmlDriverLoader(getClass().getClassLoader()); | ||
84 | + InputStream stream = getClass().getResourceAsStream("drivers.multipleInheritance.xml"); | ||
85 | + DriverProvider provider = loader.loadDrivers(stream, null); | ||
86 | + Iterator<Driver> iterator = provider.getDrivers().iterator(); | ||
87 | + Driver driver; | ||
88 | + do { | ||
89 | + driver = iterator.next(); | ||
90 | + } while (!driver.name().equals("foo.2")); | ||
91 | + assertTrue("incorrect multiple behaviour inheritance", driver.hasBehaviour(TestBehaviour.class)); | ||
92 | + assertTrue("incorrect multiple behaviour inheritance", driver.hasBehaviour(TestBehaviourTwo.class)); | ||
93 | + } | ||
94 | + | ||
95 | + @Test | ||
96 | + public void multipleDriversSameBehaviors() throws IOException { | ||
97 | + XmlDriverLoader loader = new XmlDriverLoader(getClass().getClassLoader()); | ||
98 | + InputStream stream = getClass().getResourceAsStream("drivers.sameMultipleInheritance.xml"); | ||
99 | + DriverProvider provider = loader.loadDrivers(stream, null); | ||
100 | + Iterator<Driver> iterator = provider.getDrivers().iterator(); | ||
101 | + Driver driver; | ||
102 | + do { | ||
103 | + driver = iterator.next(); | ||
104 | + } while (!driver.name().equals("foo.2")); | ||
105 | + assertTrue("incorrect multiple behaviour inheritance", driver.hasBehaviour(TestBehaviour.class)); | ||
106 | + Behaviour b2 = driver.createBehaviour(new DefaultDriverHandler( | ||
107 | + new DefaultDriverData( | ||
108 | + driver, DeviceId.deviceId("test_device"))), | ||
109 | + TestBehaviour.class); | ||
110 | + assertTrue("incorrect multiple same behaviour inheritance", b2.getClass() | ||
111 | + .getSimpleName().equals("TestBehaviourImpl2")); | ||
112 | + assertTrue("incorrect multiple behaviour inheritance", driver.hasBehaviour(TestBehaviourTwo.class)); | ||
113 | + } | ||
114 | + | ||
80 | } | 115 | } | ... | ... |
1 | +<?xml version="1.0" encoding="UTF-8"?> | ||
2 | +<!-- | ||
3 | + ~ Copyright 2016 Open Networking Laboratory | ||
4 | + ~ | ||
5 | + ~ Licensed under the Apache License, Version 2.0 (the "License"); | ||
6 | + ~ you may not use this file except in compliance with the License. | ||
7 | + ~ You may obtain a copy of the License at | ||
8 | + ~ | ||
9 | + ~ http://www.apache.org/licenses/LICENSE-2.0 | ||
10 | + ~ | ||
11 | + ~ Unless required by applicable law or agreed to in writing, software | ||
12 | + ~ distributed under the License is distributed on an "AS IS" BASIS, | ||
13 | + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
14 | + ~ See the License for the specific language governing permissions and | ||
15 | + ~ limitations under the License. | ||
16 | + --> | ||
17 | +<drivers> | ||
18 | + <driver name="foo.0" manufacturer="Circus" hwVersion="1.2" swVersion="2.0"> | ||
19 | + <behaviour api="org.onosproject.net.driver.TestBehaviour" | ||
20 | + impl="org.onosproject.net.driver.TestBehaviourImpl"/> | ||
21 | + </driver> | ||
22 | + | ||
23 | + <driver name="foo.1" extends="foo.0" manufacturer="Circus" hwVersion="1.2a" swVersion="2.2"> | ||
24 | + <fingerprint>ding</fingerprint> | ||
25 | + <fingerprint>bat</fingerprint> | ||
26 | + | ||
27 | + <behaviour api="org.onosproject.net.driver.TestBehaviourTwo" | ||
28 | + impl="org.onosproject.net.driver.TestBehaviourTwoImpl"/> | ||
29 | + | ||
30 | + <property name="p1">v1</property> | ||
31 | + <property name="p2">v2</property> | ||
32 | + </driver> | ||
33 | + | ||
34 | + <driver name="foo.2" extends="foo.0,foo.1" manufacturer="Circus" hwVersion="1.2" swVersion="2.0"> | ||
35 | + <behaviour api="org.onosproject.net.driver.TestBehaviourThree" | ||
36 | + impl="org.onosproject.net.driver.TestBehaviourThreeImpl"/> | ||
37 | + </driver> | ||
38 | +</drivers> | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
core/api/src/test/resources/org/onosproject/net/driver/drivers.sameMultipleInheritance.xml
0 → 100644
1 | +<?xml version="1.0" encoding="UTF-8"?> | ||
2 | +<!-- | ||
3 | + ~ Copyright 2016 Open Networking Laboratory | ||
4 | + ~ | ||
5 | + ~ Licensed under the Apache License, Version 2.0 (the "License"); | ||
6 | + ~ you may not use this file except in compliance with the License. | ||
7 | + ~ You may obtain a copy of the License at | ||
8 | + ~ | ||
9 | + ~ http://www.apache.org/licenses/LICENSE-2.0 | ||
10 | + ~ | ||
11 | + ~ Unless required by applicable law or agreed to in writing, software | ||
12 | + ~ distributed under the License is distributed on an "AS IS" BASIS, | ||
13 | + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
14 | + ~ See the License for the specific language governing permissions and | ||
15 | + ~ limitations under the License. | ||
16 | + --> | ||
17 | +<drivers> | ||
18 | + <driver name="foo.0" manufacturer="Circus" hwVersion="1.2" swVersion="2.0"> | ||
19 | + <behaviour api="org.onosproject.net.driver.TestBehaviour" | ||
20 | + impl="org.onosproject.net.driver.TestBehaviourImpl"/> | ||
21 | + </driver> | ||
22 | + | ||
23 | + <driver name="foo.1" extends="foo.0" manufacturer="Circus" hwVersion="1.2a" swVersion="2.2"> | ||
24 | + <fingerprint>ding</fingerprint> | ||
25 | + <fingerprint>bat</fingerprint> | ||
26 | + | ||
27 | + <behaviour api="org.onosproject.net.driver.TestBehaviour" | ||
28 | + impl="org.onosproject.net.driver.TestBehaviourImpl2"/> | ||
29 | + <behaviour api="org.onosproject.net.driver.TestBehaviourTwo" | ||
30 | + impl="org.onosproject.net.driver.TestBehaviourTwoImpl"/> | ||
31 | + | ||
32 | + <property name="p1">v1</property> | ||
33 | + <property name="p2">v2</property> | ||
34 | + </driver> | ||
35 | + | ||
36 | + <driver name="foo.2" extends="foo.0,foo.1" manufacturer="Circus" hwVersion="1.2" swVersion="2.0"> | ||
37 | + <behaviour api="org.onosproject.net.driver.TestBehaviourThree" | ||
38 | + impl="org.onosproject.net.driver.TestBehaviourThreeImpl"/> | ||
39 | + </driver> | ||
40 | +</drivers> | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
... | @@ -16,6 +16,7 @@ | ... | @@ -16,6 +16,7 @@ |
16 | package org.onosproject.codec.impl; | 16 | package org.onosproject.codec.impl; |
17 | 17 | ||
18 | 18 | ||
19 | +import java.util.ArrayList; | ||
19 | import java.util.Map; | 20 | import java.util.Map; |
20 | 21 | ||
21 | import org.junit.Test; | 22 | import org.junit.Test; |
... | @@ -48,7 +49,7 @@ public class DriverCodecTest { | ... | @@ -48,7 +49,7 @@ public class DriverCodecTest { |
48 | Map<String, String> properties = | 49 | Map<String, String> properties = |
49 | ImmutableMap.of("key1", "value1", "key2", "value2"); | 50 | ImmutableMap.of("key1", "value1", "key2", "value2"); |
50 | 51 | ||
51 | - DefaultDriver parent = new DefaultDriver("parent", null, "Acme", | 52 | + DefaultDriver parent = new DefaultDriver("parent", new ArrayList<>(), "Acme", |
52 | "HW1.2.3", "SW1.2.3", | 53 | "HW1.2.3", "SW1.2.3", |
53 | behaviours, | 54 | behaviours, |
54 | properties); | 55 | properties); | ... | ... |
... | @@ -46,7 +46,7 @@ | ... | @@ -46,7 +46,7 @@ |
46 | impl="org.onosproject.driver.query.FullMplsAvailable" /> | 46 | impl="org.onosproject.driver.query.FullMplsAvailable" /> |
47 | </driver> | 47 | </driver> |
48 | <!--This driver is for simulated NETCONF devices through of-config tool on top og OVSDB--> | 48 | <!--This driver is for simulated NETCONF devices through of-config tool on top og OVSDB--> |
49 | - <driver name="ovs-netconf" extends="default" | 49 | + <driver name="ovs-netconf" extends="default,ovs" |
50 | manufacturer="" hwVersion="" swVersion=""> | 50 | manufacturer="" hwVersion="" swVersion=""> |
51 | <behaviour api="org.onosproject.openflow.controller.driver.OpenFlowSwitchDriver" | 51 | <behaviour api="org.onosproject.openflow.controller.driver.OpenFlowSwitchDriver" |
52 | impl="org.onosproject.driver.handshaker.NiciraSwitchHandshaker"/> | 52 | impl="org.onosproject.driver.handshaker.NiciraSwitchHandshaker"/> | ... | ... |
... | @@ -28,6 +28,8 @@ import org.onosproject.net.driver.DefaultDriverHandler; | ... | @@ -28,6 +28,8 @@ import org.onosproject.net.driver.DefaultDriverHandler; |
28 | import org.onosproject.ovsdb.controller.driver.OvsdbClientServiceAdapter; | 28 | import org.onosproject.ovsdb.controller.driver.OvsdbClientServiceAdapter; |
29 | import org.onosproject.ovsdb.controller.driver.OvsdbControllerAdapter; | 29 | import org.onosproject.ovsdb.controller.driver.OvsdbControllerAdapter; |
30 | 30 | ||
31 | +import java.util.ArrayList; | ||
32 | + | ||
31 | /** | 33 | /** |
32 | * Created by Andrea on 10/7/15. | 34 | * Created by Andrea on 10/7/15. |
33 | */ | 35 | */ |
... | @@ -51,7 +53,7 @@ public class OvsdbControllerConfigTest { | ... | @@ -51,7 +53,7 @@ public class OvsdbControllerConfigTest { |
51 | public void setUp() { | 53 | public void setUp() { |
52 | controllerConfig = new OvsdbControllerConfig(); | 54 | controllerConfig = new OvsdbControllerConfig(); |
53 | 55 | ||
54 | - ddc = new DefaultDriver("foo.bar", null, "Circus", "lux", "1.2a", | 56 | + ddc = new DefaultDriver("foo.bar", new ArrayList<>(), "Circus", "lux", "1.2a", |
55 | ImmutableMap.of(ControllerConfig.class, | 57 | ImmutableMap.of(ControllerConfig.class, |
56 | OvsdbControllerConfig.class), | 58 | OvsdbControllerConfig.class), |
57 | ImmutableMap.of("foo", "bar")); | 59 | ImmutableMap.of("foo", "bar")); | ... | ... |
... | @@ -15,6 +15,7 @@ | ... | @@ -15,6 +15,7 @@ |
15 | */ | 15 | */ |
16 | package org.onosproject.openflow; | 16 | package org.onosproject.openflow; |
17 | 17 | ||
18 | +import java.util.List; | ||
18 | import java.util.Map; | 19 | import java.util.Map; |
19 | import java.util.Set; | 20 | import java.util.Set; |
20 | 21 | ||
... | @@ -39,6 +40,11 @@ public class DriverAdapter implements Driver { | ... | @@ -39,6 +40,11 @@ public class DriverAdapter implements Driver { |
39 | } | 40 | } |
40 | 41 | ||
41 | @Override | 42 | @Override |
43 | + public List<Driver> parents() { | ||
44 | + return null; | ||
45 | + } | ||
46 | + | ||
47 | + @Override | ||
42 | public String manufacturer() { | 48 | public String manufacturer() { |
43 | return null; | 49 | return null; |
44 | } | 50 | } | ... | ... |
-
Please register or login to post a comment