Skip to content

Commit

Permalink
Fix FORGE-1775 - Maven project nesting fails if parent project inheri…
Browse files Browse the repository at this point in the history
…ts its version information from a parent
  • Loading branch information
lincolnthree committed Apr 29, 2014
1 parent 57f80df commit 375fd88
Show file tree
Hide file tree
Showing 2 changed files with 87 additions and 27 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import org.jboss.forge.addon.projects.ProjectAssociationProvider;
import org.jboss.forge.addon.projects.ProjectFactory;
import org.jboss.forge.addon.resource.Resource;
import org.jboss.forge.furnace.util.Strings;

/**
* Setup parent-child relation of Maven projects.
Expand All @@ -38,37 +39,53 @@ public void associate(final Project project, final Resource<?> parentResource)
Project parent = projectFactory.findProject(parentResource);
MavenFacet parentMavenFacet = parent.getFacet(MavenFacet.class);
Model parentPom = parentMavenFacet.getModel();
parentPom.setPackaging("pom");

String moduleDir = project.getRoot().getFullyQualifiedName()
.substring(parent.getRoot().getFullyQualifiedName().length());
if (moduleDir.startsWith(File.separator))
moduleDir = moduleDir.substring(1);
if (parentPom.getPackaging().equalsIgnoreCase("pom"))
{
String moduleDir = project.getRoot().getFullyQualifiedName()
.substring(parent.getRoot().getFullyQualifiedName().length());
if (moduleDir.startsWith(File.separator))
moduleDir = moduleDir.substring(1);

parentPom.addModule(moduleDir);
parentMavenFacet.setModel(parentPom);
parentPom.addModule(moduleDir);
parentMavenFacet.setModel(parentPom);

MavenFacet projectMavenFacet = project.getFacet(MavenFacet.class);
Model pom = projectMavenFacet.getModel();
MavenFacet projectMavenFacet = project.getFacet(MavenFacet.class);
Model pom = projectMavenFacet.getModel();

Parent projectParent = new Parent();
projectParent.setGroupId(parentPom.getGroupId());
projectParent.setArtifactId(parentPom.getArtifactId());
projectParent.setVersion(parentPom.getVersion());
Parent projectParent = new Parent();
projectParent.setGroupId(parentPom.getGroupId());
projectParent.setArtifactId(parentPom.getArtifactId());

// Calculate parent relative path
Path parentPomPath = Paths.get(parentMavenFacet.getModelResource().getFullyQualifiedName());
Path childPath = Paths.get(project.getRoot().getFullyQualifiedName());
Path relativePath = childPath.relativize(parentPomPath).normalize();
String version = resolveVersion(parentPom);
projectParent.setVersion(version);

projectParent.setRelativePath(relativePath.toString());
// Calculate parent relative path
Path parentPomPath = Paths.get(parentMavenFacet.getModelResource().getFullyQualifiedName());
Path childPath = Paths.get(project.getRoot().getFullyQualifiedName());
Path relativePath = childPath.relativize(parentPomPath).normalize();

// Reuse GroupId and version from parent
pom.setGroupId(null);
pom.setVersion(null);
pom.setParent(projectParent);
projectMavenFacet.setModel(pom);
projectParent.setRelativePath(relativePath.toString());

// Reuse GroupId and version from parent
pom.setGroupId(null);
pom.setVersion(null);
pom.setParent(projectParent);
projectMavenFacet.setModel(pom);
}
}
}

private String resolveVersion(Model parent)
{
String version = parent.getVersion();
while (Strings.isNullOrEmpty(version)
&& parent.getParent() != null
&& !Strings.isNullOrEmpty(parent.getParent().getVersion()))
{
version = parent.getParent().getVersion();
}
return version;
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,12 @@

import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.arquillian.junit.Arquillian;
import org.jboss.forge.addon.maven.projects.MavenFacet;
import org.jboss.forge.addon.maven.projects.MavenBuildSystemImpl;
import org.jboss.forge.addon.maven.projects.MavenFacet;
import org.jboss.forge.addon.projects.Project;
import org.jboss.forge.addon.projects.ProjectFactory;
import org.jboss.forge.addon.projects.facets.MetadataFacet;
import org.jboss.forge.addon.projects.facets.PackagingFacet;
import org.jboss.forge.addon.resource.DirectoryResource;
import org.jboss.forge.addon.resource.ResourceFactory;
import org.jboss.forge.arquillian.AddonDependency;
Expand Down Expand Up @@ -81,17 +82,59 @@ public void testCreateNestedProject() throws Exception
DirectoryResource projectDir = addonDir.createTempResource();
Project parentProject = projectFactory.createProject(projectDir, locator);
Assert.assertNotNull(parentProject);


parentProject.getFacet(PackagingFacet.class).setPackagingType("pom");

MetadataFacet metadata = parentProject.getFacet(MetadataFacet.class);
metadata.setProjectName("parent");
metadata.setTopLevelPackage("com.project.parent");

DirectoryResource subProjectDir = parentProject.getRootDirectory().getChildDirectory("sub");
DirectoryResource subProjectDir = parentProject.getRoot().reify(DirectoryResource.class).getChildDirectory("sub");
projectFactory.createProject(subProjectDir, locator);

MavenFacet mavenFacet = parentProject.getFacet(MavenFacet.class);
List<String> modules = mavenFacet.getModel().getModules();
Assert.assertTrue(!modules.isEmpty());
Assert.assertFalse(modules.isEmpty());
Assert.assertEquals("sub", modules.get(0));
}

@Test
public void testCreateNestedProjectWithParentThatHasInheritedVersion() throws Exception
{
DirectoryResource addonDir = factory.create(forge.getRepositories().get(0).getRootDirectory()).reify(
DirectoryResource.class);
DirectoryResource projectDir = addonDir.createTempResource();
Project parentProject = projectFactory.createProject(projectDir, locator);
Assert.assertNotNull(parentProject);

MetadataFacet metadata = parentProject.getFacet(MetadataFacet.class);
metadata.setProjectName("parent");
metadata.setTopLevelPackage("com.project.parent");
parentProject.getFacet(PackagingFacet.class).setPackagingType("pom");

DirectoryResource intermediateProjectDir = parentProject.getRoot().reify(DirectoryResource.class)
.getChildDirectory("intermediate");
Project intermediateProject = projectFactory.createProject(intermediateProjectDir, locator);

MavenFacet parentMavenFacet = parentProject.getFacet(MavenFacet.class);
List<String> modules = parentMavenFacet.getModel().getModules();
Assert.assertFalse(modules.isEmpty());
Assert.assertEquals("intermediate", modules.get(0));

intermediateProject.getFacet(MetadataFacet.class).setProjectVersion("");
intermediateProject.getFacet(PackagingFacet.class).setPackagingType("pom");

DirectoryResource subProjectDir = intermediateProject.getRoot().reify(DirectoryResource.class)
.getChildDirectory("sub");
Project subProject = projectFactory.createProject(subProjectDir, locator);

MavenFacet intermediateMavenFacet = intermediateProject.getFacet(MavenFacet.class);
List<String> intermediateModules = intermediateMavenFacet.getModel().getModules();
Assert.assertFalse(intermediateModules.isEmpty());
Assert.assertEquals("sub", intermediateModules.get(0));

String version = subProject.getFacet(MetadataFacet.class).getProjectVersion();
Assert.assertEquals(parentProject.getFacet(MetadataFacet.class).getProjectVersion(), version);

}
}

1 comment on commit 375fd88

@jsight
Copy link
Contributor

@jsight jsight commented on 375fd88 Apr 30, 2014

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This has a bug... in the case of a complex module creation, it will fail as the created parent project will not be parked as a "pom" type.

This causes the submodules not to associate correctly, and results in invalid poms. Basically the generated parent needs to be marked as a parent pom. At first glance, I am not entirely sure how to accomplish this?

Please sign in to comment.