/*
* 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.screens.workbench.backend;
import java.io.File;
import java.io.FileFilter;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;
import org.guvnor.common.services.project.model.GAV;
import org.guvnor.common.services.project.model.POM;
import org.guvnor.structure.organizationalunit.OrganizationalUnit;
import org.guvnor.structure.organizationalunit.OrganizationalUnitService;
import org.guvnor.structure.repositories.Repository;
import org.guvnor.structure.repositories.RepositoryEnvironmentConfigurations;
import org.guvnor.structure.repositories.RepositoryService;
import org.guvnor.structure.server.config.ConfigGroup;
import org.guvnor.structure.server.config.ConfigItem;
import org.guvnor.structure.server.config.ConfigType;
import org.guvnor.structure.server.config.ConfigurationFactory;
import org.guvnor.structure.server.config.ConfigurationService;
import org.kie.workbench.common.services.shared.project.KieProjectService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.uberfire.io.IOService;
public abstract class BaseAppSetup {
protected static final Logger logger = LoggerFactory.getLogger( BaseAppSetup.class );
protected static final String GLOBAL_SETTINGS = "settings";
protected static final String GIT_SCHEME = "git";
protected IOService ioService;
protected RepositoryService repositoryService;
protected OrganizationalUnitService organizationalUnitService;
protected KieProjectService projectService;
protected ConfigurationService configurationService;
protected ConfigurationFactory configurationFactory;
protected BaseAppSetup() {
}
public BaseAppSetup( final IOService ioService,
final RepositoryService repositoryService,
final OrganizationalUnitService organizationalUnitService,
final KieProjectService projectService,
final ConfigurationService configurationService,
final ConfigurationFactory configurationFactory ) {
this.ioService = ioService;
this.repositoryService = repositoryService;
this.organizationalUnitService = organizationalUnitService;
this.projectService = projectService;
this.configurationService = configurationService;
this.configurationFactory = configurationFactory;
}
protected Repository createRepository( final String alias,
final String scheme,
final String origin,
final OrganizationalUnit organizationalUnit ) {
return createRepository( alias, scheme, origin, null, null, organizationalUnit );
}
protected Repository createRepository( final String alias,
final String scheme,
final String origin,
final String user,
final String password ) {
return createRepository( alias, scheme, origin, user, password, null );
}
protected Repository createRepository( final String alias,
final String scheme,
final String origin,
final String user,
final String password,
final OrganizationalUnit organizationalUnit ) {
logger.info( "Cloning Repository '" + alias + "' from '" + origin + "'." );
Repository repository = repositoryService.getRepository( alias );
if ( repository == null ) {
try {
final RepositoryEnvironmentConfigurations configurations = new RepositoryEnvironmentConfigurations();
if ( origin != null ) {
configurations.setOrigin( origin );
}
if (user != null && password != null) {
configurations.setUserName( user );
configurations.setPassword( password );
}
repository = repositoryService.createRepository( scheme,
alias,
configurations );
if ( organizationalUnit != null ) {
organizationalUnitService.addRepository( organizationalUnit,
repository );
}
} catch ( Exception e ) {
logger.error( "Failed to clone Repository '" + alias + "'",
e );
}
} else {
logger.info( "Repository '" + alias + "' already exists." );
}
return repository;
}
protected OrganizationalUnit createOU( final Repository repository,
final String ouName,
final String ouOwner ) {
logger.info( "Creating Organizational Unit '" + ouName + "'." );
OrganizationalUnit ou = organizationalUnitService.getOrganizationalUnit( ouName );
if ( ou == null ) {
List<Repository> repositories = new ArrayList<>();
if (repository != null) {
repositories.add( repository );
}
organizationalUnitService.createOrganizationalUnit( ouName,
ouOwner,
null,
repositories );
logger.info( "Created Organizational Unit '" + ouName + "'." );
} else {
logger.info( "Organizational Unit '" + ouName + "' already exists." );
}
return ou;
}
protected void createProject( final Repository repository,
final String group,
final String artifact,
final String version ) {
GAV gav = new GAV( group, artifact, version );
try {
if ( repository != null ) {
final String projectLocation = repository.getUri() + ioService.getFileSystem( URI.create( repository.getUri() ) ).getSeparator() + artifact;
if ( !ioService.exists( ioService.get( URI.create( projectLocation ) ) ) ) {
projectService.newProject( repository.getBranchRoot( repository.getDefaultBranch() ),
new POM( gav ),
"/" );
}
} else {
logger.error( "Repository was not found (is null), cannot add project" );
}
} catch ( Exception e ) {
logger.error( "Unable to bootstrap project {} in repository {}", gav, repository.getAlias(), e );
}
}
protected void loadExampleRepositories( final String exampleRepositoriesRoot,
final String ouName,
final String ouOwner,
final String scheme ) {
final File root = new File( exampleRepositoriesRoot );
if ( !root.isDirectory() ) {
logger.error( "System Property '" + exampleRepositoriesRoot + "' does not point to a folder." );
} else {
OrganizationalUnit organizationalUnit = createOU( null, ouName, ouOwner );
final FileFilter filter = pathName -> pathName.isDirectory();
logger.info( "Cloning Example Repositories." );
for ( File child : root.listFiles( filter ) ) {
final String repositoryAlias = child.getName();
final String repositoryOrigin = child.getAbsolutePath();
createRepository( repositoryAlias, scheme, repositoryOrigin, organizationalUnit );
}
logger.info( "Example Repositories cloned." );
}
}
protected void setupConfigurationGroup( ConfigType configType, String configGroupName, ConfigGroup configGroup, ConfigItem... configItemsToSetManually ) {
List<ConfigGroup> existentConfigGroups = configurationService.getConfiguration( configType );
boolean settingsDefined = false;
for ( ConfigGroup existentConfigGroup : existentConfigGroups ) {
if ( configGroupName.equals( existentConfigGroup.getName() ) ) {
settingsDefined = true;
if ( configItemsToSetManually != null ) {
for ( ConfigItem configItem : configItemsToSetManually ) {
ConfigItem existentConfigItem = existentConfigGroup.getConfigItem( configItem.getName() );
if ( existentConfigItem == null ) {
existentConfigGroup.addConfigItem( configItem );
configurationService.updateConfiguration( existentConfigGroup );
} else if ( !existentConfigItem.getValue().equals( configItem.getValue() ) ) {
existentConfigItem.setValue( configItem.getValue() );
configurationService.updateConfiguration( existentConfigGroup );
}
}
}
break;
}
}
if ( !settingsDefined ) {
configurationService.addConfiguration( configGroup );
}
}
}