package org.jboss.windup.rules.apps.java.scan.provider;
import java.util.logging.Logger;
import org.jboss.windup.config.AbstractRuleProvider;
import org.jboss.windup.config.GraphRewrite;
import org.jboss.windup.config.loader.RuleLoaderContext;
import org.jboss.windup.config.metadata.RuleMetadata;
import org.jboss.windup.config.operation.iteration.AbstractIterationOperation;
import org.jboss.windup.config.phase.DiscoverProjectStructurePhase;
import org.jboss.windup.config.query.Query;
import org.jboss.windup.graph.model.ArchiveModel;
import org.jboss.windup.graph.model.resource.FileModel;
import org.jboss.windup.rules.apps.java.model.project.MavenProjectModel;
import org.jboss.windup.util.Logging;
import org.ocpsoft.rewrite.config.Configuration;
import org.ocpsoft.rewrite.config.ConfigurationBuilder;
import org.ocpsoft.rewrite.context.EvaluationContext;
/**
* Links the Maven artifact archives according to their hierarchy.
*/
@RuleMetadata(phase = DiscoverProjectStructurePhase.class, after = {
DiscoverMavenProjectsRuleProvider.class,
DiscoverNonMavenArchiveProjectsRuleProvider.class,
DiscoverNonMavenSourceProjectsRuleProvider.class})
public class DiscoverMavenHierarchyRuleProvider extends AbstractRuleProvider
{
private static final Logger LOG = Logging.get(DiscoverMavenProjectsRuleProvider.class);
@Override
public Configuration getConfiguration(RuleLoaderContext ruleLoaderContext)
{
AbstractIterationOperation<MavenProjectModel> setupParentModule = new AbstractIterationOperation<MavenProjectModel>()
{
@Override
public void perform(GraphRewrite event, EvaluationContext context, MavenProjectModel payload)
{
setMavenParentProject(payload);
}
@Override
public String toString()
{
return "ConfigureProjectHierarchy";
}
};
// @formatter:off
return ConfigurationBuilder.begin()
.addRule()
.when(Query.fromType(MavenProjectModel.class))
.perform(setupParentModule);
// @formatter:on
}
private void setParentProject(ArchiveModel archiveModel, MavenProjectModel projectModel)
{
if (archiveModel == null)
return;
if (archiveModel.getProjectModel() != null)
{
String mavenGAV = projectModel.getGroupId() + ":" + projectModel.getArtifactId() + ":"
+ projectModel.getVersion();
String archivePath = archiveModel.getFilePath();
LOG.info("Setting parent project for: " + mavenGAV + " to: " + archivePath);
projectModel.setParentProject(archiveModel.getProjectModel());
}
else
{
setParentProject(archiveModel.getParentArchive(), projectModel);
}
}
private void setParentProject(FileModel fileModel, MavenProjectModel projectModel)
{
if (fileModel == null)
return;
else if (fileModel.getProjectModel() != null)
{
projectModel.setParentProject(fileModel.getProjectModel());
}
else
{
setParentProject(fileModel.getParentFile(), projectModel);
}
}
private void setMavenParentProject(MavenProjectModel projectModel)
{
FileModel fileModel = projectModel.getRootFileModel();
// skip if no file was discovered for it
if (fileModel == null)
return;
if (fileModel instanceof ArchiveModel)
{
ArchiveModel archiveModel = (ArchiveModel) fileModel;
// look at the parent archive first
setParentProject(archiveModel.getParentArchive(), projectModel);
}
else
{
FileModel parentFile = fileModel.getParentFile();
setParentProject(parentFile, projectModel);
}
}
}