/*
* 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.services.backend.project;
import java.util.Set;
import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.event.Event;
import javax.inject.Inject;
import javax.inject.Named;
import org.guvnor.common.services.backend.util.CommentedOptionFactory;
import org.guvnor.common.services.project.backend.server.AbstractProjectService;
import org.guvnor.common.services.project.builder.events.InvalidateDMOProjectCacheEvent;
import org.guvnor.common.services.project.events.NewPackageEvent;
import org.guvnor.common.services.project.events.NewProjectEvent;
import org.guvnor.common.services.project.events.RenameProjectEvent;
import org.guvnor.common.services.project.model.MavenRepositoryMetadata;
import org.guvnor.common.services.project.model.POM;
import org.guvnor.common.services.project.model.Package;
import org.guvnor.common.services.project.model.Project;
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.ProjectRepositoryResolver;
import org.guvnor.structure.backend.backcompat.BackwardCompatibleUtil;
import org.guvnor.structure.server.config.ConfigurationFactory;
import org.guvnor.structure.server.config.ConfigurationService;
import org.jboss.errai.bus.server.annotations.Service;
import org.kie.workbench.common.services.shared.project.KieProject;
import org.uberfire.backend.vfs.Path;
import org.uberfire.io.IOService;
import org.uberfire.rpc.SessionInfo;
import org.uberfire.security.authz.AuthorizationManager;
@Service
@ApplicationScoped
public class KieProjectServiceImpl
extends AbstractProjectService<KieProject>
implements KieProjectFactory,
org.kie.workbench.common.services.shared.project.KieProjectService {
private ProjectSaver projectSaver;
private ProjectRepositoryResolver repositoryResolver;
public KieProjectServiceImpl() {
}
@Inject
public KieProjectServiceImpl(final @Named("ioStrategy") IOService ioService,
final ProjectSaver projectSaver,
final POMService pomService,
final ConfigurationService configurationService,
final ConfigurationFactory configurationFactory,
final Event<NewProjectEvent> newProjectEvent,
final Event<NewPackageEvent> newPackageEvent,
final Event<RenameProjectEvent> renameProjectEvent,
final Event<InvalidateDMOProjectCacheEvent> invalidateDMOCache,
final SessionInfo sessionInfo,
final AuthorizationManager authorizationManager,
final BackwardCompatibleUtil backward,
final CommentedOptionFactory commentedOptionFactory,
final KieResourceResolver resourceResolver,
final ProjectRepositoryResolver repositoryResolver) {
super(ioService,
pomService,
configurationService,
configurationFactory,
newProjectEvent,
newPackageEvent,
renameProjectEvent,
invalidateDMOCache,
sessionInfo,
authorizationManager,
backward,
commentedOptionFactory,
resourceResolver);
this.projectSaver = projectSaver;
this.repositoryResolver = repositoryResolver;
}
protected void setProjectSaver(final ProjectSaver projectSaver) {
this.projectSaver = projectSaver;
}
@Override
public KieProject newProject(final Path repositoryPath,
final POM pom,
final String baseUrl) {
return newProject(repositoryPath,
pom,
baseUrl,
DeploymentMode.VALIDATED);
}
@Override
public KieProject newProject(final Path repositoryPath,
final POM pom,
final String baseUrl,
final DeploymentMode mode) {
if (DeploymentMode.VALIDATED.equals(mode)) {
checkRepositories(pom);
}
return projectSaver.save(repositoryPath,
pom,
baseUrl);
}
private void checkRepositories(final POM pom) {
// Check is the POM's GAV resolves to any pre-existing artifacts. We don't need to filter
// resolved Repositories by those enabled for the Project since this is a new Project.
final Set<MavenRepositoryMetadata> repositories = repositoryResolver.getRepositoriesResolvingArtifact(pom.getGav());
if (repositories.size() > 0) {
throw new GAVAlreadyExistsException(pom.getGav(),
repositories);
}
}
@Override
public KieProject simpleProjectInstance(final org.uberfire.java.nio.file.Path nioProjectRootPath) {
return (KieProject) resourceResolver.simpleProjectInstance(nioProjectRootPath);
}
@Override
public KieProject resolveProject(final Path resource) {
return (KieProject) resourceResolver.resolveProject(resource);
}
@Override
public Project resolveParentProject(final Path resource) {
return resourceResolver.resolveParentProject(resource);
}
@Override
public Project resolveToParentProject(final Path resource) {
return resourceResolver.resolveToParentProject(resource);
}
@Override
public Set<Package> resolvePackages(final Project project) {
return resourceResolver.resolvePackages(project);
}
@Override
public Set<Package> resolvePackages(final Package pkg) {
return resourceResolver.resolvePackages(pkg);
}
@Override
public Package resolveDefaultPackage(final Project project) {
return resourceResolver.resolveDefaultPackage(project);
}
@Override
public Path resolveDefaultPath( Package pkg, String resourceType ) {
return resourceResolver.resolveDefaultPath( pkg, resourceType );
}
@Override
public Package resolveParentPackage(final Package pkg) {
return resourceResolver.resolveParentPackage(pkg);
}
@Override
public boolean isPom(final Path resource) {
return resourceResolver.isPom(resource);
}
@Override
public Package resolvePackage(final Path resource) {
return resourceResolver.resolvePackage(resource);
}
}