BUG-4329: switch to javaparser 53/35153/2
authorRobert Varga <robert.varga@pantheon.sk>
Sun, 21 Feb 2016 16:07:10 +0000 (17:07 +0100)
committerRobert Varga <robert.varga@pantheon.sk>
Sun, 21 Feb 2016 20:49:27 +0000 (21:49 +0100)
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 <robert.varga@pantheon.sk>
opendaylight/config/yang-jmx-generator-plugin/pom.xml
opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/CodeWriter.java
opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/JMXGenerator.java
opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ftl/TemplateFactory.java
opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/util/StringUtil.java
opendaylight/config/yang-jmx-generator-plugin/src/test/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/AbstractGeneratorTest.java
opendaylight/config/yang-jmx-generator-plugin/src/test/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/AbstractVerifier.java [new file with mode: 0644]
opendaylight/config/yang-jmx-generator-plugin/src/test/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/JMXGeneratorTest.java
opendaylight/config/yang-jmx-generator-plugin/src/test/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/MbeASTVisitor.java [new file with mode: 0644]
opendaylight/config/yang-jmx-generator-plugin/src/test/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/ModuleMXBeanEntryPluginTest.java
opendaylight/config/yang-jmx-generator-plugin/src/test/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/SieASTVisitor.java [new file with mode: 0644]

index 13fa289c875e085a2acafe6ef0cca337cc216277..f385f2f7abbe392f44d3e5a907035ceb26608e22 100644 (file)
     </dependency>
 
     <dependency>
-      <groupId>org.eclipse</groupId>
-      <artifactId>jdt</artifactId>
+      <groupId>com.github.javaparser</groupId>
+      <artifactId>javaparser-core</artifactId>
+      <version>2.3.0</version>
       <scope>test</scope>
-
-      <exclusions>
-        <exclusion>
-          <groupId>org.eclipse.equinox</groupId>
-          <artifactId>app</artifactId>
-        </exclusion>
-      </exclusions>
-    </dependency>
-
-    <dependency>
-      <groupId>org.eclipse.equinox</groupId>
-      <artifactId>app</artifactId>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.eclipse.jdt</groupId>
-      <artifactId>core</artifactId>
-      <scope>test</scope>
-
-      <exclusions>
-        <exclusion>
-          <groupId>org.eclipse.equinox</groupId>
-          <artifactId>app</artifactId>
-        </exclusion>
-      </exclusions>
-
     </dependency>
 
     <dependency>
index a1ccdc3eba0eca98e31b0ad804cce6f6ecce194a..93a432c3fe17393a14a98eff7fae1dbf3d3c3ef7 100644 (file)
@@ -43,7 +43,7 @@ final class CodeWriter {
     private static final Logger LOG = LoggerFactory.getLogger(CodeWriter.class);
     private static final Optional<String> 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<File> writeMbe(ModuleMXBeanEntry mbe, File targetBaseDir,
-                               File mainBaseDir) {
+    public List<File> writeMbe(final ModuleMXBeanEntry mbe, final File targetBaseDir,
+                               final File mainBaseDir) {
         try {
             List<File> generatedFiles = Lists.newArrayList();
 
@@ -117,7 +117,8 @@ final class CodeWriter {
         }
     }
 
-    private List<File> persistGeneratedObjects(File targetBaseDir, File mainBaseDir, Map<GeneratedObject, Boolean> gos) throws IOException {
+    private static List<File> persistGeneratedObjects(final File targetBaseDir, final File mainBaseDir,
+            final Map<GeneratedObject, Boolean> gos) throws IOException {
         List<File> generatedFiles = new ArrayList<>();
         for (Entry<GeneratedObject, Boolean> entry : gos.entrySet()) {
             boolean overwrite = entry.getValue();
@@ -136,7 +137,7 @@ final class CodeWriter {
         return generatedFiles;
     }
 
-    private List<FtlTemplate> getRuntimeBeanFtlTemplates(Collection<RuntimeBeanEntry> runtimeBeans) {
+    private static List<FtlTemplate> getRuntimeBeanFtlTemplates(final Collection<RuntimeBeanEntry> runtimeBeans) {
         if (runtimeBeans.isEmpty()) {
             return Collections.emptyList();
         }
index 2216f19f884584ab0a4fd5762034817735ce4638..ae0962b9e74c1ddd49f90b4c4e115354d76417e5 100644 (file)
@@ -197,8 +197,7 @@ public class JMXGenerator implements BasicCodeGenerator, MavenProjectAware {
         this.generateModuleFactoryFile = extractModuleFactoryBoolean(additionalCfg);
     }
 
-    private boolean extractModuleFactoryBoolean(
-            final Map<String, String> additionalCfg) {
+    private static boolean extractModuleFactoryBoolean(final Map<String, String> additionalCfg) {
         String bool = additionalCfg.get(MODULE_FACTORY_FILE_BOOLEAN);
         return !"false".equals(bool);
     }
index 0030c3c03806eb5837335ff624cb2c8a5858a68c..999b27fb9198b92df5afb794431d878f428dac2e 100644 (file)
@@ -449,7 +449,7 @@ public class TemplateFactory {
                         Collections.singletonList(new Annotation("Override", Collections.<Parameter>emptyList())), equalsBodyBuilder.toString());
             }
 
-            private MethodDefinition getHash(final Map<String, AttributeIfc> attrs) {
+            private static MethodDefinition getHash(final Map<String, AttributeIfc> attrs) {
                 final StringBuilder hashBodyBuilder = new StringBuilder(
                         "        return java.util.Objects.hash(");
                 for (AttributeIfc s : attrs.values()) {
index 02ab91b817cb20bda841c4cc671076d41cba49da..01a495bf159301f0e15204454620ba6450439558 100644 (file)
@@ -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<FullyQualifiedName> list, String prefix) {
+    public static String prefixAndJoin(final List<FullyQualifiedName> 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<String> split = Splitter.on("\n").trimResults().split(input);
 
         int basicIndent = 4;
index fb5cd2e9899cdbe96540ff322ed3f5c4c5d50f1b..a17d50da5215405857a324f1e651767f8579517e 100644 (file)
@@ -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 (file)
index 0000000..d9dd5d0
--- /dev/null
@@ -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<Void> {
+    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);
+    }
+}
index c7a12a391738d901c174c8ac6124bf4880cdea4a..2fe087130833fcd527c569230572dab1544a1703 100644 (file)
@@ -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<String, String> map = Maps.newHashMap();
+    protected final HashMap<String, String> 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<String> toFileNames(final Collection<File> files) {
+    private static List<String> toFileNames(final Collection<File> files) {
         List<String> 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<File> files = jmxGenerator.generateSources(context,
-                outputBaseDir, Sets.newHashSet(threadsModule));
-        assertEquals(ServiceInterfaceEntryTest.expectedSIEFileNames,
-                toFileNames(files));
-
-        Map<String, ASTVisitor> 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<File> files = jmxGenerator.generateSources(context,
-                outputBaseDir, Sets.newHashSet(bgpListenerJavaModule));
+        Collection<File> 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<File> files = jmxGenerator.generateSources(context,
-                outputBaseDir, Sets.newHashSet(threadsJavaModule));
+        Collection<File> files = jmxGenerator.generateSources(context, outputBaseDir,
+            Collections.singleton(threadsJavaModule));
 
         assertEquals(expectedModuleFileNames, toFileNames(files));
 
-        Map<String, ASTVisitor> verifiers = Maps.newHashMap();
-
-        Collection<File> xmlFiles = Collections2.filter(files,
-                new Predicate<File>() {
-
-                    @Override
-                    public boolean apply(final File input) {
-                        return input.getName().endsWith("xml");
-                    }
-                });
-
-        Collection<File> javaFiles = Collections2.filter(files,
-                new Predicate<File>() {
-
-                    @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<File>() {
+            @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<String> lines = Sets.newHashSet(Files
-                .readLines(moduleFactoryFile, StandardCharsets.UTF_8));
-        Set<String> 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<String> lines = ImmutableSet.copyOf(Files.readLines(moduleFactoryFile, StandardCharsets.UTF_8));
+        Set<String> 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<File> xmlFiles) throws Exception {
+    private static void verifyXmlFiles(final Collection<File> 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<String> 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<Class<? extends org.opendaylight.controller.config.api.annotations.AbstractServiceInterface>> 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<String> methods, final int expectedSize) {
+    private static void assertFactoryMethods(final Set<String> methods, final int expectedSize) {
 
-        List<ArgumentAssertion> args = Lists.newArrayList();
+        List<ArgumentAssertion> 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<String> methods, final MethodAssertion methodAssertion) {
+    private static void assertMethodPresent(final Set<String> 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<String> 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<String> 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<String, String> 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<String> fieldDeclarations = Sets.newHashSet();
-        private final Set<String> constructors = Sets.newHashSet();
-        private final Set<String> methods = new HashSet<String>();
-        private final Map<String, String> requireIfc = Maps.newHashMap();
-        private final Map<String, String> 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<File> files,
-            final Map<String, ASTVisitor> 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<String> 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<ArgumentAssertion> 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 (file)
index 0000000..3fc32dc
--- /dev/null
@@ -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<String> constructors = new HashSet<>();
+    private final Set<String> fieldDeclarations = new HashSet<>();
+    final Set<String> methods = new HashSet<>();
+    private final Map<String, String> methodJavadoc = new HashMap<>();
+    final Map<String, String> 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<ClassOrInterfaceType> 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());
+    }
+}
index ee81f1c1d98f971d560408b8985b34d9c94fd41d..d05ef0e2b9c4fd6ef2b89aa1c8fd7a495cb2cc13 100644 (file)
@@ -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<? extends Method> methods,
-            String name) {
+    private static Method findFirstMethodByName(final List<? extends Method> 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 (file)
index 0000000..9624239
--- /dev/null
@@ -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<String, String> 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());
+    }
+}