diff --git a/reporting/api/src/main/java/org/jboss/windup/reporting/config/Classification.java b/reporting/api/src/main/java/org/jboss/windup/reporting/config/Classification.java index b217047492..dabbd36b94 100644 --- a/reporting/api/src/main/java/org/jboss/windup/reporting/config/Classification.java +++ b/reporting/api/src/main/java/org/jboss/windup/reporting/config/Classification.java @@ -140,8 +140,17 @@ public void perform(GraphRewrite event, EvaluationContext context, FileModel pay } } + // check for duplicate adds first + for (FileModel existingFileModel : classification.getFileModels()) + { + if (existingFileModel.asVertex().getId().equals(payload.asVertex().getId())) + { + log.info("Classification already added to " + payload.getPrettyPathWithinProject() + " [" + this + + "] -- not adding again"); + return; + } + } classification.addFileModel(payload); - log.info("Classification added to " + payload.getPrettyPathWithinProject() + " [" + this + "] "); } diff --git a/rules-java-ee/src/main/java/org/jboss/windup/rules/apps/legacy/java/SeamToCDI.java b/rules-java-ee/src/main/java/org/jboss/windup/rules/apps/legacy/java/SeamToCDI.java index 4ccbfe475a..5e2f1b37f7 100644 --- a/rules-java-ee/src/main/java/org/jboss/windup/rules/apps/legacy/java/SeamToCDI.java +++ b/rules-java-ee/src/main/java/org/jboss/windup/rules/apps/legacy/java/SeamToCDI.java @@ -36,7 +36,7 @@ public Configuration getConfiguration(GraphContext context) .begin() .addRule() - .when(JavaClass.references("org.jboss.seam")) + .when(JavaClass.references("org.jboss.seam.*")) .perform(Classification.as("SEAM Component").with( Link.to("Seam 2 to Seam 3 Migration Notes","http://www.seamframework.org/Seam3/Seam2ToSeam3MigrationNotes")) .with(Link diff --git a/rules-java/src/main/java/org/jboss/windup/rules/apps/java/config/JavaClass.java b/rules-java/src/main/java/org/jboss/windup/rules/apps/java/config/JavaClass.java index 960c54ba49..f22b6cd47e 100644 --- a/rules-java/src/main/java/org/jboss/windup/rules/apps/java/config/JavaClass.java +++ b/rules-java/src/main/java/org/jboss/windup/rules/apps/java/config/JavaClass.java @@ -102,7 +102,7 @@ public boolean evaluate(Object first, Object second) }; pipeline.as("result").out(FileReferenceModel.FILE_MODEL) - .out(JavaSourceFileModel.PROPERTY_JAVA_CLASS_MODEL) + .out(JavaSourceFileModel.JAVA_CLASS_MODEL) .has(JavaClassModel.PROPERTY_QUALIFIED_NAME, regexPredicate, fileRegex).back("result"); } }; diff --git a/rules-java/src/main/java/org/jboss/windup/rules/apps/java/model/JavaClassFileModel.java b/rules-java/src/main/java/org/jboss/windup/rules/apps/java/model/JavaClassFileModel.java index 11b5960008..7d3f275488 100644 --- a/rules-java/src/main/java/org/jboss/windup/rules/apps/java/model/JavaClassFileModel.java +++ b/rules-java/src/main/java/org/jboss/windup/rules/apps/java/model/JavaClassFileModel.java @@ -37,13 +37,13 @@ public interface JavaClassFileModel extends FileModel /** * Contains the {@link JavaClassModel} represented by this .class file. */ - @Adjacency(label = JavaSourceFileModel.PROPERTY_JAVA_CLASS_MODEL, direction = Direction.OUT) + @Adjacency(label = JavaSourceFileModel.JAVA_CLASS_MODEL, direction = Direction.OUT) public void setJavaClass(JavaClassModel model); /** * Contains the {@link JavaClassModel} represented by this .class file. */ - @Adjacency(label = JavaSourceFileModel.PROPERTY_JAVA_CLASS_MODEL, direction = Direction.OUT) + @Adjacency(label = JavaSourceFileModel.JAVA_CLASS_MODEL, direction = Direction.OUT) public JavaClassModel getJavaClass(); /** diff --git a/rules-java/src/main/java/org/jboss/windup/rules/apps/java/model/JavaSourceFileModel.java b/rules-java/src/main/java/org/jboss/windup/rules/apps/java/model/JavaSourceFileModel.java index 0b2cd05c02..909425ebf0 100644 --- a/rules-java/src/main/java/org/jboss/windup/rules/apps/java/model/JavaSourceFileModel.java +++ b/rules-java/src/main/java/org/jboss/windup/rules/apps/java/model/JavaSourceFileModel.java @@ -8,21 +8,42 @@ import com.tinkerpop.frames.Property; import com.tinkerpop.frames.modules.typedgraph.TypeValue; -@TypeValue("JavaSourceFileModel") +/** + * Represents a source ".java" file on disk. + * + * @author jsightler + */ +@TypeValue(JavaSourceFileModel.TYPE) public interface JavaSourceFileModel extends FileModel, SourceFileModel { - public static final String PROPERTY_PACKAGE_NAME = "packageName"; - public static final String PROPERTY_JAVA_CLASS_MODEL = "javaClass"; + public static final String UNPARSEABLE_JAVA_CLASSIFICATION = "Unparseable Java File"; + public static final String UNPARSEABLE_JAVA_DESCRIPTION = "This Java file could not be parsed"; - @Property(PROPERTY_PACKAGE_NAME) + public static final String TYPE = "JavaSourceFileModel"; + public static final String PACKAGE_NAME = "packageName"; + public static final String JAVA_CLASS_MODEL = "javaClass"; + + /** + * Contains the Java package name + */ + @Property(PACKAGE_NAME) public String getPackageName(); - @Property(PROPERTY_PACKAGE_NAME) + /** + * Contains the Java package name + */ + @Property(PACKAGE_NAME) public void setPackageName(String packageName); - @Adjacency(label = PROPERTY_JAVA_CLASS_MODEL, direction = Direction.OUT) + /** + * Lists the {@link JavaClassModel}s contained within this source file + */ + @Adjacency(label = JAVA_CLASS_MODEL, direction = Direction.OUT) public Iterable getJavaClasses(); - @Adjacency(label = PROPERTY_JAVA_CLASS_MODEL, direction = Direction.OUT) + /** + * Lists the {@link JavaClassModel}s contained within this source file + */ + @Adjacency(label = JAVA_CLASS_MODEL, direction = Direction.OUT) public void addJavaClass(JavaClassModel javaClassModel); } \ No newline at end of file diff --git a/rules-java/src/main/java/org/jboss/windup/rules/apps/java/scan/provider/DiscoverJavaFilesRuleProvider.java b/rules-java/src/main/java/org/jboss/windup/rules/apps/java/scan/provider/DiscoverJavaFilesRuleProvider.java index e603bb5922..f28bdd6b2b 100644 --- a/rules-java/src/main/java/org/jboss/windup/rules/apps/java/scan/provider/DiscoverJavaFilesRuleProvider.java +++ b/rules-java/src/main/java/org/jboss/windup/rules/apps/java/scan/provider/DiscoverJavaFilesRuleProvider.java @@ -8,8 +8,11 @@ import java.util.List; import org.jboss.forge.furnace.util.Strings; +import org.jboss.forge.roaster.ParserException; import org.jboss.forge.roaster.Roaster; -import org.jboss.forge.roaster.model.source.JavaClassSource; +import org.jboss.forge.roaster.model.Extendable; +import org.jboss.forge.roaster.model.InterfaceCapable; +import org.jboss.forge.roaster.model.source.JavaSource; import org.jboss.windup.config.GraphRewrite; import org.jboss.windup.config.RulePhase; import org.jboss.windup.config.WindupRuleProvider; @@ -21,6 +24,7 @@ import org.jboss.windup.graph.model.resource.FileModel; import org.jboss.windup.graph.service.GraphService; import org.jboss.windup.reporting.model.TechnologyTagLevel; +import org.jboss.windup.reporting.service.ClassificationService; import org.jboss.windup.reporting.service.TechnologyTagService; import org.jboss.windup.rules.apps.java.model.JavaClassModel; import org.jboss.windup.rules.apps.java.model.JavaSourceFileModel; @@ -124,11 +128,24 @@ public void perform(GraphRewrite event, EvaluationContext context, FileModel pay } } - private void addParsedClassToFile(FileInputStream fis, GraphContext context, JavaSourceFileModel classFileModel) + private void addParsedClassToFile(FileInputStream fis, GraphContext context, JavaSourceFileModel sourceFileModel) { - JavaClassSource javaClass = Roaster.parse(JavaClassSource.class, fis); - String packageName = javaClass.getPackage(); - String qualifiedName = javaClass.getQualifiedName(); + JavaSource javaSource; + try + { + javaSource = Roaster.parse(JavaSource.class, fis); + } + catch (ParserException e) + { + ClassificationService classificationService = new ClassificationService(context); + classificationService.attachClassification(sourceFileModel, + JavaSourceFileModel.UNPARSEABLE_JAVA_CLASSIFICATION, + JavaSourceFileModel.UNPARSEABLE_JAVA_DESCRIPTION); + return; + } + + String packageName = javaSource.getPackage(); + String qualifiedName = javaSource.getQualifiedName(); String simpleName = qualifiedName; if (packageName != null && !packageName.equals("") && simpleName != null) @@ -142,23 +159,31 @@ private void addParsedClassToFile(FileInputStream fis, GraphContext context, Jav javaClassModel.setSimpleName(simpleName); javaClassModel.setPackageName(packageName); javaClassModel.setQualifiedName(qualifiedName); - javaClassModel.setClassFile(classFileModel); + javaClassModel.setClassFile(sourceFileModel); - List interfaceNames = javaClass.getInterfaces(); - if (interfaceNames != null) + if (javaSource instanceof InterfaceCapable) { - for (String iface : interfaceNames) + InterfaceCapable interfaceCapable = (InterfaceCapable) javaSource; + List interfaceNames = interfaceCapable.getInterfaces(); + if (interfaceNames != null) { - JavaClassModel interfaceModel = javaClassService.getOrCreate(iface); - javaClassModel.addImplements(interfaceModel); + for (String iface : interfaceNames) + { + JavaClassModel interfaceModel = javaClassService.getOrCreate(iface); + javaClassModel.addImplements(interfaceModel); + } } } - String superclassName = javaClass.getSuperType(); - if (Strings.isNullOrEmpty(superclassName)) - javaClassModel.setExtends(javaClassService.getOrCreate(superclassName)); + if (javaSource instanceof Extendable) + { + Extendable extendable = (Extendable) javaSource; + String superclassName = extendable.getSuperType(); + if (Strings.isNullOrEmpty(superclassName)) + javaClassModel.setExtends(javaClassService.getOrCreate(superclassName)); + } - classFileModel.addJavaClass(javaClassModel); + sourceFileModel.addJavaClass(javaClassModel); } } diff --git a/tests/src/test/java/org/jboss/windup/tests/application/WindupArchitectureSeamBookingSourceTest.java b/tests/src/test/java/org/jboss/windup/tests/application/WindupArchitectureSeamBookingSourceTest.java new file mode 100644 index 0000000000..aab7131656 --- /dev/null +++ b/tests/src/test/java/org/jboss/windup/tests/application/WindupArchitectureSeamBookingSourceTest.java @@ -0,0 +1,58 @@ +package org.jboss.windup.tests.application; + +import org.jboss.arquillian.container.test.api.Deployment; +import org.jboss.arquillian.junit.Arquillian; +import org.jboss.forge.arquillian.AddonDependency; +import org.jboss.forge.arquillian.Dependencies; +import org.jboss.forge.arquillian.archive.ForgeArchive; +import org.jboss.forge.furnace.repositories.AddonDependencyEntry; +import org.jboss.shrinkwrap.api.ShrinkWrap; +import org.jboss.windup.graph.GraphContext; +import org.junit.Test; +import org.junit.runner.RunWith; + +@RunWith(Arquillian.class) +public class WindupArchitectureSeamBookingSourceTest extends WindupArchitectureTest +{ + @Deployment + @Dependencies({ + @AddonDependency(name = "org.jboss.windup.graph:windup-graph"), + @AddonDependency(name = "org.jboss.windup.exec:windup-exec"), + @AddonDependency(name = "org.jboss.windup.rules.apps:rules-java"), + @AddonDependency(name = "org.jboss.windup.rules.apps:rules-java-ee"), + @AddonDependency(name = "org.jboss.windup.utils:utils"), + @AddonDependency(name = "org.jboss.windup.tests:test-util"), + @AddonDependency(name = "org.jboss.windup.reporting:windup-reporting"), + @AddonDependency(name = "org.jboss.windup.ext:windup-config-groovy"), + @AddonDependency(name = "org.jboss.forge.furnace.container:cdi"), + }) + public static ForgeArchive getDeployment() + { + ForgeArchive archive = ShrinkWrap.create(ForgeArchive.class) + .addBeansXML() + .addClass(WindupArchitectureTest.class) + .addAsAddonDependencies( + AddonDependencyEntry.create("org.jboss.windup.graph:windup-graph"), + AddonDependencyEntry.create("org.jboss.windup.exec:windup-exec"), + AddonDependencyEntry.create("org.jboss.windup.rules.apps:rules-java"), + AddonDependencyEntry.create("org.jboss.windup.rules.apps:rules-java-ee"), + AddonDependencyEntry.create("org.jboss.windup.utils:utils"), + AddonDependencyEntry.create("org.jboss.windup.tests:test-util"), + AddonDependencyEntry.create("org.jboss.windup.reporting:windup-reporting"), + AddonDependencyEntry.create("org.jboss.windup.ext:windup-config-groovy"), + AddonDependencyEntry.create("org.jboss.forge.furnace.container:cdi") + ); + return archive; + } + + @Test + public void testRunWindupSeamBookingSourceMode() throws Exception + { + try (GraphContext context = createGraphContext()) + { + // The test-files folder in the project root dir. + super.runTest(context, "../test-files/seam-booking-5.2", true); + } + } + +}