package org.jboss.windup.rules.apps.mavenize; import java.util.logging.Logger; import org.jboss.windup.graph.model.ProjectModel; import org.jboss.windup.util.Logging; /** * Adds the appropriate API dependencies to Maven POMs based on features found in the project. * * This is in a prototyping stage. Far away from final implementation. * It could be rule-based in the future, so the users could write their own mapping. * * @author <a href="http://ondra.zizka.cz/">Ondrej Zizka, zizka@seznam.cz</a> */ class FeatureBasedApiDependenciesDeducer implements DependencyDeducer { private static final Logger LOG = Logging.get(FeatureBasedApiDependenciesDeducer.class); private MavenizationService.MavenizationContext mavCtx; FeatureBasedApiDependenciesDeducer(MavenizationService.MavenizationContext mavCtx) { this.mavCtx = mavCtx; } @Override public void addAppropriateDependencies(ProjectModel projectModel, Pom modulePom) { addDeploymentTypeBasedDependencies(projectModel, modulePom); addHardcodedRecognitionDependencies(projectModel, modulePom); addIndexBasedDependencies(projectModel, modulePom); } private void addIndexBasedDependencies(ProjectModel projectModel, Pom modulePom) { PackagesToContainingMavenArtifactsIndex packageIndex = new PackagesToContainingMavenArtifactsIndex(mavCtx.getGraphContext()); for (MavenCoord apiCoords : ApiDependenciesData.API_ARTIFACTS) { if (packageIndex.moduleContainsPackagesFromAPI(projectModel, apiCoords)) modulePom.getDependencies().add(new SimpleDependency(Dependency.Role.API, apiCoords)); } } /** * Adds the dependencies typical for particular deployment types. * This is not accurate and doesn't cover the real needs of the project. * Basically it's just to have "something" for the initial implementation. */ private boolean addDeploymentTypeBasedDependencies(ProjectModel projectModel, Pom modulePom) { if (projectModel.getProjectType() == null) return true; switch (projectModel.getProjectType()){ case "ear": break; case "war": modulePom.getDependencies().add(new SimpleDependency(Dependency.Role.API, ApiDependenciesData.DEP_API_SERVLET_31)); break; case "ejb": modulePom.getDependencies().add(new SimpleDependency(Dependency.Role.API, ApiDependenciesData.DEP_API_EJB_32)); modulePom.getDependencies().add(new SimpleDependency(Dependency.Role.API, ApiDependenciesData.DEP_API_CDI)); modulePom.getDependencies().add(new SimpleDependency(Dependency.Role.API, ApiDependenciesData.DEP_API_JAVAX_ANN)); break; case "ejb-client": modulePom.getDependencies().add(new SimpleDependency(Dependency.Role.API, ApiDependenciesData.DEP_API_EJB_CLIENT)); break; } return false; } /** * This is, theoretically, slightly better than addDeploymentTypeBasedDependencies(), * but we don't have any of the has*() methods implemented yet, so it does nothing. */ private void addHardcodedRecognitionDependencies(ProjectModel projectModel, Pom modulePom) { // TODO: Create a mapping from API occurence in the module into use of if (hasJpaEntities(projectModel)) modulePom.getDependencies().add(new SimpleDependency(Dependency.Role.API, ApiDependenciesData.DEP_API_JPA_21)); if (hasJsf(projectModel)) modulePom.getDependencies().add(new SimpleDependency(Dependency.Role.API, ApiDependenciesData.DEP_API_JSF)); if (hasJaxrs(projectModel)) modulePom.getDependencies().add(new SimpleDependency(Dependency.Role.API, ApiDependenciesData.DEP_API_JAXRS_20)); } private boolean hasJpaEntities(ProjectModel projectModel) { return false; } private boolean hasJsf(ProjectModel projectModel) { return false; } private boolean hasJaxrs(ProjectModel projectModel) { return false; } private boolean moduleContainsClassesFromAPI(ProjectModel projectModel, MavenCoord apiCoords) { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } }