From cd0a18d48f5e8b6ff208b6633e05ee003979218e Mon Sep 17 00:00:00 2001 From: Tomas Olvecky Date: Fri, 21 Feb 2014 10:53:44 +0100 Subject: [PATCH] Resolve Bug:445 Remove freemarker from config code generator. Change-Id: Idf834620cb7e12e10e7fca1ce8ea0172ca730a3d Signed-off-by: Tomas Olvecky --- .../manager/impl/ConfigRegistryImpl.java | 1 + .../impl/ConfigTransactionControllerImpl.java | 4 +- .../config/yang-jmx-generator-plugin/pom.xml | 52 ++- .../yangjmxgenerator/plugin/CodeWriter.java | 150 ++++++- .../plugin/FreeMarkerCodeWriterImpl.java | 108 ----- .../yangjmxgenerator/plugin/JMXGenerator.java | 25 +- .../plugin/ftl/AbstractFactoryTemplate.java | 72 +--- .../plugin/ftl/AbstractFtlTemplate.java | 36 +- .../plugin/ftl/AbstractModuleTemplate.java | 58 +-- .../plugin/ftl/FtlFilePersister.java | 116 ----- .../plugin/ftl/FtlTemplate.java | 21 +- .../plugin/ftl/StubFactoryTemplate.java | 18 +- .../plugin/ftl/StubModuleTemplate.java | 73 ---- .../plugin/ftl/TemplateFactory.java | 111 ++--- .../ftl/directives/AnnotationsDirective.java | 85 ---- .../ftl/directives/ConstructorsDirective.java | 76 ---- .../ftl/directives/FieldsDirectiveProg.java | 74 ---- .../directives/FieldsDirectiveTemplate.java | 57 --- .../ftl/directives/HeaderDirective.java | 81 ---- .../ftl/directives/JavadocDirective.java | 65 --- .../ftl/directives/MethodsDirective.java | 115 ----- .../ftl/directives/ModuleFieldsDirective.java | 88 ---- .../directives/TypeDeclarationDirective.java | 80 ---- .../UnimplementedExceptionDirective.java | 39 -- .../plugin/ftl/model/Annotation.java | 39 +- .../ftl/model/AnnotationSerializer.java | 38 ++ .../plugin/ftl/model/Constructor.java | 4 + .../ftl/model/ConstructorSerializer.java | 32 ++ .../plugin/ftl/model/Field.java | 21 +- .../plugin/ftl/model/FieldSerializer.java | 28 ++ .../plugin/ftl/model/Header.java | 3 +- .../plugin/ftl/model/HeaderSerializer.java | 44 ++ .../plugin/ftl/model/MethodDeclaration.java | 5 + .../plugin/ftl/model/MethodDefinition.java | 5 + .../plugin/ftl/model/MethodSerializer.java | 71 ++++ .../plugin/ftl/model/ModuleField.java | 10 + .../ftl/model/ModuleFieldSerializer.java | 48 +++ .../plugin/ftl/model/TypeDeclaration.java | 20 + .../AbsFactoryGeneratedObjectFactory.groovy | 168 ++++++++ .../AbsModuleGeneratedObjectFactory.groovy | 400 ++++++++++++++++++ .../ConcreteModuleGeneratedObjectFactory.java | 101 +++++ .../GenericGeneratedObjectFactory.groovy | 40 ++ .../plugin/java/FullyQualifiedName.java | 81 ++++ .../plugin/java/GeneratedObject.java | 75 ++++ .../plugin/java/GeneratedObjectBuilder.java | 68 +++ .../plugin/java/JavaFileInput.java | 27 ++ .../plugin/java/JavaFileInputBuilder.java | 164 +++++++ .../plugin/java/TypeName.java | 17 + .../plugin/util/StringUtil.java | 101 +++++ .../src/main/resources/copyright.txt | 5 + .../freeMarker/abstract_ftl_file.ftl | 15 - .../freeMarker/factory_abs_template.ftl | 82 ---- .../freeMarker/module_abs_template_new.ftl | 223 ---------- .../freeMarker/module_stub_template.ftl | 27 -- .../plugin/AbstractGeneratorTest.java | 4 +- .../plugin/JMXGeneratorTest.java | 2 +- .../ModuleMXBeanEntryTemplatesTest.java | 4 +- .../plugin/RuntimeRegistratorFtlFileTest.java | 50 +-- .../plugin/ftl/FtlFilePersisterTest.java | 72 ---- .../module/AbstractGeneratedObjectTest.java | 44 ++ .../AbsModuleGeneratedObjectFactoryTest.java | 45 ++ ...creteModuleGeneratedObjectFactoryTest.java | 52 +++ .../plugin/util/FormattingUtil.java | 32 -- .../plugin/util/StringUtilTest.java | 60 +++ .../yangjmxgenerator/AbstractYangTest.java | 52 ++- .../ModuleMXBeanEntryTest.java | 29 +- opendaylight/config/yang-test-plugin/pom.xml | 4 + .../yang/test/plugin/ProcessSources.java | 62 +-- .../config/yang/test/plugin/Util.java | 30 -- .../src/main/resources/Header.txt | 7 - opendaylight/config/yang-test/pom.xml | 2 + .../yang/test/impl/DepTestImplModule.java | 28 +- .../test/impl/DepTestImplModuleFactory.java | 28 +- .../yang/test/impl/IdentityTestModule.java | 28 +- .../test/impl/IdentityTestModuleFactory.java | 28 +- .../yang/test/impl/NetconfTestImplModule.java | 28 +- .../impl/NetconfTestImplModuleFactory.java | 28 +- .../config/yang/test/impl/TestImplModule.java | 28 +- .../yang/test/impl/TestImplModuleFactory.java | 28 +- 79 files changed, 2254 insertions(+), 2088 deletions(-) delete mode 100644 opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/FreeMarkerCodeWriterImpl.java delete mode 100644 opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/FtlFilePersister.java delete mode 100644 opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/StubModuleTemplate.java delete mode 100644 opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/directives/AnnotationsDirective.java delete mode 100644 opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/directives/ConstructorsDirective.java delete mode 100644 opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/directives/FieldsDirectiveProg.java delete mode 100644 opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/directives/FieldsDirectiveTemplate.java delete mode 100644 opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/directives/HeaderDirective.java delete mode 100644 opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/directives/JavadocDirective.java delete mode 100644 opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/directives/MethodsDirective.java delete mode 100644 opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/directives/ModuleFieldsDirective.java delete mode 100644 opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/directives/TypeDeclarationDirective.java delete mode 100644 opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/directives/UnimplementedExceptionDirective.java create mode 100644 opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/model/AnnotationSerializer.java create mode 100644 opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/model/ConstructorSerializer.java create mode 100644 opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/model/FieldSerializer.java create mode 100644 opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/model/HeaderSerializer.java create mode 100644 opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/model/MethodSerializer.java create mode 100644 opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/model/ModuleFieldSerializer.java create mode 100644 opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/gofactory/AbsFactoryGeneratedObjectFactory.groovy create mode 100644 opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/gofactory/AbsModuleGeneratedObjectFactory.groovy create mode 100644 opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/gofactory/ConcreteModuleGeneratedObjectFactory.java create mode 100644 opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/gofactory/GenericGeneratedObjectFactory.groovy create mode 100644 opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/java/FullyQualifiedName.java create mode 100644 opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/java/GeneratedObject.java create mode 100644 opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/java/GeneratedObjectBuilder.java create mode 100644 opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/java/JavaFileInput.java create mode 100644 opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/java/JavaFileInputBuilder.java create mode 100644 opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/java/TypeName.java create mode 100644 opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/util/StringUtil.java create mode 100644 opendaylight/config/yang-jmx-generator-plugin/src/main/resources/copyright.txt delete mode 100644 opendaylight/config/yang-jmx-generator-plugin/src/main/resources/freeMarker/abstract_ftl_file.ftl delete mode 100644 opendaylight/config/yang-jmx-generator-plugin/src/main/resources/freeMarker/factory_abs_template.ftl delete mode 100644 opendaylight/config/yang-jmx-generator-plugin/src/main/resources/freeMarker/module_abs_template_new.ftl delete mode 100644 opendaylight/config/yang-jmx-generator-plugin/src/main/resources/freeMarker/module_stub_template.ftl delete mode 100644 opendaylight/config/yang-jmx-generator-plugin/src/test/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/FtlFilePersisterTest.java create mode 100644 opendaylight/config/yang-jmx-generator-plugin/src/test/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/module/AbstractGeneratedObjectTest.java create mode 100644 opendaylight/config/yang-jmx-generator-plugin/src/test/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/module/abs/AbsModuleGeneratedObjectFactoryTest.java create mode 100644 opendaylight/config/yang-jmx-generator-plugin/src/test/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/module/concrete/ConcreteModuleGeneratedObjectFactoryTest.java delete mode 100644 opendaylight/config/yang-jmx-generator-plugin/src/test/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/util/FormattingUtil.java create mode 100644 opendaylight/config/yang-jmx-generator-plugin/src/test/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/util/StringUtilTest.java delete mode 100644 opendaylight/config/yang-test-plugin/src/main/resources/Header.txt diff --git a/opendaylight/config/config-manager/src/main/java/org/opendaylight/controller/config/manager/impl/ConfigRegistryImpl.java b/opendaylight/config/config-manager/src/main/java/org/opendaylight/controller/config/manager/impl/ConfigRegistryImpl.java index fb0718a721..e914162671 100644 --- a/opendaylight/config/config-manager/src/main/java/org/opendaylight/controller/config/manager/impl/ConfigRegistryImpl.java +++ b/opendaylight/config/config-manager/src/main/java/org/opendaylight/controller/config/manager/impl/ConfigRegistryImpl.java @@ -283,6 +283,7 @@ public class ConfigRegistryImpl implements AutoCloseable, ConfigRegistryImplMXBe int orderingIdx = 0; for (ModuleIdentifier moduleIdentifier : orderedModuleIdentifiers) { + logger.trace("Registering {}", moduleIdentifier); ModuleInternalTransactionalInfo entry = commitInfo.getCommitted() .get(moduleIdentifier); if (entry == null) { diff --git a/opendaylight/config/config-manager/src/main/java/org/opendaylight/controller/config/manager/impl/ConfigTransactionControllerImpl.java b/opendaylight/config/config-manager/src/main/java/org/opendaylight/controller/config/manager/impl/ConfigTransactionControllerImpl.java index 6b7251c302..bc4de5cc15 100644 --- a/opendaylight/config/config-manager/src/main/java/org/opendaylight/controller/config/manager/impl/ConfigTransactionControllerImpl.java +++ b/opendaylight/config/config-manager/src/main/java/org/opendaylight/controller/config/manager/impl/ConfigTransactionControllerImpl.java @@ -44,6 +44,7 @@ import java.util.Map.Entry; import java.util.Set; import java.util.concurrent.atomic.AtomicBoolean; +import static com.google.common.base.Preconditions.checkNotNull; import static java.lang.String.format; /** @@ -380,7 +381,8 @@ class ConfigTransactionControllerImpl implements try { logger.debug("About to commit {} in transaction {}", name, getTransactionIdentifier()); - module.getInstance(); + AutoCloseable instance = module.getInstance(); + checkNotNull(instance, "Instance is null:{} in transaction {}", name, getTransactionIdentifier()); } catch (Exception e) { logger.error("Commit failed on {} in transaction {}", name, getTransactionIdentifier(), e); diff --git a/opendaylight/config/yang-jmx-generator-plugin/pom.xml b/opendaylight/config/yang-jmx-generator-plugin/pom.xml index a8119b81ae..c934530067 100644 --- a/opendaylight/config/yang-jmx-generator-plugin/pom.xml +++ b/opendaylight/config/yang-jmx-generator-plugin/pom.xml @@ -1,4 +1,5 @@ - + 4.0.0 config-subsystem @@ -30,6 +31,14 @@ binding-type-provider + + net.sourceforge.pmd + pmd + 5.1.0 + test + + + org.eclipse.jdt core @@ -53,12 +62,6 @@ - - org.freemarker - freemarker - 2.3.20 - - ${project.groupId} config-api @@ -110,14 +113,45 @@ org.apache.commons commons-lang3 + + + org.codehaus.gmaven.runtime + gmaven-runtime-2.0 + 1.5 + + + org.sonatype.gossip + gossip + + + + - org.apache.maven.plugins - maven-jar-plugin + maven-compiler-plugin + 3.1 + + groovy-eclipse-compiler + false + + + + org.codehaus.groovy + groovy-eclipse-compiler + 2.8.0-01 + + + + org.codehaus.groovy + groovy-eclipse-batch + 2.1.8-01 + + + 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..dd2b504da9 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; + } } diff --git a/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/FreeMarkerCodeWriterImpl.java b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/FreeMarkerCodeWriterImpl.java deleted file mode 100644 index 2b84ed1d45..0000000000 --- a/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/FreeMarkerCodeWriterImpl.java +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.controller.config.yangjmxgenerator.plugin; - -import java.io.File; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Iterator; -import java.util.List; -import java.util.Map; - -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.FtlFilePersister; -import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.FtlTemplate; -import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.RuntimeRegistratorFtlTemplate; -import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.TemplateFactory; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.google.common.collect.Lists; - -final class FreeMarkerCodeWriterImpl implements CodeWriter { - - private static final Logger logger = LoggerFactory - .getLogger(FreeMarkerCodeWriterImpl.class); - - private final FtlFilePersister ftlFilePersister = new FtlFilePersister(); - - public FreeMarkerCodeWriterImpl() { - } - - @Override - public File writeSie(ServiceInterfaceEntry sie, File outputBaseDir) { - try { - Collection values = TemplateFactory.getFtlTemplates( - sie).values(); - return ftlFilePersister.persist(values, outputBaseDir, true).get(0); - } 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); - } - } - - @Override - public List writeMbe(ModuleMXBeanEntry mbe, File targetBaseDir, - File mainBaseDir, File resourceBaseDir) { - try { - List generatedFiles = Lists.newArrayList(); - - generatedFiles.addAll(ftlFilePersister.persist(TemplateFactory - .getFtlTemplates(mbe).values(), targetBaseDir, true)); - generatedFiles.addAll(ftlFilePersister.persist(TemplateFactory - .getFtlStubTemplates(mbe).values(), mainBaseDir, false)); - - // write runtime bean MXBeans and registrators - Collection runtimeBeans = mbe.getRuntimeBeans(); - if (runtimeBeans.size() > 0) { - 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); - } - } - boolean overwrite = true; - - FtlFilePersister ftlFilePersister = new FtlFilePersister(); - List persisted = ftlFilePersister.persist(allFtlFiles, - targetBaseDir, overwrite); - // FIXME: check for intersection - generatedFiles.addAll(persisted); - } - - // 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); - } - } - -} diff --git a/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/JMXGenerator.java b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/JMXGenerator.java index e41ac66952..1b8905b987 100644 --- a/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/JMXGenerator.java +++ b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/JMXGenerator.java @@ -12,16 +12,6 @@ import com.google.common.base.Preconditions; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Sets; -import java.io.File; -import java.io.IOException; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; -import java.util.regex.Matcher; -import java.util.regex.Pattern; import org.apache.commons.io.FileUtils; import org.apache.maven.plugin.logging.Log; import org.apache.maven.project.MavenProject; @@ -40,6 +30,17 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.slf4j.impl.StaticLoggerBinder; +import java.io.File; +import java.io.IOException; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + /** * This class interfaces with yang-maven-plugin. Gets parsed yang modules in * {@link SchemaContext}, and parameters form the plugin configuration, and @@ -61,7 +62,7 @@ public class JMXGenerator implements CodeGenerator { private boolean generateModuleFactoryFile = true; public JMXGenerator() { - this.codeWriter = new FreeMarkerCodeWriterImpl(); + this.codeWriter = new CodeWriter(); } public JMXGenerator(CodeWriter codeWriter) { @@ -139,7 +140,7 @@ public class JMXGenerator implements CodeGenerator { ModuleMXBeanEntry mbe = mbeEntry.getValue(); try { List files1 = codeWriter.writeMbe(mbe, outputBaseDir, - mainBaseDir, resourceBaseDir); + mainBaseDir); generatedFiles.addFile(files1); } catch (Exception e) { throw new RuntimeException( diff --git a/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/AbstractFactoryTemplate.java b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/AbstractFactoryTemplate.java index 35dc7a3600..c3e51d6550 100644 --- a/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/AbstractFactoryTemplate.java +++ b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/AbstractFactoryTemplate.java @@ -8,94 +8,26 @@ package org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl; import com.google.common.collect.Lists; -import org.opendaylight.controller.config.api.DependencyResolver; -import org.opendaylight.controller.config.api.DynamicMBeanWithInstance; -import org.opendaylight.controller.config.api.ModuleIdentifier; -import org.opendaylight.controller.config.api.annotations.AbstractServiceInterface; -import org.opendaylight.controller.config.spi.Module; import org.opendaylight.controller.config.spi.ModuleFactory; -import org.opendaylight.controller.config.yangjmxgenerator.ModuleMXBeanEntry; import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.model.Constructor; import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.model.Field; import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.model.Header; import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.model.MethodDefinition; -import org.osgi.framework.BundleContext; import java.util.Collections; import java.util.List; -/** - * - */ public class AbstractFactoryTemplate extends GeneralClassTemplate { private static final List implementedIfcs = Lists .newArrayList(ModuleFactory.class.getCanonicalName()); - private final String globallyUniqueName, moduleInstanceType; - private final List providedServices; - private final ModuleMXBeanEntry mbe; - public AbstractFactoryTemplate(Header header, String packageName, - String abstractFactoryName, String globallyUniqueName, - String moduleInstanceType, List fields, - List providedServices, ModuleMXBeanEntry mbe) { + String abstractFactoryName, + List fields) { super(header, packageName, abstractFactoryName, Collections . emptyList(), implementedIfcs, fields, Collections . emptyList(), true, false, Collections . emptyList()); - this.globallyUniqueName = globallyUniqueName; - this.moduleInstanceType = moduleInstanceType; - this.providedServices = providedServices; - this.mbe = mbe; - } - - public String getGloballyUniqueName() { - return globallyUniqueName; - } - - public String getInstanceType() { - return AutoCloseable.class.getCanonicalName(); - } - - public String getModuleNameType() { - return ModuleIdentifier.class.getCanonicalName(); - } - - public String getModuleInstanceType() { - return moduleInstanceType; - } - - public String getAbstractServiceInterfaceType() { - return AbstractServiceInterface.class.getCanonicalName(); - } - - public List getProvidedServices() { - return providedServices; - } - - public String getModuleType() { - return Module.class.getCanonicalName(); - } - - public String getDependencyResolverType() { - return DependencyResolver.class.getCanonicalName(); - } - - public String getDynamicMBeanWithInstanceType() { - return DynamicMBeanWithInstance.class.getCanonicalName(); - } - - public String getBundleContextType() { - return BundleContext.class.getCanonicalName(); - } - - @Override - public String getFtlTempleteLocation() { - return "factory_abs_template.ftl"; - } - - public ModuleMXBeanEntry getMbe() { - return mbe; } } diff --git a/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/AbstractFtlTemplate.java b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/AbstractFtlTemplate.java index 7f80299f00..a9599783e6 100644 --- a/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/AbstractFtlTemplate.java +++ b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/AbstractFtlTemplate.java @@ -7,17 +7,18 @@ */ package org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl; -import java.io.File; -import java.util.List; - +import com.google.common.base.Optional; +import com.google.common.collect.Lists; import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.model.Annotation; +import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.model.Constructor; import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.model.Field; import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.model.Header; import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.model.Method; import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.model.TypeDeclaration; import org.opendaylight.controller.config.yangjmxgenerator.plugin.util.FullyQualifiedNameHelper; -import com.google.common.collect.Lists; +import java.util.Collections; +import java.util.List; public abstract class AbstractFtlTemplate implements FtlTemplate { private final String packageName; @@ -44,6 +45,15 @@ public abstract class AbstractFtlTemplate implements FtlTemplate { return header; } + @Override + public Optional getHeaderString() { + if (header == null) { + return Optional.absent(); + } else { + return Optional.of(header.toString()); + } + } + @Override public String getFullyQualifiedName() { return FullyQualifiedNameHelper.getFullyQualifiedName(getPackageName(), @@ -60,9 +70,14 @@ public abstract class AbstractFtlTemplate implements FtlTemplate { return typeDeclaration; } + @Override - public String getJavadoc() { - return javadoc; + public Optional getMaybeJavadoc() { + if (javadoc == null) { + return Optional.absent(); + } else { + return Optional.of(javadoc); + } } public void setJavadoc(String javadoc) { @@ -84,15 +99,10 @@ public abstract class AbstractFtlTemplate implements FtlTemplate { return methods; } - @Override - public File getRelativeFile() { - return new File(packageName.replace(".", File.separator), - getTypeDeclaration().getName() + ".java"); - } @Override - public String getFtlTempleteLocation() { - return "abstract_ftl_file.ftl"; + public List getConstructors() { + return Collections.emptyList(); } @Override diff --git a/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/AbstractModuleTemplate.java b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/AbstractModuleTemplate.java index c40bfdfb9f..92a71c2530 100644 --- a/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/AbstractModuleTemplate.java +++ b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/AbstractModuleTemplate.java @@ -7,26 +7,15 @@ */ package org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl; -import java.util.Collections; -import java.util.List; - -import org.opendaylight.controller.config.api.DependencyResolver; -import org.opendaylight.controller.config.api.DynamicMBeanWithInstance; -import org.opendaylight.controller.config.api.ModuleIdentifier; -import org.opendaylight.controller.config.api.annotations.AbstractServiceInterface; -import org.opendaylight.controller.config.api.runtime.RootRuntimeBeanRegistrator; -import org.opendaylight.controller.config.spi.Module; import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.model.Constructor; import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.model.Field; import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.model.Header; import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.model.MethodDefinition; import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.model.ModuleField; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -/** - * - */ +import java.util.Collections; +import java.util.List; + public class AbstractModuleTemplate extends GeneralClassTemplate { private final List moduleFields; @@ -50,22 +39,6 @@ public class AbstractModuleTemplate extends GeneralClassTemplate { return moduleFields; } - public String getInstanceType() { - return AutoCloseable.class.getCanonicalName(); - } - - public String getModuleNameType() { - return ModuleIdentifier.class.getCanonicalName(); - } - - public String getAbstractServiceInterfaceType() { - return AbstractServiceInterface.class.getCanonicalName(); - } - - public String getModuleType() { - return Module.class.getCanonicalName(); - } - public String getRegistratorType() { return registratorType; } @@ -74,29 +47,4 @@ public class AbstractModuleTemplate extends GeneralClassTemplate { return runtime; } - public String getDependencyResolverType() { - return DependencyResolver.class.getCanonicalName(); - } - - public String getDynamicMBeanWithInstanceType() { - return DynamicMBeanWithInstance.class.getCanonicalName(); - } - - public String getRootRuntimeRegistratorType() { - return RootRuntimeBeanRegistrator.class.getCanonicalName(); - } - - @Override - public String getFtlTempleteLocation() { - return "module_abs_template_new.ftl"; - } - - public String getLoggerType() { - return Logger.class.getCanonicalName(); - } - - public String getLoggerFactoryType() { - return LoggerFactory.class.getCanonicalName(); - } - } diff --git a/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/FtlFilePersister.java b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/FtlFilePersister.java deleted file mode 100644 index 37d5e6bd3f..0000000000 --- a/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/FtlFilePersister.java +++ /dev/null @@ -1,116 +0,0 @@ -/* - * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl; - -import com.google.common.annotations.VisibleForTesting; -import freemarker.template.Configuration; -import freemarker.template.Template; -import org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator; -import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.directives.AnnotationsDirective; -import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.directives.ConstructorsDirective; -import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.directives.FieldsDirectiveProg; -import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.directives.HeaderDirective; -import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.directives.JavadocDirective; -import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.directives.MethodsDirective; -import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.directives.ModuleFieldsDirective; -import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.directives.TypeDeclarationDirective; -import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.directives.UnimplementedExceptionDirective; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.File; -import java.io.FileWriter; -import java.io.IOException; -import java.io.StringWriter; -import java.io.Writer; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.regex.Pattern; - -public class FtlFilePersister { - private static final Logger logger = LoggerFactory - .getLogger(FtlFilePersister.class); - - private static final Pattern TRAILING_WHITESPACES = Pattern.compile(" +$", Pattern.MULTILINE); - - @VisibleForTesting - public Map serializeFtls( - Collection ftlFiles) { - Map result = new HashMap<>(); - for (FtlTemplate ftlFile : ftlFiles) { - - try (Writer writer = new StringWriter()) { - Template template = getCfg().getTemplate( - ftlFile.getFtlTempleteLocation()); - try { - template.process(ftlFile, writer); - } catch (Exception e) { - throw new IllegalStateException( - "Template error while generating " + ftlFile, e); - } - String fileContent = writer.toString(); - // remove trailing spaces - fileContent = TRAILING_WHITESPACES.matcher(fileContent).replaceAll(""); - result.put(ftlFile, fileContent); - } catch (IOException e) { - throw new IllegalStateException( - "Exception while processing template", e); - } - } - - return result; - } - - public List persist(Collection ftlFiles, - File dstFolder, boolean overwrite) throws IOException { - Map ftlFileStringMap = serializeFtls(ftlFiles); - List result = new ArrayList<>(); - for (Entry entry : ftlFileStringMap.entrySet()) { - FtlTemplate ftlFile = entry.getKey(); - File targetFile = new File(dstFolder, ftlFile.getRelativeFile() - .getPath()); - File pathToFile = targetFile.getParentFile(); - if (pathToFile.exists() == false) { - pathToFile.mkdirs(); - } - if (targetFile.exists() && overwrite == false) { - logger.trace("Skipping {} since it already exists", targetFile); - } else { - try (Writer fileWriter = new FileWriter(targetFile)) { - fileWriter.write(entry.getValue()); - } - logger.trace("{}: File {} generated successfully", - JMXGenerator.class.getCanonicalName(), targetFile); - result.add(targetFile); - } - } - return result; - } - - private Configuration getCfg() { - Configuration cfg = new Configuration(); - cfg.setClassForTemplateLoading(getClass(), "/freeMarker/"); - cfg.setSharedVariable("javadocD", new JavadocDirective()); - cfg.setSharedVariable("annotationsD", new AnnotationsDirective()); - cfg.setSharedVariable("typeDeclarationD", - new TypeDeclarationDirective()); - cfg.setSharedVariable("constructorsD", new ConstructorsDirective()); - cfg.setSharedVariable("fieldsD", new FieldsDirectiveProg()); - cfg.setSharedVariable("moduleFieldsD", new ModuleFieldsDirective()); - cfg.setSharedVariable("methodsD", new MethodsDirective()); - cfg.setSharedVariable("headerD", new HeaderDirective()); - cfg.setSharedVariable("unimplementedExceptionD", - new UnimplementedExceptionDirective()); - return cfg; - } - -} diff --git a/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/FtlTemplate.java b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/FtlTemplate.java index 8172a58af6..d01f3f9223 100644 --- a/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/FtlTemplate.java +++ b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/FtlTemplate.java @@ -7,22 +7,24 @@ */ package org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl; -import java.io.File; -import java.util.List; - +import com.google.common.base.Optional; import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.model.Annotation; +import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.model.Constructor; import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.model.Field; import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.model.Header; import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.model.Method; import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.model.TypeDeclaration; +import java.util.List; + public interface FtlTemplate { Header getHeader(); + Optional getHeaderString(); String getPackageName(); - String getJavadoc(); + Optional getMaybeJavadoc(); public List getAnnotations(); @@ -34,14 +36,5 @@ public interface FtlTemplate { List getMethods(); - /** - * @return relative path to file to be created. - */ - public File getRelativeFile(); - - /** - * - * @return ftl template location - */ - public String getFtlTempleteLocation(); + List getConstructors(); } diff --git a/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/StubFactoryTemplate.java b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/StubFactoryTemplate.java index be49f93bca..5d2d6644b0 100644 --- a/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/StubFactoryTemplate.java +++ b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/StubFactoryTemplate.java @@ -7,33 +7,21 @@ */ package org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl; -import java.util.Collections; - -import org.opendaylight.controller.config.api.DynamicMBeanWithInstance; +import com.google.common.collect.Lists; import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.model.Field; import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.model.Header; import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.model.MethodDefinition; -import com.google.common.collect.Lists; +import java.util.Collections; public class StubFactoryTemplate extends GeneralClassTemplate { - private final String moduleInstanceType; - public StubFactoryTemplate(Header header, String packageName, String name, - String extendedClass, String moduleInstanceType) { + String extendedClass) { super(header, packageName, name, Lists.newArrayList(extendedClass), Collections. emptyList(), Collections . emptyList(), Collections . emptyList()); - this.moduleInstanceType = moduleInstanceType; - } - - public String getModuleInstanceType() { - return moduleInstanceType; } - public String getDynamicMBeanWithInstanceType() { - return DynamicMBeanWithInstance.class.getCanonicalName(); - } } diff --git a/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/StubModuleTemplate.java b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/StubModuleTemplate.java deleted file mode 100644 index f49bbbacab..0000000000 --- a/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/StubModuleTemplate.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl; - -import java.util.Collections; - -import org.opendaylight.controller.config.api.DependencyResolver; -import org.opendaylight.controller.config.api.DynamicMBeanWithInstance; -import org.opendaylight.controller.config.api.ModuleIdentifier; -import org.opendaylight.controller.config.api.annotations.AbstractServiceInterface; -import org.opendaylight.controller.config.spi.Module; -import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.model.Constructor; -import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.model.Field; -import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.model.Header; -import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.model.MethodDefinition; - -import com.google.common.collect.Lists; - -/** - * - */ -public class StubModuleTemplate extends GeneralClassTemplate { - - private final String extendedClass; - - public StubModuleTemplate(Header header, String packageName, - String stubModuleName, String extendedClass) { - super(header, packageName, stubModuleName, Lists - .newArrayList(extendedClass), Collections. emptyList(), - Collections. emptyList(), Collections - . emptyList(), false, true, - Collections. emptyList()); - this.extendedClass = extendedClass; - } - - public String getExtendedClass() { - return extendedClass; - } - - public String getInstanceType() { - return AutoCloseable.class.getCanonicalName(); - } - - public String getModuleNameType() { - return ModuleIdentifier.class.getCanonicalName(); - } - - public String getAbstractServiceInterfaceType() { - return AbstractServiceInterface.class.getCanonicalName(); - } - - public String getModuleType() { - return Module.class.getCanonicalName(); - } - - public String getDependencyResolverType() { - return DependencyResolver.class.getCanonicalName(); - } - - public String getDynamicMBeanWithInstanceType() { - return DynamicMBeanWithInstance.class.getCanonicalName(); - } - - @Override - public String getFtlTempleteLocation() { - return "module_stub_template.ftl"; - } -} diff --git a/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/TemplateFactory.java b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/TemplateFactory.java index fea9a79616..7b7aab8559 100644 --- a/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/TemplateFactory.java +++ b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/TemplateFactory.java @@ -7,9 +7,7 @@ */ package org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl; -import com.google.common.base.Function; import com.google.common.base.Preconditions; -import com.google.common.collect.Collections2; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import org.opendaylight.controller.config.api.DependencyResolver; @@ -45,12 +43,10 @@ import org.opendaylight.controller.config.yangjmxgenerator.plugin.util.FullyQual import org.opendaylight.yangtools.binding.generator.util.BindingGeneratorUtil; import org.opendaylight.yangtools.sal.binding.model.api.ParameterizedType; import org.opendaylight.yangtools.sal.binding.model.api.Type; -import org.opendaylight.yangtools.yang.model.api.type.IdentityrefTypeDefinition; import javax.management.openmbean.SimpleType; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.List; @@ -59,49 +55,6 @@ import java.util.Map.Entry; public class TemplateFactory { - public static Map getFtlTemplates( - ModuleMXBeanEntry entry) { - Map result = new HashMap<>(); - - result.putAll(TemplateFactory.tOsFromMbe(entry)); - - // IFC - result.put(entry.getMXBeanInterfaceName() + ".java", - TemplateFactory.mXBeanInterfaceTemplateFromMbe(entry)); - - // ABS fact - result.put(entry.getAbstractFactoryName() + ".java", - TemplateFactory.abstractFactoryTemplateFromMbe(entry)); - - // ABS module - result.put(entry.getAbstractModuleName() + ".java", - TemplateFactory.abstractModuleTemplateFromMbe(entry)); - - return result; - } - - public static Map getFtlStubTemplates( - ModuleMXBeanEntry entry) { - Map result = new HashMap<>(); - // STUB fact - result.put(entry.getStubFactoryName() + ".java", - TemplateFactory.stubFactoryTemplateFromMbe(entry)); - - result.put(entry.getStubModuleName() + ".java", - TemplateFactory.stubModuleTemplateFromMbe(entry)); - return result; - } - - public static Map getFtlTemplates( - ServiceInterfaceEntry entry) { - - Map result = new HashMap<>(); - result.put(entry.getTypeName() + ".java", - TemplateFactory.serviceInterfaceFromSie(entry)); - - return result; - } - /** * Get map of file name as key, FtlFile instance representing runtime mx * bean as value that should be persisted from this instance. @@ -183,11 +136,6 @@ public class TemplateFactory { return serializeType(type, false); } - private static boolean isIdentityRefType(Type type) { - return type instanceof IdentityrefTypeDefinition; - } - - private static String getReturnType(AttributeIfc attributeIfc) { String returnType; if (attributeIfc instanceof TypedAttribute) { @@ -234,28 +182,17 @@ public class TemplateFactory { attrProcessor.processAttributes(mbe.getAttributes(), mbe.getPackageName()); - Collection transformed = Collections2.transform(mbe - .getProvidedServices().keySet(), - new Function() { - @Override - public String apply(String input) { - return input + ".class"; - } - }); return new AbstractFactoryTemplate(getHeaderFromEntry(mbe), mbe.getPackageName(), mbe.getAbstractFactoryName(), - mbe.getGloballyUniqueName(), mbe.getFullyQualifiedName(mbe - .getStubModuleName()), attrProcessor.getFields(), - Lists.newArrayList(transformed), mbe); + attrProcessor.getFields() + ); } public static AbstractModuleTemplate abstractModuleTemplateFromMbe( ModuleMXBeanEntry mbe) { - AbstractModuleAttributesProcessor attrProcessor = new AbstractModuleAttributesProcessor(); - attrProcessor.processAttributes(mbe.getAttributes(), - mbe.getPackageName()); + AbstractModuleAttributesProcessor attrProcessor = new AbstractModuleAttributesProcessor(mbe.getAttributes()); List moduleFields = attrProcessor.getModuleFields(); List implementedIfcs = Lists.newArrayList( @@ -298,15 +235,8 @@ public class TemplateFactory { ModuleMXBeanEntry mbe) { return new StubFactoryTemplate(getHeaderFromEntry(mbe), mbe.getPackageName(), mbe.getStubFactoryName(), - mbe.getFullyQualifiedName(mbe.getAbstractFactoryName()), - mbe.getStubModuleName()); - } - - public static StubModuleTemplate stubModuleTemplateFromMbe( - ModuleMXBeanEntry mbe) { - return new StubModuleTemplate(getHeaderFromEntry(mbe), - mbe.getPackageName(), mbe.getStubModuleName(), - mbe.getFullyQualifiedName(mbe.getAbstractModuleName())); + mbe.getFullyQualifiedName(mbe.getAbstractFactoryName()) + ); } public static GeneralInterfaceTemplate mXBeanInterfaceTemplateFromMbe( @@ -612,12 +542,26 @@ public class TemplateFactory { } private static class AbstractModuleAttributesProcessor { + private static class Holder { + private final List moduleFields; + private final List methods; + + private Holder(List moduleFields, List methods) { + this.moduleFields = Collections.unmodifiableList(moduleFields); + this.methods = Collections.unmodifiableList(methods); + } + } - private final List moduleFields = Lists.newArrayList(); - private final List methods = Lists.newArrayList(); + private final Holder holder; - void processAttributes(Map attributes, - String packageName) { + + private AbstractModuleAttributesProcessor(Map attributes) { + this.holder = processAttributes(attributes); + } + + private static Holder processAttributes(Map attributes) { + List moduleFields = new ArrayList<>(); + List methods = new ArrayList<>(); for (Entry attrEntry : attributes.entrySet()) { String type, nullableDefaultWrapped = null; AttributeIfc attributeIfc = attrEntry.getValue(); @@ -661,7 +605,7 @@ public class TemplateFactory { String varName = BindingGeneratorUtil .parseToValidParamName(attrEntry.getKey()); - + { ModuleField field; if (isIdentity) { @@ -695,7 +639,7 @@ public class TemplateFactory { nullableDefaultWrapped, isDependency, dependency, isListOfDependencies, needsDepResolver); } moduleFields.add(field); - + } String getterName = "get" + attributeIfc.getUpperCaseCammelCase(); MethodDefinition getter = new MethodDefinition(type, @@ -727,14 +671,15 @@ public class TemplateFactory { methods.add(setter); } + return new Holder(moduleFields, methods); } List getModuleFields() { - return moduleFields; + return holder.moduleFields; } List getMethods() { - return methods; + return holder.methods; } } diff --git a/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/directives/AnnotationsDirective.java b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/directives/AnnotationsDirective.java deleted file mode 100644 index 4a34a1f294..0000000000 --- a/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/directives/AnnotationsDirective.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.directives; - -import java.io.IOException; -import java.io.Writer; -import java.util.List; -import java.util.Map; - -import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.FtlTemplate; -import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.model.Annotation; -import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.model.Annotation.Parameter; - -import com.google.common.collect.Lists; - -import freemarker.core.Environment; -import freemarker.template.SimpleSequence; -import freemarker.template.TemplateDirectiveBody; -import freemarker.template.TemplateDirectiveModel; -import freemarker.template.TemplateException; -import freemarker.template.TemplateModel; - -/** - * Add annotations to freemarker template. - */ -public class AnnotationsDirective implements TemplateDirectiveModel { - - private static final String OBJECT = "object"; - - @Override - public void execute(Environment env, Map params, TemplateModel[] loopVars, - TemplateDirectiveBody body) throws TemplateException, IOException { - Object object = params.get(OBJECT); - List annotations = Lists.newArrayList(); - - if (object != null) { - if (object instanceof SimpleSequence) - annotations = ((SimpleSequence) object).toList(); - else if (object instanceof FtlTemplate) { - annotations = ((FtlTemplate) object).getAnnotations(); - } else - throw new IllegalArgumentException( - "Object must be a SimpleSequence or instance of " - + FtlTemplate.class + "but was " - + object.getClass()); - } - - Writer out = env.getOut(); - StringBuilder build = new StringBuilder(); - writeAnnotations(annotations, build, ""); - - if (!annotations.isEmpty()) - out.write(build.toString().toCharArray()); - } - - static void writeAnnotations(List annotations, - StringBuilder build, String linePrefix) { - for (Annotation annotation : annotations) { - build.append(linePrefix + "@"); - build.append(annotation.getName()); - if (!annotation.getParams().isEmpty()) { - build.append("("); - for (Parameter param : annotation.getParams()) { - build.append(param.getKey()); - build.append(" = "); - build.append(fixString(param.getValue())); - build.append(", "); - } - build.setCharAt(build.length() - 2, ')'); - } - build.append(System.lineSeparator()); - } - } - - private static String fixString(String value) { - // TODO replace with compress single line if possible - return value.replaceAll("\\r\\n|\\r|\\n", " ").replaceAll(" +", " "); - } - -} diff --git a/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/directives/ConstructorsDirective.java b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/directives/ConstructorsDirective.java deleted file mode 100644 index 56b7286eb5..0000000000 --- a/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/directives/ConstructorsDirective.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.directives; - -import java.io.IOException; -import java.io.Writer; -import java.util.List; -import java.util.Map; - -import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.GeneralClassTemplate; -import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.model.Constructor; - -import com.google.common.collect.Lists; - -import freemarker.core.Environment; -import freemarker.template.SimpleSequence; -import freemarker.template.TemplateDirectiveBody; -import freemarker.template.TemplateDirectiveModel; -import freemarker.template.TemplateException; -import freemarker.template.TemplateModel; - -/** - * Add annotations to freemarker template. - */ -public class ConstructorsDirective implements TemplateDirectiveModel { - - private static final String OBJECT = "object"; - - @Override - public void execute(Environment env, Map params, TemplateModel[] loopVars, - TemplateDirectiveBody body) throws TemplateException, IOException { - Object object = params.get(OBJECT); - List constructors = Lists.newArrayList(); - - if (object != null) { - if (object instanceof SimpleSequence) - constructors = ((SimpleSequence) object).toList(); - else if (object instanceof GeneralClassTemplate) { - constructors = ((GeneralClassTemplate) object) - .getConstructors(); - } else - throw new IllegalArgumentException( - "Object must be a SimpleSequence or instance of " - + GeneralClassTemplate.class + "but was " - + object.getClass()); - } - - Writer out = env.getOut(); - StringBuilder build = new StringBuilder(); - for (Constructor constr : constructors) { - build.append(" "); - if (constr.isPublic()) - build.append("public "); - build.append(constr.getTypeName() + " "); - build.append("() {"); - build.append(System.lineSeparator()); - build.append(" "); - build.append(" "); - build.append(constr.getBody()); - build.append(System.lineSeparator()); - build.append(" "); - build.append("}"); - build.append(System.lineSeparator()); - build.append(System.lineSeparator()); - } - - if (!constructors.isEmpty()) - out.write(build.toString().toCharArray()); - } - -} diff --git a/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/directives/FieldsDirectiveProg.java b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/directives/FieldsDirectiveProg.java deleted file mode 100644 index 7dd0f8e992..0000000000 --- a/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/directives/FieldsDirectiveProg.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.directives; - -import java.io.IOException; -import java.io.Writer; -import java.util.List; -import java.util.Map; - -import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.FtlTemplate; -import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.model.Field; - -import com.google.common.collect.Lists; - -import freemarker.core.Environment; -import freemarker.template.SimpleSequence; -import freemarker.template.TemplateDirectiveBody; -import freemarker.template.TemplateDirectiveModel; -import freemarker.template.TemplateException; -import freemarker.template.TemplateModel; - -/** - * Add fields to freemarker template. - */ -public class FieldsDirectiveProg implements TemplateDirectiveModel { - - private static final String OBJECT = "object"; - - @Override - public void execute(Environment env, Map params, TemplateModel[] loopVars, - TemplateDirectiveBody body) throws TemplateException, IOException { - Object object = params.get(OBJECT); - List fields = Lists.newArrayList(); - - if (object != null) { - if (object instanceof SimpleSequence) - fields = ((SimpleSequence) object).toList(); - else if (object instanceof FtlTemplate) { - fields = ((FtlTemplate) object).getFields(); - } else - throw new IllegalArgumentException( - "Object must be a SimpleSequence or instance of " - + FtlTemplate.class + "but was " - + object.getClass()); - } - - Writer out = env.getOut(); - StringBuilder build = new StringBuilder(); - for (Field field : fields) { - build.append(" private "); - for (String mod : field.getModifiers()) { - build.append(mod + " "); - } - build.append(field.getType() + " "); - build.append(field.getName()); - if (field.getDefinition() != null) - build.append(" = " + field.getDefinition()); - build.append(";"); - build.append(System.lineSeparator()); - } - - if (!fields.isEmpty()) - out.write(build.toString().toCharArray()); - } - - // String templateStr = "Hello ${user}"; - // Template t = new Template("name", new StringReader(templateStr), new - // Configuration()); -} diff --git a/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/directives/FieldsDirectiveTemplate.java b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/directives/FieldsDirectiveTemplate.java deleted file mode 100644 index 268d898477..0000000000 --- a/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/directives/FieldsDirectiveTemplate.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.directives; - -import java.io.IOException; -import java.io.StringReader; -import java.io.Writer; -import java.util.Map; - -import com.google.common.collect.Maps; - -import freemarker.core.Environment; -import freemarker.template.Configuration; -import freemarker.template.Template; -import freemarker.template.TemplateDirectiveBody; -import freemarker.template.TemplateDirectiveModel; -import freemarker.template.TemplateException; -import freemarker.template.TemplateModel; - -/** - * Add fields to freemarker template. - */ -public class FieldsDirectiveTemplate implements TemplateDirectiveModel { - - private static final String OBJECT = "object"; - - @Override - public void execute(Environment env, Map params, TemplateModel[] loopVars, - TemplateDirectiveBody body) throws TemplateException, IOException { - Object object = params.get(OBJECT); - - // TODO check type - - String templateStr = " <#list fields as field>" - + "private <#if field.final==true>final <#if field.static==true>static " - + "${field.type} ${field.name}<#if field.definition??> = ${field.definition};" - + System.lineSeparator() + " "; - Template t = new Template("name", new StringReader(templateStr), - new Configuration()); - - try { - Map map = Maps.newHashMap(); - map.put("fields", object); - Writer out = env.getOut(); - t.process(map, out); - } catch (TemplateException e) { - throw new IllegalStateException( - "Template error while generating fields" + e); - } - } - -} diff --git a/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/directives/HeaderDirective.java b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/directives/HeaderDirective.java deleted file mode 100644 index 93fde59e96..0000000000 --- a/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/directives/HeaderDirective.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.directives; - -import java.io.IOException; -import java.io.Writer; -import java.util.Date; -import java.util.Map; - -import org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator; -import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.model.Header; - -import com.google.common.base.Preconditions; - -import freemarker.core.Environment; -import freemarker.ext.beans.StringModel; -import freemarker.template.TemplateDirectiveBody; -import freemarker.template.TemplateDirectiveModel; -import freemarker.template.TemplateException; -import freemarker.template.TemplateModel; - -/** - * Add annotations to freemarker template. - */ -public class HeaderDirective implements TemplateDirectiveModel { - - private static final String GENERATOR_CLASS = JMXGenerator.class - .getCanonicalName(); - private static final String OBJECT = "header"; - - @Override - public void execute(Environment env, Map params, TemplateModel[] loopVars, - TemplateDirectiveBody body) throws TemplateException, IOException { - - // FIXME do not allow null header - // Preconditions.checkNotNull(object, "Null type declaration"); - Object object = params.get(OBJECT); - Header header = null; - if (object != null) { - object = ((StringModel) object).getWrappedObject(); - Preconditions.checkArgument(object instanceof Header, - "Template header should be instance of " + Header.class - + " but was " + object.getClass()); - - header = (Header) object; - } - - Writer out = env.getOut(); - StringBuilder build = new StringBuilder(); - build.append("/**"); - build.append(System.lineSeparator()); - build.append("* "); - build.append("Generated file"); - build.append(System.lineSeparator()); - build.append(System.lineSeparator()); - build.append("* "); - build.append("Generated from: "); - build.append(header != null ? header.toString() : ""); - build.append(System.lineSeparator()); - build.append("* "); - build.append("Generated by: " + GENERATOR_CLASS); - build.append(System.lineSeparator()); - build.append("* "); - build.append("Generated at: " + new Date()); - build.append(System.lineSeparator()); - build.append("* "); - build.append(System.lineSeparator()); - build.append("* "); - build.append("Do not modify this file unless it is present under src/main directory "); - build.append(System.lineSeparator()); - build.append("*/"); - build.append(System.lineSeparator()); - - out.write(build.toString().toCharArray()); - } -} diff --git a/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/directives/JavadocDirective.java b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/directives/JavadocDirective.java deleted file mode 100644 index 9817be3ea3..0000000000 --- a/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/directives/JavadocDirective.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.directives; - -import java.io.IOException; -import java.io.Writer; -import java.util.Map; - -import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.FtlTemplate; - -import freemarker.core.Environment; -import freemarker.template.SimpleScalar; -import freemarker.template.TemplateDirectiveBody; -import freemarker.template.TemplateDirectiveModel; -import freemarker.template.TemplateException; -import freemarker.template.TemplateModel; - -/** - * Add javadoc to freemarker template as String. - */ -public class JavadocDirective implements TemplateDirectiveModel { - - private static final String OBJECT = "object"; - - @Override - public void execute(Environment env, Map params, TemplateModel[] loopVars, - TemplateDirectiveBody body) throws TemplateException, IOException { - Object object = params.get(OBJECT); - String javadoc = ""; - - if (object != null) { - if (object instanceof SimpleScalar) - javadoc = ((SimpleScalar) object).getAsString(); - else if (object instanceof FtlTemplate) { - javadoc = ((FtlTemplate) object).getJavadoc(); - } else - throw new IllegalArgumentException( - "Object must be a String or instance of " - + FtlTemplate.class + "but was " - + object.getClass()); - } - - Writer out = env.getOut(); - StringBuilder build = new StringBuilder(); - writeJavadoc(build, javadoc, ""); - out.write(build.toString().toCharArray()); - } - - static void writeJavadoc(StringBuilder build, String javadoc, - String linePrefix) { - build.append(linePrefix + "/**"); - build.append(System.lineSeparator()); - build.append(linePrefix + "* "); - build.append(javadoc == null ? "" : javadoc); - build.append(System.lineSeparator()); - build.append(linePrefix + "*/"); - build.append(System.lineSeparator()); - } - -} diff --git a/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/directives/MethodsDirective.java b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/directives/MethodsDirective.java deleted file mode 100644 index 975d8fd620..0000000000 --- a/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/directives/MethodsDirective.java +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.directives; - -import java.io.IOException; -import java.io.Writer; -import java.util.List; -import java.util.Map; - -import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.FtlTemplate; -import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.model.Field; -import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.model.Method; -import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.model.MethodDeclaration; -import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.model.MethodDefinition; - -import com.google.common.collect.Lists; - -import freemarker.core.Environment; -import freemarker.template.SimpleSequence; -import freemarker.template.TemplateDirectiveBody; -import freemarker.template.TemplateDirectiveModel; -import freemarker.template.TemplateException; -import freemarker.template.TemplateModel; - -/** - * Add annotations to freemarker template. - */ -public class MethodsDirective implements TemplateDirectiveModel { - - private static final String OBJECT = "object"; - - @Override - public void execute(Environment env, Map params, TemplateModel[] loopVars, - TemplateDirectiveBody body) throws TemplateException, IOException { - Object object = params.get(OBJECT); - List methods = Lists.newArrayList(); - - if (object != null) { - if (object instanceof SimpleSequence) - methods = ((SimpleSequence) object).toList(); - else if (object instanceof FtlTemplate) { - methods = ((FtlTemplate) object).getMethods(); - } else - throw new IllegalArgumentException( - "Object must be a SimpleSequence or instance of " - + FtlTemplate.class + "but was " - + object.getClass()); - } - - Writer out = env.getOut(); - StringBuilder build = new StringBuilder(); - for (Method method : methods) { - if (method.getJavadoc() != null) - JavadocDirective.writeJavadoc(build, method.getJavadoc(), " "); - - if (!method.getAnnotations().isEmpty()) { - AnnotationsDirective.writeAnnotations(method.getAnnotations(), - build, " "); - } - - build.append(" " + "public "); - for (String mod : method.getModifiers()) { - build.append(mod + " "); - } - build.append(method.getReturnType() + " "); - - build.append(method.getName() + "("); - for (Field param : method.getParameters()) { - for (String mod : param.getModifiers()) { - build.append(mod + " "); - } - build.append(param.getType() + " "); - build.append(param.getName() + ", "); - } - if (method.getParameters().isEmpty()) - build.append(")"); - else { - build.deleteCharAt(build.length() - 1); - build.deleteCharAt(build.length() - 1); - build.append(')'); - } - - if (method instanceof MethodDeclaration) { - build.append(";"); - build.append(System.lineSeparator()); - } else if (method instanceof MethodDefinition) { - if (!((MethodDefinition) method).getThrowsExceptions() - .isEmpty()) - build.append(" throws "); - for (String ex : ((MethodDefinition) method) - .getThrowsExceptions()) { - build.append(ex + " "); - } - build.append(" {"); - build.append(System.lineSeparator()); - build.append(" "); - build.append(((MethodDefinition) method).getBody()); - build.append(System.lineSeparator()); - build.append(" "); - build.append("}"); - build.append(System.lineSeparator()); - } - build.append(System.lineSeparator()); - - } - - if (!methods.isEmpty()) - out.write(build.toString().toCharArray()); - } -} diff --git a/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/directives/ModuleFieldsDirective.java b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/directives/ModuleFieldsDirective.java deleted file mode 100644 index 144419e8ae..0000000000 --- a/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/directives/ModuleFieldsDirective.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.directives; - -import java.io.IOException; -import java.io.Writer; -import java.util.List; -import java.util.Map; - -import org.opendaylight.controller.config.api.JmxAttribute; -import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.AbstractModuleTemplate; -import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.model.ModuleField; - -import com.google.common.collect.Lists; - -import freemarker.core.Environment; -import freemarker.template.SimpleSequence; -import freemarker.template.TemplateDirectiveBody; -import freemarker.template.TemplateDirectiveModel; -import freemarker.template.TemplateException; -import freemarker.template.TemplateModel; - -/** - * Add annotations to freemarker template. - */ -public class ModuleFieldsDirective implements TemplateDirectiveModel { - - private static final String OBJECT = "moduleFields"; - - @Override - public void execute(Environment env, Map params, TemplateModel[] loopVars, - TemplateDirectiveBody body) throws TemplateException, IOException { - Object object = params.get(OBJECT); - List fields = Lists.newArrayList(); - - if (object != null) { - if (object instanceof SimpleSequence) - fields = ((SimpleSequence) object).toList(); - else if (object instanceof AbstractModuleTemplate) { - fields = ((AbstractModuleTemplate) object).getModuleFields(); - } else - throw new IllegalArgumentException( - "Object must be a SimpleSequence or instance of " - + AbstractModuleTemplate.class + "but was " - + object.getClass()); - } - - Writer out = env.getOut(); - StringBuilder build = new StringBuilder(); - for (ModuleField field : fields) { - build.append(" "); - build.append("protected final " - + JmxAttribute.class.getCanonicalName() + " " - + field.getName() + "JmxAttribute = new " - + JmxAttribute.class.getCanonicalName() + "(\"" - + field.getAttributeName() + "\");"); - build.append(System.lineSeparator()); - - build.append(" private "); - for (String mod : field.getModifiers()) { - build.append(mod + " "); - } - build.append(field.getType() + " "); - build.append(field.getName()); - if (field.getNullableDefault() != null) - build.append(" = " + field.getNullableDefault()); - build.append(";"); - - if (field.isDependent()) { - String comment = field.getDependency().isMandatory() ? "mandatory" - : "optional"; - build.append(" // " + comment); - } - build.append(System.lineSeparator()); - - build.append(System.lineSeparator()); - - } - - if (!fields.isEmpty()) - out.write(build.toString().toCharArray()); - } -} diff --git a/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/directives/TypeDeclarationDirective.java b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/directives/TypeDeclarationDirective.java deleted file mode 100644 index 42556c243e..0000000000 --- a/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/directives/TypeDeclarationDirective.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.directives; - -import java.io.IOException; -import java.io.Writer; -import java.util.Collection; -import java.util.Map; - -import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.model.TypeDeclaration; - -import com.google.common.base.Preconditions; - -import freemarker.core.Environment; -import freemarker.ext.beans.StringModel; -import freemarker.template.TemplateDirectiveBody; -import freemarker.template.TemplateDirectiveModel; -import freemarker.template.TemplateException; -import freemarker.template.TemplateModel; - -/** - * Add type declaration to freemarker template. - */ -public class TypeDeclarationDirective implements TemplateDirectiveModel { - - private static final String OBJECT = "object"; - - @Override - public void execute(Environment env, Map params, TemplateModel[] loopVars, - TemplateDirectiveBody body) throws TemplateException, IOException { - Object object = params.get(OBJECT); - Preconditions.checkNotNull(object, "Null type declaration"); - - object = ((StringModel) object).getWrappedObject(); - Preconditions.checkArgument( - object instanceof TypeDeclaration, - "Type declaration should be instance of " - + TypeDeclaration.class + " but was " - + object.getClass()); - - TypeDeclaration type = (TypeDeclaration) object; - - Writer out = env.getOut(); - StringBuilder build = new StringBuilder("public "); - if (type.isAbstract()) - build.append("abstract "); - if (type.isFinal()) - build.append("final "); - build.append(type.getType() + " "); - build.append(type.getName() + " "); - - generateExtendOrImplement(build, "extends", type.getExtended()); - - generateExtendOrImplement(build, "implements", type.getImplemented()); - - build.append(System.lineSeparator()); - out.write(build.toString().toCharArray()); - } - - private void generateExtendOrImplement(StringBuilder build, String prefix, - Collection elements) { - if (elements.isEmpty()) - return; - - build.append(prefix + " "); - - for (String extended : elements) { - build.append(extended); - build.append(", "); - } - build.deleteCharAt(build.length() - 1); - build.deleteCharAt(build.length() - 1); - } - -} diff --git a/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/directives/UnimplementedExceptionDirective.java b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/directives/UnimplementedExceptionDirective.java deleted file mode 100644 index 5175ade438..0000000000 --- a/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/directives/UnimplementedExceptionDirective.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.directives; - -import java.io.IOException; -import java.io.Writer; -import java.util.Map; - -import freemarker.core.Environment; -import freemarker.template.TemplateDirectiveBody; -import freemarker.template.TemplateDirectiveModel; -import freemarker.template.TemplateException; -import freemarker.template.TemplateModel; - -/** - * Add annotations to freemarker template. - */ -public class UnimplementedExceptionDirective implements TemplateDirectiveModel { - - @Override - public void execute(Environment env, Map params, TemplateModel[] loopVars, - TemplateDirectiveBody body) throws TemplateException, IOException { - - Writer out = env.getOut(); - StringBuilder build = new StringBuilder(); - build.append(" "); - build.append("throw new " - + UnsupportedOperationException.class.getCanonicalName() - + "(\"Unimplemented stub method\");"); - build.append(System.lineSeparator()); - - out.write(build.toString().toCharArray()); - } -} diff --git a/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/model/Annotation.java b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/model/Annotation.java index 7cf241725d..a8ddabc4cf 100644 --- a/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/model/Annotation.java +++ b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/model/Annotation.java @@ -7,18 +7,21 @@ */ package org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.model; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; - +import com.google.common.base.Preconditions; +import com.google.common.collect.Lists; import org.opendaylight.controller.config.api.annotations.Description; import org.opendaylight.controller.config.api.annotations.RequireInterface; import org.opendaylight.controller.config.api.annotations.ServiceInterfaceAnnotation; -import org.opendaylight.yangtools.yang.binding.annotations.ModuleQName; import org.opendaylight.controller.config.yangjmxgenerator.ServiceInterfaceEntry; +import org.opendaylight.yangtools.yang.binding.annotations.ModuleQName; +import org.opendaylight.yangtools.yang.common.QName; -import com.google.common.base.Preconditions; -import com.google.common.collect.Lists; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; public class Annotation { final String name; @@ -37,6 +40,14 @@ public class Annotation { return params; } + public static Annotation createFromMap(Class annotationClass, Map parameters) { + List parameterList = new ArrayList<>(); + for(Entry entry: parameters.entrySet()) { + parameterList.add(new Parameter(entry.getKey(), entry.getValue())); + } + return new Annotation(annotationClass.getCanonicalName(), parameterList); + } + public static Annotation createDescriptionAnnotation(String description) { Preconditions.checkNotNull(description, "Cannot create annotation from null description"); @@ -44,6 +55,14 @@ public class Annotation { Lists.newArrayList(new Parameter("value", q(description)))); } + public static Annotation createModuleQNameANnotation(QName qName) { + Map parameters = new HashMap<>(); + parameters.put("namespace", q(qName.getNamespace().toString())); + parameters.put("revision", q(qName.getFormattedRevision())); + parameters.put("name", q(qName.getLocalName())); + return Annotation.createFromMap(ModuleQName.class, parameters); + } + public static Collection createSieAnnotations(ServiceInterfaceEntry sie){ String exportedClassName = sie.getExportedOsgiClassName(); @@ -85,7 +104,7 @@ public class Annotation { private static final String quote = "\""; - private static String q(String nullableDescription) { + public static String q(String nullableDescription) { return nullableDescription == null ? null : quote + nullableDescription + quote; } @@ -107,4 +126,8 @@ public class Annotation { } } + @Override + public String toString() { + return AnnotationSerializer.toString(this); + } } diff --git a/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/model/AnnotationSerializer.java b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/model/AnnotationSerializer.java new file mode 100644 index 0000000000..6b4ce38621 --- /dev/null +++ b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/model/AnnotationSerializer.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ + +package org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.model; + +import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.model.Annotation.Parameter; + +class AnnotationSerializer { + + static String toString(Annotation annotation) { + StringBuilder builder = new StringBuilder(); + builder.append("@"); + builder.append(annotation.getName()); + if (!annotation.getParams().isEmpty()) { + builder.append("("); + for (Parameter param : annotation.getParams()) { + builder.append(param.getKey()); + builder.append(" = "); + builder.append(fixString(param.getValue())); + builder.append(", "); + } + builder.setCharAt(builder.length() - 2, ')'); + } + builder.append("\n"); + return builder.toString(); + } + + private static String fixString(String value) { + // TODO replace with compress single line if possible + return value.replaceAll("\\r\\n|\\r|\\n", " ").replaceAll(" +", " "); + } + +} diff --git a/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/model/Constructor.java b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/model/Constructor.java index 1aeb86d25d..91c1cc3966 100644 --- a/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/model/Constructor.java +++ b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/model/Constructor.java @@ -37,4 +37,8 @@ public class Constructor { return isPublic; } + @Override + public String toString() { + return ConstructorSerializer.toString(this); + } } diff --git a/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/model/ConstructorSerializer.java b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/model/ConstructorSerializer.java new file mode 100644 index 0000000000..c257aa6dda --- /dev/null +++ b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/model/ConstructorSerializer.java @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ + +package org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.model; + +public class ConstructorSerializer { + + public static String toString(Constructor constr) { + StringBuilder build = new StringBuilder(); + build.append(" "); + if (constr.isPublic()) { + build.append("public "); + } + build.append(constr.getTypeName() + " "); + build.append("() {"); + build.append("\n"); + build.append(" "); + build.append(" "); + build.append(constr.getBody()); + build.append("\n"); + build.append(" "); + build.append("}"); + build.append("\n"); + build.append("\n"); + return build.toString(); + } +} diff --git a/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/model/Field.java b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/model/Field.java index ad5cbb287c..3639b6d727 100644 --- a/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/model/Field.java +++ b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/model/Field.java @@ -11,6 +11,8 @@ import com.google.common.collect.Lists; import java.util.List; +import static com.google.common.base.Preconditions.checkNotNull; + public class Field { private final String type; private final String name; @@ -36,11 +38,11 @@ public class Field { } public Field(List modifiers, String type, String name, - String definition, boolean needsDepResolver) { - this.modifiers = modifiers; - this.type = type; - this.name = name; - this.definition = definition; + String nullableDefinition, boolean needsDepResolver) { + this.modifiers = checkNotNull(modifiers); + this.type = checkNotNull(type); + this.name = checkNotNull(name); + this.definition = nullableDefinition; this.needsDepResolver = needsDepResolver; } @@ -56,6 +58,10 @@ public class Field { return type; } + public String getGenericInnerType() { + return type.substring(type.indexOf("<") + 1, type.indexOf(">")); + } + public List getModifiers() { return modifiers; } @@ -71,4 +77,9 @@ public class Field { public boolean isArray() { return type.endsWith("[]"); } + + @Override + public String toString() { + return FieldSerializer.toString(this); + } } diff --git a/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/model/FieldSerializer.java b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/model/FieldSerializer.java new file mode 100644 index 0000000000..90a2b5694c --- /dev/null +++ b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/model/FieldSerializer.java @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ + +package org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.model; + +public class FieldSerializer { + + public static String toString(Field field) { + StringBuilder build = new StringBuilder(); + build.append("private "); + for (String mod : field.getModifiers()) { + build.append(mod + " "); + } + build.append(field.getType() + " "); + build.append(field.getName()); + if (field.getDefinition() != null) { + build.append(" = " + field.getDefinition()); + } + build.append(";"); + build.append("\n"); + return build.toString(); + } +} diff --git a/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/model/Header.java b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/model/Header.java index 047e87a3dc..b9a628495d 100644 --- a/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/model/Header.java +++ b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/model/Header.java @@ -26,8 +26,7 @@ public class Header { @Override public String toString() { - return "yang module name: " + yangModuleName + " " - + " yang module local name: " + yangModuleLocalName; + return HeaderSerializer.toString(this); } } diff --git a/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/model/HeaderSerializer.java b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/model/HeaderSerializer.java new file mode 100644 index 0000000000..eb07c80e15 --- /dev/null +++ b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/model/HeaderSerializer.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ + +package org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.model; + +import org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator; + +import java.util.Date; + +public class HeaderSerializer { + private static final String GENERATOR_CLASS = JMXGenerator.class.getCanonicalName(); + + public static String toString(Header header) { + StringBuilder build = new StringBuilder(); + + + build.append("Generated file"); + build.append("\n"); + build.append("\n"); + build.append("Generated from: "); + //build.append(header.toString()); + + build.append("yang module name: "); + build.append(header.getYangModuleName()); + build.append(" yang module local name: "); + build.append(header.getYangModuleLocalName()); + + build.append("\n"); + build.append("Generated by: " + GENERATOR_CLASS); + build.append("\n"); + build.append("Generated at: " + new Date()); + build.append("\n"); + build.append("\n"); + build.append("Do not modify this file unless it is present under src/main directory "); + + return build.toString(); + } + +} diff --git a/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/model/MethodDeclaration.java b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/model/MethodDeclaration.java index bd4e22e084..be6b23e879 100644 --- a/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/model/MethodDeclaration.java +++ b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/model/MethodDeclaration.java @@ -63,4 +63,9 @@ public class MethodDeclaration implements Method { public List getModifiers() { return Collections.emptyList(); } + + @Override + public String toString() { + return MethodSerializer.toString(this); + } } diff --git a/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/model/MethodDefinition.java b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/model/MethodDefinition.java index bf453ac135..9af011fe71 100644 --- a/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/model/MethodDefinition.java +++ b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/model/MethodDefinition.java @@ -93,4 +93,9 @@ public class MethodDefinition implements Method { public List getModifiers() { return modifiers; } + + @Override + public String toString() { + return MethodSerializer.toString(this); + } } diff --git a/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/model/MethodSerializer.java b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/model/MethodSerializer.java new file mode 100644 index 0000000000..7d2b9fcdaf --- /dev/null +++ b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/model/MethodSerializer.java @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ + +package org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.model; + +import org.opendaylight.controller.config.yangjmxgenerator.plugin.util.StringUtil; + +class MethodSerializer { + + static String toString(Method method) { + StringBuilder build = new StringBuilder(); + if (method.getJavadoc() != null) { + build.append(StringUtil.writeComment(method.getJavadoc(), true)); + } + + for(Annotation a: method.getAnnotations()) { + build.append(a); + } + + build.append(" " + "public "); + for (String mod : method.getModifiers()) { + build.append(mod + " "); + } + build.append(method.getReturnType() + " "); + + build.append(method.getName() + "("); + for (Field param : method.getParameters()) { + for (String mod : param.getModifiers()) { + build.append(mod + " "); + } + build.append(param.getType() + " "); + build.append(param.getName() + ", "); + } + if (method.getParameters().isEmpty()) { + build.append(")"); + } else { + build.deleteCharAt(build.length() - 1); + build.deleteCharAt(build.length() - 1); + build.append(')'); + } + + if (method instanceof MethodDeclaration) { + build.append(";"); + build.append("\n"); + } else if (method instanceof MethodDefinition) { + if (!((MethodDefinition) method).getThrowsExceptions() + .isEmpty()) { + build.append(" throws "); + } + for (String ex : ((MethodDefinition) method) + .getThrowsExceptions()) { + build.append(ex + " "); + } + build.append(" {"); + build.append("\n"); + build.append(" "); + build.append(((MethodDefinition) method).getBody()); + build.append("\n"); + build.append(" "); + build.append("}"); + build.append("\n"); + } + build.append("\n"); + return build.toString(); + } +} diff --git a/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/model/ModuleField.java b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/model/ModuleField.java index 74e5bb0490..37d660353f 100644 --- a/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/model/ModuleField.java +++ b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/model/ModuleField.java @@ -44,6 +44,11 @@ public class ModuleField extends Field { return false; } + @Override + public String toString() { + return ModuleFieldSerializer.toString(this); + } + public Dependency getDependency() { return dependency; } @@ -64,4 +69,9 @@ public class ModuleField extends Field { return attributeName; } + + public boolean isList() { + return getType().startsWith("java.util.List"); + } + } diff --git a/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/model/ModuleFieldSerializer.java b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/model/ModuleFieldSerializer.java new file mode 100644 index 0000000000..c0e3bc1ad8 --- /dev/null +++ b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/model/ModuleFieldSerializer.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ + +package org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.model; + +import org.opendaylight.controller.config.api.JmxAttribute; + +public class ModuleFieldSerializer { + + + public static String toString(ModuleField moduleField) { + StringBuilder builder = new StringBuilder(); + builder.append(" "); + builder.append("protected final " + + JmxAttribute.class.getCanonicalName() + " " + + moduleField.getName() + "JmxAttribute = new " + + JmxAttribute.class.getCanonicalName() + "(\"" + + moduleField.getAttributeName() + "\");"); + builder.append("\n"); + + builder.append(" private "); + for (String mod : moduleField.getModifiers()) { + builder.append(mod + " "); + } + builder.append(moduleField.getType() + " "); + builder.append(moduleField.getName()); + if (moduleField.getNullableDefault() != null) { + builder.append(" = " + moduleField.getNullableDefault()); + } + builder.append(";"); + + if (moduleField.isDependent()) { + String comment = moduleField.getDependency().isMandatory() ? "mandatory" + : "optional"; + builder.append(" // " + comment); + } + builder.append("\n"); + + builder.append("\n"); + + return builder.toString(); + } +} diff --git a/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/model/TypeDeclaration.java b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/model/TypeDeclaration.java index ee0aa2ff5c..a5bb987fd3 100644 --- a/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/model/TypeDeclaration.java +++ b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/model/TypeDeclaration.java @@ -7,6 +7,8 @@ */ package org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.model; +import org.opendaylight.controller.config.yangjmxgenerator.plugin.java.TypeName; + import java.util.List; public class TypeDeclaration { @@ -54,6 +56,24 @@ public class TypeDeclaration { return implemented; } + public TypeName toTypeName() { + if ("interface".equals(type)) { + return TypeName.interfaceType; + } else if ("class".equals(type)) { + if (isAbstract) { + return TypeName.absClassType; + } else if (isFinal) { + return TypeName.finalClassType; + } else { + return TypeName.classType; + } + } else if ("enum".equals(type)) { + return TypeName.enumType; + } else { + throw new IllegalStateException("Type not supported: " + type); + } + } + @Override public String toString() { return "TypeDeclaration{" + "type='" + type + '\'' + ", name='" + name diff --git a/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/gofactory/AbsFactoryGeneratedObjectFactory.groovy b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/gofactory/AbsFactoryGeneratedObjectFactory.groovy new file mode 100644 index 0000000000..baff88c8f3 --- /dev/null +++ b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/gofactory/AbsFactoryGeneratedObjectFactory.groovy @@ -0,0 +1,168 @@ +/* + * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ + +package org.opendaylight.controller.config.yangjmxgenerator.plugin.gofactory +import com.google.common.base.Optional +import org.opendaylight.controller.config.api.DependencyResolver +import org.opendaylight.controller.config.api.DynamicMBeanWithInstance +import org.opendaylight.controller.config.api.ModuleIdentifier +import org.opendaylight.controller.config.api.annotations.AbstractServiceInterface +import org.opendaylight.controller.config.api.annotations.Description +import org.opendaylight.controller.config.spi.Module +import org.opendaylight.controller.config.spi.ModuleFactory +import org.opendaylight.controller.config.yangjmxgenerator.ModuleMXBeanEntry +import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.AbstractFactoryTemplate +import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.TemplateFactory +import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.model.Annotation +import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.model.Field +import org.opendaylight.controller.config.yangjmxgenerator.plugin.java.* +import org.opendaylight.yangtools.yang.common.QName +import org.osgi.framework.BundleContext + +public class AbsFactoryGeneratedObjectFactory { + + public GeneratedObject toGeneratedObject(ModuleMXBeanEntry mbe, Optional copyright) { + FullyQualifiedName absFactoryFQN = new FullyQualifiedName(mbe.packageName, mbe.abstractFactoryName) + FullyQualifiedName moduleFQN = new FullyQualifiedName(mbe.packageName, mbe.stubModuleName) + Optional classJavaDoc = Optional.fromNullable(mbe.getNullableDescription()) + + AbstractFactoryTemplate abstractFactoryTemplate = TemplateFactory.abstractFactoryTemplateFromMbe(mbe) + Optional header = abstractFactoryTemplate.headerString; + List providedServices = mbe.providedServices.keySet().collect { + FullyQualifiedName.fromString(it) + } + + + return toGeneratedObject(absFactoryFQN, copyright, + header, classJavaDoc, mbe.yangModuleQName, + mbe.globallyUniqueName, + providedServices, + moduleFQN, + abstractFactoryTemplate.fields) + } + + public GeneratedObject toGeneratedObject(FullyQualifiedName absFactoryFQN, Optional copyright, + Optional header, Optional classJavaDoc, QName yangModuleQName, + String globallyUniqueName, + List providedServices, + FullyQualifiedName moduleFQN, + List moduleFields) { + JavaFileInputBuilder b = new JavaFileInputBuilder() + Annotation moduleQNameAnnotation = Annotation.createModuleQNameANnotation(yangModuleQName) + b.addClassAnnotation(moduleQNameAnnotation) + + b.setFqn(absFactoryFQN) + b.setTypeName(TypeName.absClassType) + + b.setCopyright(copyright); + b.setHeader(header); + b.setClassJavaDoc(classJavaDoc); + b.addImplementsFQN(new FullyQualifiedName(ModuleFactory)) + if (classJavaDoc.isPresent()) { + b.addClassAnnotation("@${Description.canonicalName}(value=\"${classJavaDoc.get()}\")") + } + + b.addToBody("public static final java.lang.String NAME = \"${globallyUniqueName}\";") + b.addToBody("private static final java.util.Set> serviceIfcs;") + + b.addToBody("@Override\n public final String getImplementationName() { \n return NAME; \n}") + + b.addToBody(getServiceIfcsInitialization(providedServices)) + + // createModule + b.addToBody(""" + @Override + public ${Module.canonicalName} createModule(String instanceName, ${DependencyResolver.canonicalName} dependencyResolver, ${BundleContext.canonicalName} bundleContext) { + return instantiateModule(instanceName, dependencyResolver, bundleContext); + } + """) + + b.addToBody(getCreateModule(moduleFQN, moduleFields)) + + b.addToBody(""" + public ${moduleFQN} instantiateModule(String instanceName, ${DependencyResolver.canonicalName} dependencyResolver, ${moduleFQN} oldModule, ${AutoCloseable.canonicalName} oldInstance, ${BundleContext.canonicalName} bundleContext) { + return new ${moduleFQN}(new ${ModuleIdentifier.canonicalName}(NAME, instanceName), dependencyResolver, oldModule, oldInstance); + } + """) + + b.addToBody(""" + public ${moduleFQN} instantiateModule(String instanceName, ${DependencyResolver.canonicalName} dependencyResolver, ${BundleContext.canonicalName} bundleContext) { + return new ${moduleFQN}(new ${ModuleIdentifier.canonicalName}(NAME, instanceName), dependencyResolver); + } + """) + + b.addToBody(""" + public ${moduleFQN} handleChangedClass(${DynamicMBeanWithInstance.canonicalName} old) throws Exception { + throw new UnsupportedOperationException("Class reloading is not supported"); + } + """) + + b.addToBody(""" + @Override + public java.util.Set<${moduleFQN}> getDefaultModules(org.opendaylight.controller.config.api.DependencyResolverFactory dependencyResolverFactory, ${BundleContext.canonicalName} bundleContext) { + return new java.util.HashSet<${moduleFQN}>(); + } + """) + + return new GeneratedObjectBuilder(b.build()).toGeneratedObject() + } + + private static String getCreateModule(FullyQualifiedName moduleFQN, List moduleFields) { + String result = """ + @Override + public ${Module.canonicalName} createModule(String instanceName, ${DependencyResolver.canonicalName} dependencyResolver, ${DynamicMBeanWithInstance.canonicalName} old, ${BundleContext.canonicalName} bundleContext) throws Exception { + ${moduleFQN} oldModule = null; + try { + oldModule = (${moduleFQN}) old.getModule(); + } catch(Exception e) { + return handleChangedClass(old); + } + ${moduleFQN} module = instantiateModule(instanceName, dependencyResolver, oldModule, old.getInstance(), bundleContext); + """ + result += moduleFields.collect{"module.set${it.name}(oldModule.get${it.name}());"}.join("\n") + result += """ + return module; + } + """ + return result + } + + private static String getServiceIfcsInitialization(List providedServices) { + String generic = "Class" + + String result = """static { + java.util.Set<${generic}> serviceIfcs2 = new java.util.HashSet<${generic}>(); + """ + result += providedServices.collect{"serviceIfcs2.add(${it}.class);"}.join("\n") + result += """serviceIfcs = java.util.Collections.unmodifiableSet(serviceIfcs2); + } + """ + + // add isModuleImplementingServiceInterface and getImplementedServiceIntefaces methods + + result += """ + @Override + public final boolean isModuleImplementingServiceInterface(Class serviceInterface) { + for (Class ifc: serviceIfcs) { + if (serviceInterface.isAssignableFrom(ifc)){ + return true; + } + } + return false; + } + + @Override + public java.util.Set> getImplementedServiceIntefaces() { + return serviceIfcs; + } + """ + + return result + } + +} diff --git a/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/gofactory/AbsModuleGeneratedObjectFactory.groovy b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/gofactory/AbsModuleGeneratedObjectFactory.groovy new file mode 100644 index 0000000000..930acff7bc --- /dev/null +++ b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/gofactory/AbsModuleGeneratedObjectFactory.groovy @@ -0,0 +1,400 @@ +/* + * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.controller.config.yangjmxgenerator.plugin.gofactory +import com.google.common.base.Optional +import org.opendaylight.controller.config.api.DependencyResolver +import org.opendaylight.controller.config.api.ModuleIdentifier +import org.opendaylight.controller.config.api.annotations.Description +import org.opendaylight.controller.config.api.runtime.RootRuntimeBeanRegistrator +import org.opendaylight.controller.config.yangjmxgenerator.ModuleMXBeanEntry +import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.AbstractModuleTemplate +import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.TemplateFactory +import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.model.Annotation +import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.model.IdentityRefModuleField +import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.model.Method +import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.model.ModuleField +import org.opendaylight.controller.config.yangjmxgenerator.plugin.java.* +import org.opendaylight.yangtools.yang.common.QName +import org.slf4j.Logger +import org.slf4j.LoggerFactory + +public class AbsModuleGeneratedObjectFactory { + + public GeneratedObject toGeneratedObject(ModuleMXBeanEntry mbe, Optional copyright) { + FullyQualifiedName abstractFQN = new FullyQualifiedName(mbe.getPackageName(), mbe.getAbstractModuleName()) + Optional classJavaDoc = Optional.fromNullable(mbe.getNullableDescription()) + AbstractModuleTemplate abstractModuleTemplate = TemplateFactory.abstractModuleTemplateFromMbe(mbe) + Optional header = abstractModuleTemplate.headerString; + List implementedInterfaces = abstractModuleTemplate.getTypeDeclaration().getImplemented().collect { + FullyQualifiedName.fromString(it) + } + Optional maybeRegistratorType + if (abstractModuleTemplate.isRuntime()) { + maybeRegistratorType = Optional.of(FullyQualifiedName.fromString(abstractModuleTemplate.getRegistratorType())) + } else { + maybeRegistratorType = Optional.absent() + } + + return toGeneratedObject(abstractFQN, copyright, header, classJavaDoc, implementedInterfaces, + abstractModuleTemplate.getModuleFields(), maybeRegistratorType, abstractModuleTemplate.getMethods(), + mbe.yangModuleQName + ) + } + + public GeneratedObject toGeneratedObject(FullyQualifiedName abstractFQN, + Optional copyright, + Optional header, + Optional classJavaDoc, + List implementedInterfaces, + List moduleFields, + Optional maybeRegistratorType, + List methods, + QName yangModuleQName) { + JavaFileInputBuilder b = new JavaFileInputBuilder() + + Annotation moduleQNameAnnotation = Annotation.createModuleQNameANnotation(yangModuleQName) + b.addClassAnnotation(moduleQNameAnnotation) + + b.setFqn(abstractFQN) + b.setTypeName(TypeName.absClassType) + + b.setCopyright(copyright); + b.setHeader(header); + b.setClassJavaDoc(classJavaDoc); + implementedInterfaces.each { b.addImplementsFQN(it) } + if (classJavaDoc.isPresent()) { + b.addClassAnnotation("@${Description.canonicalName}(value=\"${classJavaDoc.get()}\")") + } + + // add logger: + b.addToBody(getLogger(abstractFQN)); + + b.addToBody("//attributes start"); + + b.addToBody(moduleFields.collect { it.toString() }.join("\n")) + + b.addToBody("//attributes end"); + + + b.addToBody(getCommonFields(abstractFQN)); + + + b.addToBody(getNewConstructor(abstractFQN)) + b.addToBody(getCopyFromOldConstructor(abstractFQN)) + + b.addToBody(getRuntimeRegistratorCode(maybeRegistratorType)) + b.addToBody(getValidationMethods(moduleFields)) + + b.addToBody(getCachesOfResolvedDependencies(moduleFields)) + b.addToBody(getCachesOfResolvedIdentityRefs(moduleFields)) + b.addToBody(getGetInstance(moduleFields)) + b.addToBody(getReuseLogic(moduleFields, abstractFQN)) + b.addToBody(getEqualsAndHashCode(abstractFQN)) + + b.addToBody(getMethods(methods)) + + return new GeneratedObjectBuilder(b.build()).toGeneratedObject() + } + + private static String getMethods(List methods) { + String result = """ + // getters and setters + """ + result += methods.collect{it.toString()}.join("\n") + return result + } + + private static String getEqualsAndHashCode(FullyQualifiedName abstractFQN) { + return """ + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + ${abstractFQN.typeName} that = (${abstractFQN.typeName}) o; + return identifier.equals(that.identifier); + } + + @Override + public int hashCode() { + return identifier.hashCode(); + } + """ + } + + private static String getReuseLogic(List moduleFields, FullyQualifiedName abstractFQN) { + String result = """ + public boolean canReuseInstance(${abstractFQN.typeName} oldModule){ + // allow reusing of old instance if no parameters was changed + return isSame(oldModule); + } + + public ${AutoCloseable.canonicalName} reuseInstance(${AutoCloseable.canonicalName} oldInstance){ + // implement if instance reuse should be supported. Override canReuseInstance to change the criteria. + return oldInstance; + } + """ + // isSame method that detects changed fields + result += """ + public boolean isSame(${abstractFQN.typeName} other) { + if (other == null) { + throw new IllegalArgumentException("Parameter 'other' is null"); + } + """ + // loop through fields, do deep equals on each field + result += moduleFields.collect { field -> + if (field.isListOfDependencies()) { + return """ + if (${field.name}Dependency.equals(other.${field.name}Dependency) == false) { + return false; + } + for (int idx = 0; idx < ${field.name}Dependency.size(); idx++) { + if (${field.name}Dependency.get(idx) != other.${field.name}Dependency.get(idx)) { + return false; + } + } + """ + } else if (field.isDependent()) { + return """ + if (${field.name}Dependency != other.${field.name}Dependency) { // reference to dependency must be same + return false; + } + """ + } else { + return """ + if (java.util.Objects.deepEquals(${field.name}, other.${field.name}) == false) { + return false; + } + """ + } + }.join("\n") + + + result += """ + return true; + } + """ + + return result + } + + private static String getGetInstance(List moduleFields) { + String result = """ + @Override + public final ${AutoCloseable.canonicalName} getInstance() { + if(instance==null) { + """ + // create instance start + + // loop through dependent fields, use dependency resolver to instantiate dependencies. Do it in loop in case field represents list of dependencies. + Map resolveDependenciesMap = moduleFields.findAll { + it.isDependent() + }.collectEntries { ModuleField field -> + [field, field.isList() ? + """ + ${field.name}Dependency = new java.util.ArrayList<${field.dependency.sie.exportedOsgiClassName}>(); + for(javax.management.ObjectName dep : ${field.name}) { + ${field.name}Dependency.add(dependencyResolver.resolveInstance(${ + field.dependency.sie.exportedOsgiClassName + }.class, dep, ${field.name}JmxAttribute)); + } + """ + : + """ + ${field.name}Dependency = dependencyResolver.resolveInstance(${ + field.dependency.sie.exportedOsgiClassName + }.class, ${field.name}, ${field.name}JmxAttribute); + """ + ] + } + // wrap each field resolvation statement with if !=null when dependency is not mandatory + def wrapWithNullCheckClosure = {Map map, predicate -> map.collect { ModuleField key, String value -> + predicate(key) ? """ + if(${key.name}!=null) { + ${value} + } + """ : value + }.join("\n") + } + + result += wrapWithNullCheckClosure(resolveDependenciesMap, {ModuleField key -> + key.getDependency().isMandatory() == false} ) + + // add code to inject dependency resolver to fields that support it + Map injectDepsMap = moduleFields.findAll { it.needsDepResolver }.collectEntries { field -> + if (field.isList()) { + return [field,""" + for(${field.genericInnerType} candidate : ${field.name}) { + candidate.injectDependencyResolver(dependencyResolver); + } + """] + } else { + return [field, "${field.name}.injectDependencyResolver(dependencyResolver);"] + } + } + + result += wrapWithNullCheckClosure(injectDepsMap, {true}) + + // identity refs need to be injected with dependencyResolver and base class + Map resolveIdentityMap = moduleFields.findAll { it.isIdentityRef() }.collectEntries { IdentityRefModuleField field -> + [field, + "set${field.attributeName}(${field.name}.resolveIdentity(dependencyResolver, ${field.identityBaseClass}.class));"] + } + + result += wrapWithNullCheckClosure(resolveIdentityMap, {true}) + + // create instance end: reuse and recreate logic + result += """ + if(oldInstance!=null && canReuseInstance(oldModule)) { + instance = reuseInstance(oldInstance); + } else { + if(oldInstance!=null) { + try { + oldInstance.close(); + } catch(Exception e) { + logger.error("An error occurred while closing old instance " + oldInstance, e); + } + } + instance = createInstance(); + if (instance == null) { + throw new IllegalStateException("Error in createInstance - null is not allowed as return value"); + } + } + } + return instance; + } + public abstract ${AutoCloseable.canonicalName} createInstance(); + """ + return result + } + + private static String getCommonFields(FullyQualifiedName abstractFQN) { + return """ + private final ${abstractFQN.typeName} oldModule; + private final ${AutoCloseable.canonicalName} oldInstance; + private ${AutoCloseable.canonicalName} instance; + private final ${DependencyResolver.canonicalName} dependencyResolver; + private final ${ModuleIdentifier.canonicalName} identifier; + @Override + public ${ModuleIdentifier.canonicalName} getIdentifier() { + return identifier; + } + """ + } + + private static String getCachesOfResolvedIdentityRefs(List moduleFields) { + return moduleFields.findAll { it.isIdentityRef() }.collect { IdentityRefModuleField field -> + "private ${field.identityClassType} ${field.identityClassName};" + }.join("\n") + } + + private static String getCachesOfResolvedDependencies(List moduleFields) { + return moduleFields.findAll { it.dependent }.collect { field -> + if (field.isList()) { + return """ + private java.util.List<${field.dependency.sie.exportedOsgiClassName}> ${ + field.name + }Dependency = new java.util.ArrayList<${field.dependency.sie.exportedOsgiClassName}>(); + protected final java.util.List<${field.dependency.sie.exportedOsgiClassName}> get${ + field.attributeName + }Dependency(){ + return ${field.name}Dependency; + } + """ + } else { + return """ + private ${field.dependency.sie.exportedOsgiClassName} ${field.name}Dependency; + protected final ${field.dependency.sie.exportedOsgiClassName} get${field.attributeName}Dependency(){ + return ${field.name}Dependency; + } + """ + } + }.join("\n") + } + + private static String getRuntimeRegistratorCode(Optional maybeRegistratorType) { + if (maybeRegistratorType.isPresent()) { + String registratorType = maybeRegistratorType.get() + + return """ + private ${registratorType} rootRuntimeBeanRegistratorWrapper; + + public ${registratorType} getRootRuntimeBeanRegistratorWrapper(){ + return rootRuntimeBeanRegistratorWrapper; + } + + @Override + public void setRuntimeBeanRegistrator(${RootRuntimeBeanRegistrator.canonicalName} rootRuntimeRegistrator){ + this.rootRuntimeBeanRegistratorWrapper = new ${registratorType}(rootRuntimeRegistrator); + } + """ + } else { + return "" + } + } + + private static String getValidationMethods(List moduleFields) { + String result = """ + @Override + public void validate() { + """ + // validate each mandatory dependency + List lines = moduleFields.findAll{(it.dependent && it.dependency.mandatory)}.collect { field -> + if (field.isList()) { + return "" + + "for(javax.management.ObjectName dep : ${field.name}) {\n" + + " dependencyResolver.validateDependency(${field.dependency.sie.fullyQualifiedName}.class, dep, ${field.name}JmxAttribute);\n" + + "}\n" + } else { + return "dependencyResolver.validateDependency(${field.dependency.sie.fullyQualifiedName}.class, ${field.name}, ${field.name}JmxAttribute);" + } + } + result += lines.findAll { it.isEmpty() == false }.join("\n") + result += """ + customValidation(); + } + + protected void customValidation(){ + } + """ + return result + } + + private static String getLogger(FullyQualifiedName fqn) { + return "private static final ${Logger.canonicalName} logger = ${LoggerFactory.canonicalName}.getLogger(${fqn.toString()}.class);" + } + + // assumes that each parameter name corresponds to an field in this class, constructs lines setting this.field = field; + private static String getConstructorStart(FullyQualifiedName fqn, + LinkedHashMap parameters, String after) { + return "public ${fqn.typeName}(" + + parameters.collect { it.key + " " + it.value }.join(",") + + ") {\n" + + parameters.values().collect { "this.${it}=${it};\n" }.join() + + after + + "}\n" + } + + private static String getNewConstructor(FullyQualifiedName abstractFQN) { + LinkedHashMap parameters = [ + (ModuleIdentifier.canonicalName): "identifier", + (DependencyResolver.canonicalName): "dependencyResolver" + ] + String setToNulls = ["oldInstance", "oldModule"].collect { "this.${it}=null;\n" }.join() + return getConstructorStart(abstractFQN, parameters, setToNulls) + } + + private static String getCopyFromOldConstructor(FullyQualifiedName abstractFQN) { + LinkedHashMap parameters = [ + (ModuleIdentifier.canonicalName): "identifier", + (DependencyResolver.canonicalName): "dependencyResolver", + (abstractFQN.typeName): "oldModule", + (AutoCloseable.canonicalName): "oldInstance" + ] + return getConstructorStart(abstractFQN, parameters, "") + } +} diff --git a/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/gofactory/ConcreteModuleGeneratedObjectFactory.java b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/gofactory/ConcreteModuleGeneratedObjectFactory.java new file mode 100644 index 0000000000..fbc507d0b4 --- /dev/null +++ b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/gofactory/ConcreteModuleGeneratedObjectFactory.java @@ -0,0 +1,101 @@ +package org.opendaylight.controller.config.yangjmxgenerator.plugin.gofactory; + +import com.google.common.base.Joiner; +import com.google.common.base.Optional; +import org.opendaylight.controller.config.api.DependencyResolver; +import org.opendaylight.controller.config.api.ModuleIdentifier; +import org.opendaylight.controller.config.yangjmxgenerator.ModuleMXBeanEntry; +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.java.GeneratedObjectBuilder; +import org.opendaylight.controller.config.yangjmxgenerator.plugin.java.JavaFileInputBuilder; +import org.opendaylight.controller.config.yangjmxgenerator.plugin.java.TypeName; + +import java.util.LinkedHashMap; + +public class ConcreteModuleGeneratedObjectFactory { + + public GeneratedObject toGeneratedObject(ModuleMXBeanEntry mbe, Optional copyright, Optional header) { + FullyQualifiedName concreteFQN = new FullyQualifiedName(mbe.getPackageName(), mbe.getStubModuleName()); + FullyQualifiedName abstractFQN = new FullyQualifiedName(mbe.getPackageName(), mbe.getAbstractModuleName()); + Optional classJavaDoc = Optional.fromNullable(mbe.getNullableDescription()); + return toGeneratedObject(concreteFQN, abstractFQN, copyright, header, classJavaDoc); + } + + GeneratedObject toGeneratedObject(FullyQualifiedName concreteFQN, + FullyQualifiedName abstractFQN, + Optional copyright, + Optional header, + Optional classJavaDoc) { + // there are two constructors and two methods + JavaFileInputBuilder builder = new JavaFileInputBuilder(); + builder.setTypeName(TypeName.classType); + builder.setFqn(concreteFQN); + builder.addExtendsFQN(abstractFQN); + + builder.setCopyright(copyright); + builder.setHeader(header); + builder.setClassJavaDoc(classJavaDoc); + + builder.addToBody(getNewCtor(concreteFQN)); + builder.addToBody(getCopyCtor(concreteFQN)); + builder.addToBody(getCustomValidationStub()); + builder.addToBody(getCreateInstanceStub()); + + return new GeneratedObjectBuilder(builder.build()).toGeneratedObject(); + } + + private static String getNewCtor(FullyQualifiedName fqn) { + LinkedHashMap parameters = new LinkedHashMap(){ + { + put(ModuleIdentifier.class.getCanonicalName(), "identifier"); + put(DependencyResolver.class.getCanonicalName(), "dependencyResolver"); + } + }; + StringBuilder stringBuilder = getCtor(fqn, parameters); + return stringBuilder.toString(); + } + + private static StringBuilder getCtor(FullyQualifiedName fqn , LinkedHashMap parameters) { + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.append("public ").append(fqn.getTypeName()).append("("); + // parameters + stringBuilder.append(Joiner.on(", ").withKeyValueSeparator(" ").join(parameters)); + stringBuilder.append(") {\n"); + if (parameters.isEmpty() == false) { + stringBuilder.append("super("); + stringBuilder.append(Joiner.on(", ").join(parameters.values())); + stringBuilder.append(");\n"); + } + stringBuilder.append("}"); + return stringBuilder; + } + + private static String getCopyCtor(final FullyQualifiedName fqn) { + LinkedHashMap parameters = new LinkedHashMap(){ + { + put(ModuleIdentifier.class.getCanonicalName(), "identifier"); + put(DependencyResolver.class.getCanonicalName(), "dependencyResolver"); + put(fqn.toString(), "oldModule"); + put(AutoCloseable.class.getCanonicalName(), "oldInstance"); + } + }; + StringBuilder stringBuilder = getCtor(fqn, parameters); + return stringBuilder.toString(); + } + + private static String getCustomValidationStub() { + return "@Override\n" + + "public void customValidation() {\n" + + "// add custom validation form module attributes here.\n" + + "}"; + } + + private static String getCreateInstanceStub() { + return "@Override\n" + + "public " + AutoCloseable.class.getCanonicalName() + " createInstance() {\n" + + "// TODO:implement\n" + + "throw new " + UnsupportedOperationException.class.getCanonicalName() + "();\n"+ + "}"; + } +} diff --git a/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/gofactory/GenericGeneratedObjectFactory.groovy b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/gofactory/GenericGeneratedObjectFactory.groovy new file mode 100644 index 0000000000..6504aac7d4 --- /dev/null +++ b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/gofactory/GenericGeneratedObjectFactory.groovy @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ + +package org.opendaylight.controller.config.yangjmxgenerator.plugin.gofactory + +import com.google.common.base.Optional +import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.FtlTemplate +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.java.GeneratedObjectBuilder +import org.opendaylight.controller.config.yangjmxgenerator.plugin.java.JavaFileInputBuilder + +public class GenericGeneratedObjectFactory { + + public GeneratedObject toGeneratedObject(FtlTemplate template, Optional copyright) { + JavaFileInputBuilder b = new JavaFileInputBuilder(); + b.setHeader(template.headerString) + b.setFqn(new FullyQualifiedName(template.packageName, template.typeDeclaration.name)) + b.setClassJavaDoc(template.maybeJavadoc) + template.annotations.each { b.addClassAnnotation(it) } + // type declaration + template.typeDeclaration.extended.each { b.addExtendsFQN(FullyQualifiedName.fromString(it)) } + template.typeDeclaration.implemented.each { b.addImplementsFQN(FullyQualifiedName.fromString(it)) } + b.setCopyright(copyright); + b.setTypeName(template.typeDeclaration.toTypeName()) + // fields + template.fields.each { b.addToBody(it.toString()) } + // constructors + template.constructors.each { b.addToBody(it.toString()) } + // methods + template.methods.each { b.addToBody(it.toString()) } + + return new GeneratedObjectBuilder(b.build()).toGeneratedObject(); + } +} diff --git a/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/java/FullyQualifiedName.java b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/java/FullyQualifiedName.java new file mode 100644 index 0000000000..f72551a377 --- /dev/null +++ b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/java/FullyQualifiedName.java @@ -0,0 +1,81 @@ +package org.opendaylight.controller.config.yangjmxgenerator.plugin.java; + +import java.io.File; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import static com.google.common.base.Preconditions.checkNotNull; + +public class FullyQualifiedName { + + private final String packageName; + private final String typeName; + + public FullyQualifiedName(String packageName, String typeName) { + this.packageName = checkNotNull(packageName); + this.typeName = checkNotNull(typeName); + } + + public FullyQualifiedName(Class clazz) { + this(clazz.getPackage().getName(), clazz.getSimpleName()); + } + + public static FullyQualifiedName fromString(String fqn) { + Matcher m = Pattern.compile("(.*)\\.([^\\.]+)$").matcher(fqn); + if (m.matches()) { + return new FullyQualifiedName(m.group(1), m.group(2)); + } else { + return new FullyQualifiedName("", fqn); + } + } + + public String getPackageName() { + return packageName; + } + + public String getTypeName() { + return typeName; + } + + public File toFile(File srcDirectory) { + String directory = packageName.replace(".", File.separator); + return new File(srcDirectory, directory + File.separator + typeName + ".java"); + } + + + @Override + public String toString() { + if (packageName.isEmpty()){ + return typeName; + } + return packageName + "." + typeName; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + + FullyQualifiedName that = (FullyQualifiedName) o; + + if (!packageName.equals(that.packageName)) { + return false; + } + if (!typeName.equals(that.typeName)) { + return false; + } + + return true; + } + + @Override + public int hashCode() { + int result = packageName.hashCode(); + result = 31 * result + typeName.hashCode(); + return result; + } +} diff --git a/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/java/GeneratedObject.java b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/java/GeneratedObject.java new file mode 100644 index 0000000000..4ad080c6f5 --- /dev/null +++ b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/java/GeneratedObject.java @@ -0,0 +1,75 @@ +package org.opendaylight.controller.config.yangjmxgenerator.plugin.java; + +import com.google.common.base.Optional; +import com.google.common.collect.Maps; +import org.apache.commons.io.FileUtils; +import org.opendaylight.controller.config.yangjmxgenerator.plugin.util.StringUtil; + +import java.io.File; +import java.io.IOException; +import java.util.Map.Entry; + +import static com.google.common.base.Preconditions.checkNotNull; + +public class GeneratedObject { + + private final FullyQualifiedName fqn; + private final String content; + + public GeneratedObject(FullyQualifiedName fqn, String content) { + this.fqn = checkNotNull(fqn); + this.content = StringUtil.formatJavaSource(checkNotNull(content)); + } + + public FullyQualifiedName getFQN(){ + return fqn; + } + + public String getContent() { + return content; + } + + public Optional> persist(File srcDirectory, boolean overwrite) throws IOException { + File dstFile = fqn.toFile(srcDirectory); + if (overwrite == true || dstFile.exists() == false) { + FileUtils.write(dstFile, content); + return Optional.of(Maps.immutableEntry(fqn, dstFile)); + } else { + return Optional.absent(); + } + } + + public Optional> persist(File srcDirectory) throws IOException { + return persist(srcDirectory, true); + } + + @Override + public String toString() { + return getClass().getSimpleName() + "{" + + "fqn=" + fqn + + '}'; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + + GeneratedObject that = (GeneratedObject) o; + + if (!fqn.equals(that.fqn)) { + return false; + } + + return true; + } + + @Override + public int hashCode() { + return fqn.hashCode(); + } +} diff --git a/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/java/GeneratedObjectBuilder.java b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/java/GeneratedObjectBuilder.java new file mode 100644 index 0000000000..72819db9cf --- /dev/null +++ b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/java/GeneratedObjectBuilder.java @@ -0,0 +1,68 @@ +package org.opendaylight.controller.config.yangjmxgenerator.plugin.java; + +import com.google.common.base.Optional; +import org.opendaylight.controller.config.yangjmxgenerator.plugin.util.StringUtil; + +import static org.opendaylight.controller.config.yangjmxgenerator.plugin.util.StringUtil.prefixAndJoin; + +public class GeneratedObjectBuilder { + private final JavaFileInput input; + + public GeneratedObjectBuilder(JavaFileInput input) { + this.input = input; + } + + + public GeneratedObject toGeneratedObject() { + FullyQualifiedName fqn = input.getFQN(); + StringBuilder content = new StringBuilder(); + + + content.append(maybeAddComment(input.getCopyright())); + content.append(maybeAddComment(input.getHeader())); + + if (input.getFQN().getPackageName().isEmpty() == false) { + content.append("package "); + content.append(input.getFQN().getPackageName()); + content.append(";\n"); + } + content.append(maybeAddComment(input.getClassJavaDoc(), true)); + + for (String classAnnotation : input.getClassAnnotations()) { + content.append(classAnnotation); + content.append("\n"); + } + + content.append("public "); + content.append(input.getType()); + content.append(" "); + content.append(input.getFQN().getTypeName()); + content.append(prefixAndJoin(input.getExtends(), "extends")); + content.append(prefixAndJoin(input.getImplements(), "implements")); + content.append(" {\n"); + + for (String method : input.getBodyElements()) { + content.append(method); + content.append("\n"); + } + + content.append("\n}\n"); + + return new GeneratedObject(fqn, content.toString()); + } + + private static String maybeAddComment(Optional comment) { + return maybeAddComment(comment, false); + } + + private static String maybeAddComment(Optional comment, boolean isJavadoc) { + + if (comment.isPresent()) { + String input = comment.get(); + return StringUtil.writeComment(input, isJavadoc); + } else { + return ""; + } + } + +} diff --git a/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/java/JavaFileInput.java b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/java/JavaFileInput.java new file mode 100644 index 0000000000..ba8537bea0 --- /dev/null +++ b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/java/JavaFileInput.java @@ -0,0 +1,27 @@ +package org.opendaylight.controller.config.yangjmxgenerator.plugin.java; + +import com.google.common.base.Optional; + +import java.util.List; + +public interface JavaFileInput { + + FullyQualifiedName getFQN(); + + Optional getCopyright(); + + Optional getHeader(); + + TypeName getType(); + + Optional getClassJavaDoc(); + + List getClassAnnotations(); + + List getExtends(); + + List getImplements(); + + List getBodyElements(); + +} diff --git a/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/java/JavaFileInputBuilder.java b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/java/JavaFileInputBuilder.java new file mode 100644 index 0000000000..c739f57730 --- /dev/null +++ b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/java/JavaFileInputBuilder.java @@ -0,0 +1,164 @@ +/* + * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ + +package org.opendaylight.controller.config.yangjmxgenerator.plugin.java; + +import com.google.common.base.Optional; +import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.model.Annotation; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import static com.google.common.base.Preconditions.checkNotNull; + +public class JavaFileInputBuilder { + + private Optional copyright = Optional.absent(), header = Optional.absent(), classJavaDoc = Optional.absent(); + + private TypeName typeName = TypeName.classType; + + private FullyQualifiedName fqn; + + private final List classAnnotations = new ArrayList<>(); + + private final List extendsFQNs = new ArrayList<>(); + + private final List implementsFQNs = new ArrayList<>(); + + private final List bodyElements = new ArrayList<>(); + + public void addToBody(String element) { + bodyElements.add(element + "\n"); + } + + public void addClassAnnotation(Annotation annotation) { + addClassAnnotation(annotation.toString()); + } + + public void addClassAnnotation(String annotation) { + classAnnotations.add(checkNotNull(annotation)); + } + + public void addExtendsFQN(FullyQualifiedName fqn) { + extendsFQNs.add(fqn); + } + + public void addImplementsFQN(FullyQualifiedName fqn) { + implementsFQNs.add(fqn); + } + + public Optional getCopyright() { + return copyright; + } + + public void setCopyright(Optional copyright) { + this.copyright = checkNotNull(copyright); + } + + public Optional getHeader() { + return header; + } + + public void setHeader(Optional header) { + this.header = checkNotNull(header); + } + + + public Optional getClassJavaDoc() { + return classJavaDoc; + } + + public void setClassJavaDoc(Optional classJavaDoc) { + this.classJavaDoc = checkNotNull(classJavaDoc); + } + + + public FullyQualifiedName getFqn() { + return fqn; + } + + public void setFqn(FullyQualifiedName fqn) { + this.fqn = fqn; + } + + public List getExtendsFQNs() { + return extendsFQNs; + } + + + public List getImplementsFQNs() { + return implementsFQNs; + } + + + public TypeName getTypeName() { + return typeName; + } + + public void setTypeName(TypeName typeName) { + this.typeName = typeName; + } + + + public JavaFileInput build() { + checkNotNull(copyright); + checkNotNull(header); + checkNotNull(classJavaDoc); + checkNotNull(typeName); + checkNotNull(fqn); + + return new JavaFileInput() { + + @Override + public FullyQualifiedName getFQN() { + return fqn; + } + + @Override + public Optional getCopyright() { + return copyright; + } + + @Override + public Optional getHeader() { + return header; + } + + @Override + public Optional getClassJavaDoc() { + return classJavaDoc; + } + + @Override + public TypeName getType() { + return typeName; + } + + @Override + public List getExtends() { + return Collections.unmodifiableList(extendsFQNs); + } + + @Override + public List getImplements() { + return Collections.unmodifiableList(implementsFQNs); + } + + @Override + public List getClassAnnotations() { + return Collections.unmodifiableList(classAnnotations); + } + + @Override + public List getBodyElements() { + return Collections.unmodifiableList(bodyElements); + } + }; + } +} diff --git a/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/java/TypeName.java b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/java/TypeName.java new file mode 100644 index 0000000000..d6ed12dbfe --- /dev/null +++ b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/java/TypeName.java @@ -0,0 +1,17 @@ +package org.opendaylight.controller.config.yangjmxgenerator.plugin.java; + +public enum TypeName { + + classType("class"), interfaceType("interface"), enumType("enum"), absClassType("abstract class"), finalClassType("final class"); + + private final String value; + + TypeName(String value) { + this.value = value; + } + + @Override + public String toString() { + return value; + } +} diff --git a/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/util/StringUtil.java b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/util/StringUtil.java new file mode 100644 index 0000000000..265aea10c5 --- /dev/null +++ b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/util/StringUtil.java @@ -0,0 +1,101 @@ +package org.opendaylight.controller.config.yangjmxgenerator.plugin.util; + +import com.google.common.base.Joiner; +import com.google.common.base.Optional; +import com.google.common.base.Splitter; +import com.google.common.base.Strings; +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.StringUtils; +import org.opendaylight.controller.config.yangjmxgenerator.plugin.java.FullyQualifiedName; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.io.InputStream; +import java.util.List; +import java.util.regex.Pattern; + +public class StringUtil { + private static final Logger logger = LoggerFactory.getLogger(StringUtils.class); + + /** + * @param list of strings to be joined by ',' + * @param prefix e.g. 'extends' or 'implements' + */ + public static String prefixAndJoin(List list, String prefix) { + if (list.isEmpty()) { + return ""; + } + Joiner joiner = Joiner.on(","); + return " " + prefix + " " + joiner.join(list); + } + + public static String addAsterixAtEachLineStart(String input) { + String s = Pattern.compile("^", Pattern.MULTILINE).matcher(input).replaceAll("* "); + // remove trailing spaces + s = Pattern.compile("\\s+$", Pattern.MULTILINE).matcher(s).replaceAll(""); + s = ensureEndsWithSingleNewLine(s); + return s; + } + + private static String ensureEndsWithSingleNewLine(String s) { + // .split Only trailing empty strings are skipped. + String[] split = s.split("\n"); + s = Joiner.on("\n").join(split); + s = s + "\n"; + return s; + } + + public static String writeComment(String input, boolean isJavadoc) { + StringBuilder content = new StringBuilder(); + content.append("/*"); + if (isJavadoc) { + content.append("*"); + } + content.append("\n"); + + content.append(addAsterixAtEachLineStart(input)); + content.append("*/\n"); + return content.toString(); + } + + + public static Optional loadCopyright() { + try (InputStream in = StringUtil.class.getResourceAsStream("/copyright.txt")) { + if (in != null) { + return Optional.of(IOUtils.toString(in)); + } + } catch (IOException e) { + logger.warn("Cannot load copyright.txt", e); + } + return Optional.absent(); + } + + public static String formatJavaSource(String input) { + Iterable split = Splitter.on("\n").trimResults().split(input); + + int basicIndent = 4; + StringBuilder sb = new StringBuilder(); + int intends = 0, empty = 0; + for (String line : split) { + intends -= StringUtils.countMatches(line, "}"); + if (intends < 0) { + intends = 0; + } + if (line.isEmpty() == false) { + sb.append(Strings.repeat(" ", basicIndent * intends)); + sb.append(line); + sb.append("\n"); + empty = 0; + } else { + empty++; // one empty line is allowed + if (empty < 2) { + sb.append("\n"); + } + } + intends += StringUtils.countMatches(line, "{"); + } + return ensureEndsWithSingleNewLine(sb.toString()); + } + +} diff --git a/opendaylight/config/yang-jmx-generator-plugin/src/main/resources/copyright.txt b/opendaylight/config/yang-jmx-generator-plugin/src/main/resources/copyright.txt new file mode 100644 index 0000000000..4a0c355685 --- /dev/null +++ b/opendaylight/config/yang-jmx-generator-plugin/src/main/resources/copyright.txt @@ -0,0 +1,5 @@ +Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. + +This program and the accompanying materials are made available under the +terms of the Eclipse Public License v1.0 which accompanies this distribution, +and is available at http://www.eclipse.org/legal/epl-v10.html diff --git a/opendaylight/config/yang-jmx-generator-plugin/src/main/resources/freeMarker/abstract_ftl_file.ftl b/opendaylight/config/yang-jmx-generator-plugin/src/main/resources/freeMarker/abstract_ftl_file.ftl deleted file mode 100644 index 0c6bf839fa..0000000000 --- a/opendaylight/config/yang-jmx-generator-plugin/src/main/resources/freeMarker/abstract_ftl_file.ftl +++ /dev/null @@ -1,15 +0,0 @@ -<@headerD header=header/> -package ${packageName}; - -<@javadocD object=javadoc/> -<@annotationsD object=annotations/> -<#-- class/interface --> -<@typeDeclarationD object=typeDeclaration/> -{ - -<@constructorsD object=constructors> - -<@fieldsD object=fields/> - -<@methodsD object=methods/> -} diff --git a/opendaylight/config/yang-jmx-generator-plugin/src/main/resources/freeMarker/factory_abs_template.ftl b/opendaylight/config/yang-jmx-generator-plugin/src/main/resources/freeMarker/factory_abs_template.ftl deleted file mode 100644 index b9bbf1f1b5..0000000000 --- a/opendaylight/config/yang-jmx-generator-plugin/src/main/resources/freeMarker/factory_abs_template.ftl +++ /dev/null @@ -1,82 +0,0 @@ -<@headerD header=header/> -package ${packageName}; - -<@javadocD object=javadoc/> -@org.opendaylight.yangtools.yang.binding.annotations.ModuleQName(namespace="${mbe.getYangModuleQName().getNamespace().toString()}",revision="${mbe.getYangModuleQName().getFormattedRevision()}",name="${mbe.getYangModuleQName().getLocalName()}") -<@typeDeclarationD object=typeDeclaration/> -{ - - public static final java.lang.String NAME = "${globallyUniqueName}"; - private static final java.util.Set> serviceIfcs; - <#if providedServices??> - static { - java.util.Set> serviceIfcs2 = new java.util.HashSet>(); - <#list providedServices as refId> - serviceIfcs2.add(${refId}); - - serviceIfcs = java.util.Collections.unmodifiableSet(serviceIfcs2); - } - - - @Override - public final boolean isModuleImplementingServiceInterface(Class serviceInterface) { - for (Class ifc: serviceIfcs) { - if (serviceInterface.isAssignableFrom(ifc)){ - return true; - } - } - return false; - } - - @Override - public java.util.Set> getImplementedServiceIntefaces() { - return serviceIfcs; - } - - - @Override - public ${moduleType} createModule(String instanceName, ${dependencyResolverType} dependencyResolver, ${bundleContextType} bundleContext) { - return instantiateModule(instanceName, dependencyResolver, bundleContext); - } - - @Override - public ${moduleType} createModule(String instanceName, ${dependencyResolverType} dependencyResolver, ${dynamicMBeanWithInstanceType} old, ${bundleContextType} bundleContext) throws Exception { - ${moduleInstanceType} oldModule = null; - try { - oldModule = (${moduleInstanceType}) old.getModule(); - } catch(Exception e) { - return handleChangedClass(old); - } - ${moduleInstanceType} module = instantiateModule(instanceName, dependencyResolver, oldModule, old.getInstance(), bundleContext); - - <#list fields as attr> - module.set${attr.name}(oldModule.get${attr.name}()); - - - return module; - } - - public ${moduleInstanceType} instantiateModule(String instanceName, ${dependencyResolverType} dependencyResolver, ${moduleInstanceType} oldModule, ${instanceType} oldInstance, ${bundleContextType} bundleContext) { - return new ${moduleInstanceType}(new ${moduleNameType}(NAME, instanceName), dependencyResolver, oldModule, oldInstance); - } - - public ${moduleInstanceType} instantiateModule(String instanceName, ${dependencyResolverType} dependencyResolver, ${bundleContextType} bundleContext) { - return new ${moduleInstanceType}(new ${moduleNameType}(NAME, instanceName), dependencyResolver); - } - - @Override - public final String getImplementationName() { - return NAME; - } - - - public ${moduleInstanceType} handleChangedClass(${dynamicMBeanWithInstanceType} old) throws Exception { - throw new UnsupportedOperationException("Class reloading is not supported"); - } - - @Override - public java.util.Set<${moduleInstanceType}> getDefaultModules(org.opendaylight.controller.config.api.DependencyResolverFactory dependencyResolverFactory, ${bundleContextType} bundleContext) { - return new java.util.HashSet<${moduleInstanceType}>(); - } - -} diff --git a/opendaylight/config/yang-jmx-generator-plugin/src/main/resources/freeMarker/module_abs_template_new.ftl b/opendaylight/config/yang-jmx-generator-plugin/src/main/resources/freeMarker/module_abs_template_new.ftl deleted file mode 100644 index 848fcfe5fc..0000000000 --- a/opendaylight/config/yang-jmx-generator-plugin/src/main/resources/freeMarker/module_abs_template_new.ftl +++ /dev/null @@ -1,223 +0,0 @@ -<@headerD header=header/> -package ${packageName}; - -<@javadocD object=javadoc/> -<@annotationsD object=annotations/> -<@typeDeclarationD object=typeDeclaration/> -{ - // attributes - <@moduleFieldsD moduleFields=moduleFields/> - //attributes end - - private static final ${loggerType} logger = ${loggerFactoryType}.getLogger(${typeDeclaration.name}.class); - - private final ${typeDeclaration.name} oldModule; - private final ${instanceType} oldInstance; - private ${instanceType} instance; - private final ${dependencyResolverType} dependencyResolver; - private final ${moduleNameType} identifier; - <#if runtime=true> - private ${registratorType} rootRuntimeBeanRegistratorWrapper; - - - public ${typeDeclaration.name}(${moduleNameType} identifier, ${dependencyResolverType} dependencyResolver) { - this.identifier = identifier; - this.dependencyResolver = dependencyResolver; - this.oldInstance = null; - this.oldModule = null; - } - - public ${typeDeclaration.name}(${moduleNameType} identifier, ${dependencyResolverType} dependencyResolver, ${typeDeclaration.name} oldModule, ${instanceType} oldInstance) { - this.identifier = identifier; - this.dependencyResolver = dependencyResolver; - this.oldInstance = oldInstance; - this.oldModule = oldModule; - } - - // getters and setters exported into MXBean - <@methodsD object=methods/> - - <#if runtime=true> - public ${registratorType} getRootRuntimeBeanRegistratorWrapper(){ - return rootRuntimeBeanRegistratorWrapper; - } - - @Override - public void setRuntimeBeanRegistrator(${rootRuntimeRegistratorType} rootRuntimeRegistrator){ - this.rootRuntimeBeanRegistratorWrapper = new ${registratorType}(rootRuntimeRegistrator); - } - - - @Override - public void validate(){ - <#list moduleFields as field> - <#if field.dependent==true && field.dependency.mandatory==true> - <#if field.type?starts_with("java.util.List")> - for(javax.management.ObjectName dep : ${field.name}) { - dependencyResolver.validateDependency(${field.dependency.sie.fullyQualifiedName}.class, dep, ${field.name}JmxAttribute); - } - <#else> - dependencyResolver.validateDependency(${field.dependency.sie.fullyQualifiedName}.class, ${field.name}, ${field.name}JmxAttribute); - - - - customValidation(); - } - - protected void customValidation(){ - - } - - // caches of resolved dependencies - <#list moduleFields as field> - <#if field.dependent==true> - <#if field.type?starts_with("java.util.List")> - private java.util.List<${field.dependency.sie.exportedOsgiClassName}> ${field.name}Dependency = new java.util.ArrayList<${field.dependency.sie.exportedOsgiClassName}>(); - protected final java.util.List<${field.dependency.sie.exportedOsgiClassName}> get${field.attributeName}Dependency(){ - return ${field.name}Dependency; - } - <#else> - private ${field.dependency.sie.exportedOsgiClassName} ${field.name}Dependency; - protected final ${field.dependency.sie.exportedOsgiClassName} get${field.attributeName}Dependency(){ - return ${field.name}Dependency; - } - - - - - // caches of resolved IdentityRefs - <#list moduleFields as field> - <#if field.identityRef==true> - private ${field.identityClassType} ${field.identityClassName}; - - - - @Override - public final ${instanceType} getInstance(){ - if(instance==null) { - - <#list moduleFields as field> - <#if field.dependent==true> - <#if field.dependency.mandatory==false> - if(${field.name}!=null) { - - - <#if field.type?starts_with("java.util.List")> - ${field.name}Dependency = new java.util.ArrayList<${field.dependency.sie.exportedOsgiClassName}>(); - for(javax.management.ObjectName dep : ${field.name}) { - ${field.name}Dependency.add(dependencyResolver.resolveInstance(${field.dependency.sie.exportedOsgiClassName}.class, dep, ${field.name}JmxAttribute)); - } - <#else> - ${field.name}Dependency = dependencyResolver.resolveInstance(${field.dependency.sie.exportedOsgiClassName}.class, ${field.name}, ${field.name}JmxAttribute); - - - <#if field.dependency.mandatory==false> - } - - - - <#if field.needsDepResolver==true> - if(${field.name} != null) { - <#if field.type?starts_with("java.util.List")> - for(${field.type?substring(field.type?index_of("<") + 1, field.type?index_of(">"))} candidate : ${field.name}) { - candidate.injectDependencyResolver(dependencyResolver); - } - <#else> - ${field.name}.injectDependencyResolver(dependencyResolver); - - } - - - <#if field.identityRef==true> - if(${field.name} != null) { - set${field.attributeName}(${field.name}.resolveIdentity(dependencyResolver, ${field.identityBaseClass}.class)); - } - - - - if(oldInstance!=null && canReuseInstance(oldModule)) { - instance = reuseInstance(oldInstance); - } else { - if(oldInstance!=null) { - try { - oldInstance.close(); - } catch(Exception e) { - logger.error("An error occurred while closing old instance " + oldInstance, e); - } - } - instance = createInstance(); - } - } - return instance; - } - - @Override - public ${moduleNameType} getIdentifier() { - return identifier; - } - - public boolean canReuseInstance(${typeDeclaration.name} oldModule){ - // allow reusing of old instance if no parameters was changed - return isSame(oldModule); - } - - public ${instanceType} reuseInstance(${instanceType} oldInstance){ - // implement if instance reuse should be supported. Override canReuseInstance to change the criteria. - return oldInstance; - } - - public abstract ${instanceType} createInstance(); - - public boolean isSame(${typeDeclaration.name} other) { - if (other == null) { - throw new IllegalArgumentException("Parameter 'other' is null"); - } - <#list moduleFields as field> - <#if field.dependent==true && field.listOfDependencies == false> - if (${field.name}Dependency != other.${field.name}Dependency) { // reference to dependency must be same - return false; - } - <#elseif field.listOfDependencies> - if (${field.name}Dependency.equals(other.${field.name}Dependency) == false) { - return false; - } - for (int idx = 0; idx < ${field.name}Dependency.size(); idx++) { - if (${field.name}Dependency.get(idx) != other.${field.name}Dependency.get(idx)) { - return false; - } - } - <#else> - if (${field.name} == null) { - if (other.${field.name} != null) { - return false; - } - } else if - <#if field.array == false> - (${field.name}.equals(other.${field.name}) == false) - <#else> - (java.util.Arrays.equals(${field.name},other.${field.name}) == false) - - { - return false; - } - - - - return true; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - ${typeDeclaration.name} that = (${typeDeclaration.name}) o; - - return identifier.equals(that.identifier); - } - - @Override - public int hashCode() { - return identifier.hashCode(); - } -} diff --git a/opendaylight/config/yang-jmx-generator-plugin/src/main/resources/freeMarker/module_stub_template.ftl b/opendaylight/config/yang-jmx-generator-plugin/src/main/resources/freeMarker/module_stub_template.ftl deleted file mode 100644 index 2db505e54e..0000000000 --- a/opendaylight/config/yang-jmx-generator-plugin/src/main/resources/freeMarker/module_stub_template.ftl +++ /dev/null @@ -1,27 +0,0 @@ -<@headerD header=header/> -package ${packageName}; - -<@javadocD object=javadoc/> -<@typeDeclarationD object=typeDeclaration/> { - - public ${typeDeclaration.name}(${moduleNameType} identifier, ${dependencyResolverType} dependencyResolver) { - super(identifier, dependencyResolver); - } - - public ${typeDeclaration.name}(${moduleNameType} identifier, ${dependencyResolverType} dependencyResolver, - ${typeDeclaration.name} oldModule, ${instanceType} oldInstance) { - - super(identifier, dependencyResolver, oldModule, oldInstance); - } - - @Override - protected void customValidation(){ - // Add custom validation for module attributes here. - } - - @Override - public ${instanceType} createInstance() { - //TODO:implement - <@unimplementedExceptionD/> - } -} diff --git a/opendaylight/config/yang-jmx-generator-plugin/src/test/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/AbstractGeneratorTest.java b/opendaylight/config/yang-jmx-generator-plugin/src/test/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/AbstractGeneratorTest.java index 9e2f334dac..1dde94b482 100644 --- a/opendaylight/config/yang-jmx-generator-plugin/src/test/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/AbstractGeneratorTest.java +++ b/opendaylight/config/yang-jmx-generator-plugin/src/test/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/AbstractGeneratorTest.java @@ -7,12 +7,12 @@ */ package org.opendaylight.controller.config.yangjmxgenerator.plugin; -import java.io.File; - import org.apache.commons.io.FileUtils; import org.junit.Before; import org.opendaylight.controller.config.yangjmxgenerator.AbstractYangTest; +import java.io.File; + public abstract class AbstractGeneratorTest extends AbstractYangTest { private static final File GENERATOR_OUTPUT_PATH_ROOT = new File( "target/testgen"); diff --git a/opendaylight/config/yang-jmx-generator-plugin/src/test/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/JMXGeneratorTest.java b/opendaylight/config/yang-jmx-generator-plugin/src/test/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/JMXGeneratorTest.java index 3ef406694a..0fd9720f79 100644 --- a/opendaylight/config/yang-jmx-generator-plugin/src/test/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/JMXGeneratorTest.java +++ b/opendaylight/config/yang-jmx-generator-plugin/src/test/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/JMXGeneratorTest.java @@ -119,7 +119,7 @@ public class JMXGeneratorTest extends AbstractGeneratorTest { + JMXGenerator.NAMESPACE_TO_PACKAGE_DIVIDER + PackageTranslatorTest.EXPECTED_PACKAGE_PREFIX); map.put(JMXGenerator.MODULE_FACTORY_FILE_BOOLEAN, "false"); - jmxGenerator = new JMXGenerator(new FreeMarkerCodeWriterImpl()); + jmxGenerator = new JMXGenerator(new CodeWriter()); jmxGenerator.setAdditionalConfig(map); File targetDir = new File(generatorOutputPath, "target"); generatedResourcesDir = new File(targetDir, "generated-resources"); diff --git a/opendaylight/config/yang-jmx-generator-plugin/src/test/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ModuleMXBeanEntryTemplatesTest.java b/opendaylight/config/yang-jmx-generator-plugin/src/test/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ModuleMXBeanEntryTemplatesTest.java index 48d5b30eb2..3c01cc00d4 100644 --- a/opendaylight/config/yang-jmx-generator-plugin/src/test/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ModuleMXBeanEntryTemplatesTest.java +++ b/opendaylight/config/yang-jmx-generator-plugin/src/test/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ModuleMXBeanEntryTemplatesTest.java @@ -34,7 +34,7 @@ public class ModuleMXBeanEntryTemplatesTest { assertNotNull(template); } - private ModuleMXBeanEntry mockMbe(String packageName) { + public static ModuleMXBeanEntry mockMbe(String packageName) { ModuleMXBeanEntry mbe = mock(ModuleMXBeanEntry.class); Map a = Maps.newHashMap(); JavaAttribute attr = mockJavaAttr(); @@ -52,7 +52,7 @@ public class ModuleMXBeanEntryTemplatesTest { return mbe; } - private JavaAttribute mockJavaAttr() { + public static JavaAttribute mockJavaAttr() { JavaAttribute attr = mock(JavaAttribute.class); Type typeA = mock(Type.class); doReturn("package").when(typeA).getName(); diff --git a/opendaylight/config/yang-jmx-generator-plugin/src/test/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/RuntimeRegistratorFtlFileTest.java b/opendaylight/config/yang-jmx-generator-plugin/src/test/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/RuntimeRegistratorFtlFileTest.java index b12ee5023f..f21765e536 100644 --- a/opendaylight/config/yang-jmx-generator-plugin/src/test/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/RuntimeRegistratorFtlFileTest.java +++ b/opendaylight/config/yang-jmx-generator-plugin/src/test/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/RuntimeRegistratorFtlFileTest.java @@ -7,26 +7,21 @@ */ package org.opendaylight.controller.config.yangjmxgenerator.plugin; -import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.CoreMatchers.not; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertThat; -import static org.junit.internal.matchers.StringContains.containsString; - -import java.util.Arrays; -import java.util.Collections; -import java.util.Map; - import org.junit.Test; import org.opendaylight.controller.config.yangjmxgenerator.RuntimeBeanEntry; import org.opendaylight.controller.config.yangjmxgenerator.RuntimeRegistratorTest; -import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.FtlFilePersister; import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.FtlTemplate; import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.RuntimeRegistratorFtlTemplate; -import org.opendaylight.controller.config.yangjmxgenerator.plugin.util.FormattingUtil; + +import java.util.Arrays; +import java.util.Collections; +import java.util.Map; + +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertThat; public class RuntimeRegistratorFtlFileTest extends RuntimeRegistratorTest { - private final FtlFilePersister ftlFilePersister = new FtlFilePersister(); @Test public void testRootWithoutAnything() { @@ -40,9 +35,7 @@ public class RuntimeRegistratorFtlFileTest extends RuntimeRegistratorTest { FtlTemplate rootFtlFile = createdFtls.get(rootRegistratorName); assertNotNull(rootFtlFile); - Map serializedFtls = ftlFilePersister - .serializeFtls(createdFtls.values()); - assertThat(serializedFtls.size(), is(2)); + assertThat(createdFtls.values().size(), is(2)); } @Test @@ -55,29 +48,6 @@ public class RuntimeRegistratorFtlFileTest extends RuntimeRegistratorTest { Map createdFtls = RuntimeRegistratorFtlTemplate .create(rootRB); - Map serializedFtls = ftlFilePersister - .serializeFtls(createdFtls.values()); - assertThat(serializedFtls.size(), is(4)); - - assertThat( - findRegistrationOutput(createdFtls, grandChildRB, - serializedFtls), not(containsString(" register("))); - - FtlTemplate registrator = createdFtls.get(RuntimeRegistratorFtlTemplate - .getJavaNameOfRuntimeRegistrator(rootRB)); - FormattingUtil.cleanUpEmptyLinesAndIndent(serializedFtls - .get(registrator)); - + assertThat(createdFtls.values().size(), is(4)); } - - private String findRegistrationOutput(Map createdFtls, - RuntimeBeanEntry rb, Map serializedFtls) { - RuntimeRegistratorFtlTemplate rbFtlFile = (RuntimeRegistratorFtlTemplate) createdFtls - .get(RuntimeRegistratorFtlTemplate.getJavaNameOfRuntimeRegistration(rb.getJavaNamePrefix())); - assertNotNull(rbFtlFile); - String unformatted = serializedFtls.get(rbFtlFile); - assertNotNull(unformatted); - return FormattingUtil.cleanUpEmptyLinesAndIndent(unformatted); - } - } diff --git a/opendaylight/config/yang-jmx-generator-plugin/src/test/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/FtlFilePersisterTest.java b/opendaylight/config/yang-jmx-generator-plugin/src/test/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/FtlFilePersisterTest.java deleted file mode 100644 index 2582a602b3..0000000000 --- a/opendaylight/config/yang-jmx-generator-plugin/src/test/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/FtlFilePersisterTest.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl; - -import static org.junit.Assert.assertEquals; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import java.util.Map; - -import org.junit.Before; -import org.junit.Test; -import org.mockito.MockitoAnnotations; -import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.model.Field; -import org.opendaylight.controller.config.yangjmxgenerator.plugin.ftl.model.MethodDeclaration; -import org.opendaylight.controller.config.yangjmxgenerator.plugin.util.FormattingUtil; - -import com.google.common.collect.Lists; - -public class FtlFilePersisterTest { - private final FtlFilePersister tested = new FtlFilePersister(); - - @Before - public void setUp() { - MockitoAnnotations.initMocks(this); - } - - @Test - public void testGeneralInterface() { - String packageName = "pa.cka.ge"; - String name = "GeneralClassImpl"; - List extendedInterfaces = Arrays.asList("List", "Set"); - List methods = new ArrayList<>(); - methods.add(new MethodDeclaration("String", "executeOperation", - Collections. emptyList())); - - List mods = Lists.newArrayList(); - List mods2 = Lists.newArrayList("final"); - methods.add(new MethodDeclaration("String", "executeOperation", Arrays - .asList(new Field(mods, "int", "param1"), new Field(mods2, "long", "param2")))); - - GeneralInterfaceTemplate generalInterface = new GeneralInterfaceTemplate( - null, packageName, name, extendedInterfaces, methods); - - Map abstractFtlFileStringMap = tested - .serializeFtls(Arrays.asList(generalInterface)); - String content = FormattingUtil - .cleanUpEmptyLinesAndIndent(abstractFtlFileStringMap.get(generalInterface)); - - // skip header - content = content.substring(content.indexOf("package")); - - String expected = "package pa.cka.ge;\n" - + "/**\n" - + "*\n" - + "*/\n" - + "public interface GeneralClassImpl extends List, Set\n{\n" - + "public String executeOperation();\n" - + "public String executeOperation(int param1, final long param2);\n" - + "}\n"; - - assertEquals(expected, content); - } - -} diff --git a/opendaylight/config/yang-jmx-generator-plugin/src/test/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/module/AbstractGeneratedObjectTest.java b/opendaylight/config/yang-jmx-generator-plugin/src/test/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/module/AbstractGeneratedObjectTest.java new file mode 100644 index 0000000000..957fbf5251 --- /dev/null +++ b/opendaylight/config/yang-jmx-generator-plugin/src/test/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/module/AbstractGeneratedObjectTest.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ + +package org.opendaylight.controller.config.yangjmxgenerator.plugin.module; + +import net.sourceforge.pmd.lang.Parser; +import net.sourceforge.pmd.lang.ParserOptions; +import net.sourceforge.pmd.lang.ast.Node; +import net.sourceforge.pmd.lang.java.Java17Parser; +import org.apache.commons.io.FileUtils; +import org.opendaylight.controller.config.yangjmxgenerator.plugin.AbstractGeneratorTest; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.File; +import java.io.FileReader; +import java.io.IOException; + +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +public class AbstractGeneratedObjectTest extends AbstractGeneratorTest { + private static final Logger logger = LoggerFactory.getLogger(AbstractGeneratedObjectTest.class); + + protected void assertHasMethodNamed(Node c, String method) { + assertTrue(c.hasDescendantMatchingXPath("//MethodDeclaration[MethodDeclarator[@Image='" + + method + + "']]")); + } + + protected Node parse(File dstFile) throws IOException { + assertNotNull(dstFile); + logger.debug(FileUtils.readFileToString(dstFile)); + Parser parser = new Java17Parser(new ParserOptions()); + return parser.parse(dstFile.toString(), new FileReader(dstFile)); + } + + +} diff --git a/opendaylight/config/yang-jmx-generator-plugin/src/test/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/module/abs/AbsModuleGeneratedObjectFactoryTest.java b/opendaylight/config/yang-jmx-generator-plugin/src/test/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/module/abs/AbsModuleGeneratedObjectFactoryTest.java new file mode 100644 index 0000000000..164d1a5f58 --- /dev/null +++ b/opendaylight/config/yang-jmx-generator-plugin/src/test/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/module/abs/AbsModuleGeneratedObjectFactoryTest.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ + +package org.opendaylight.controller.config.yangjmxgenerator.plugin.module.abs; + +import com.google.common.base.Optional; +import org.junit.Test; +import org.opendaylight.controller.config.yangjmxgenerator.ModuleMXBeanEntry; +import org.opendaylight.controller.config.yangjmxgenerator.ServiceInterfaceEntry; +import org.opendaylight.controller.config.yangjmxgenerator.plugin.gofactory.AbsModuleGeneratedObjectFactory; +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.module.AbstractGeneratedObjectTest; +import org.opendaylight.yangtools.yang.common.QName; + +import java.io.File; +import java.io.IOException; +import java.util.Map; +import java.util.Map.Entry; + +public class AbsModuleGeneratedObjectFactoryTest extends AbstractGeneratedObjectTest { + + @Test + public void test() throws IOException { + Map serviceInterfaceEntryMap = loadThreadsServiceInterfaceEntries("packages.sis"); + Map namesToMBEs = loadThreadsJava(serviceInterfaceEntryMap, "packages.pack2"); + ModuleMXBeanEntry dynamicThreadPool = namesToMBEs.get(THREADPOOL_DYNAMIC_MXB_NAME); + parseGeneratedFile(dynamicThreadPool); + + } + + private void parseGeneratedFile(ModuleMXBeanEntry moduleMXBeanEntry) throws IOException { + Optional copyright = Optional.absent(); + GeneratedObject generatedObject = new AbsModuleGeneratedObjectFactory().toGeneratedObject(moduleMXBeanEntry, copyright); + Entry entry = generatedObject.persist(generatorOutputPath).get(); + + File dstFile = entry.getValue(); + parse(dstFile); + } +} diff --git a/opendaylight/config/yang-jmx-generator-plugin/src/test/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/module/concrete/ConcreteModuleGeneratedObjectFactoryTest.java b/opendaylight/config/yang-jmx-generator-plugin/src/test/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/module/concrete/ConcreteModuleGeneratedObjectFactoryTest.java new file mode 100644 index 0000000000..519b0edf42 --- /dev/null +++ b/opendaylight/config/yang-jmx-generator-plugin/src/test/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/module/concrete/ConcreteModuleGeneratedObjectFactoryTest.java @@ -0,0 +1,52 @@ +package org.opendaylight.controller.config.yangjmxgenerator.plugin.module.concrete; + +import com.google.common.base.Optional; +import net.sourceforge.pmd.lang.ast.Node; +import net.sourceforge.pmd.lang.java.ast.ASTClassOrInterfaceDeclaration; +import net.sourceforge.pmd.lang.java.ast.ASTCompilationUnit; +import org.junit.Test; +import org.opendaylight.controller.config.yangjmxgenerator.ModuleMXBeanEntry; +import org.opendaylight.controller.config.yangjmxgenerator.plugin.gofactory.ConcreteModuleGeneratedObjectFactory; +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.module.AbstractGeneratedObjectTest; + +import java.io.File; +import java.util.Map.Entry; + +import static org.junit.Assert.assertEquals; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; + +public class ConcreteModuleGeneratedObjectFactoryTest extends AbstractGeneratedObjectTest { + + @Test + public void test() throws Exception { + FullyQualifiedName fqn = new FullyQualifiedName("foo.bar", "Baz"); + FullyQualifiedName abstractFQN = new FullyQualifiedName("foo.bar", "AbstractBaz"); + String nullableDescription = null; + + ModuleMXBeanEntry moduleMXBeanEntry = mockModuleMXBeanEntry(fqn, abstractFQN, nullableDescription); + Optional copyright = Optional.absent(); + Optional header = Optional.absent(); + GeneratedObject go = new ConcreteModuleGeneratedObjectFactory().toGeneratedObject(moduleMXBeanEntry, copyright, header); + Entry entry = go.persist(generatorOutputPath).get(); + + File dstFile = entry.getValue(); + Node c = parse(dstFile); + assertEquals(fqn.getPackageName(), ((ASTCompilationUnit) c).getPackageDeclaration().getPackageNameImage()); + assertEquals(fqn.getTypeName(), c.getFirstDescendantOfType(ASTClassOrInterfaceDeclaration.class).getImage()); + assertHasMethodNamed(c, "customValidation"); + assertHasMethodNamed(c, "createInstance"); + } + + static ModuleMXBeanEntry mockModuleMXBeanEntry(FullyQualifiedName fqn, FullyQualifiedName abstractFQN, String nullableDescription) { + ModuleMXBeanEntry mock = mock(ModuleMXBeanEntry.class); + assertEquals(fqn.getPackageName(), abstractFQN.getPackageName()); + doReturn(fqn.getPackageName()).when(mock).getPackageName(); + doReturn(fqn.getTypeName()).when(mock).getStubModuleName(); + doReturn(nullableDescription).when(mock).getNullableDescription(); + doReturn(abstractFQN.getTypeName()).when(mock).getAbstractModuleName(); + return mock; + } +} diff --git a/opendaylight/config/yang-jmx-generator-plugin/src/test/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/util/FormattingUtil.java b/opendaylight/config/yang-jmx-generator-plugin/src/test/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/util/FormattingUtil.java deleted file mode 100644 index e62cb7c002..0000000000 --- a/opendaylight/config/yang-jmx-generator-plugin/src/test/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/util/FormattingUtil.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.controller.config.yangjmxgenerator.plugin.util; - -import java.util.Scanner; - -public class FormattingUtil { - - public static String cleanUpEmptyLinesAndIndent(String input) { - StringBuffer output = new StringBuffer(); - Scanner scanner = new Scanner(input); - while (scanner.hasNextLine()) { - String line = scanner.nextLine(); - line = line.replaceAll("\t", " "); - while (line.contains(" ")) { - line = line.replaceAll(" ", " "); - } - line = line.trim(); - if (line.length() > 0) { - output.append(line); - output.append("\n"); - } - } - - return output.toString(); - } -} diff --git a/opendaylight/config/yang-jmx-generator-plugin/src/test/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/util/StringUtilTest.java b/opendaylight/config/yang-jmx-generator-plugin/src/test/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/util/StringUtilTest.java new file mode 100644 index 0000000000..b0217a4ba9 --- /dev/null +++ b/opendaylight/config/yang-jmx-generator-plugin/src/test/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/util/StringUtilTest.java @@ -0,0 +1,60 @@ +package org.opendaylight.controller.config.yangjmxgenerator.plugin.util; + +import org.junit.Test; +import org.opendaylight.controller.config.yangjmxgenerator.plugin.java.FullyQualifiedName; + +import java.io.IOException; + +import static java.util.Arrays.asList; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +public class StringUtilTest { + @Test + public void testPrefixAndJoin() { + assertEquals(" extends p1.Foo,Bar", StringUtil.prefixAndJoin(asList( + new FullyQualifiedName("p1", "Foo"), new FullyQualifiedName("", "Bar")), "extends")); + } + + @Test + public void testAddAsterixAtEachLineStart() { + String input = "foo \nbar"; + String expectedOutput = "* foo\n* bar\n"; + assertEquals(expectedOutput, StringUtil.addAsterixAtEachLineStart(input)); + } + + @Test + public void testCopyright() throws IOException { + assertTrue(StringUtil.loadCopyright().isPresent()); + } + + @Test + public void testFormatting() { + { + String input = " \tpack;\n" + + "class Bar{ \n" + + " method() {\n" + + " body\n" + + "}\n" + + " }"; + String expected = "pack;\n" + + "class Bar{\n" + + " method() {\n" + + " body\n" + + " }\n" + + "}\n"; + assertEquals(expected, StringUtil.formatJavaSource(input)); + } + { + String input = "{\n" + + "bar\n" + + "}\n" + + "\n\nbaz\n\n\n\n"; + String expected = "{\n" + + " bar\n" + + "}\n\n" + + "baz\n"; + assertEquals(expected, StringUtil.formatJavaSource(input)); + } + } +} diff --git a/opendaylight/config/yang-jmx-generator/src/test/java/org/opendaylight/controller/config/yangjmxgenerator/AbstractYangTest.java b/opendaylight/config/yang-jmx-generator/src/test/java/org/opendaylight/controller/config/yangjmxgenerator/AbstractYangTest.java index 1100b35437..76d97703af 100644 --- a/opendaylight/config/yang-jmx-generator/src/test/java/org/opendaylight/controller/config/yangjmxgenerator/AbstractYangTest.java +++ b/opendaylight/config/yang-jmx-generator/src/test/java/org/opendaylight/controller/config/yangjmxgenerator/AbstractYangTest.java @@ -7,25 +7,29 @@ */ package org.opendaylight.controller.config.yangjmxgenerator; -import static junit.framework.Assert.assertNotNull; -import static junit.framework.Assert.format; - -import java.io.InputStream; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; - +import com.google.common.base.Preconditions; +import com.google.common.collect.Sets; +import org.junit.Assert; import org.junit.Before; import org.opendaylight.controller.config.yangjmxgenerator.plugin.util.YangModelSearchUtils; +import org.opendaylight.yangtools.sal.binding.yang.types.TypeProviderImpl; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.IdentitySchemaNode; import org.opendaylight.yangtools.yang.model.api.Module; import org.opendaylight.yangtools.yang.model.api.SchemaContext; import org.opendaylight.yangtools.yang.parser.impl.YangParserImpl; -import com.google.common.base.Preconditions; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import static junit.framework.Assert.assertNotNull; +import static junit.framework.Assert.format; +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertThat; public abstract class AbstractYangTest { protected SchemaContext context; @@ -35,6 +39,14 @@ public abstract class AbstractYangTest { threadsJavaModule, bgpListenerJavaModule, ietfInetTypesModule, jmxModule, jmxImplModule, testFilesModule, testFiles1Module; + public static final String EVENTBUS_MXB_NAME = "eventbus"; + public static final String ASYNC_EVENTBUS_MXB_NAME = "async-eventbus"; + public static final String THREADFACTORY_NAMING_MXB_NAME = "threadfactory-naming"; + public static final String THREADPOOL_DYNAMIC_MXB_NAME = "threadpool-dynamic"; + public static final String THREADPOOL_REGISTRY_IMPL_NAME = "threadpool-registry-impl"; + + public static final String BGP_LISTENER_IMPL_MXB_NAME = "bgp-listener-impl"; + @Before public void loadYangFiles() throws Exception { List yangISs = new ArrayList<>(); @@ -97,4 +109,22 @@ public abstract class AbstractYangTest { } return result; } + + protected Map loadThreadsServiceInterfaceEntries(String packageName) { + Map identitiesToSIs = new HashMap<>(); + return ServiceInterfaceEntry.create(threadsModule, packageName,identitiesToSIs); + } + + protected Map loadThreadsJava(Map modulesToSIEs, String packageName) { + Map namesToMBEs = ModuleMXBeanEntry + .create(threadsJavaModule, modulesToSIEs, context, new TypeProviderWrapper(new TypeProviderImpl + (context)), packageName); + Assert.assertNotNull(namesToMBEs); + Set expectedMXBeanNames = Sets.newHashSet(EVENTBUS_MXB_NAME, + ASYNC_EVENTBUS_MXB_NAME, THREADFACTORY_NAMING_MXB_NAME, + THREADPOOL_DYNAMIC_MXB_NAME, THREADPOOL_REGISTRY_IMPL_NAME); + assertThat(namesToMBEs.keySet(), is(expectedMXBeanNames)); + return namesToMBEs; + } + } diff --git a/opendaylight/config/yang-jmx-generator/src/test/java/org/opendaylight/controller/config/yangjmxgenerator/ModuleMXBeanEntryTest.java b/opendaylight/config/yang-jmx-generator/src/test/java/org/opendaylight/controller/config/yangjmxgenerator/ModuleMXBeanEntryTest.java index 8ca2bb5bc9..dd44246867 100644 --- a/opendaylight/config/yang-jmx-generator/src/test/java/org/opendaylight/controller/config/yangjmxgenerator/ModuleMXBeanEntryTest.java +++ b/opendaylight/config/yang-jmx-generator/src/test/java/org/opendaylight/controller/config/yangjmxgenerator/ModuleMXBeanEntryTest.java @@ -8,7 +8,6 @@ package org.opendaylight.controller.config.yangjmxgenerator; import com.google.common.collect.Sets; -import java.util.HashMap; import org.junit.Before; import org.junit.Test; import org.opendaylight.controller.config.yangjmxgenerator.attribute.AttributeIfc; @@ -36,6 +35,7 @@ import java.text.SimpleDateFormat; import java.util.Collection; import java.util.Collections; import java.util.Date; +import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; @@ -52,13 +52,6 @@ import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; public class ModuleMXBeanEntryTest extends AbstractYangTest { - public static final String EVENTBUS_MXB_NAME = "eventbus"; - public static final String ASYNC_EVENTBUS_MXB_NAME = "async-eventbus"; - public static final String THREADFACTORY_NAMING_MXB_NAME = "threadfactory-naming"; - public static final String THREADPOOL_DYNAMIC_MXB_NAME = "threadpool-dynamic"; - public static final String THREADPOOL_REGISTRY_IMPL_NAME = "threadpool-registry-impl"; - - public static final String BGP_LISTENER_IMPL_MXB_NAME = "bgp-listener-impl"; public static final String PACKAGE_NAME = "pack2"; @@ -82,23 +75,15 @@ public class ModuleMXBeanEntryTest extends AbstractYangTest { protected Map modulesToSIEs; - protected Map loadThreadsJava() { - Map namesToMBEs = ModuleMXBeanEntry - .create(threadsJavaModule, modulesToSIEs, context, new TypeProviderWrapper(new TypeProviderImpl - (context)), PACKAGE_NAME); - assertNotNull(namesToMBEs); - Set expectedMXBeanNames = Sets.newHashSet(EVENTBUS_MXB_NAME, - ASYNC_EVENTBUS_MXB_NAME, THREADFACTORY_NAMING_MXB_NAME, - THREADPOOL_DYNAMIC_MXB_NAME, THREADPOOL_REGISTRY_IMPL_NAME); - assertThat(namesToMBEs.keySet(), is(expectedMXBeanNames)); - return namesToMBEs; - } @Before public void setUp() { - Map identitiesToSIs = new HashMap<>(); - modulesToSIEs = ServiceInterfaceEntry.create(threadsModule, - "packages.sis",identitiesToSIs); + modulesToSIEs = loadThreadsServiceInterfaceEntries("packages.sis"); + } + + + protected Map loadThreadsJava() { + return loadThreadsJava(modulesToSIEs, PACKAGE_NAME); } @Test diff --git a/opendaylight/config/yang-test-plugin/pom.xml b/opendaylight/config/yang-test-plugin/pom.xml index 0b4fc8b1b5..a4306c15c4 100644 --- a/opendaylight/config/yang-test-plugin/pom.xml +++ b/opendaylight/config/yang-test-plugin/pom.xml @@ -22,5 +22,9 @@ maven-plugin-api 3.0.5 + + commons-io + commons-io + \ No newline at end of file diff --git a/opendaylight/config/yang-test-plugin/src/main/java/org/opendaylight/controller/config/yang/test/plugin/ProcessSources.java b/opendaylight/config/yang-test-plugin/src/main/java/org/opendaylight/controller/config/yang/test/plugin/ProcessSources.java index dbb9ddb363..f2a56f2b1b 100644 --- a/opendaylight/config/yang-test-plugin/src/main/java/org/opendaylight/controller/config/yang/test/plugin/ProcessSources.java +++ b/opendaylight/config/yang-test-plugin/src/main/java/org/opendaylight/controller/config/yang/test/plugin/ProcessSources.java @@ -7,18 +7,14 @@ */ package org.opendaylight.controller.config.yang.test.plugin; +import org.apache.commons.io.FileUtils; import org.apache.maven.plugin.AbstractMojo; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.MojoFailureException; -import java.io.BufferedReader; import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.OutputStream; +import java.util.regex.Pattern; /** * Add implementation code from stub.txt @@ -45,55 +41,25 @@ public class ProcessSources extends AbstractMojo{ if (!sourceDirectory.exists()) { super.getLog().error("Source directory does not exists " + sourceDirectory.getPath()); } - String header = ""; - try { - header = Util.loadHeader(); - } catch (IOException e) { - super.getLog().error("Header.txt not found."); - } + File[] sourceFiles = sourceDirectory.listFiles(); for (File sourceFile: sourceFiles) { if(sourceFile.getName().endsWith("Module.java") || sourceFile.getName().endsWith("ModuleFactory.java")) { File stubFile = new File(sourceFile.getPath().replace(".java", "Stub.txt")); - String stubLines = null; - try { - if (stubFile.exists()) { - stubLines = Util.loadStubFile(stubFile.getPath()); - } - - InputStream javaIn = new FileInputStream(sourceFile.getPath()); - BufferedReader javaBuf = new BufferedReader(new InputStreamReader(javaIn)); - StringBuffer output = new StringBuffer(); - String line = javaBuf.readLine(); - boolean writeLine = false; - while ((line = javaBuf.readLine()) != null) { - if(!writeLine && line.contains("*/")) { - line = header; - writeLine = true; - } else { - if (line.contains("TODO")) { - writeLine = false; - } else { - if (stubLines != null && line.contains("throw new")) { - line = stubLines.toString(); - writeLine = true; - } - } - } - if(writeLine) { - output.append(line).append(System.lineSeparator()); - } + if (stubFile.exists()) { + try { + rewrite(sourceFile, FileUtils.readFileToString(stubFile)); + } catch (IOException e) { + getLog().error("Error while reading/writing to files.", e); } - javaBuf.close(); - - OutputStream javaOut = new FileOutputStream(sourceFile.getPath()); - javaOut.write(output.toString().getBytes()); - javaOut.close(); - } catch (IOException e) { - getLog().error("Error while reading/writing to files.", e); } - } } } + + private static void rewrite(File sourceFile, String replaceTODOWith) throws IOException { + String source = FileUtils.readFileToString(sourceFile); + String target = Pattern.compile("^.*TODO.*\n.*throw new java.lang.UnsupportedOperationException.*$", Pattern.MULTILINE).matcher(source).replaceFirst(replaceTODOWith); + FileUtils.write(sourceFile, target); + } } diff --git a/opendaylight/config/yang-test-plugin/src/main/java/org/opendaylight/controller/config/yang/test/plugin/Util.java b/opendaylight/config/yang-test-plugin/src/main/java/org/opendaylight/controller/config/yang/test/plugin/Util.java index 16a41d9adb..136733cbff 100644 --- a/opendaylight/config/yang-test-plugin/src/main/java/org/opendaylight/controller/config/yang/test/plugin/Util.java +++ b/opendaylight/config/yang-test-plugin/src/main/java/org/opendaylight/controller/config/yang/test/plugin/Util.java @@ -8,12 +8,7 @@ package org.opendaylight.controller.config.yang.test.plugin; -import java.io.BufferedReader; import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; import java.util.regex.Matcher; public class Util { @@ -22,29 +17,4 @@ public class Util { path = path.replace(".", Matcher.quoteReplacement(File.separator)); return path; } - - public static String loadHeader() throws IOException { - StringBuffer header = new StringBuffer(); - InputStream headIn = Util.class.getClassLoader().getResourceAsStream("Header.txt"); - BufferedReader headBuf = new BufferedReader(new InputStreamReader(headIn)); - String line = null; - while ((line = headBuf.readLine()) != null) { - header.append(line).append(System.lineSeparator()); - } - headBuf.close(); - return header.toString(); - } - - public static String loadStubFile(String fileName) throws IOException { - InputStream stubIn = new FileInputStream(fileName); - BufferedReader stubBuf = new BufferedReader(new InputStreamReader(stubIn)); - - StringBuffer stubLines = new StringBuffer(); - String stubLine = null; - while ((stubLine = stubBuf.readLine()) != null) { - stubLines.append(stubLine).append(System.lineSeparator()); - } - stubBuf.close(); - return stubLines.toString(); - } } diff --git a/opendaylight/config/yang-test-plugin/src/main/resources/Header.txt b/opendaylight/config/yang-test-plugin/src/main/resources/Header.txt deleted file mode 100644 index 068fd26844..0000000000 --- a/opendaylight/config/yang-test-plugin/src/main/resources/Header.txt +++ /dev/null @@ -1,7 +0,0 @@ -/* - * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ \ No newline at end of file diff --git a/opendaylight/config/yang-test/pom.xml b/opendaylight/config/yang-test/pom.xml index 3e75d00943..ecce3e33fc 100644 --- a/opendaylight/config/yang-test/pom.xml +++ b/opendaylight/config/yang-test/pom.xml @@ -107,6 +107,7 @@ org.opendaylight.yangtools yang-maven-plugin + org.opendaylight.controller yang-test-plugin @@ -115,6 +116,7 @@ delete-sources + process-sources diff --git a/opendaylight/config/yang-test/src/main/java/org/opendaylight/controller/config/yang/test/impl/DepTestImplModule.java b/opendaylight/config/yang-test/src/main/java/org/opendaylight/controller/config/yang/test/impl/DepTestImplModule.java index c64f824b15..07d7438a00 100644 --- a/opendaylight/config/yang-test/src/main/java/org/opendaylight/controller/config/yang/test/impl/DepTestImplModule.java +++ b/opendaylight/config/yang-test/src/main/java/org/opendaylight/controller/config/yang/test/impl/DepTestImplModule.java @@ -1,32 +1,23 @@ /* - * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ - -package org.opendaylight.controller.config.yang.test.impl; - -/** +* Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. * +* This program and the accompanying materials are made available under the +* terms of the Eclipse Public License v1.0 which accompanies this distribution, +* and is available at http://www.eclipse.org/legal/epl-v10.html */ -public final class DepTestImplModule extends org.opendaylight.controller.config.yang.test.impl.AbstractDepTestImplModule - { - +package org.opendaylight.controller.config.yang.test.impl; +public class DepTestImplModule extends org.opendaylight.controller.config.yang.test.impl.AbstractDepTestImplModule { public DepTestImplModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) { super(identifier, dependencyResolver); } - public DepTestImplModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver, - DepTestImplModule oldModule, java.lang.AutoCloseable oldInstance) { - + public DepTestImplModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver, org.opendaylight.controller.config.yang.test.impl.DepTestImplModule oldModule, java.lang.AutoCloseable oldInstance) { super(identifier, dependencyResolver, oldModule, oldInstance); } @Override - protected void customValidation(){ - // Add custom validation for module attributes here. + public void customValidation() { + // add custom validation form module attributes here. } @Override @@ -38,4 +29,5 @@ public final class DepTestImplModule extends org.opendaylight.controller.config. }; } + } diff --git a/opendaylight/config/yang-test/src/main/java/org/opendaylight/controller/config/yang/test/impl/DepTestImplModuleFactory.java b/opendaylight/config/yang-test/src/main/java/org/opendaylight/controller/config/yang/test/impl/DepTestImplModuleFactory.java index c26c29ed60..849dd1464d 100644 --- a/opendaylight/config/yang-test/src/main/java/org/opendaylight/controller/config/yang/test/impl/DepTestImplModuleFactory.java +++ b/opendaylight/config/yang-test/src/main/java/org/opendaylight/controller/config/yang/test/impl/DepTestImplModuleFactory.java @@ -1,18 +1,20 @@ /* - * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ - -package org.opendaylight.controller.config.yang.test.impl; - -/** +* Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. * +* This program and the accompanying materials are made available under the +* terms of the Eclipse Public License v1.0 which accompanies this distribution, +* and is available at http://www.eclipse.org/legal/epl-v10.html */ -public class DepTestImplModuleFactory extends org.opendaylight.controller.config.yang.test.impl.AbstractDepTestImplModuleFactory -{ - +/* +* Generated file +* +* Generated from: yang module name: config-test-impl yang module local name: impl-dep +* Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator +* Generated at: Mon Mar 17 14:04:38 CET 2014 +* +* Do not modify this file unless it is present under src/main directory +*/ +package org.opendaylight.controller.config.yang.test.impl; +public class DepTestImplModuleFactory extends org.opendaylight.controller.config.yang.test.impl.AbstractDepTestImplModuleFactory { } diff --git a/opendaylight/config/yang-test/src/main/java/org/opendaylight/controller/config/yang/test/impl/IdentityTestModule.java b/opendaylight/config/yang-test/src/main/java/org/opendaylight/controller/config/yang/test/impl/IdentityTestModule.java index 398bba99bd..a5b7f55df3 100644 --- a/opendaylight/config/yang-test/src/main/java/org/opendaylight/controller/config/yang/test/impl/IdentityTestModule.java +++ b/opendaylight/config/yang-test/src/main/java/org/opendaylight/controller/config/yang/test/impl/IdentityTestModule.java @@ -1,32 +1,23 @@ /* - * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ - -package org.opendaylight.controller.config.yang.test.impl; - -/** +* Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. * +* This program and the accompanying materials are made available under the +* terms of the Eclipse Public License v1.0 which accompanies this distribution, +* and is available at http://www.eclipse.org/legal/epl-v10.html */ -public final class IdentityTestModule extends org.opendaylight.controller.config.yang.test.impl.AbstractIdentityTestModule - { - +package org.opendaylight.controller.config.yang.test.impl; +public class IdentityTestModule extends org.opendaylight.controller.config.yang.test.impl.AbstractIdentityTestModule { public IdentityTestModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) { super(identifier, dependencyResolver); } - public IdentityTestModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver, - IdentityTestModule oldModule, java.lang.AutoCloseable oldInstance) { - + public IdentityTestModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver, org.opendaylight.controller.config.yang.test.impl.IdentityTestModule oldModule, java.lang.AutoCloseable oldInstance) { super(identifier, dependencyResolver, oldModule, oldInstance); } @Override - protected void customValidation(){ - // Add custom validation for module attributes here. + public void customValidation() { + // add custom validation form module attributes here. } @Override @@ -49,4 +40,5 @@ public final class IdentityTestModule extends org.opendaylight.controller.config }; } + } diff --git a/opendaylight/config/yang-test/src/main/java/org/opendaylight/controller/config/yang/test/impl/IdentityTestModuleFactory.java b/opendaylight/config/yang-test/src/main/java/org/opendaylight/controller/config/yang/test/impl/IdentityTestModuleFactory.java index 9de3e0bb74..5560b6ec3f 100644 --- a/opendaylight/config/yang-test/src/main/java/org/opendaylight/controller/config/yang/test/impl/IdentityTestModuleFactory.java +++ b/opendaylight/config/yang-test/src/main/java/org/opendaylight/controller/config/yang/test/impl/IdentityTestModuleFactory.java @@ -1,18 +1,20 @@ /* - * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ - -package org.opendaylight.controller.config.yang.test.impl; - -/** +* Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. * +* This program and the accompanying materials are made available under the +* terms of the Eclipse Public License v1.0 which accompanies this distribution, +* and is available at http://www.eclipse.org/legal/epl-v10.html */ -public class IdentityTestModuleFactory extends org.opendaylight.controller.config.yang.test.impl.AbstractIdentityTestModuleFactory -{ - +/* +* Generated file +* +* Generated from: yang module name: config-test-impl yang module local name: impl-identity-test +* Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator +* Generated at: Mon Mar 17 14:04:38 CET 2014 +* +* Do not modify this file unless it is present under src/main directory +*/ +package org.opendaylight.controller.config.yang.test.impl; +public class IdentityTestModuleFactory extends org.opendaylight.controller.config.yang.test.impl.AbstractIdentityTestModuleFactory { } diff --git a/opendaylight/config/yang-test/src/main/java/org/opendaylight/controller/config/yang/test/impl/NetconfTestImplModule.java b/opendaylight/config/yang-test/src/main/java/org/opendaylight/controller/config/yang/test/impl/NetconfTestImplModule.java index 3594ee0353..ecbf4aba33 100644 --- a/opendaylight/config/yang-test/src/main/java/org/opendaylight/controller/config/yang/test/impl/NetconfTestImplModule.java +++ b/opendaylight/config/yang-test/src/main/java/org/opendaylight/controller/config/yang/test/impl/NetconfTestImplModule.java @@ -1,32 +1,23 @@ /* - * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ - -package org.opendaylight.controller.config.yang.test.impl; - -/** +* Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. * +* This program and the accompanying materials are made available under the +* terms of the Eclipse Public License v1.0 which accompanies this distribution, +* and is available at http://www.eclipse.org/legal/epl-v10.html */ -public final class NetconfTestImplModule extends org.opendaylight.controller.config.yang.test.impl.AbstractNetconfTestImplModule - { - +package org.opendaylight.controller.config.yang.test.impl; +public class NetconfTestImplModule extends org.opendaylight.controller.config.yang.test.impl.AbstractNetconfTestImplModule { public NetconfTestImplModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) { super(identifier, dependencyResolver); } - public NetconfTestImplModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver, - NetconfTestImplModule oldModule, java.lang.AutoCloseable oldInstance) { - + public NetconfTestImplModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver, org.opendaylight.controller.config.yang.test.impl.NetconfTestImplModule oldModule, java.lang.AutoCloseable oldInstance) { super(identifier, dependencyResolver, oldModule, oldInstance); } @Override - protected void customValidation(){ - // Add custom validation for module attributes here. + public void customValidation() { + // add custom validation form module attributes here. } @Override @@ -34,4 +25,5 @@ public final class NetconfTestImplModule extends org.opendaylight.controller.con return NetconfTestImplModuleUtil.registerRuntimeBeans(this); } + } diff --git a/opendaylight/config/yang-test/src/main/java/org/opendaylight/controller/config/yang/test/impl/NetconfTestImplModuleFactory.java b/opendaylight/config/yang-test/src/main/java/org/opendaylight/controller/config/yang/test/impl/NetconfTestImplModuleFactory.java index accc1db76e..b857c6211d 100644 --- a/opendaylight/config/yang-test/src/main/java/org/opendaylight/controller/config/yang/test/impl/NetconfTestImplModuleFactory.java +++ b/opendaylight/config/yang-test/src/main/java/org/opendaylight/controller/config/yang/test/impl/NetconfTestImplModuleFactory.java @@ -1,18 +1,20 @@ /* - * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ - -package org.opendaylight.controller.config.yang.test.impl; - -/** +* Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. * +* This program and the accompanying materials are made available under the +* terms of the Eclipse Public License v1.0 which accompanies this distribution, +* and is available at http://www.eclipse.org/legal/epl-v10.html */ -public class NetconfTestImplModuleFactory extends org.opendaylight.controller.config.yang.test.impl.AbstractNetconfTestImplModuleFactory -{ - +/* +* Generated file +* +* Generated from: yang module name: config-test-impl yang module local name: impl-netconf +* Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator +* Generated at: Mon Mar 17 14:04:38 CET 2014 +* +* Do not modify this file unless it is present under src/main directory +*/ +package org.opendaylight.controller.config.yang.test.impl; +public class NetconfTestImplModuleFactory extends org.opendaylight.controller.config.yang.test.impl.AbstractNetconfTestImplModuleFactory { } diff --git a/opendaylight/config/yang-test/src/main/java/org/opendaylight/controller/config/yang/test/impl/TestImplModule.java b/opendaylight/config/yang-test/src/main/java/org/opendaylight/controller/config/yang/test/impl/TestImplModule.java index 9ba1db4eed..9132407356 100644 --- a/opendaylight/config/yang-test/src/main/java/org/opendaylight/controller/config/yang/test/impl/TestImplModule.java +++ b/opendaylight/config/yang-test/src/main/java/org/opendaylight/controller/config/yang/test/impl/TestImplModule.java @@ -1,32 +1,23 @@ /* - * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ - -package org.opendaylight.controller.config.yang.test.impl; - -/** +* Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. * +* This program and the accompanying materials are made available under the +* terms of the Eclipse Public License v1.0 which accompanies this distribution, +* and is available at http://www.eclipse.org/legal/epl-v10.html */ -public final class TestImplModule extends org.opendaylight.controller.config.yang.test.impl.AbstractTestImplModule - { - +package org.opendaylight.controller.config.yang.test.impl; +public class TestImplModule extends org.opendaylight.controller.config.yang.test.impl.AbstractTestImplModule { public TestImplModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) { super(identifier, dependencyResolver); } - public TestImplModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver, - TestImplModule oldModule, java.lang.AutoCloseable oldInstance) { - + public TestImplModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver, org.opendaylight.controller.config.yang.test.impl.TestImplModule oldModule, java.lang.AutoCloseable oldInstance) { super(identifier, dependencyResolver, oldModule, oldInstance); } @Override - protected void customValidation(){ - // Add custom validation for module attributes here. + public void customValidation() { + // add custom validation form module attributes here. } @Override @@ -38,4 +29,5 @@ public final class TestImplModule extends org.opendaylight.controller.config.yan }; } + } diff --git a/opendaylight/config/yang-test/src/main/java/org/opendaylight/controller/config/yang/test/impl/TestImplModuleFactory.java b/opendaylight/config/yang-test/src/main/java/org/opendaylight/controller/config/yang/test/impl/TestImplModuleFactory.java index a6ce734f96..ae0ef6acf4 100644 --- a/opendaylight/config/yang-test/src/main/java/org/opendaylight/controller/config/yang/test/impl/TestImplModuleFactory.java +++ b/opendaylight/config/yang-test/src/main/java/org/opendaylight/controller/config/yang/test/impl/TestImplModuleFactory.java @@ -1,18 +1,20 @@ /* - * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ - -package org.opendaylight.controller.config.yang.test.impl; - -/** +* Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. * +* This program and the accompanying materials are made available under the +* terms of the Eclipse Public License v1.0 which accompanies this distribution, +* and is available at http://www.eclipse.org/legal/epl-v10.html */ -public class TestImplModuleFactory extends org.opendaylight.controller.config.yang.test.impl.AbstractTestImplModuleFactory -{ - +/* +* Generated file +* +* Generated from: yang module name: config-test-impl yang module local name: impl +* Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator +* Generated at: Mon Mar 17 14:04:38 CET 2014 +* +* Do not modify this file unless it is present under src/main directory +*/ +package org.opendaylight.controller.config.yang.test.impl; +public class TestImplModuleFactory extends org.opendaylight.controller.config.yang.test.impl.AbstractTestImplModuleFactory { } -- 2.36.6