/*
* Copyright 2012 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.guvnor.asset.management.backend.service;
import java.net.URI;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.event.Event;
import javax.enterprise.inject.Instance;
import javax.inject.Inject;
import javax.inject.Named;
import org.guvnor.asset.management.model.ConfigureRepositoryEvent;
import org.guvnor.asset.management.service.AssetManagementService;
import org.guvnor.common.services.project.model.POM;
import org.guvnor.common.services.project.model.Project;
import org.guvnor.common.services.project.service.POMService;
import org.guvnor.common.services.project.service.ProjectService;
import org.guvnor.structure.repositories.NewBranchEvent;
import org.guvnor.structure.repositories.Repository;
import org.guvnor.structure.repositories.RepositoryService;
import org.jboss.errai.bus.server.annotations.Service;
import org.uberfire.backend.server.util.Paths;
import org.uberfire.io.IOService;
import org.uberfire.java.nio.file.DirectoryStream;
import org.uberfire.java.nio.file.Files;
import org.uberfire.java.nio.file.Path;
@Service
@ApplicationScoped
public class AssetManagementServiceImpl implements AssetManagementService {
private Instance<ProjectService<?>> projectService;
private IOService ioService;
private POMService pomService;
private RepositoryService repositoryService;
private Event<NewBranchEvent> newBranchEvent;
private Event<ConfigureRepositoryEvent> configureRepositoryEvent;
public AssetManagementServiceImpl() {
//Zero-parameter constructor for CDI proxies
}
@Inject
public AssetManagementServiceImpl( final Event<NewBranchEvent> newBranchEvent,
final Event<ConfigureRepositoryEvent> configureRepositoryEvent,
final POMService pomService,
@Named("ioStrategy") final IOService ioService,
final RepositoryService repositoryService,
final Instance<ProjectService<?>> projectService ) {
this.ioService = ioService;
this.newBranchEvent = newBranchEvent;
this.configureRepositoryEvent = configureRepositoryEvent;
this.pomService = pomService;
this.repositoryService = repositoryService;
this.projectService = projectService;
}
@Override
public void configureRepository( final String repository,
final String sourceBranch,
final String devBranch,
final String releaseBranch,
final String version ) {
String branchName = devBranch;
if (version != null && !version.isEmpty()) {
branchName = branchName + "-" + version;
}
// create development branch
Path branchPath = ioService.get(URI.create("default://" + branchName + "@" + repository));
Path branchOriginPath = ioService.get(URI.create("default://" + sourceBranch + "@" + repository));
ioService.copy(branchOriginPath, branchPath);
// update development branch project
Repository repo = repositoryService.getRepository(Paths.convert(branchPath));
// update all pom.xml files of projects on the dev branch
String devVersion = null;
if (version == null) {
devVersion = "1.0.0";
} else if (!version.endsWith("-SNAPSHOT")) {
devVersion = version.concat("-SNAPSHOT");
} else {
devVersion = version;
}
Set<Project> projects = getProjects(repo);
for (Project project : projects) {
POM pom = pomService.load(project.getPomXMLPath());
pom.getGav().setVersion(devVersion);
pomService.save(project.getPomXMLPath(), pom, null, "Update project version on development branch");
}
newBranchEvent.fire(new NewBranchEvent(repository, branchName, Paths.convert(branchPath), System.currentTimeMillis()) );
// create release branch
branchName = releaseBranch;
if (version != null && !version.isEmpty()) {
branchName = branchName + "-" + version;
}
branchPath = ioService.get(URI.create("default://" + branchName + "@" + repository));
branchOriginPath = ioService.get(URI.create("default://" + sourceBranch + "@" + repository));
ioService.copy(branchOriginPath, branchPath);
newBranchEvent.fire(new NewBranchEvent(repository, branchName, Paths.convert(branchPath), System.currentTimeMillis()) );
Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put("RepositoryName", repository);
parameters.put("SourceBranchName", sourceBranch);
parameters.put("DevBranchName", devBranch);
parameters.put("RelBranchName", releaseBranch);
parameters.put("Version", version);
configureRepositoryEvent.fire(new ConfigureRepositoryEvent(parameters));
}
@Override
public Set<Project> getProjects( final Repository repository,
final String branch ) {
return projectService.get().getProjects( repository,
branch );
}
private Set<Project> getProjects( final Repository repository ) {
final Set<Project> authorizedProjects = new HashSet<Project>();
if ( repository == null ) {
return authorizedProjects;
}
final Path repositoryRoot = Paths.convert(repository.getRoot());
final DirectoryStream<Path> nioRepositoryPaths = ioService.newDirectoryStream( repositoryRoot );
for ( Path nioRepositoryPath : nioRepositoryPaths ) {
if ( Files.isDirectory(nioRepositoryPath) ) {
final org.uberfire.backend.vfs.Path projectPath = Paths.convert( nioRepositoryPath );
final Project project = projectService.get().resolveProject(projectPath);
if ( project != null ) {
authorizedProjects.add( project );
}
}
}
return authorizedProjects;
}
}