Skip to content

Commit

Permalink
FORGE-2627: Introduced JavaTargetFacet
Browse files Browse the repository at this point in the history
  • Loading branch information
gastaldi committed Mar 28, 2016
1 parent e3a868f commit ce981bc
Show file tree
Hide file tree
Showing 4 changed files with 208 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
/*
* Copyright 2016 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Eclipse Public License version 1.0, available at
* http://www.eclipse.org/legal/epl-v10.html
*/

package org.jboss.forge.addon.maven.projects.facets;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import org.apache.maven.model.Build;
import org.jboss.forge.addon.facets.AbstractFacet;
import org.jboss.forge.addon.facets.constraints.FacetConstraint;
import org.jboss.forge.addon.maven.projects.MavenFacet;
import org.jboss.forge.addon.parser.java.facets.JavaTargetFacet;
import org.jboss.forge.addon.projects.Project;
import org.jboss.forge.addon.projects.facets.PackagingFacet;
import org.jboss.forge.addon.resource.DirectoryResource;

/**
*
* @author <a href="mailto:ggastald@redhat.com">George Gastaldi</a>
*/
@FacetConstraint({ MavenFacet.class, PackagingFacet.class })
public class MavenJavaTargetFacet extends AbstractFacet<Project> implements JavaTargetFacet
{
@Override
public List<DirectoryResource> getTargetDirectories()
{
List<DirectoryResource> result = new ArrayList<>();
result.add(getTargetDirectory());
result.add(getTestTargetDirectory());
return result;
}

@Override
public DirectoryResource getTargetDirectory()
{
MavenFacet mavenFacet = getFaceted().getFacet(MavenFacet.class);
Build build = mavenFacet.getModel().getBuild();
String targetFolderName;
if (build != null && build.getOutputDirectory() != null)
{
targetFolderName = mavenFacet.resolveProperties(build.getOutputDirectory());
}
else
{
targetFolderName = "target" + File.separator + "classes";
}
DirectoryResource projectRoot = getFaceted().getRoot().reify(DirectoryResource.class);
return projectRoot.getChildDirectory(targetFolderName);
}

@Override
public DirectoryResource getTestTargetDirectory()
{
MavenFacet mavenFacet = getFaceted().getFacet(MavenFacet.class);
Build build = mavenFacet.getModel().getBuild();
String targetFolderName;
if (build != null && build.getTestOutputDirectory() != null)
{
targetFolderName = mavenFacet.resolveProperties(build.getTestOutputDirectory());
}
else
{
targetFolderName = "target" + File.separator + "test-classes";
}
DirectoryResource projectRoot = getFaceted().getRoot().reify(DirectoryResource.class);
return projectRoot.getChildDirectory(targetFolderName);
}

@Override
public boolean install()
{
PackagingFacet packagingFacet = getFaceted().getFacet(PackagingFacet.class);
packagingFacet.createBuilder().quiet(true).runTests(false).build();
return isInstalled();
}

@Override
public boolean isInstalled()
{
return getTargetDirectory().exists();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ org.jboss.forge.addon.maven.projects.facets.MavenDependencyFacet
org.jboss.forge.addon.maven.projects.facets.MavenEnterpriseResourcesFacet
org.jboss.forge.addon.maven.projects.facets.MavenJavaCompilerFacet
org.jboss.forge.addon.maven.projects.facets.MavenJavaSourceFacet
org.jboss.forge.addon.maven.projects.facets.MavenJavaTargetFacet
org.jboss.forge.addon.maven.projects.facets.MavenMetadataFacet
org.jboss.forge.addon.maven.projects.facets.MavenModuleFacet
org.jboss.forge.addon.maven.projects.facets.MavenPackagingFacet
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
/**
* Copyright 2014 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Eclipse Public License version 1.0, available at
* http://www.eclipse.org/legal/epl-v10.html
*/

package org.jboss.forge.addon.maven.projects.facets;

import java.util.Arrays;

import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.arquillian.junit.Arquillian;
import org.jboss.forge.addon.facets.FacetFactory;
import org.jboss.forge.addon.parser.java.facets.JavaSourceFacet;
import org.jboss.forge.addon.parser.java.facets.JavaTargetFacet;
import org.jboss.forge.addon.parser.java.resources.JavaResource;
import org.jboss.forge.addon.projects.Project;
import org.jboss.forge.addon.projects.ProjectFactory;
import org.jboss.forge.arquillian.AddonDependencies;
import org.jboss.forge.arquillian.AddonDependency;
import org.jboss.forge.arquillian.archive.AddonArchive;
import org.jboss.forge.furnace.container.simple.Service;
import org.jboss.forge.furnace.container.simple.lifecycle.SimpleContainer;
import org.jboss.forge.roaster.Roaster;
import org.jboss.forge.roaster.model.source.JavaClassSource;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;

/**
*
* @author <a href="ggastald@redhat.com">George Gastaldi</a>
*/
@RunWith(Arquillian.class)
public class MavenJavaTargetFacetTest
{

@Deployment
@AddonDependencies({
@AddonDependency(name = "org.jboss.forge.addon:parser-java"),
@AddonDependency(name = "org.jboss.forge.addon:projects"),
@AddonDependency(name = "org.jboss.forge.addon:maven"),
@AddonDependency(name = "org.jboss.forge.furnace.container:simple")
})
public static AddonArchive getDeployment()
{
AddonArchive archive = ShrinkWrap
.create(AddonArchive.class)
.addAsServiceProvider(Service.class, MavenJavaTargetFacetTest.class);

return archive;
}

private ProjectFactory projectFactory;
private FacetFactory facetFactory;

@Before
public void setUp()
{
projectFactory = SimpleContainer.getServices(getClass().getClassLoader(), ProjectFactory.class).get();
facetFactory = SimpleContainer.getServices(getClass().getClassLoader(), FacetFactory.class).get();
}

@Test
public void testFacetInstallationBuildsProject() throws Exception
{
Project project = projectFactory.createTempProject(Arrays.asList(JavaSourceFacet.class));
JavaSourceFacet sourceFacet = project.getFacet(JavaSourceFacet.class);
JavaResource javaResource = sourceFacet.getJavaResource("com.example.App");
javaResource.setContents(Roaster.create(JavaClassSource.class).setName("App").setPackage("com.example"));
Assert.assertFalse(project.hasFacet(JavaTargetFacet.class));
JavaTargetFacet facet = facetFactory.install(project, JavaTargetFacet.class);
Assert.assertTrue(facet.getTargetDirectory().getChild("com/example/App.class").exists());
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
/*
* Copyright 2016 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Eclipse Public License version 1.0, available at
* http://www.eclipse.org/legal/epl-v10.html
*/

package org.jboss.forge.addon.parser.java.facets;

import java.util.List;

import org.jboss.forge.addon.projects.Project;
import org.jboss.forge.addon.projects.ProjectFacet;
import org.jboss.forge.addon.resource.DirectoryResource;

/**
* This facet provides the path to the compiled sources. It will build the project if explicitly installed.
*
* @author <a href="mailto:ggastald@redhat.com">George Gastaldi</a>
*/
public interface JavaTargetFacet extends ProjectFacet
{
/**
* Get the {@link DirectoryResource} this project uses to contain {@link Project} compiled documents (such as .class
* files.)
*/
DirectoryResource getTargetDirectory();

/**
* Get the {@link DirectoryResource} this {@link Project} uses to store test-scoped compiled classes (such as .class
* files.) Files in this directory will never be packaged or deployed except when running Unit Tests.
*/
DirectoryResource getTestTargetDirectory();

/**
* Get a list of {@link DirectoryResource}s this project uses to contain {@link Project} compiled documents (such as
* .class files.)
*/
List<DirectoryResource> getTargetDirectories();
}

0 comments on commit ce981bc

Please sign in to comment.