summaryrefslogtreecommitdiffstats
path: root/infra/minimal-distribution-core/src/main/java/io/fd/honeycomb/infra/distro/schema
diff options
context:
space:
mode:
Diffstat (limited to 'infra/minimal-distribution-core/src/main/java/io/fd/honeycomb/infra/distro/schema')
-rw-r--r--infra/minimal-distribution-core/src/main/java/io/fd/honeycomb/infra/distro/schema/ModuleInfoBackedCtxProvider.java51
-rw-r--r--infra/minimal-distribution-core/src/main/java/io/fd/honeycomb/infra/distro/schema/ResourceLoader.java135
-rw-r--r--infra/minimal-distribution-core/src/main/java/io/fd/honeycomb/infra/distro/schema/SchemaModule.java33
-rw-r--r--infra/minimal-distribution-core/src/main/java/io/fd/honeycomb/infra/distro/schema/SchemaServiceProvider.java81
-rw-r--r--infra/minimal-distribution-core/src/main/java/io/fd/honeycomb/infra/distro/schema/SerializerProvider.java46
-rw-r--r--infra/minimal-distribution-core/src/main/java/io/fd/honeycomb/infra/distro/schema/YangBindingProviderModule.java30
-rw-r--r--infra/minimal-distribution-core/src/main/java/io/fd/honeycomb/infra/distro/schema/YangModuleMappingIndex.java69
-rw-r--r--infra/minimal-distribution-core/src/main/java/io/fd/honeycomb/infra/distro/schema/YangModulesProvider.java97
8 files changed, 542 insertions, 0 deletions
diff --git a/infra/minimal-distribution-core/src/main/java/io/fd/honeycomb/infra/distro/schema/ModuleInfoBackedCtxProvider.java b/infra/minimal-distribution-core/src/main/java/io/fd/honeycomb/infra/distro/schema/ModuleInfoBackedCtxProvider.java
new file mode 100644
index 000000000..e2d0fbfaa
--- /dev/null
+++ b/infra/minimal-distribution-core/src/main/java/io/fd/honeycomb/infra/distro/schema/ModuleInfoBackedCtxProvider.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 2016 Cisco and/or its affiliates.
+ *
+ * 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 io.fd.honeycomb.infra.distro.schema;
+
+import static io.fd.honeycomb.infra.distro.schema.YangModulesProvider.YangModules;
+
+import com.google.common.base.MoreObjects;
+import com.google.inject.Inject;
+import io.fd.honeycomb.infra.distro.ProviderTrait;
+import java.util.stream.Collectors;
+import org.opendaylight.yangtools.sal.binding.generator.impl.ModuleInfoBackedContext;
+import org.opendaylight.yangtools.yang.binding.YangModelBindingProvider;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public final class ModuleInfoBackedCtxProvider extends ProviderTrait<ModuleInfoBackedContext> {
+ private static final Logger LOG = LoggerFactory.getLogger(ModuleInfoBackedCtxProvider.class);
+
+ // optional in sense that list of modules inside can be empty if none was found
+ @Inject
+ private YangModules moduleInfos;
+
+ @Override
+ protected ModuleInfoBackedContext create() {
+ ModuleInfoBackedContext create = ModuleInfoBackedContext.create();
+ create.addModuleInfos(moduleInfos.getYangBindings().stream()
+ .map(YangModelBindingProvider::getModuleInfo)
+ .collect(Collectors.toList()));
+ LOG.debug("ModuleInfoBackedContext created from {}", moduleInfos);
+ return create;
+ }
+
+ @Override
+ public String toString() {
+ return MoreObjects.toStringHelper(this).add("writerFactories", moduleInfos).toString();
+ }
+}
diff --git a/infra/minimal-distribution-core/src/main/java/io/fd/honeycomb/infra/distro/schema/ResourceLoader.java b/infra/minimal-distribution-core/src/main/java/io/fd/honeycomb/infra/distro/schema/ResourceLoader.java
new file mode 100644
index 000000000..c851dab1b
--- /dev/null
+++ b/infra/minimal-distribution-core/src/main/java/io/fd/honeycomb/infra/distro/schema/ResourceLoader.java
@@ -0,0 +1,135 @@
+/*
+ * Copyright (c) 2017 Cisco and/or its affiliates.
+ *
+ * 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 io.fd.honeycomb.infra.distro.schema;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static java.lang.String.format;
+
+import com.google.common.base.Charsets;
+import com.google.common.base.Strings;
+import com.google.common.io.Resources;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.MalformedURLException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.nio.charset.StandardCharsets;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Set;
+import java.util.jar.JarEntry;
+import java.util.jar.JarFile;
+import java.util.stream.Collectors;
+import org.apache.commons.io.IOUtils;
+
+interface ResourceLoader {
+
+ default Set<String> loadResourceContentsOnPath(final String path) {
+ final URL folderUrl = getClass().getClassLoader().getResource(path);
+ checkNotNull(folderUrl, "Resources %s not found", path);
+
+ if (ResourceLoaderIml.urlToUri(folderUrl).getScheme().equals("jar")) {
+ return ResourceLoaderIml.readFromJar(path, folderUrl);
+ } else {
+ return ResourceLoaderIml.readFromFolder(folderUrl);
+ }
+
+ }
+
+ final class ResourceLoaderIml {
+
+ private static Set<String> readFromFolder(final URL folderUrl) {
+ final File folder = new File(folderUrl.getPath());
+ final File[] files = checkNotNull(folder.listFiles(), "No files present on path %s", folderUrl);
+ return Arrays.stream(files)
+ .map(ResourceLoaderIml::fileToUrl)
+ .map(ResourceLoaderIml::urlToContentString)
+ .flatMap(content -> Arrays.stream(content.split(System.lineSeparator())))
+ .filter(ResourceLoaderIml::filterNonEmpty)
+ .collect(Collectors.toSet());
+ }
+
+ private static Set<String> readFromJar(final String path, final URL url) {
+ final String uriString = urlToUri(url).toString();
+ final String fileReference = extractJarFilePath(uriString);
+ try (JarFile jar = new JarFile(new File(fileReference))) {
+ return Collections.list(jar.entries())
+ .stream()
+ .filter(jarEntry -> jarEntry.getName().contains(path))
+ .map(jarEntry -> getJarEntryStream(jar, jarEntry))
+ .map(ResourceLoaderIml::readJarEntryStream)
+ .flatMap(content -> Arrays.stream(content.split(System.lineSeparator())))
+ .filter(ResourceLoaderIml::filterNonEmpty)
+ .collect(Collectors.toSet());
+ } catch (IOException e) {
+ throw new IllegalStateException(e);
+ }
+ }
+
+ private static String extractJarFilePath(final String uriString) {
+ return uriString.substring(0, uriString.indexOf("!")).replace("jar:file:", "");
+ }
+
+ private static boolean filterNonEmpty(final String line) {
+ return !Strings.isNullOrEmpty(line.trim());
+ }
+
+ private static String readJarEntryStream(final InputStream inputStream) {
+ try {
+ final String value = IOUtils.toString(inputStream, StandardCharsets.UTF_8);
+ IOUtils.closeQuietly(inputStream);
+ return value;
+ } catch (IOException e) {
+ throw new IllegalStateException(e);
+ }
+ }
+
+ private static InputStream getJarEntryStream(final JarFile jar, final JarEntry jarEntry) {
+ try {
+ return jar.getInputStream(jarEntry);
+ } catch (IOException e) {
+ throw new IllegalStateException(format("Unable to get stream for entry %s | jar %s", jar, jarEntry));
+ }
+ }
+
+ private static URI urlToUri(final URL url) {
+ try {
+ return url.toURI();
+ } catch (URISyntaxException e) {
+ throw new IllegalStateException(format("Unable to convert URL %s to URI", url));
+ }
+ }
+
+ private static String urlToContentString(final URL url) {
+ try {
+ return Resources.toString(url, Charsets.UTF_8);
+ } catch (IOException e) {
+ throw new IllegalArgumentException("Unable to read resource from: " + url, e);
+ }
+ }
+
+ private static URL fileToUrl(final File file) {
+ try {
+ return file.toURI().toURL();
+ } catch (MalformedURLException e) {
+ throw new IllegalStateException(e);
+ }
+ }
+ }
+}
diff --git a/infra/minimal-distribution-core/src/main/java/io/fd/honeycomb/infra/distro/schema/SchemaModule.java b/infra/minimal-distribution-core/src/main/java/io/fd/honeycomb/infra/distro/schema/SchemaModule.java
new file mode 100644
index 000000000..0799a06f3
--- /dev/null
+++ b/infra/minimal-distribution-core/src/main/java/io/fd/honeycomb/infra/distro/schema/SchemaModule.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 2016 Cisco and/or its affiliates.
+ *
+ * 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 io.fd.honeycomb.infra.distro.schema;
+
+import com.google.inject.AbstractModule;
+import com.google.inject.Singleton;
+import org.opendaylight.controller.md.sal.binding.impl.BindingToNormalizedNodeCodec;
+import org.opendaylight.controller.sal.core.api.model.SchemaService;
+import org.opendaylight.yangtools.sal.binding.generator.impl.ModuleInfoBackedContext;
+
+public class SchemaModule extends AbstractModule {
+
+ protected void configure() {
+ bind(ModuleInfoBackedContext.class).toProvider(ModuleInfoBackedCtxProvider.class).in(Singleton.class);
+ bind(SchemaService.class).toProvider(SchemaServiceProvider.class).in(Singleton.class);
+ bind(BindingToNormalizedNodeCodec.class).toProvider(SerializerProvider.class).in(Singleton.class);
+ }
+
+}
diff --git a/infra/minimal-distribution-core/src/main/java/io/fd/honeycomb/infra/distro/schema/SchemaServiceProvider.java b/infra/minimal-distribution-core/src/main/java/io/fd/honeycomb/infra/distro/schema/SchemaServiceProvider.java
new file mode 100644
index 000000000..eb3552c12
--- /dev/null
+++ b/infra/minimal-distribution-core/src/main/java/io/fd/honeycomb/infra/distro/schema/SchemaServiceProvider.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright (c) 2016 Cisco and/or its affiliates.
+ *
+ * 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 io.fd.honeycomb.infra.distro.schema;
+
+import com.google.inject.Inject;
+import io.fd.honeycomb.infra.distro.ProviderTrait;
+import org.opendaylight.controller.sal.core.api.model.SchemaService;
+import org.opendaylight.yangtools.concepts.ListenerRegistration;
+import org.opendaylight.yangtools.sal.binding.generator.impl.ModuleInfoBackedContext;
+import org.opendaylight.yangtools.yang.model.api.Module;
+import org.opendaylight.yangtools.yang.model.api.SchemaContext;
+import org.opendaylight.yangtools.yang.model.api.SchemaContextListener;
+
+public final class SchemaServiceProvider extends ProviderTrait<SchemaService> {
+
+ @Inject
+ private ModuleInfoBackedContext mibCtx;
+
+ public StaticSchemaService create() {
+ return new StaticSchemaService(mibCtx.getSchemaContext());
+ }
+
+ /**
+ * Static schema context provider service.
+ */
+ private static final class StaticSchemaService implements SchemaService {
+ private final SchemaContext schemaContext;
+
+ StaticSchemaService(SchemaContext schemaContext) {
+ this.schemaContext = schemaContext;
+ }
+
+ @Override
+ public void addModule(final Module module) {
+ throw new UnsupportedOperationException("Static service");
+ }
+
+ @Override
+ public void removeModule(final Module module) {
+ throw new UnsupportedOperationException("Static service");
+ }
+
+ @Override
+ public SchemaContext getSessionContext() {
+ return schemaContext;
+ }
+
+ @Override
+ public SchemaContext getGlobalContext() {
+ return schemaContext;
+ }
+
+ @Override
+ public ListenerRegistration<SchemaContextListener> registerSchemaContextListener(
+ final SchemaContextListener listener) {
+ listener.onGlobalContextUpdated(schemaContext);
+ return new ListenerRegistration<SchemaContextListener>() {
+ public void close() {}
+
+ public SchemaContextListener getInstance() {
+ return listener;
+ }
+
+ };
+ }
+ }
+}
diff --git a/infra/minimal-distribution-core/src/main/java/io/fd/honeycomb/infra/distro/schema/SerializerProvider.java b/infra/minimal-distribution-core/src/main/java/io/fd/honeycomb/infra/distro/schema/SerializerProvider.java
new file mode 100644
index 000000000..2a1963c0a
--- /dev/null
+++ b/infra/minimal-distribution-core/src/main/java/io/fd/honeycomb/infra/distro/schema/SerializerProvider.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2016 Cisco and/or its affiliates.
+ *
+ * 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 io.fd.honeycomb.infra.distro.schema;
+
+import com.google.inject.Inject;
+import io.fd.honeycomb.infra.distro.ProviderTrait;
+import javassist.ClassPool;
+import org.opendaylight.controller.md.sal.binding.impl.BindingToNormalizedNodeCodec;
+import org.opendaylight.yangtools.binding.data.codec.gen.impl.DataObjectSerializerGenerator;
+import org.opendaylight.yangtools.binding.data.codec.gen.impl.StreamWriterGenerator;
+import org.opendaylight.yangtools.binding.data.codec.impl.BindingNormalizedNodeCodecRegistry;
+import org.opendaylight.yangtools.sal.binding.generator.impl.ModuleInfoBackedContext;
+import org.opendaylight.yangtools.sal.binding.generator.util.BindingRuntimeContext;
+import org.opendaylight.yangtools.sal.binding.generator.util.JavassistUtils;
+
+public class SerializerProvider extends ProviderTrait<BindingToNormalizedNodeCodec> {
+
+ @Inject
+ private ModuleInfoBackedContext mibCtx;
+
+ @Override
+ protected BindingToNormalizedNodeCodec create() {
+ final DataObjectSerializerGenerator serializerGenerator =
+ StreamWriterGenerator.create(JavassistUtils.forClassPool(ClassPool.getDefault()));
+ BindingNormalizedNodeCodecRegistry codecRegistry = new BindingNormalizedNodeCodecRegistry(serializerGenerator);
+ BindingRuntimeContext ctx = BindingRuntimeContext.create(mibCtx, mibCtx.getSchemaContext());
+ codecRegistry.onBindingRuntimeContextUpdated(ctx);
+ BindingToNormalizedNodeCodec codec = new BindingToNormalizedNodeCodec(mibCtx, codecRegistry);
+ codec.onGlobalContextUpdated(mibCtx.getSchemaContext());
+ return codec;
+ }
+}
diff --git a/infra/minimal-distribution-core/src/main/java/io/fd/honeycomb/infra/distro/schema/YangBindingProviderModule.java b/infra/minimal-distribution-core/src/main/java/io/fd/honeycomb/infra/distro/schema/YangBindingProviderModule.java
new file mode 100644
index 000000000..d705226bf
--- /dev/null
+++ b/infra/minimal-distribution-core/src/main/java/io/fd/honeycomb/infra/distro/schema/YangBindingProviderModule.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (c) 2016 Cisco and/or its affiliates.
+ *
+ * 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 io.fd.honeycomb.infra.distro.schema;
+
+import com.google.inject.AbstractModule;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class YangBindingProviderModule extends AbstractModule {
+ private static final Logger LOG = LoggerFactory.getLogger(YangBindingProviderModule.class);
+
+ protected void configure() {
+ LOG.info("Configuring YangBindingProviderModule");
+ bind(YangModulesProvider.YangModules.class).toProvider(YangModulesProvider.class).asEagerSingleton();
+ }
+}
diff --git a/infra/minimal-distribution-core/src/main/java/io/fd/honeycomb/infra/distro/schema/YangModuleMappingIndex.java b/infra/minimal-distribution-core/src/main/java/io/fd/honeycomb/infra/distro/schema/YangModuleMappingIndex.java
new file mode 100644
index 000000000..a483cfd9c
--- /dev/null
+++ b/infra/minimal-distribution-core/src/main/java/io/fd/honeycomb/infra/distro/schema/YangModuleMappingIndex.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright (c) 2016 Cisco and/or its affiliates.
+ *
+ * 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 io.fd.honeycomb.infra.distro.schema;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.LinkedListMultimap;
+import com.google.common.collect.Multimap;
+import java.util.Arrays;
+import java.util.Set;
+import java.util.stream.Stream;
+import javax.annotation.Nonnull;
+
+/**
+ * Index from guice module to yang module providers
+ */
+class YangModuleMappingIndex implements ResourceLoader {
+
+ private static final String G_MODULE_TOKEN = "GUICE_MODULE:";
+ private static final String KEY_VALUE_SEPARATOR = "|";
+ private static final String Y_MODULE_TOKEN = "YANG_MODULES:";
+ private static final String Y_MODULE_SEPARATOR = ",";
+
+ /**
+ * key - module class name
+ * value - yang module provider
+ */
+ private final Multimap<String, String> index;
+
+ YangModuleMappingIndex(final String indexPath) {
+ this.index = LinkedListMultimap.create();
+ loadResourceContentsOnPath(indexPath)
+ .forEach(line -> {
+ final String moduleName = parseModuleName(line);
+ parseYangModules(line).forEach(yModuleProvider -> index.put(moduleName, yModuleProvider));
+ });
+ }
+
+ Set<String> getByModuleName(@Nonnull final String moduleName) {
+ return ImmutableSet.copyOf(index.get(moduleName));
+ }
+
+ int applicationModulesCount() {
+ return index.keySet().size();
+ }
+
+ private static String parseModuleName(final String rawLine) {
+ return rawLine.substring(rawLine.indexOf(G_MODULE_TOKEN) + G_MODULE_TOKEN.length(),
+ rawLine.indexOf(KEY_VALUE_SEPARATOR));
+ }
+
+ private static Stream<String> parseYangModules(final String rawLine) {
+ return Arrays.stream(rawLine.substring(rawLine.indexOf(Y_MODULE_TOKEN) + Y_MODULE_TOKEN.length())
+ .split(Y_MODULE_SEPARATOR));
+ }
+}
diff --git a/infra/minimal-distribution-core/src/main/java/io/fd/honeycomb/infra/distro/schema/YangModulesProvider.java b/infra/minimal-distribution-core/src/main/java/io/fd/honeycomb/infra/distro/schema/YangModulesProvider.java
new file mode 100644
index 000000000..f6d8ea0c1
--- /dev/null
+++ b/infra/minimal-distribution-core/src/main/java/io/fd/honeycomb/infra/distro/schema/YangModulesProvider.java
@@ -0,0 +1,97 @@
+/*
+ * Copyright (c) 2016 Cisco and/or its affiliates.
+ *
+ * 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 io.fd.honeycomb.infra.distro.schema;
+
+
+import static java.lang.String.format;
+
+import com.google.common.base.Charsets;
+import com.google.common.io.Resources;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import io.fd.honeycomb.infra.distro.activation.ActivationConfig;
+import io.fd.honeycomb.infra.distro.activation.ActiveModules;
+import java.io.IOException;
+import java.net.URL;
+import java.util.Collection;
+import java.util.Set;
+import java.util.stream.Collectors;
+import javax.annotation.Nonnull;
+import org.opendaylight.yangtools.yang.binding.YangModelBindingProvider;
+
+/**
+ * Loads active yang modules
+ * Relying on generate yang-module-index
+ */
+public class YangModulesProvider implements Provider<YangModulesProvider.YangModules> {
+
+ @Inject
+ private ActiveModules activeModules;
+
+ @Inject
+ private ActivationConfig config;
+
+ @Override
+ public YangModules get() {
+ // no need to bind this, pretty big map and its needed just here
+ final YangModuleMappingIndex index = new YangModuleMappingIndex(config.getYangModulesIndexPath());
+
+ return new YangModules(activeModules.getActiveModulesClasses().stream()
+ .map(Class::getName)
+ .map(index::getByModuleName)
+ .flatMap(Collection::stream)
+ .map(YangModulesProvider::loadClass)
+ .map(aClass -> (Class<? extends YangModelBindingProvider>) aClass)
+ .collect(Collectors.toSet()));
+ }
+
+ static class YangModules {
+ private final Set<Class<? extends YangModelBindingProvider>> yangBindings;
+
+ YangModules(final Set<Class<? extends YangModelBindingProvider>> yangBindings) {
+ this.yangBindings = yangBindings;
+ }
+
+ Set<YangModelBindingProvider> getYangBindings() {
+ return yangBindings.stream()
+ .map(providerClass -> {
+ try {
+ return providerClass.newInstance();
+ } catch (InstantiationException | IllegalAccessException e) {
+ throw new IllegalStateException(format("Unable to create instance of %s", providerClass),
+ e);
+ }
+ }).collect(Collectors.toSet());
+ }
+ }
+
+ private static Class<?> loadClass(@Nonnull final String className) {
+ try {
+ return Class.forName(className);
+ } catch (ClassNotFoundException e) {
+ throw new IllegalArgumentException("Unable to load class: " + className, e);
+ }
+ }
+
+ static String urlToString(@Nonnull final URL url) {
+ try {
+ return Resources.toString(url, Charsets.UTF_8);
+ } catch (IOException e) {
+ throw new IllegalArgumentException("Unable to read resource from: " + url, e);
+ }
+ }
+}