Adding a small hack to allow resolving model specific resources against the class-loader of the model.
Change-Id: I78dd29cd626495005cec094a8a6f1a952e3e68df
diff --git a/apps/yang/src/main/java/org/onosproject/yang/AbstractYangModelRegistrator.java b/apps/yang/src/main/java/org/onosproject/yang/AbstractYangModelRegistrator.java
index 094c1c2..d2ec54f 100644
--- a/apps/yang/src/main/java/org/onosproject/yang/AbstractYangModelRegistrator.java
+++ b/apps/yang/src/main/java/org/onosproject/yang/AbstractYangModelRegistrator.java
@@ -43,12 +43,17 @@
private final Logger log = LoggerFactory.getLogger(getClass());
private final Class<?> loaderClass;
- @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
- protected YangModelRegistry modelRegistry;
+
private Map<YangModuleId, AppModuleInfo> appInfo;
protected YangModel model;
private ModelRegistrationParam registrationParam;
+ @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+ protected YangModelRegistry modelRegistry;
+
+ @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+ protected YangClassLoaderRegistry sourceResolver;
+
/**
* Creates a model registrator primed with the class-loader of the specified
* class.
@@ -80,6 +85,7 @@
ModelRegistrationParam.Builder b =
DefaultModelRegistrationParam.builder().setYangModel(model);
registrationParam = getAppInfo(b).setYangModel(model).build();
+ sourceResolver.registerClassLoader(model.getYangModelId(), loaderClass.getClassLoader());
modelRegistry.registerModel(registrationParam);
log.info("Started");
}
@@ -96,6 +102,7 @@
@Deactivate
protected void deactivate() {
modelRegistry.unregisterModel(registrationParam);
+ sourceResolver.unregisterClassLoader(model.getYangModelId());
log.info("Stopped");
}
}
diff --git a/apps/yang/src/main/java/org/onosproject/yang/YangClassLoaderRegistry.java b/apps/yang/src/main/java/org/onosproject/yang/YangClassLoaderRegistry.java
new file mode 100644
index 0000000..7198346
--- /dev/null
+++ b/apps/yang/src/main/java/org/onosproject/yang/YangClassLoaderRegistry.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2017-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.yang;
+
+import com.google.common.annotations.Beta;
+
+/**
+ * Auxiliary mechanism for resolving model IDs into class-loaders from where
+ * the model was registered.
+ */
+@Beta
+public interface YangClassLoaderRegistry {
+
+ /**
+ * Get the class loader registered for the given model id.
+ *
+ * @param modelId model identifier
+ * @return class loader registered for the model
+ */
+ ClassLoader getClassLoader(String modelId);
+
+ /**
+ * Register the class loader for the specified model.
+ *
+ * @param modelId model identifier
+ * @param classLoader class loader
+ */
+ void registerClassLoader(String modelId, ClassLoader classLoader);
+
+ /**
+ * Register the class loader for the specified model.
+ *
+ * @param modelId model identifier
+ */
+ void unregisterClassLoader(String modelId);
+}
diff --git a/apps/yang/src/main/java/org/onosproject/yang/YangRuntimeManager.java b/apps/yang/src/main/java/org/onosproject/yang/YangRuntimeManager.java
index 063051b..c792dd8 100644
--- a/apps/yang/src/main/java/org/onosproject/yang/YangRuntimeManager.java
+++ b/apps/yang/src/main/java/org/onosproject/yang/YangRuntimeManager.java
@@ -53,7 +53,9 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import java.util.Map;
import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
import static com.google.common.base.Preconditions.checkNotNull;
@@ -65,7 +67,7 @@
@Component(immediate = true)
public class YangRuntimeManager implements YangModelRegistry,
YangSerializerRegistry, YangRuntimeService, ModelConverter,
- SchemaContextProvider {
+ SchemaContextProvider, YangClassLoaderRegistry {
private static final String APP_ID = "org.onosproject.yang";
private final Logger log = LoggerFactory.getLogger(getClass());
@@ -79,6 +81,8 @@
private DefaultModelConverter modelConverter;
private DefaultSchemaContextProvider schemaContextProvider;
+ private Map<String, ClassLoader> classLoaders;
+
@Activate
public void activate() {
coreService.registerApplication(APP_ID);
@@ -89,6 +93,7 @@
serializerRegistry.registerSerializer(new JsonSerializer());
serializerRegistry.registerSerializer(new XmlSerializer());
modelConverter = new DefaultModelConverter(modelRegistry);
+ classLoaders = new ConcurrentHashMap<>();
log.info("Started");
}
@@ -174,4 +179,19 @@
public RpcContext getRpcContext(ResourceId resourceId) {
return schemaContextProvider.getRpcContext(resourceId);
}
+
+ @Override
+ public ClassLoader getClassLoader(String modelId) {
+ return classLoaders.get(modelId);
+ }
+
+ @Override
+ public void registerClassLoader(String modelId, ClassLoader classLoader) {
+ classLoaders.put(modelId, classLoader);
+ }
+
+ @Override
+ public void unregisterClassLoader(String modelId) {
+ classLoaders.remove(modelId);
+ }
}