From a8a0bce50e877fea088f59587ceaf40ee76f54b6 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Sun, 21 Feb 2016 17:07:10 +0100 Subject: [PATCH] BUG-4329: switch to javaparser Instead of using Eclipse JDT, which has not been published in ages, use comgithub.javaparser, which supports Java 8 and is quite convenient. Change-Id: I30d3975679b6b24952eabe5488fbce2db49ab0e6 Signed-off-by: Robert Varga --- .../config/yang-jmx-generator-plugin/pom.xml | 32 +- .../yangjmxgenerator/plugin/CodeWriter.java | 11 +- .../yangjmxgenerator/plugin/JMXGenerator.java | 3 +- .../plugin/ftl/TemplateFactory.java | 2 +- .../plugin/util/StringUtil.java | 16 +- .../plugin/AbstractGeneratorTest.java | 11 +- .../plugin/AbstractVerifier.java | 43 ++ .../plugin/JMXGeneratorTest.java | 589 ++++-------------- .../plugin/MbeASTVisitor.java | 117 ++++ .../plugin/ModuleMXBeanEntryPluginTest.java | 4 +- .../plugin/SieASTVisitor.java | 75 +++ 11 files changed, 394 insertions(+), 509 deletions(-) create mode 100644 opendaylight/config/yang-jmx-generator-plugin/src/test/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/AbstractVerifier.java create mode 100644 opendaylight/config/yang-jmx-generator-plugin/src/test/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/MbeASTVisitor.java create mode 100644 opendaylight/config/yang-jmx-generator-plugin/src/test/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/SieASTVisitor.java diff --git a/opendaylight/config/yang-jmx-generator-plugin/pom.xml b/opendaylight/config/yang-jmx-generator-plugin/pom.xml index 13fa289c87..f385f2f7ab 100644 --- a/opendaylight/config/yang-jmx-generator-plugin/pom.xml +++ b/opendaylight/config/yang-jmx-generator-plugin/pom.xml @@ -62,36 +62,10 @@ - org.eclipse - jdt + com.github.javaparser + javaparser-core + 2.3.0 test - - - - org.eclipse.equinox - app - - - - - - org.eclipse.equinox - app - test - - - - org.eclipse.jdt - core - test - - - - org.eclipse.equinox - app - - - 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 a1ccdc3eba..93a432c3fe 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 @@ -43,7 +43,7 @@ final class CodeWriter { private static final Logger LOG = LoggerFactory.getLogger(CodeWriter.class); private static final Optional COPYRIGHT = StringUtil.loadCopyright(); - public File writeSie(ServiceInterfaceEntry sie, File outputBaseDir) { + public File writeSie(final ServiceInterfaceEntry sie, final File outputBaseDir) { try { GeneralInterfaceTemplate generalInterfaceTemplate = TemplateFactory.serviceInterfaceFromSie(sie); GeneratedObject go = new GenericGeneratedObjectFactory().toGeneratedObject(generalInterfaceTemplate, COPYRIGHT); @@ -56,8 +56,8 @@ final class CodeWriter { } } - public List writeMbe(ModuleMXBeanEntry mbe, File targetBaseDir, - File mainBaseDir) { + public List writeMbe(final ModuleMXBeanEntry mbe, final File targetBaseDir, + final File mainBaseDir) { try { List generatedFiles = Lists.newArrayList(); @@ -117,7 +117,8 @@ final class CodeWriter { } } - private List persistGeneratedObjects(File targetBaseDir, File mainBaseDir, Map gos) throws IOException { + private static List persistGeneratedObjects(final File targetBaseDir, final File mainBaseDir, + final Map gos) throws IOException { List generatedFiles = new ArrayList<>(); for (Entry entry : gos.entrySet()) { boolean overwrite = entry.getValue(); @@ -136,7 +137,7 @@ final class CodeWriter { return generatedFiles; } - private List getRuntimeBeanFtlTemplates(Collection runtimeBeans) { + private static List getRuntimeBeanFtlTemplates(final Collection runtimeBeans) { if (runtimeBeans.isEmpty()) { return Collections.emptyList(); } 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 2216f19f88..ae0962b9e7 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 @@ -197,8 +197,7 @@ public class JMXGenerator implements BasicCodeGenerator, MavenProjectAware { this.generateModuleFactoryFile = extractModuleFactoryBoolean(additionalCfg); } - private boolean extractModuleFactoryBoolean( - final Map additionalCfg) { + private static boolean extractModuleFactoryBoolean(final Map additionalCfg) { String bool = additionalCfg.get(MODULE_FACTORY_FILE_BOOLEAN); return !"false".equals(bool); } 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 0030c3c038..999b27fb91 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 @@ -449,7 +449,7 @@ public class TemplateFactory { Collections.singletonList(new Annotation("Override", Collections.emptyList())), equalsBodyBuilder.toString()); } - private MethodDefinition getHash(final Map attrs) { + private static MethodDefinition getHash(final Map attrs) { final StringBuilder hashBodyBuilder = new StringBuilder( " return java.util.Objects.hash("); for (AttributeIfc s : attrs.values()) { 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 index 02ab91b817..01a495bf15 100644 --- 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 @@ -16,17 +16,17 @@ import java.util.List; import java.util.regex.Pattern; import org.apache.commons.lang3.StringUtils; import org.opendaylight.controller.config.yangjmxgenerator.plugin.java.FullyQualifiedName; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -public class StringUtil { - private static final Logger LOG = LoggerFactory.getLogger(StringUtil.class); +public final class StringUtil { + private StringUtil() { + throw new UnsupportedOperationException(); + } /** * @param list of strings to be joined by ',' * @param prefix e.g. 'extends' or 'implements' */ - public static String prefixAndJoin(List list, String prefix) { + public static String prefixAndJoin(final List list, final String prefix) { if (list.isEmpty()) { return ""; } @@ -34,7 +34,7 @@ public class StringUtil { return " " + prefix + " " + joiner.join(list); } - public static String addAsterixAtEachLineStart(String input) { + public static String addAsterixAtEachLineStart(final String input) { String s = Pattern.compile("^", Pattern.MULTILINE).matcher(input).replaceAll("* "); // remove trailing spaces s = Pattern.compile("\\s+$", Pattern.MULTILINE).matcher(s).replaceAll(""); @@ -50,7 +50,7 @@ public class StringUtil { return s; } - public static String writeComment(String input, boolean isJavadoc) { + public static String writeComment(final String input, final boolean isJavadoc) { StringBuilder content = new StringBuilder(); content.append("/*"); if (isJavadoc) { @@ -80,7 +80,7 @@ public class StringUtil { return Optional.absent(); } - public static String formatJavaSource(String input) { + public static String formatJavaSource(final String input) { Iterable split = Splitter.on("\n").trimResults().split(input); int basicIndent = 4; 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 fb5cd2e989..a17d50da52 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 @@ -12,13 +12,11 @@ import org.junit.Before; import org.opendaylight.controller.config.yangjmxgenerator.AbstractYangTest; public abstract class AbstractGeneratorTest extends AbstractYangTest { - private static final File GENERATOR_OUTPUT_PATH_ROOT = new File( - "target/testgen"); + private static final File GENERATOR_OUTPUT_PATH_ROOT = new File("target/testgen"); protected final File generatorOutputPath; public AbstractGeneratorTest() { - generatorOutputPath = new File(GENERATOR_OUTPUT_PATH_ROOT, getClass() - .getSimpleName()); + generatorOutputPath = new File(GENERATOR_OUTPUT_PATH_ROOT, getClass().getSimpleName()); } @Before @@ -26,10 +24,10 @@ public abstract class AbstractGeneratorTest extends AbstractYangTest { deleteFolder(generatorOutputPath); } - public void deleteFolder(File folder) { + public void deleteFolder(final File folder) { File[] files = folder.listFiles(); if (files != null) { - for (File f: files) { + for (File f : files) { if (f.isDirectory()) { deleteFolder(f); } else { @@ -39,5 +37,4 @@ public abstract class AbstractGeneratorTest extends AbstractYangTest { } folder.delete(); } - } diff --git a/opendaylight/config/yang-jmx-generator-plugin/src/test/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/AbstractVerifier.java b/opendaylight/config/yang-jmx-generator-plugin/src/test/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/AbstractVerifier.java new file mode 100644 index 0000000000..d9dd5d0cb0 --- /dev/null +++ b/opendaylight/config/yang-jmx-generator-plugin/src/test/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/AbstractVerifier.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2016 Pantheon Technologies s.r.o. 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 static org.junit.Assert.assertEquals; +import com.github.javaparser.ast.PackageDeclaration; +import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration; +import com.github.javaparser.ast.visitor.VoidVisitorAdapter; +import com.google.common.base.Preconditions; + +abstract class AbstractVerifier extends VoidVisitorAdapter { + private final String expectedPackageName; + private final String expectedType; + private String packageName; + private String type; + + AbstractVerifier(final String expectedPackageName, final String fileName) { + this.expectedPackageName = Preconditions.checkNotNull(expectedPackageName); + this.expectedType = fileName.substring(0, fileName.length() - 5); + } + + @Override + public void visit(final ClassOrInterfaceDeclaration n, final Void arg) { + type = n.getName(); + super.visit(n, arg); + } + + @Override + public final void visit(final PackageDeclaration n, final Void arg) { + packageName = n.getName().toString(); + super.visit(n, arg); + } + + void verify() { + assertEquals(expectedPackageName, packageName); + assertEquals(expectedType, type); + } +} 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 c7a12a3917..2fe0871308 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 @@ -8,8 +8,6 @@ package org.opendaylight.controller.config.yangjmxgenerator.plugin; import static org.hamcrest.CoreMatchers.containsString; -import static org.hamcrest.CoreMatchers.equalTo; -import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; @@ -18,53 +16,35 @@ import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; - +import static org.opendaylight.controller.config.yangjmxgenerator.PackageTranslatorTest.EXPECTED_PACKAGE_PREFIX; +import com.github.javaparser.JavaParser; +import com.github.javaparser.ParseException; +import com.github.javaparser.ast.CompilationUnit; import com.google.common.base.Predicate; import com.google.common.collect.Collections2; -import com.google.common.collect.Lists; -import com.google.common.collect.Maps; -import com.google.common.collect.Sets; +import com.google.common.collect.ImmutableSet; import com.google.common.io.Files; import java.io.File; import java.io.IOException; -import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashMap; -import java.util.HashSet; import java.util.List; -import java.util.Map; import java.util.Set; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.apache.maven.project.MavenProject; -import org.eclipse.jdt.core.JavaCore; -import org.eclipse.jdt.core.compiler.IProblem; -import org.eclipse.jdt.core.dom.AST; -import org.eclipse.jdt.core.dom.ASTParser; -import org.eclipse.jdt.core.dom.ASTVisitor; -import org.eclipse.jdt.core.dom.CompilationUnit; -import org.eclipse.jdt.core.dom.FieldDeclaration; -import org.eclipse.jdt.core.dom.MethodDeclaration; -import org.eclipse.jdt.core.dom.NormalAnnotation; -import org.eclipse.jdt.core.dom.PackageDeclaration; -import org.eclipse.jdt.core.dom.TypeDeclaration; import org.junit.Before; import org.junit.Test; import org.opendaylight.controller.config.api.DependencyResolver; import org.opendaylight.controller.config.api.DependencyResolverFactory; import org.opendaylight.controller.config.api.DynamicMBeanWithInstance; -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.controller.config.spi.AbstractModule; import org.opendaylight.controller.config.spi.Module; import org.opendaylight.controller.config.spi.ModuleFactory; import org.opendaylight.controller.config.yangjmxgenerator.ConfigConstants; -import org.opendaylight.controller.config.yangjmxgenerator.PackageTranslatorTest; import org.opendaylight.controller.config.yangjmxgenerator.ServiceInterfaceEntryTest; import org.osgi.framework.BundleContext; import org.xml.sax.ErrorHandler; @@ -77,7 +57,7 @@ public class JMXGeneratorTest extends AbstractGeneratorTest { JMXGenerator jmxGenerator; - protected final HashMap map = Maps.newHashMap(); + protected final HashMap map = new HashMap<>(); protected File outputBaseDir; File generatedResourcesDir; @@ -112,9 +92,7 @@ public class JMXGeneratorTest extends AbstractGeneratorTest { @Before public void setUp() { map.put(JMXGenerator.NAMESPACE_TO_PACKAGE_PREFIX + "1", - ConfigConstants.CONFIG_NAMESPACE - + JMXGenerator.NAMESPACE_TO_PACKAGE_DIVIDER - + PackageTranslatorTest.EXPECTED_PACKAGE_PREFIX); + ConfigConstants.CONFIG_NAMESPACE + JMXGenerator.NAMESPACE_TO_PACKAGE_DIVIDER + EXPECTED_PACKAGE_PREFIX); map.put(JMXGenerator.MODULE_FACTORY_FILE_BOOLEAN, "false"); jmxGenerator = new JMXGenerator(new CodeWriter()); jmxGenerator.setAdditionalConfig(map); @@ -124,8 +102,7 @@ public class JMXGeneratorTest extends AbstractGeneratorTest { MavenProject project = mock(MavenProject.class); doReturn(generatorOutputPath).when(project).getBasedir(); jmxGenerator.setMavenProject(project); - outputBaseDir = JMXGenerator.concatFolders(targetDir, - "generated-sources", "config"); + outputBaseDir = JMXGenerator.concatFolders(targetDir, "generated-sources", "config"); } @Test @@ -160,7 +137,7 @@ public class JMXGeneratorTest extends AbstractGeneratorTest { } } - public static List toFileNames(final Collection files) { + private static List toFileNames(final Collection files) { List result = new ArrayList<>(); for (File f : files) { result.add(f.getName()); @@ -170,72 +147,53 @@ public class JMXGeneratorTest extends AbstractGeneratorTest { } @Test - public void generateSIEsTest() throws IOException { + public void generateSIEsTest() throws IOException, ParseException { Collection files = jmxGenerator.generateSources(context, - outputBaseDir, Sets.newHashSet(threadsModule)); - assertEquals(ServiceInterfaceEntryTest.expectedSIEFileNames, - toFileNames(files)); - - Map verifiers = Maps.newHashMap(); - - for (File file : files) { - verifiers.put(file.getName(), new SieASTVisitor()); - } - - processGeneratedCode(files, verifiers); + outputBaseDir, Collections.singleton(threadsModule)); + assertEquals(ServiceInterfaceEntryTest.expectedSIEFileNames, toFileNames(files)); for (File file : files) { String fileName = file.getName(); - SieASTVisitor verifier = (SieASTVisitor) verifiers.get(fileName); + SieASTVisitor verifier = new SieASTVisitor(EXPECTED_PACKAGE_PREFIX + ".threads", fileName); + verifyFile(file, verifier); - assertEquals(fileName.substring(0, fileName.length() - 5), - verifier.type); - assertThat( - verifier.extnds, + assertThat(verifier.extnds, containsString("org.opendaylight.controller.config.api.annotations.AbstractServiceInterface")); - assertEquals(PackageTranslatorTest.EXPECTED_PACKAGE_PREFIX - + ".threads", verifier.packageName); assertNotNull(verifier.javadoc); - if ("ThreadPoolServiceInterface.java".equals(fileName)) { - assertContains(verifier.descriptionAnotValue, - "A simple pool of threads able to execute work."); + switch (fileName) { + case "ThreadPoolServiceInterface.java": + assertContains(verifier.descriptionAnotValue, "A simple pool of threads able to execute work."); assertContains(verifier.sieAnnotValue, "threadpool"); - assertContains(verifier.sieAnnotOsgiRegistrationType, - PackageTranslatorTest.EXPECTED_PACKAGE_PREFIX - + ".threadpool.ThreadPool.class"); - } else if ("ScheduledThreadPoolServiceInterface.java" - .equals(fileName)) { + assertContains(verifier.sieAnnotOsgiRegistrationType, EXPECTED_PACKAGE_PREFIX + ".threadpool.ThreadPool.class"); + break; + case "ScheduledThreadPoolServiceInterface.java": assertContains(verifier.extnds, - PackageTranslatorTest.EXPECTED_PACKAGE_PREFIX - + ".threads.ThreadPoolServiceInterface"); - assertContains( - verifier.descriptionAnotValue, + EXPECTED_PACKAGE_PREFIX + ".threads.ThreadPoolServiceInterface"); + assertContains(verifier.descriptionAnotValue, "An extension of the simple pool of threads able to schedule work to be executed at some point in time."); assertContains(verifier.sieAnnotValue, "scheduled-threadpool"); assertContains(verifier.sieAnnotOsgiRegistrationType, - PackageTranslatorTest.EXPECTED_PACKAGE_PREFIX - + ".threadpool.ScheduledThreadPool.class"); - } else if ("EventBusServiceInterface.java".equals(fileName)) { - assertContains( - verifier.descriptionAnotValue, + EXPECTED_PACKAGE_PREFIX + ".threadpool.ScheduledThreadPool.class"); + break; + case "EventBusServiceInterface.java": + assertContains(verifier.descriptionAnotValue, "Service representing an event bus. The service acts as message router between event producers and event consumers"); assertContains(verifier.sieAnnotValue, "eventbus"); - assertContains(verifier.sieAnnotOsgiRegistrationType, - "com.google.common.eventbus.EventBus.class"); - } else if ("ThreadFactoryServiceInterface.java".equals(fileName)) { - assertContains( - verifier.descriptionAnotValue, + assertContains(verifier.sieAnnotOsgiRegistrationType, "com.google.common.eventbus.EventBus.class"); + break; + case "ThreadFactoryServiceInterface.java": + assertContains( verifier.descriptionAnotValue, "Service representing a ThreadFactory instance. It is directly useful in Java world, where various library pieces need to create threads and you may want to inject a customized thread implementation."); assertContains(verifier.sieAnnotValue, "threadfactory"); assertContains(verifier.sieAnnotOsgiRegistrationType, "java.util.concurrent.ThreadFactory.class"); - - } else if ("ScheduledExecutorServiceServiceInterface.java" - .equals(fileName)) { + break; + case "ScheduledExecutorServiceServiceInterface.java": assertContains(verifier.sieAnnotOsgiRegistrationType, "java.util.concurrent.ScheduledExecutorService.class"); - } else { + break; + default: fail("Unknown generated sie " + fileName); } } @@ -247,8 +205,8 @@ public class JMXGeneratorTest extends AbstractGeneratorTest { map.put(JMXGenerator.MODULE_FACTORY_FILE_BOOLEAN, "randomValue"); jmxGenerator.setAdditionalConfig(map); - Collection files = jmxGenerator.generateSources(context, - outputBaseDir, Sets.newHashSet(bgpListenerJavaModule)); + Collection files = jmxGenerator.generateSources(context, outputBaseDir, + Collections.singleton(bgpListenerJavaModule)); assertEquals(expectedGenerateMBEsListNames, toFileNames(files)); } @@ -259,196 +217,121 @@ public class JMXGeneratorTest extends AbstractGeneratorTest { map.put(JMXGenerator.MODULE_FACTORY_FILE_BOOLEAN, "randomValue"); jmxGenerator.setAdditionalConfig(map); - Collection files = jmxGenerator.generateSources(context, - outputBaseDir, Sets.newHashSet(threadsJavaModule)); + Collection files = jmxGenerator.generateSources(context, outputBaseDir, + Collections.singleton(threadsJavaModule)); assertEquals(expectedModuleFileNames, toFileNames(files)); - Map verifiers = Maps.newHashMap(); - - Collection xmlFiles = Collections2.filter(files, - new Predicate() { - - @Override - public boolean apply(final File input) { - return input.getName().endsWith("xml"); - } - }); - - Collection javaFiles = Collections2.filter(files, - new Predicate() { - - @Override - public boolean apply(final File input) { - return input.getName().endsWith("java"); - } - }); - - MbeASTVisitor abstractDynamicThreadPoolModuleVisitor = null; - MbeASTVisitor asyncEventBusModuleMXBeanVisitor = null; - MbeASTVisitor abstractNamingThreadFactoryModuleFactoryVisitor = null; - MbeASTVisitor asyncEventBusModuleVisitor = null; - MbeASTVisitor eventBusModuleFactoryVisitor = null; - - for (File file : javaFiles) { - String name = file.getName(); - MbeASTVisitor visitor = new MbeASTVisitor(); - verifiers.put(name, visitor); - if (name.equals("AbstractDynamicThreadPoolModule.java")) { - abstractDynamicThreadPoolModuleVisitor = visitor; - } - if (name.equals("AsyncEventBusModuleMXBean.java")) { - asyncEventBusModuleMXBeanVisitor = visitor; - } - if (name.equals("AbstractNamingThreadFactoryModuleFactory.java")) { - abstractNamingThreadFactoryModuleFactoryVisitor = visitor; - } - if (name.equals("AsyncEventBusModule.java")) { - asyncEventBusModuleVisitor = visitor; + for (File file : files) { + final String name = file.getName(); + if (!name.endsWith("java")) { + continue; } - if (name.equals("EventBusModuleFactory.java")) { - eventBusModuleFactoryVisitor = visitor; + + MbeASTVisitor visitor = new MbeASTVisitor(EXPECTED_PACKAGE_PREFIX + ".threads.java", name); + + verifyFile(file, visitor); + + switch (name) { + case "AbstractDynamicThreadPoolModule.java": + assertAbstractDynamicThreadPoolModule(visitor); + break; + case "AsyncEventBusModuleMXBean.java": + assertEquals("Incorrenct number of generated methods", 4, visitor.methods.size()); + break; + case "AbstractNamingThreadFactoryModuleFactory.java": + assertAbstractNamingThreadFactoryModuleFactory(visitor); + break; + case "AsyncEventBusModule.java": + assertContains(visitor.extnds, EXPECTED_PACKAGE_PREFIX + ".threads.java.AbstractAsyncEventBusModule"); + visitor.assertFields(0); + assertEquals("Incorrenct number of generated methods", 2, visitor.methods.size()); + visitor.assertConstructors(2); + visitor.assertMethodDescriptions(0); + visitor.assertMethodJavadocs(0); + break; + case "EventBusModuleFactory.java": + assertContains(visitor.extnds, + EXPECTED_PACKAGE_PREFIX + ".threads.java.AbstractEventBusModuleFactory"); + visitor.assertFields(0); + assertEquals("Incorrenct number of generated methods", 0, visitor.methods.size()); + visitor.assertConstructors(0); + visitor.assertMethodDescriptions(0); + visitor.assertMethodJavadocs(0); + break; } } - processGeneratedCode(javaFiles, verifiers); - - assertAbstractDynamicThreadPoolModule(abstractDynamicThreadPoolModuleVisitor); - assertAsyncEventBusModuleMXBean(asyncEventBusModuleMXBeanVisitor); - assertAbstractNamingThreadFactoryModuleFactory(abstractNamingThreadFactoryModuleFactoryVisitor); - assertAsyncEventBusModule(asyncEventBusModuleVisitor); - assertEventBusModuleFactory(eventBusModuleFactoryVisitor); + verifyXmlFiles(Collections2.filter(files, new Predicate() { + @Override + public boolean apply(final File input) { + return input.getName().endsWith("xml"); + } + })); - verifyXmlFiles(xmlFiles); // verify ModuleFactory file - File moduleFactoryFile = JMXGenerator.concatFolders( - generatedResourcesDir, "META-INF", "services", + File moduleFactoryFile = JMXGenerator.concatFolders(generatedResourcesDir, "META-INF", "services", ModuleFactory.class.getName()); - assertThat(moduleFactoryFile.exists(), is(true)); - Set lines = Sets.newHashSet(Files - .readLines(moduleFactoryFile, StandardCharsets.UTF_8)); - Set expectedLines = Sets.newHashSet(// - PackageTranslatorTest.EXPECTED_PACKAGE_PREFIX - + ".threads.java.EventBusModuleFactory",// - PackageTranslatorTest.EXPECTED_PACKAGE_PREFIX - + ".threads.java.AsyncEventBusModuleFactory", // - PackageTranslatorTest.EXPECTED_PACKAGE_PREFIX - + ".threads.java.DynamicThreadPoolModuleFactory",// - PackageTranslatorTest.EXPECTED_PACKAGE_PREFIX - + ".threads.java.NamingThreadFactoryModuleFactory", // - PackageTranslatorTest.EXPECTED_PACKAGE_PREFIX - + ".threads.java.ThreadPoolRegistryImplModuleFactory"); - - - assertThat(lines, equalTo(expectedLines)); - + assertTrue(moduleFactoryFile.exists()); + Set lines = ImmutableSet.copyOf(Files.readLines(moduleFactoryFile, StandardCharsets.UTF_8)); + Set expectedLines = ImmutableSet.of( + EXPECTED_PACKAGE_PREFIX + ".threads.java.EventBusModuleFactory", + EXPECTED_PACKAGE_PREFIX + ".threads.java.AsyncEventBusModuleFactory", + EXPECTED_PACKAGE_PREFIX + ".threads.java.DynamicThreadPoolModuleFactory", + EXPECTED_PACKAGE_PREFIX + ".threads.java.NamingThreadFactoryModuleFactory", + EXPECTED_PACKAGE_PREFIX + ".threads.java.ThreadPoolRegistryImplModuleFactory"); + + assertEquals(expectedLines, lines); } - private void verifyXmlFiles(final Collection xmlFiles) throws Exception { + private static void verifyXmlFiles(final Collection xmlFiles) throws Exception { ErrorHandler errorHandler = new ErrorHandler() { @Override public void warning(final SAXParseException exception) throws SAXException { - fail("Generated blueprint xml is not well formed " - + exception.getMessage()); + fail("Generated blueprint xml is not well formed " + exception.getMessage()); } @Override public void fatalError(final SAXParseException exception) throws SAXException { - fail("Generated blueprint xml is not well formed " - + exception.getMessage()); + fail("Generated blueprint xml is not well formed " + exception.getMessage()); } @Override public void error(final SAXParseException exception) throws SAXException { - fail("Generated blueprint xml is not well formed " - + exception.getMessage()); + fail("Generated blueprint xml is not well formed " + exception.getMessage()); } }; - for (File file : xmlFiles) { - DocumentBuilderFactory factory = DocumentBuilderFactory - .newInstance(); - factory.setValidating(false); - factory.setNamespaceAware(true); + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + factory.setValidating(false); + factory.setNamespaceAware(true); + for (File file : xmlFiles) { DocumentBuilder builder = factory.newDocumentBuilder(); - builder.setErrorHandler(errorHandler); builder.parse(new InputSource(file.getPath())); } - } - private void assertEventBusModuleFactory(final MbeASTVisitor visitor) { - assertEquals(PackageTranslatorTest.EXPECTED_PACKAGE_PREFIX - + ".threads.java", visitor.packageName); - assertEquals("EventBusModuleFactory", visitor.type); - assertContains(visitor.extnds, - PackageTranslatorTest.EXPECTED_PACKAGE_PREFIX - + ".threads.java.AbstractEventBusModuleFactory"); - - assertEquals(0, visitor.fieldDeclarations.size()); - - assertEquals("Incorrenct number of generated methods", 0, - visitor.methods.size()); - assertEquals("Incorrenct number of generated constructors", 0, - visitor.constructors.size()); - assertEquals("Incorrenct number of generated method descriptions", 0, - visitor.methodDescriptions.size()); - assertEquals("Incorrenct number of generated method javadoc", 0, - visitor.methodJavadoc.size()); - } + private static void assertAbstractNamingThreadFactoryModuleFactory( final MbeASTVisitor visitor) { + assertContains(visitor.implmts, "org.opendaylight.controller.config.spi.ModuleFactory"); - private void assertAsyncEventBusModule(final MbeASTVisitor visitor) { - assertEquals(PackageTranslatorTest.EXPECTED_PACKAGE_PREFIX - + ".threads.java", visitor.packageName); - assertEquals("AsyncEventBusModule", visitor.type); - assertContains(visitor.extnds, - PackageTranslatorTest.EXPECTED_PACKAGE_PREFIX - + ".threads.java.AbstractAsyncEventBusModule"); - - assertEquals(0, visitor.fieldDeclarations.size()); - - assertEquals("Incorrenct number of generated methods", 2, - visitor.methods.size()); - assertEquals("Incorrenct number of generated constructors", 2, - visitor.constructors.size()); - assertEquals("Incorrenct number of generated method descriptions", 0, - visitor.methodDescriptions.size()); - assertEquals("Incorrenct number of generated method javadoc", 0, - visitor.methodJavadoc.size()); - } - - private void assertAbstractNamingThreadFactoryModuleFactory( - final MbeASTVisitor visitor) { - assertEquals(PackageTranslatorTest.EXPECTED_PACKAGE_PREFIX - + ".threads.java", visitor.packageName); - assertEquals("AbstractNamingThreadFactoryModuleFactory", visitor.type); - assertContains(visitor.implmts, - "org.opendaylight.controller.config.spi.ModuleFactory"); - Set fieldDeclarations = visitor.fieldDeclarations; - assertDeclaredField(fieldDeclarations, - "public static final java.lang.String NAME=\"threadfactory-naming\""); - assertDeclaredField( - fieldDeclarations, + visitor.assertFields(2); + visitor.assertField("public static final java.lang.String NAME = \"threadfactory-naming\""); + visitor.assertField( "private static final java.util.Set> serviceIfcs"); - assertEquals(2, fieldDeclarations.size()); - assertFactoryMethods(visitor.methods, 9); - assertEquals("Incorrenct number of generated method descriptions", 0, - visitor.methodDescriptions.size()); - assertEquals("Incorrenct number of generated method javadoc", 0, - visitor.methodJavadoc.size()); - + visitor.assertMethodDescriptions(0); + visitor.assertMethodJavadocs(0); } - private void assertFactoryMethods(final Set methods, final int expectedSize) { + private static void assertFactoryMethods(final Set methods, final int expectedSize) { - List args = Lists.newArrayList(); + List args = new ArrayList<>(); ArgumentAssertion oldInstanceArg = new ArgumentAssertion(DynamicMBeanWithInstance.class.getCanonicalName(), "old"); ArgumentAssertion instanceNameArg = new ArgumentAssertion(String.class.getSimpleName(), "instanceName"); ArgumentAssertion dependencyResolverArg = new ArgumentAssertion(DependencyResolver.class.getCanonicalName(), "dependencyResolver"); @@ -489,257 +372,55 @@ public class JMXGeneratorTest extends AbstractGeneratorTest { assertMethodPresent(methods, new MethodAssertion("boolean", "isModuleImplementingServiceInterface", args)); assertEquals(methods.size(), expectedSize); - } - private void assertMethodPresent(final Set methods, final MethodAssertion methodAssertion) { + private static void assertMethodPresent(final Set methods, final MethodAssertion methodAssertion) { assertTrue(String.format("Generated methods did not contain %s, generated methods: %s", methodAssertion.toString(), methods), methods.contains(methodAssertion.toString())); } - private void assertAsyncEventBusModuleMXBean(final MbeASTVisitor visitor) { - assertEquals(PackageTranslatorTest.EXPECTED_PACKAGE_PREFIX - + ".threads.java", visitor.packageName); - assertEquals("AsyncEventBusModuleMXBean", visitor.type); - - assertEquals("Incorrenct number of generated methods", 4, - visitor.methods.size()); - - } - - private void assertAbstractDynamicThreadPoolModule(final MbeASTVisitor visitor) { - assertEquals(PackageTranslatorTest.EXPECTED_PACKAGE_PREFIX - + ".threads.java", visitor.packageName); + private static void assertAbstractDynamicThreadPoolModule(final MbeASTVisitor visitor) { assertNotNull(visitor.javadoc); - assertContains(visitor.descriptionAnotValue, - "threadpool-dynamic description"); - assertEquals("AbstractDynamicThreadPoolModule", visitor.type); + assertContains(visitor.descriptionAnotValue, "threadpool-dynamic description"); assertContains(visitor.implmts, - PackageTranslatorTest.EXPECTED_PACKAGE_PREFIX - + ".threads.java.DynamicThreadPoolModuleMXBean", - PackageTranslatorTest.EXPECTED_PACKAGE_PREFIX - + ".threads.ScheduledThreadPoolServiceInterface", - PackageTranslatorTest.EXPECTED_PACKAGE_PREFIX - + ".threads.ThreadPoolServiceInterface"); + EXPECTED_PACKAGE_PREFIX + ".threads.java.DynamicThreadPoolModuleMXBean", + EXPECTED_PACKAGE_PREFIX + ".threads.ScheduledThreadPoolServiceInterface", + EXPECTED_PACKAGE_PREFIX + ".threads.ThreadPoolServiceInterface"); assertContains(visitor.extnds, AbstractModule.class.getCanonicalName()); - assertEquals(2, visitor.constructors.size()); - Set fieldDeclarations = visitor.fieldDeclarations; - assertDeclaredField(fieldDeclarations, - "private java.lang.Long maximumSize"); - assertDeclaredField(fieldDeclarations, - "private javax.management.ObjectName threadfactory"); - assertDeclaredField(fieldDeclarations, - "private java.util.concurrent.ThreadFactory threadfactoryDependency"); - assertDeclaredField(fieldDeclarations, - "private java.lang.Long keepAlive=new java.lang.Long(\"10\")"); - assertDeclaredField(fieldDeclarations, - "private java.lang.Long coreSize"); - assertDeclaredField(fieldDeclarations, "private byte[] binary"); - assertEquals(17, fieldDeclarations.size()); + visitor.assertConstructors(2); + visitor.assertFields(17); + visitor.assertField("private java.lang.Long maximumSize"); + visitor.assertField("private javax.management.ObjectName threadfactory"); + visitor.assertField("private java.util.concurrent.ThreadFactory threadfactoryDependency"); + visitor.assertField("private java.lang.Long keepAlive = new java.lang.Long(\"10\")"); + visitor.assertField("private java.lang.Long coreSize"); + visitor.assertField("private byte[] binary"); assertEquals(1, visitor.requireIfc.size()); String reqIfc = visitor.requireIfc.get("setThreadfactory"); assertNotNull("Missing generated setter for threadfactory", reqIfc); - assertContains(reqIfc, PackageTranslatorTest.EXPECTED_PACKAGE_PREFIX - + ".threads.ThreadFactoryServiceInterface"); - - assertEquals("Incorrenct number of generated methods", 26, - visitor.methods.size()); - assertEquals("Incorrenct number of generated method descriptions", 3, - visitor.methodDescriptions.size()); - assertEquals("Incorrenct number of generated method javadoc", 3, - visitor.methodJavadoc.size()); - assertNotNull("Missing javadoc for setMaximumSize method " + visitor.methodJavadoc, - visitor.methodJavadoc.get("void setMaximumSize(java.lang.Long maximumSize)")); - } - - private void assertDeclaredField(final Set fieldDeclarations, - final String declaration) { - assertTrue("Missing field " + declaration + ", got: " - + fieldDeclarations, - fieldDeclarations.contains(declaration + ";\n")); - } + assertContains(reqIfc, EXPECTED_PACKAGE_PREFIX + ".threads.ThreadFactoryServiceInterface"); - private static class SieASTVisitor extends ASTVisitor { - protected String packageName, descriptionAnotValue, sieAnnotValue, - sieAnnotOsgiRegistrationType, type, extnds, javadoc; - protected Map methodDescriptions = Maps.newHashMap(); - - @Override - public boolean visit(final PackageDeclaration node) { - packageName = node.getName().toString(); - return super.visit(node); - } - - @Override - public boolean visit(final NormalAnnotation node) { - if (node.getTypeName().toString() - .equals(Description.class.getCanonicalName())) { - if (node.getParent() instanceof TypeDeclaration) { - descriptionAnotValue = node.values().get(0).toString(); - } else if (node.getParent() instanceof MethodDeclaration) { - String descr = node.values().get(0).toString(); - methodDescriptions.put(((MethodDeclaration) node - .getParent()).getName().toString(), descr); - } - } else if (node - .getTypeName() - .toString() - .equals(ServiceInterfaceAnnotation.class.getCanonicalName())) { - String text1 = node.values().get(0).toString(); - String text2 = node.values().get(1).toString(); - if (text1.contains("value")) { - sieAnnotValue = text1; - sieAnnotOsgiRegistrationType = text2; - } else { - sieAnnotValue = text2; - sieAnnotOsgiRegistrationType = text1; - } - } - return super.visit(node); - } - - @Override - public boolean visit(final TypeDeclaration node) { - javadoc = node.getJavadoc() == null ? null : node.getJavadoc() - .toString(); - type = node.getName().toString(); - List superIfcs = node.superInterfaceTypes(); - extnds = superIfcs != null && !superIfcs.isEmpty() ? superIfcs - .toString() : null; - return super.visit(node); - } - } - - private static class MbeASTVisitor extends SieASTVisitor { - private String implmts; - private final Set fieldDeclarations = Sets.newHashSet(); - private final Set constructors = Sets.newHashSet(); - private final Set methods = new HashSet(); - private final Map requireIfc = Maps.newHashMap(); - private final Map methodJavadoc = Maps.newHashMap(); - - @Override - public boolean visit(final NormalAnnotation node) { - boolean result = super.visit(node); - if (node.getTypeName().toString() - .equals(RequireInterface.class.getCanonicalName()) - && node.getParent() instanceof MethodDeclaration) { - // remember only top level description annotation - String reqVal = node.values().get(0).toString(); - requireIfc.put(((MethodDeclaration) node.getParent()).getName() - .toString(), reqVal); - } - return result; - } - - @Override - public boolean visit(final FieldDeclaration node) { - fieldDeclarations.add(node.toString()); - return super.visit(node); - } - - @Override - public boolean visit(final MethodDeclaration node) { - if (node.isConstructor()) { - constructors.add(node.toString()); - } else { - String methodSignature = node.getReturnType2() + " " + node.getName() + "("; - boolean first = true; - for (Object o : node.parameters()) { - if (first){ - first = false; - } else { - methodSignature += ","; - } - methodSignature += o.toString(); - } - methodSignature += ")"; - methods.add(methodSignature); - if (node.getJavadoc() != null) { - methodJavadoc.put(methodSignature, node.getJavadoc().toString()); - } - } - return super.visit(node); - } - - @Override - public boolean visit(final TypeDeclaration node) { - boolean visit = super.visit(node); - List superIfcs = node.superInterfaceTypes(); - implmts = superIfcs != null && !superIfcs.isEmpty() ? superIfcs - .toString() : null; - extnds = node.getSuperclassType() == null ? null : node - .getSuperclassType().toString(); - return visit; - } + assertEquals("Incorrenct number of generated methods", 26, visitor.methods.size()); + visitor.assertMethodDescriptions(3); + visitor.assertMethodJavadocs(3); + visitor.assertMethodJavadoc("setMaximumSize", "void setMaximumSize(java.lang.Long maximumSize)"); } - private void assertContains(final String source, final String... contained) { + private static void assertContains(final String source, final String... contained) { for (String string : contained) { assertThat(source, containsString(string)); } } - private void processGeneratedCode(final Collection files, - final Map verifiers) throws IOException { - ASTParser parser = ASTParser.newParser(AST.JLS3); - Map options = JavaCore.getOptions(); - JavaCore.setComplianceOptions(JavaCore.VERSION_1_7, options); - parser.setCompilerOptions(options); - - parser.setKind(ASTParser.K_COMPILATION_UNIT); - - for (File file : files) { - char[] source = readFileAsChars(file); - parser.setSource(source); - parser.setResolveBindings(true); - - CompilationUnit cu = (CompilationUnit) parser.createAST(null); - // Check for compilation problems in generated file - for (IProblem c : cu.getProblems()) { - // 1610613332 = Syntax error, annotations are only available if - // source level is 5.0 - if (c.getID() == 1610613332) { - continue; - } - // 1610613332 = Syntax error, parameterized types are only - // available if source level is 5.0 - if (c.getID() == 1610613329) { - continue; - } - if (c.getID() == 1610613328) { - continue; - } - fail("Error in generated source code " + file + ":" - + c.getSourceLineNumber() + " id: " + c.getID() + " message:" + c.toString()); - } - - ASTVisitor visitor = verifiers.get(file.getName()); - if (visitor == null) { - fail("Unknown generated file " + file.getName()); - } - cu.accept(visitor); - - } - } - - public static char[] readFileAsChars(final File file) throws IOException { - List readLines = Files - .readLines(file, Charset.forName("utf-8")); - char[] retVal = new char[0]; - for (String string : readLines) { - char[] line = string.toCharArray(); - int beforeLength = retVal.length; - retVal = Arrays.copyOf(retVal, retVal.length + line.length + 1); - System.arraycopy(line, 0, retVal, beforeLength, line.length); - retVal[retVal.length - 1] = '\n'; - } - return retVal; + private static void verifyFile(final File file, final AbstractVerifier verifier) throws ParseException, IOException { + final CompilationUnit cu = JavaParser.parse(file); + cu.accept(verifier, null); + verifier.verify(); } - private static class MethodAssertion extends ArgumentAssertion{ + private static class MethodAssertion extends ArgumentAssertion { private final List arguments; @@ -764,7 +445,7 @@ public class JMXGeneratorTest extends AbstractGeneratorTest { sb.append(argument.type).append(' '); sb.append(argument.name); if(++i != arguments.size()) { - sb.append(','); + sb.append(", "); } } sb.append(')'); diff --git a/opendaylight/config/yang-jmx-generator-plugin/src/test/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/MbeASTVisitor.java b/opendaylight/config/yang-jmx-generator-plugin/src/test/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/MbeASTVisitor.java new file mode 100644 index 0000000000..3fc32dc0fc --- /dev/null +++ b/opendaylight/config/yang-jmx-generator-plugin/src/test/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/MbeASTVisitor.java @@ -0,0 +1,117 @@ +/* + * Copyright (c) 2016 Pantheon Technologies s.r.o. 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 static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import com.github.javaparser.ast.Node; +import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration; +import com.github.javaparser.ast.body.ConstructorDeclaration; +import com.github.javaparser.ast.body.FieldDeclaration; +import com.github.javaparser.ast.body.MethodDeclaration; +import com.github.javaparser.ast.comments.Comment; +import com.github.javaparser.ast.comments.JavadocComment; +import com.github.javaparser.ast.expr.NormalAnnotationExpr; +import com.github.javaparser.ast.type.ClassOrInterfaceType; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import org.opendaylight.controller.config.api.annotations.RequireInterface; + +class MbeASTVisitor extends SieASTVisitor { + private final Set constructors = new HashSet<>(); + private final Set fieldDeclarations = new HashSet<>(); + final Set methods = new HashSet<>(); + private final Map methodJavadoc = new HashMap<>(); + final Map requireIfc = new HashMap<>(); + + String implmts; + + MbeASTVisitor(final String expectedPackageName, final String fileName) { + super(expectedPackageName, fileName); + } + + @Override + public void visit(final NormalAnnotationExpr expr, final Void arg) { + super.visit(expr, arg); + + final String fqcn = expr.getName().toString(); + if (fqcn.equals(RequireInterface.class.getCanonicalName()) && expr.getParentNode() instanceof MethodDeclaration) { + final Node parent = expr.getParentNode(); + if (parent instanceof MethodDeclaration) { + // remember only top level description annotation + String reqVal = expr.getPairs().get(0).toString(); + requireIfc.put(((MethodDeclaration) parent).getName().toString(), reqVal); + } + } + } + + @Override + public void visit(final ConstructorDeclaration n, final Void arg) { + constructors.add(n.toString()); + super.visit(n, arg); + } + + @Override + public void visit(final MethodDeclaration n, final Void arg) { + final String signature = n.getDeclarationAsString(false, false); + + methods.add(signature); + + final Comment c = n.getComment(); + if (c instanceof JavadocComment) { + methodJavadoc.put(signature, c.toString()); + } + super.visit(n, arg); + } + + @Override + public void visit(final FieldDeclaration n, final Void arg) { + fieldDeclarations.add(n.toStringWithoutComments()); + super.visit(n, arg); + } + + @Override + public void visit(final ClassOrInterfaceDeclaration n, final Void arg) { + super.visit(n, arg); + + List superIfcs = n.getImplements(); + implmts = superIfcs != null && !superIfcs.isEmpty() ? superIfcs.toString() : null; + + if (!n.isInterface()) { + final List e = n.getExtends(); + if (!e.isEmpty()) { + extnds = e.get(0).toString(); + } + } + } + + void assertConstructors(final int expected) { + assertEquals("Incorrenct number of generated constructors", expected, constructors.size()); + } + + void assertField(final String declaration) { + assertTrue("Missing field " + declaration + ", got: " + fieldDeclarations, + fieldDeclarations.contains(declaration + ";")); + } + + void assertFields(final int expected) { + assertEquals("Incorrect number of generated fields", expected, fieldDeclarations.size()); + } + + void assertMethodJavadoc(final String method, final String signature) { + assertNotNull("Missing javadoc for " + method + " method " + methodJavadoc, methodJavadoc.get(signature)); + } + + void assertMethodJavadocs(final int expected) { + assertEquals("Incorrenct number of generated method javadoc", expected, methodJavadoc.size()); + } +} diff --git a/opendaylight/config/yang-jmx-generator-plugin/src/test/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ModuleMXBeanEntryPluginTest.java b/opendaylight/config/yang-jmx-generator-plugin/src/test/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ModuleMXBeanEntryPluginTest.java index ee81f1c1d9..d05ef0e2b9 100644 --- a/opendaylight/config/yang-jmx-generator-plugin/src/test/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ModuleMXBeanEntryPluginTest.java +++ b/opendaylight/config/yang-jmx-generator-plugin/src/test/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ModuleMXBeanEntryPluginTest.java @@ -12,7 +12,6 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertThat; - import java.util.Arrays; import java.util.Collection; import java.util.List; @@ -147,8 +146,7 @@ public class ModuleMXBeanEntryPluginTest extends ModuleMXBeanEntryTest { } } - private Method findFirstMethodByName(List methods, - String name) { + private static Method findFirstMethodByName(final List methods, final String name) { for (Method ms : methods) { if (name.equals(ms.getName())) { return ms; diff --git a/opendaylight/config/yang-jmx-generator-plugin/src/test/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/SieASTVisitor.java b/opendaylight/config/yang-jmx-generator-plugin/src/test/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/SieASTVisitor.java new file mode 100644 index 0000000000..9624239943 --- /dev/null +++ b/opendaylight/config/yang-jmx-generator-plugin/src/test/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/SieASTVisitor.java @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2016 Pantheon Technologies s.r.o. 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 static org.junit.Assert.assertEquals; +import com.github.javaparser.ast.Node; +import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration; +import com.github.javaparser.ast.body.MethodDeclaration; +import com.github.javaparser.ast.comments.Comment; +import com.github.javaparser.ast.comments.JavadocComment; +import com.github.javaparser.ast.expr.NormalAnnotationExpr; +import java.util.HashMap; +import java.util.Map; +import org.opendaylight.controller.config.api.annotations.Description; +import org.opendaylight.controller.config.api.annotations.ServiceInterfaceAnnotation; + +class SieASTVisitor extends AbstractVerifier { + private final Map methodDescriptions = new HashMap<>(); + protected String descriptionAnotValue; + protected String extnds; + protected String javadoc; + protected String sieAnnotValue; + protected String sieAnnotOsgiRegistrationType; + + SieASTVisitor(final String expectedPackageName, final String fileName) { + super(expectedPackageName, fileName); + } + + @Override + public void visit(final ClassOrInterfaceDeclaration n, final Void arg) { + extnds = n.getExtends().toString(); + + final Comment c = n.getComment(); + if (c instanceof JavadocComment) { + javadoc = c.toString(); + } + + super.visit(n, arg); + } + + @Override + public void visit(final NormalAnnotationExpr expr, final Void arg) { + final String fqcn = expr.getName().toString(); + if (fqcn.equals(Description.class.getCanonicalName())) { + final Node parent = expr.getParentNode(); + final String value = expr.getPairs().get(0).toString(); + if (parent instanceof ClassOrInterfaceDeclaration) { + descriptionAnotValue = value; + } else if (parent instanceof MethodDeclaration) { + methodDescriptions.put(((MethodDeclaration) parent).getName(), value); + } + } else if (fqcn.equals(ServiceInterfaceAnnotation.class.getCanonicalName())) { + String text1 = expr.getPairs().get(0).toString(); + String text2 = expr.getPairs().get(1).toString(); + if (text1.contains("value")) { + sieAnnotValue = text1; + sieAnnotOsgiRegistrationType = text2; + } else { + sieAnnotValue = text2; + sieAnnotOsgiRegistrationType = text1; + } + } + + super.visit(expr, arg); + } + + final void assertMethodDescriptions(final int expected) { + assertEquals("Incorrenct number of generated method descriptions", expected, methodDescriptions.size()); + } +} -- 2.36.6