package org.jboss.windup.rules.apps.java.scan.provider;
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.DuplicateArchiveModel;
import org.jboss.windup.graph.model.DuplicateProjectModel;
import org.jboss.windup.graph.model.ProjectModel;
import org.jboss.windup.graph.service.ProjectService;
import org.jboss.windup.graph.service.Service;
import org.ocpsoft.rewrite.config.Configuration;
import org.ocpsoft.rewrite.config.ConfigurationBuilder;
import org.ocpsoft.rewrite.context.EvaluationContext;
/**
* This creates {@link DuplicateProjectModel}s, associates them with the {@link DuplicateArchiveModel}s
* and attaches them to the canonical {@link ProjectModel}s.
*
* The links between the duplicated projects and archives follow this schema:
* <pre>
* ArchiveX.jar <-> canonical archive <-> ArchiveXDuplicate.jar
* | | |
* getProjectModel() getProjectModel() getProjectModel()
* | | |
* V V V
* ArchiveX.jar's project <-> canonical project <-> ArchiveXDuplicate.jar's project
* </pre>
* Canonical (virtual) project and archive has 1:N relation to duplicated project and archives.
*
*
* @author <a href="mailto:jesse.sightler@gmail.com">Jesse Sightler</a>
*/
@RuleMetadata(phase = DiscoverProjectStructurePhase.class, after = DiscoverMavenHierarchyRuleProvider.class)
public class DiscoverDuplicateArchiveProjectsRuleProvider extends AbstractRuleProvider
{
@Override
public Configuration getConfiguration(RuleLoaderContext ruleLoaderContext)
{
return ConfigurationBuilder.begin()
.addRule()
.when(Query.fromType(DuplicateArchiveModel.class))
.perform(new AbstractIterationOperation<DuplicateArchiveModel>()
{
@Override
public void perform(GraphRewrite event, EvaluationContext context, DuplicateArchiveModel payload)
{
setupProject(event, payload);
}
});
}
private void setupProject(GraphRewrite event, DuplicateArchiveModel duplicateArchive)
{
Service<DuplicateProjectModel> duplicateProjectService = event.getGraphContext().service(DuplicateProjectModel.class);
ArchiveModel canonicalArchive = duplicateArchive.getCanonicalArchive();
ProjectModel canonicalProject = canonicalArchive.getProjectModel();
DuplicateProjectModel duplicateProject = duplicateProjectService.create();
duplicateProject.setCanonicalProject(canonicalProject);
duplicateProject.setName(canonicalProject.getName());
if (duplicateArchive.getParentArchive() != null)
duplicateProject.setParentProject(duplicateArchive.getParentArchive().getProjectModel());
duplicateProject.setRootFileModel(duplicateArchive);
if (canonicalProject.getParentProject() == null)
{
ProjectService projectService = new ProjectService(event.getGraphContext());
ProjectModel sharedLibsProject = projectService.getOrCreateSharedLibsProject();
canonicalProject.setParentProject(sharedLibsProject);
}
duplicateProject.addFileModel(duplicateArchive);
}
}