/* * Copyright 2016 Red Hat, Inc. and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.kie.workbench.common.screens.projecteditor.backend.server; import java.util.Set; import javax.inject.Inject; import javax.inject.Named; import org.guvnor.common.services.backend.util.CommentedOptionFactory; import org.guvnor.common.services.project.model.GAV; import org.guvnor.common.services.project.model.MavenRepositoryMetadata; import org.guvnor.common.services.project.model.ProjectRepositories; import org.guvnor.common.services.project.service.DeploymentMode; import org.guvnor.common.services.project.service.GAVAlreadyExistsException; import org.guvnor.common.services.project.service.POMService; import org.guvnor.common.services.project.service.ProjectRepositoriesService; import org.guvnor.common.services.project.service.ProjectRepositoryResolver; import org.kie.workbench.common.screens.projecteditor.model.ProjectScreenModel; import org.kie.workbench.common.services.shared.kmodule.KModuleService; import org.kie.workbench.common.services.shared.project.KieProject; import org.kie.workbench.common.services.shared.project.KieProjectService; import org.kie.workbench.common.services.shared.project.ProjectImportsService; import org.kie.workbench.common.services.shared.whitelist.PackageNameWhiteListService; import org.uberfire.backend.server.util.Paths; import org.uberfire.backend.vfs.Path; import org.uberfire.io.IOService; public class ProjectScreenModelSaver { private POMService pomService; private KModuleService kModuleService; private ProjectImportsService importsService; private ProjectRepositoriesService repositoriesService; private PackageNameWhiteListService whiteListService; private IOService ioService; private KieProjectService projectService; private ProjectRepositoryResolver repositoryResolver; private CommentedOptionFactory commentedOptionFactory; public ProjectScreenModelSaver() { } @Inject public ProjectScreenModelSaver( final POMService pomService, final KModuleService kModuleService, final ProjectImportsService importsService, final ProjectRepositoriesService repositoriesService, final PackageNameWhiteListService whiteListService, final @Named("ioStrategy") IOService ioService, final KieProjectService projectService, final ProjectRepositoryResolver repositoryResolver, final CommentedOptionFactory commentedOptionFactory ) { this.pomService = pomService; this.kModuleService = kModuleService; this.importsService = importsService; this.repositoriesService = repositoriesService; this.whiteListService = whiteListService; this.ioService = ioService; this.projectService = projectService; this.repositoryResolver = repositoryResolver; this.commentedOptionFactory = commentedOptionFactory; } public void save( final Path pathToPomXML, final ProjectScreenModel model, final DeploymentMode mode, final String comment ) { if ( DeploymentMode.VALIDATED.equals( mode ) ) { checkRepositories( pathToPomXML, model ); } try { ioService.startBatch( Paths.convert( pathToPomXML ).getFileSystem(), commentedOptionFactory.makeCommentedOption( comment ) ); pomService.save( pathToPomXML, model.getPOM(), model.getPOMMetaData(), comment ); kModuleService.save( model.getPathToKModule(), model.getKModule(), model.getKModuleMetaData(), comment ); importsService.save( model.getPathToImports(), model.getProjectImports(), model.getProjectImportsMetaData(), comment ); repositoriesService.save( model.getPathToRepositories(), model.getRepositories(), comment ); whiteListService.save( model.getPathToWhiteList(), model.getWhiteList(), model.getWhiteListMetaData(), comment ); } catch ( final Exception e ) { throw new RuntimeException( e ); } finally { ioService.endBatch(); } } private void checkRepositories( final Path pathToPomXML, final ProjectScreenModel model ) { // Check is the POM's GAV has been changed. final GAV gav = model.getPOM().getGav(); final KieProject project = projectService.resolveProject( pathToPomXML ); if ( gav.equals( project.getPom().getGav() ) ) { return; } // Check is the Project's "proposed" GAV resolves to any pre-existing artifacts. // Use the Repositories in the model since the User may update the Repositories filter and save. final ProjectRepositories projectRepositories = model.getRepositories(); final Set<MavenRepositoryMetadata> repositories = repositoryResolver.getRepositoriesResolvingArtifact( gav, project, projectRepositories.filterByIncluded() ); if ( repositories.size() > 0 ) { throw new GAVAlreadyExistsException( gav, repositories ); } } }