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.GraphOperation;
import org.jboss.windup.config.phase.DiscoverProjectStructurePhase;
import org.jboss.windup.graph.model.ProjectModel;
import org.jboss.windup.graph.model.WindupConfigurationModel;
import org.jboss.windup.graph.model.resource.FileModel;
import org.jboss.windup.graph.service.ProjectService;
import org.jboss.windup.graph.service.WindupConfigurationService;
import org.ocpsoft.rewrite.config.Configuration;
import org.ocpsoft.rewrite.config.ConfigurationBuilder;
import org.ocpsoft.rewrite.context.EvaluationContext;
/**
* Finds files that were not classified as Maven archives/projects, and adds some generic project information for them.
*
* @author <a href="mailto:jesse.sightler@gmail.com">Jesse Sightler</a>
*/
@RuleMetadata(phase = DiscoverProjectStructurePhase.class, after = DiscoverNonMavenArchiveProjectsRuleProvider.class)
public class DiscoverNonMavenSourceProjectsRuleProvider extends AbstractRuleProvider
{
@Override
public Configuration getConfiguration(RuleLoaderContext ruleLoaderContext)
{
return ConfigurationBuilder.begin()
.addRule()
.perform(new AddProjectInformation());
}
private class AddProjectInformation extends GraphOperation
{
@Override
public void perform(GraphRewrite event, EvaluationContext context)
{
WindupConfigurationModel configuration = WindupConfigurationService.getConfigurationModel(event.getGraphContext());
for (FileModel mainFileModel : configuration.getInputPaths())
{
ProjectService projectModelService = new ProjectService(event.getGraphContext());
ProjectModel mainProjectModel = mainFileModel.getProjectModel();
if (mainProjectModel == null)
{
mainProjectModel = projectModelService.create();
mainProjectModel.setName(mainFileModel.getFileName());
mainProjectModel.setDescription("Source Directory");
mainProjectModel.setRootFileModel(mainFileModel);
mainProjectModel.addFileModel(mainFileModel);
}
addProjectToChildFiles(mainFileModel, mainProjectModel);
}
}
private void addProjectToChildFiles(FileModel fileModel, ProjectModel projectModel)
{
for (FileModel childFile : fileModel.getFilesInDirectory())
{
if (childFile.getProjectModel() == null)
{
projectModel.addFileModel(childFile);
}
else if (childFile.getProjectModel().getParentProject() == null && !childFile.getProjectModel().equals(projectModel))
{
// if the child has a project, but the project doesn't have a parent, associate it with the root
// project
childFile.getProjectModel().setParentProject(projectModel);
}
addProjectToChildFiles(childFile, projectModel);
}
}
public String toString()
{
return "ScanAsNonMavenProject";
}
}
@Override
public String toString()
{
return "AddProjectInformation";
}
}