X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fconfig%2Fyang-jmx-generator-plugin%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fconfig%2Fyangjmxgenerator%2Fplugin%2FCodeWriter.java;h=cd0f491ebc949c610e925916fc41628eb1a03607;hp=13d828a430b3a530a6c09aab7ffc7954b176f79b;hb=0a16f37f1baa4a2616e9b7289a445649b4f3132d;hpb=9fb64948564e252018f9b1e13e7cea2c92f991aa diff --git a/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/CodeWriter.java b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/CodeWriter.java index 13d828a430..cd0f491ebc 100644 --- a/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/CodeWriter.java +++ b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/CodeWriter.java @@ -7,17 +7,155 @@ */ package org.opendaylight.controller.config.yangjmxgenerator.plugin; +import com.google.common.base.Optional; +import com.google.common.collect.Lists; +import org.opendaylight.controller.config.yangjmxgenerator.ModuleMXBeanEntry; +import org.opendaylight.controller.config.yangjmxgenerator.RuntimeBeanEntry; +import org.opendaylight.controller.config.yangjmxgenerator.ServiceInterfaceEntry; +import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.FtlTemplate; +import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.GeneralClassTemplate; +import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.GeneralInterfaceTemplate; +import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.RuntimeRegistratorFtlTemplate; +import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.StubFactoryTemplate; +import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.TemplateFactory; +import org.opendaylight.controller.config.yangjmxgenerator.plugin.gofactory.AbsFactoryGeneratedObjectFactory; +import org.opendaylight.controller.config.yangjmxgenerator.plugin.gofactory.AbsModuleGeneratedObjectFactory; +import org.opendaylight.controller.config.yangjmxgenerator.plugin.gofactory.ConcreteModuleGeneratedObjectFactory; +import org.opendaylight.controller.config.yangjmxgenerator.plugin.gofactory.GenericGeneratedObjectFactory; +import org.opendaylight.controller.config.yangjmxgenerator.plugin.java.FullyQualifiedName; +import org.opendaylight.controller.config.yangjmxgenerator.plugin.java.GeneratedObject; +import org.opendaylight.controller.config.yangjmxgenerator.plugin.util.StringUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.Iterator; import java.util.List; +import java.util.Map; +import java.util.Map.Entry; -import org.opendaylight.controller.config.yangjmxgenerator.ModuleMXBeanEntry; -import org.opendaylight.controller.config.yangjmxgenerator.ServiceInterfaceEntry; +final class CodeWriter { + + private static final Logger LOGGER = LoggerFactory.getLogger(CodeWriter.class); + private static final Optional COPYRIGHT = StringUtil.loadCopyright(); + + public File writeSie(ServiceInterfaceEntry sie, File outputBaseDir) { + try { + GeneralInterfaceTemplate generalInterfaceTemplate = TemplateFactory.serviceInterfaceFromSie(sie); + GeneratedObject go = new GenericGeneratedObjectFactory().toGeneratedObject(generalInterfaceTemplate, COPYRIGHT); + return go.persist(outputBaseDir).get().getValue(); + } catch (Exception e) { + String message = "An error occurred during Service interface generating, sie:" + + sie.getTypeName() + ", " + sie.getFullyQualifiedName(); + LOGGER.error(message, e); + throw new RuntimeException(message, e); + } + } + + public List writeMbe(ModuleMXBeanEntry mbe, File targetBaseDir, + File mainBaseDir) { + try { + List generatedFiles = Lists.newArrayList(); + + + Map gos = new HashMap<>(); + + // generate mx interface and abstract factory + + // TOs + Map tosFromMbe = TemplateFactory.tOsFromMbe(mbe); + for(GeneralClassTemplate template: tosFromMbe.values()) { + gos.put(new GenericGeneratedObjectFactory().toGeneratedObject(template, COPYRIGHT), true); + } + + // MXBean interface + GeneralInterfaceTemplate ifcTemplate = TemplateFactory.mXBeanInterfaceTemplateFromMbe(mbe); + gos.put(new GenericGeneratedObjectFactory().toGeneratedObject(ifcTemplate, COPYRIGHT), true); + + + // generate abstract factory + gos.put(new AbsFactoryGeneratedObjectFactory().toGeneratedObject(mbe, COPYRIGHT), true); + + // generate abstract module + gos.put(new AbsModuleGeneratedObjectFactory().toGeneratedObject(mbe, COPYRIGHT), true); + + // generate concrete factory + StubFactoryTemplate concreteFactory = TemplateFactory.stubFactoryTemplateFromMbe(mbe); + gos.put(new GenericGeneratedObjectFactory().toGeneratedObject(concreteFactory, COPYRIGHT), false); + + + // generate concrete module + + gos.put(new ConcreteModuleGeneratedObjectFactory().toGeneratedObject(mbe, COPYRIGHT, Optional.absent()), false); + + // write runtime bean MXBeans and registrators + List allFtlFiles = getRuntimeBeanFtlTemplates(mbe.getRuntimeBeans()); + for(FtlTemplate template: allFtlFiles) { + gos.put(new GenericGeneratedObjectFactory().toGeneratedObject(template, COPYRIGHT), true); + } + + generatedFiles.addAll(persistGeneratedObjects(targetBaseDir, mainBaseDir, gos)); + + // purge nulls + for (Iterator it = generatedFiles.iterator(); it.hasNext(); ) { + if (it.next() == null) { + it.remove(); + } + } + + return generatedFiles; + + } catch (Exception e) { + String message = "An error occurred during Module generating, mbe:" + + mbe.getJavaNamePrefix(); + LOGGER.error(message, e); + throw new RuntimeException(message, e); + } + } -public interface CodeWriter { + private List persistGeneratedObjects(File targetBaseDir, File mainBaseDir, Map gos) throws IOException { + List generatedFiles = new ArrayList<>(); + for (Entry entry : gos.entrySet()) { + boolean overwrite = entry.getValue(); + File dst; + if (overwrite) { + dst = targetBaseDir; + } else { + dst = mainBaseDir; + } + Optional> maybePersistEntry = entry.getKey().persist(dst, overwrite); - File writeSie(ServiceInterfaceEntry sie, File targetBaseDir); + if (maybePersistEntry.isPresent()) { + generatedFiles.add(maybePersistEntry.get().getValue()); + } + } + return generatedFiles; + } - List writeMbe(ModuleMXBeanEntry mbe, File targetBaseDir, - File mainBaseDir, File resourceBaseDir); + private List getRuntimeBeanFtlTemplates(Collection runtimeBeans) { + if (runtimeBeans.isEmpty()) { + return Collections.emptyList(); + } + List allFtlFiles = new ArrayList<>(); + { // registrators + Map registratorNamesToFtls = RuntimeRegistratorFtlTemplate + .create(RuntimeRegistratorFtlTemplate.findRoot(runtimeBeans)); + allFtlFiles.addAll(registratorNamesToFtls.values()); + } + { // TOs, MXBean interfaces + for (RuntimeBeanEntry runtimeBeanEntry : runtimeBeans) { + Collection ftlFiles = TemplateFactory + .getTOAndMXInterfaceFtlFiles(runtimeBeanEntry) + .values(); + allFtlFiles.addAll(ftlFiles); + } + } + return allFtlFiles; + } }