package org.jboss.windup.rules.java; import java.nio.file.Path; import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.RandomStringUtils; import org.apache.commons.lang3.RandomStringUtils2; import org.jboss.forge.furnace.repositories.AddonDependencyEntry; import org.jboss.forge.furnace.util.Callables; import org.jboss.windup.exec.configuration.WindupConfiguration; /** * This comment is here so that optimize imports in the IDE doesn't remove these two things: {@link Callables} {@link RandomStringUtils2} */ @RunWith(Arquillian.class) public class JavaClassTestFile2 { @Deployment @Dependencies({ @AddonDependency(name = "org.jboss.windup.config:windup-config"), @AddonDependency(name = "org.jboss.windup.exec:windup-exec"), @AddonDependency(name = "org.jboss.windup.rules.apps:windup-rules-java"), @AddonDependency(name = "org.jboss.windup.reporting:windup-reporting"), @AddonDependency(name = "org.jboss.forge.furnace.container:cdi") }) public static ForgeArchive getDeployment() { final ForgeArchive archive = ShrinkWrap.create(ForgeArchive.class) .addBeansXML() .addClass(TestHintsClassificationsTestRuleProvider.class) .addAsAddonDependencies( AddonDependencyEntry.create("org.jboss.windup.config:windup-config"), AddonDependencyEntry.create("org.jboss.windup.exec:windup-exec"), AddonDependencyEntry.create("org.jboss.windup.rules.apps:windup-rules-java"), AddonDependencyEntry.create("org.jboss.windup.reporting:windup-reporting"), AddonDependencyEntry.create("org.jboss.forge.furnace.container:cdi") ); return archive; } @Inject private TestHintsClassificationsTestRuleProvider provider; @Inject private WindupProcessor processor; @Inject private GraphContextFactory factory; @Test public void testHintsAndClassificationOperation() throws Exception { try (GraphContext context = factory.create()) { Assert.assertNotNull(context); // Output dir. final Path outputPath = Paths.get(FileUtils.getTempDirectory().toString(), "windup_" + RandomStringUtils.randomAlphanumeric(6)); FileUtils.deleteDirectory(outputPath.toFile()); Files.createDirectories(outputPath); String inputPath = "src/test/java/org/jboss/windup/rules/java"; ProjectModel pm = context.getFramed().addVertex(null, ProjectModel.class); pm.setName("Main Project"); FileModel inputPathFrame = context.getFramed().addVertex(null, FileModel.class); inputPathFrame.setFilePath(inputPath); inputPathFrame.setProjectModel(pm); pm.setRootFileModel(inputPathFrame); FileModel fileModel = context.getFramed().addVertex(null, FileModel.class); fileModel.setFilePath(inputPath + "/JavaHintsClassificationsTest2.java"); fileModel.setProjectModel(pm); pm.addFileModel(inputPathFrame); pm.addFileModel(fileModel); fileModel = context.getFramed().addVertex(null, FileModel.class); fileModel.setFilePath(inputPath + "/JavaClassTest.java"); fileModel.setProjectModel(pm); pm.addFileModel(fileModel); try { WindupConfiguration configuration = new WindupConfiguration() .setGraphContext(context) .setRuleProviderFilter( new RuleProviderWithDependenciesPredicate( TestHintsClassificationsTestRuleProvider.class)) .setInputPath(Paths.get(inputPath)) .setOutputDirectory(outputPath) .setOptionValue(ScanPackagesOption.NAME, Collections.singletonList("")) .setOptionValue(SourceModeOption.NAME, true); processor.execute(configuration); GraphService<InlineHintModel> hintService = new GraphService<>(context, InlineHintModel.class); GraphService<ClassificationModel> classificationService = new GraphService<>(context, ClassificationModel.class); GraphService<JavaTypeReferenceModel> typeRefService = new GraphService<>(context, JavaTypeReferenceModel.class); Iterable<JavaTypeReferenceModel> typeReferences = typeRefService.findAll(); Assert.assertTrue(typeReferences.iterator().hasNext()); Assert.assertEquals(3, provider.getTypeReferences().size()); List<InlineHintModel> hints = Iterators.asList(hintService.findAll()); Assert.assertEquals(3, hints.size()); List<ClassificationModel> classifications = Iterators.asList(classificationService.findAll()); Assert.assertEquals(1, classifications.size()); Iterable<FileModel> fileModels = classifications.get(0).getFileModels(); Assert.assertEquals(2, Iterators.asList(fileModels).size()); } finally { FileUtils.deleteDirectory(outputPath.toFile()); } } } @Singleton public static class TestHintsClassificationsTestRuleProvider extends WindupRuleProvider { private Set<JavaTypeReferenceModel> typeReferences = new HashSet<>(); @Override public RulePhase getPhase() { return RulePhase.INITIAL_ANALYSIS; } @Override public List<Class<? extends WindupRuleProvider>> getExecuteAfter() { return asClassList(AnalyzeJavaFilesRuleProvider.class); } // @formatter:off @Override public Configuration getConfiguration(GraphContext context) { AbstractIterationOperation<JavaTypeReferenceModel> addTypeRefToList = new AbstractIterationOperation<JavaTypeReferenceModel>() { @Override public void perform(GraphRewrite event, EvaluationContext context, JavaTypeReferenceModel payload) { typeReferences.add(payload); } }; return ConfigurationBuilder.begin() .addRule() .when(JavaClass.references("org.jboss.forge.furnace.*").at(TypeReferenceLocation.IMPORT)) .perform( Classification.as("Furnace Service").with(Link.to("JBoss Forge", "http://forge.jboss.org")).withEffort(0) .and(Hint.withText("Furnace type references imply that the client code must be run within a Furnace container.") .withEffort(8) .and(addTypeRefToList)) ); } // @formatter:on public Set<JavaTypeReferenceModel> getTypeReferences() { return typeReferences; } } }