Committed by
Gerrit Code Review
Allowing driver loaders to refer to classes loaded by others.
Change-Id: Ife4e50758620d4c052a7bb81740d9b9305647317
Showing
7 changed files
with
79 additions
and
41 deletions
... | @@ -49,7 +49,7 @@ public abstract class AbstractDriverLoader { | ... | @@ -49,7 +49,7 @@ public abstract class AbstractDriverLoader { |
49 | @Activate | 49 | @Activate |
50 | protected void activate() { | 50 | protected void activate() { |
51 | try { | 51 | try { |
52 | - provider = new XmlDriverLoader(getClass().getClassLoader()) | 52 | + provider = new XmlDriverLoader(getClass().getClassLoader(), driverAdminService) |
53 | .loadDrivers(getClass().getResourceAsStream(path), driverAdminService); | 53 | .loadDrivers(getClass().getResourceAsStream(path), driverAdminService); |
54 | driverAdminService.registerProvider(provider); | 54 | driverAdminService.registerProvider(provider); |
55 | } catch (Exception e) { | 55 | } catch (Exception e) { | ... | ... |
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 | + | ||
17 | +package org.onosproject.net.driver; | ||
18 | + | ||
19 | +/** | ||
20 | + * Entity capable of resolving a class using its name. | ||
21 | + */ | ||
22 | +public interface BehaviourClassResolver { | ||
23 | + | ||
24 | + /** | ||
25 | + * Returns the class corresponding to the specified class name. | ||
26 | + * @param className class className | ||
27 | + * @return | ||
28 | + */ | ||
29 | + Class<? extends Behaviour> getBehaviourClass(String className); | ||
30 | + | ||
31 | +} |
... | @@ -20,7 +20,7 @@ import java.util.Set; | ... | @@ -20,7 +20,7 @@ import java.util.Set; |
20 | /** | 20 | /** |
21 | * Service for managing drivers and driver behaviour implementations. | 21 | * Service for managing drivers and driver behaviour implementations. |
22 | */ | 22 | */ |
23 | -public interface DriverAdminService extends DriverService { | 23 | +public interface DriverAdminService extends DriverService, BehaviourClassResolver { |
24 | 24 | ||
25 | /** | 25 | /** |
26 | * Returns the set of driver providers currently registered. | 26 | * Returns the set of driver providers currently registered. | ... | ... |
... | @@ -64,6 +64,7 @@ public class XmlDriverLoader { | ... | @@ -64,6 +64,7 @@ public class XmlDriverLoader { |
64 | private static final String IMPL = "[@impl]"; | 64 | private static final String IMPL = "[@impl]"; |
65 | 65 | ||
66 | private final ClassLoader classLoader; | 66 | private final ClassLoader classLoader; |
67 | + private final BehaviourClassResolver resolver; | ||
67 | 68 | ||
68 | private Map<String, Driver> drivers = Maps.newHashMap(); | 69 | private Map<String, Driver> drivers = Maps.newHashMap(); |
69 | 70 | ||
... | @@ -72,9 +73,23 @@ public class XmlDriverLoader { | ... | @@ -72,9 +73,23 @@ public class XmlDriverLoader { |
72 | * class loader. | 73 | * class loader. |
73 | * | 74 | * |
74 | * @param classLoader class loader to use | 75 | * @param classLoader class loader to use |
76 | + * @deprecated since 1.7.0 (Hummingbird) | ||
75 | */ | 77 | */ |
78 | + @Deprecated | ||
76 | public XmlDriverLoader(ClassLoader classLoader) { | 79 | public XmlDriverLoader(ClassLoader classLoader) { |
80 | + this(classLoader, null); | ||
81 | + } | ||
82 | + | ||
83 | + /** | ||
84 | + * Creates a new driver loader capable of loading drivers from the supplied | ||
85 | + * class loader. | ||
86 | + * | ||
87 | + * @param classLoader class loader to use | ||
88 | + * @param resolver behaviour class resolver | ||
89 | + */ | ||
90 | + public XmlDriverLoader(ClassLoader classLoader, BehaviourClassResolver resolver) { | ||
77 | this.classLoader = classLoader; | 91 | this.classLoader = classLoader; |
92 | + this.resolver = resolver; | ||
78 | } | 93 | } |
79 | 94 | ||
80 | /** | 95 | /** |
... | @@ -182,7 +197,13 @@ public class XmlDriverLoader { | ... | @@ -182,7 +197,13 @@ public class XmlDriverLoader { |
182 | try { | 197 | try { |
183 | return (Class<? extends Behaviour>) classLoader.loadClass(className); | 198 | return (Class<? extends Behaviour>) classLoader.loadClass(className); |
184 | } catch (ClassNotFoundException e) { | 199 | } catch (ClassNotFoundException e) { |
185 | - throw new IllegalArgumentException("Unable to load class " + className, e); | 200 | + if (resolver != null) { |
201 | + Class<? extends Behaviour> cls = resolver.getBehaviourClass(className); | ||
202 | + if (cls != null) { | ||
203 | + return cls; | ||
204 | + } | ||
205 | + } | ||
206 | + throw new IllegalArgumentException("Unable to resolve class " + className, e); | ||
186 | } | 207 | } |
187 | } | 208 | } |
188 | 209 | ... | ... |
1 | package org.onosproject.net.driver; | 1 | package org.onosproject.net.driver; |
2 | 2 | ||
3 | -import java.util.Set; | ||
4 | - | ||
5 | import org.junit.Test; | 3 | import org.junit.Test; |
6 | -import org.onosproject.net.DeviceId; | 4 | + |
5 | +import java.util.Set; | ||
7 | 6 | ||
8 | /** | 7 | /** |
9 | * Base test class for driver loading. | 8 | * Base test class for driver loading. |
10 | */ | 9 | */ |
11 | public abstract class AbstractDriverLoaderTest { | 10 | public abstract class AbstractDriverLoaderTest { |
12 | 11 | ||
13 | - private class DriverAdminServiceAdapter implements DriverAdminService { | 12 | + private class DriverAdminServiceAdapter extends DriverServiceAdapter implements DriverAdminService { |
14 | @Override | 13 | @Override |
15 | public Set<DriverProvider> getProviders() { | 14 | public Set<DriverProvider> getProviders() { |
16 | return null; | 15 | return null; |
... | @@ -18,41 +17,14 @@ public abstract class AbstractDriverLoaderTest { | ... | @@ -18,41 +17,14 @@ public abstract class AbstractDriverLoaderTest { |
18 | 17 | ||
19 | @Override | 18 | @Override |
20 | public void registerProvider(DriverProvider provider) { | 19 | public void registerProvider(DriverProvider provider) { |
21 | - | ||
22 | } | 20 | } |
23 | 21 | ||
24 | @Override | 22 | @Override |
25 | public void unregisterProvider(DriverProvider provider) { | 23 | public void unregisterProvider(DriverProvider provider) { |
26 | - | ||
27 | - } | ||
28 | - | ||
29 | - @Override | ||
30 | - public Set<Driver> getDrivers() { | ||
31 | - return null; | ||
32 | - } | ||
33 | - | ||
34 | - @Override | ||
35 | - public Set<Driver> getDrivers(Class<? extends Behaviour> withBehaviour) { | ||
36 | - return null; | ||
37 | - } | ||
38 | - | ||
39 | - @Override | ||
40 | - public Driver getDriver(String mfr, String hw, String sw) { | ||
41 | - return null; | ||
42 | - } | ||
43 | - | ||
44 | - @Override | ||
45 | - public Driver getDriver(DeviceId deviceId) { | ||
46 | - return null; | ||
47 | - } | ||
48 | - | ||
49 | - @Override | ||
50 | - public DriverHandler createHandler(DeviceId deviceId, String... credentials) { | ||
51 | - return null; | ||
52 | } | 24 | } |
53 | 25 | ||
54 | @Override | 26 | @Override |
55 | - public Driver getDriver(String driverName) { | 27 | + public Class<? extends Behaviour> getBehaviourClass(String className) { |
56 | return null; | 28 | return null; |
57 | } | 29 | } |
58 | } | 30 | } | ... | ... |
... | @@ -33,7 +33,7 @@ public class XmlDriverLoaderTest { | ... | @@ -33,7 +33,7 @@ public class XmlDriverLoaderTest { |
33 | 33 | ||
34 | @Test | 34 | @Test |
35 | public void basics() throws IOException { | 35 | public void basics() throws IOException { |
36 | - XmlDriverLoader loader = new XmlDriverLoader(getClass().getClassLoader()); | 36 | + XmlDriverLoader loader = new XmlDriverLoader(getClass().getClassLoader(), null); |
37 | InputStream stream = getClass().getResourceAsStream("drivers.1.xml"); | 37 | InputStream stream = getClass().getResourceAsStream("drivers.1.xml"); |
38 | DriverProvider provider = loader.loadDrivers(stream, null); | 38 | DriverProvider provider = loader.loadDrivers(stream, null); |
39 | System.out.println(provider); | 39 | System.out.println(provider); |
... | @@ -59,19 +59,19 @@ public class XmlDriverLoaderTest { | ... | @@ -59,19 +59,19 @@ public class XmlDriverLoaderTest { |
59 | 59 | ||
60 | @Test(expected = IOException.class) | 60 | @Test(expected = IOException.class) |
61 | public void badXml() throws IOException { | 61 | public void badXml() throws IOException { |
62 | - XmlDriverLoader loader = new XmlDriverLoader(getClass().getClassLoader()); | 62 | + XmlDriverLoader loader = new XmlDriverLoader(getClass().getClassLoader(), null); |
63 | loader.loadDrivers(getClass().getResourceAsStream("drivers.bad.xml"), null); | 63 | loader.loadDrivers(getClass().getResourceAsStream("drivers.bad.xml"), null); |
64 | } | 64 | } |
65 | 65 | ||
66 | @Test(expected = IllegalArgumentException.class) | 66 | @Test(expected = IllegalArgumentException.class) |
67 | public void noClass() throws IOException { | 67 | public void noClass() throws IOException { |
68 | - XmlDriverLoader loader = new XmlDriverLoader(getClass().getClassLoader()); | 68 | + XmlDriverLoader loader = new XmlDriverLoader(getClass().getClassLoader(), null); |
69 | loader.loadDrivers(getClass().getResourceAsStream("drivers.noclass.xml"), null); | 69 | loader.loadDrivers(getClass().getResourceAsStream("drivers.noclass.xml"), null); |
70 | } | 70 | } |
71 | 71 | ||
72 | @Test(expected = IllegalArgumentException.class) | 72 | @Test(expected = IllegalArgumentException.class) |
73 | public void noConstructor() throws IOException { | 73 | public void noConstructor() throws IOException { |
74 | - XmlDriverLoader loader = new XmlDriverLoader(getClass().getClassLoader()); | 74 | + XmlDriverLoader loader = new XmlDriverLoader(getClass().getClassLoader(), null); |
75 | InputStream stream = getClass().getResourceAsStream("drivers.noconstructor.xml"); | 75 | InputStream stream = getClass().getResourceAsStream("drivers.noconstructor.xml"); |
76 | DriverProvider provider = loader.loadDrivers(stream, null); | 76 | DriverProvider provider = loader.loadDrivers(stream, null); |
77 | Driver driver = provider.getDrivers().iterator().next(); | 77 | Driver driver = provider.getDrivers().iterator().next(); |
... | @@ -80,7 +80,7 @@ public class XmlDriverLoaderTest { | ... | @@ -80,7 +80,7 @@ public class XmlDriverLoaderTest { |
80 | 80 | ||
81 | @Test | 81 | @Test |
82 | public void multipleDrivers() throws IOException { | 82 | public void multipleDrivers() throws IOException { |
83 | - XmlDriverLoader loader = new XmlDriverLoader(getClass().getClassLoader()); | 83 | + XmlDriverLoader loader = new XmlDriverLoader(getClass().getClassLoader(), null); |
84 | InputStream stream = getClass().getResourceAsStream("drivers.multipleInheritance.xml"); | 84 | InputStream stream = getClass().getResourceAsStream("drivers.multipleInheritance.xml"); |
85 | DriverProvider provider = loader.loadDrivers(stream, null); | 85 | DriverProvider provider = loader.loadDrivers(stream, null); |
86 | Iterator<Driver> iterator = provider.getDrivers().iterator(); | 86 | Iterator<Driver> iterator = provider.getDrivers().iterator(); |
... | @@ -94,7 +94,7 @@ public class XmlDriverLoaderTest { | ... | @@ -94,7 +94,7 @@ public class XmlDriverLoaderTest { |
94 | 94 | ||
95 | @Test | 95 | @Test |
96 | public void multipleDriversSameBehaviors() throws IOException { | 96 | public void multipleDriversSameBehaviors() throws IOException { |
97 | - XmlDriverLoader loader = new XmlDriverLoader(getClass().getClassLoader()); | 97 | + XmlDriverLoader loader = new XmlDriverLoader(getClass().getClassLoader(), null); |
98 | InputStream stream = getClass().getResourceAsStream("drivers.sameMultipleInheritance.xml"); | 98 | InputStream stream = getClass().getResourceAsStream("drivers.sameMultipleInheritance.xml"); |
99 | DriverProvider provider = loader.loadDrivers(stream, null); | 99 | DriverProvider provider = loader.loadDrivers(stream, null); |
100 | Iterator<Driver> iterator = provider.getDrivers().iterator(); | 100 | Iterator<Driver> iterator = provider.getDrivers().iterator(); | ... | ... |
... | @@ -70,6 +70,7 @@ public class DriverManager extends DefaultDriverProvider implements DriverAdminS | ... | @@ -70,6 +70,7 @@ public class DriverManager extends DefaultDriverProvider implements DriverAdminS |
70 | 70 | ||
71 | private Set<DriverProvider> providers = Sets.newConcurrentHashSet(); | 71 | private Set<DriverProvider> providers = Sets.newConcurrentHashSet(); |
72 | private Map<String, Driver> driverByKey = Maps.newConcurrentMap(); | 72 | private Map<String, Driver> driverByKey = Maps.newConcurrentMap(); |
73 | + private Map<String, Class<? extends Behaviour>> classes = Maps.newConcurrentMap(); | ||
73 | 74 | ||
74 | @Activate | 75 | @Activate |
75 | protected void activate() { | 76 | protected void activate() { |
... | @@ -80,6 +81,9 @@ public class DriverManager extends DefaultDriverProvider implements DriverAdminS | ... | @@ -80,6 +81,9 @@ public class DriverManager extends DefaultDriverProvider implements DriverAdminS |
80 | @Deactivate | 81 | @Deactivate |
81 | protected void deactivate() { | 82 | protected void deactivate() { |
82 | AbstractProjectableModel.setDriverService(this, null); | 83 | AbstractProjectableModel.setDriverService(this, null); |
84 | + providers.clear(); | ||
85 | + driverByKey.clear(); | ||
86 | + classes.clear(); | ||
83 | log.info("Stopped"); | 87 | log.info("Stopped"); |
84 | } | 88 | } |
85 | 89 | ||
... | @@ -95,6 +99,11 @@ public class DriverManager extends DefaultDriverProvider implements DriverAdminS | ... | @@ -95,6 +99,11 @@ public class DriverManager extends DefaultDriverProvider implements DriverAdminS |
95 | driverByKey.put(key(driver.manufacturer(), | 99 | driverByKey.put(key(driver.manufacturer(), |
96 | driver.hwVersion(), | 100 | driver.hwVersion(), |
97 | driver.swVersion()), d); | 101 | driver.swVersion()), d); |
102 | + d.behaviours().forEach(b -> { | ||
103 | + Class<? extends Behaviour> implementation = d.implementation(b); | ||
104 | + classes.put(b.getName(), b); | ||
105 | + classes.put(implementation.getName(), implementation); | ||
106 | + }); | ||
98 | }); | 107 | }); |
99 | providers.add(provider); | 108 | providers.add(provider); |
100 | } | 109 | } |
... | @@ -111,6 +120,11 @@ public class DriverManager extends DefaultDriverProvider implements DriverAdminS | ... | @@ -111,6 +120,11 @@ public class DriverManager extends DefaultDriverProvider implements DriverAdminS |
111 | } | 120 | } |
112 | 121 | ||
113 | @Override | 122 | @Override |
123 | + public Class<? extends Behaviour> getBehaviourClass(String className) { | ||
124 | + return classes.get(className); | ||
125 | + } | ||
126 | + | ||
127 | + @Override | ||
114 | public Set<Driver> getDrivers() { | 128 | public Set<Driver> getDrivers() { |
115 | checkPermission(DRIVER_READ); | 129 | checkPermission(DRIVER_READ); |
116 | ImmutableSet.Builder<Driver> builder = ImmutableSet.builder(); | 130 | ImmutableSet.Builder<Driver> builder = ImmutableSet.builder(); | ... | ... |
-
Please register or login to post a comment