package org.axway.grapes.server.core; import org.axway.grapes.commons.datamodel.DataModelFactory; import org.axway.grapes.commons.datamodel.Dependency; import org.axway.grapes.server.core.options.FiltersHolder; import org.axway.grapes.server.core.options.filters.CorporateFilter; import org.axway.grapes.server.core.options.filters.PromotedFilter; import org.axway.grapes.server.db.DataUtils; import org.axway.grapes.server.db.ModelMapper; import org.axway.grapes.server.db.RepositoryHandler; import org.axway.grapes.server.db.datamodel.*; import org.axway.grapes.server.webapp.views.PromotionReportView; import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.Response; import java.util.ArrayList; import java.util.List; /** * Module Handler * * <p>Manages all operation regarding Modules. It can, get/update Modules of the database.</p> * * @author jdcoffre */ public class ModuleHandler { private final RepositoryHandler repositoryHandler; public ModuleHandler(final RepositoryHandler repositoryHandler) { this.repositoryHandler = repositoryHandler; } /** * Add/update module in the database * * @param dbModule DbModule */ public void store(final DbModule dbModule){ repositoryHandler.store(dbModule); } /** * Returns the available module names regarding the filters * * @param filters FiltersHolder * @return List<String> */ public List<String> getModuleNames(final FiltersHolder filters) { return repositoryHandler.getModuleNames(filters); } /** * Returns the available module names regarding the filters * * @param name String * @param filters FiltersHolder * @return List<String> */ public List<String> getModuleVersions(final String name, final FiltersHolder filters) { final List<String> versions = repositoryHandler.getModuleVersions(name, filters); if(versions.isEmpty()){ throw new WebApplicationException(Response.status(Response.Status.NOT_FOUND) .entity("Module " + name + " does not exist.").build()); } return versions; } /** * Returns a module * * @param moduleId String * @return DbModule */ public DbModule getModule(final String moduleId) { final DbModule dbModule = repositoryHandler.getModule(moduleId); if(dbModule == null){ throw new WebApplicationException(Response.status(Response.Status.NOT_FOUND) .entity("Module " + moduleId + " does not exist.").build()); } return dbModule; } /** * Delete a module * * @param moduleId String */ public void deleteModule(final String moduleId) { final DbModule module = getModule(moduleId); repositoryHandler.deleteModule(module.getId()); for(String gavc: DataUtils.getAllArtifacts(module)){ repositoryHandler.deleteArtifact(gavc); } } /** * Return a licenses view of the targeted module * * @param moduleId String * @return List<DbLicense> */ public List<DbLicense> getModuleLicenses(final String moduleId) { final DbModule module = getModule(moduleId); final List<DbLicense> licenses = new ArrayList<DbLicense>(); final FiltersHolder filters = new FiltersHolder(); final ArtifactHandler artifactHandler = new ArtifactHandler(repositoryHandler); for(String gavc: DataUtils.getAllArtifacts(module)){ licenses.addAll(artifactHandler.getArtifactLicenses(gavc, filters)); } return licenses; } /** * Perform the module promotion * * @param moduleId String */ public void promoteModule(final String moduleId) { final DbModule module = getModule(moduleId); for(String gavc: DataUtils.getAllArtifacts(module)){ final DbArtifact artifact = repositoryHandler.getArtifact(gavc); artifact.setPromoted(true); repositoryHandler.store(artifact); } repositoryHandler.promoteModule(module); } /** * Provide a report about the promotion feasibility * * @param moduleId String * @return PromotionReportView */ public PromotionReportView getPromotionReport(final String moduleId) { final DependencyHandler depHandler = new DependencyHandler(repositoryHandler); final ModelMapper modelMapper = new ModelMapper(repositoryHandler); final DbModule module = getModule(moduleId); final DbOrganization organization = getOrganization(module); final PromotionReportView report = new PromotionReportView(); report.setRootModule(DataModelFactory.createModule(module.getName(), module.getVersion())); if(!report.isSnapshot()) { // filters initialization final FiltersHolder filters = new FiltersHolder(); filters.addFilter(new PromotedFilter(false)); filters.addFilter(new CorporateFilter(organization)); // Checks if each dependency module has been promoted for (Dependency dependency : depHandler.getModuleDependencies(moduleId, filters)) { final DbModule depModule = repositoryHandler.getRootModuleOf(dependency.getTarget().getGavc()); if (depModule != null && !depModule.getId().equals(moduleId)) { if (!depModule.isPromoted()) { report.addUnPromotedDependency(depModule.getId()); report.addDependencyPromotionReport(depModule.getId(), getPromotionReport(depModule.getId())); } } } // Checks if the module has dependencies that shouldn't be used final List<String> treatedArtifacts = new ArrayList<String>(); for (DbDependency dependency : DataUtils.getAllDbDependencies(module)) { final DbArtifact artifactDep = repositoryHandler.getArtifact(dependency.getTarget()); if (artifactDep == null) { // handle the case of a corporate artifact which is not available in the repository continue; } if (artifactDep.getDoNotUse() && !treatedArtifacts.contains(artifactDep.getGavc())) { report.addDoNotUseArtifact(modelMapper.getArtifact(artifactDep)); treatedArtifacts.add(artifactDep.getGavc()); } } } report.compute(); return report; } public DbOrganization getOrganization(final DbModule module) { if(module.getOrganization() == null || module.getOrganization().isEmpty()){ final DbOrganization organization = new DbOrganization(); organization.setName("No organization registered"); return organization; } final OrganizationHandler handler = new OrganizationHandler(repositoryHandler); return handler.getOrganization(module.getOrganization()); } /** * Provides a list of module regarding the filters * * @param filters FiltersHolder * @return List<DbModule> */ public List<DbModule> getModules(final FiltersHolder filters) { return repositoryHandler.getModules(filters); } }