/*
* Copyright 2015 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.
*
* 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.structure.backend.deployment;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import javax.annotation.PostConstruct;
import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.event.Event;
import javax.enterprise.event.Observes;
import javax.inject.Inject;
import org.guvnor.structure.backend.config.Added;
import org.guvnor.structure.backend.config.Removed;
import org.guvnor.structure.config.SystemRepositoryChangedEvent;
import org.guvnor.structure.deployment.DeploymentConfig;
import org.guvnor.structure.deployment.DeploymentConfigService;
import org.guvnor.structure.server.config.ConfigGroup;
import org.guvnor.structure.server.config.ConfigType;
import org.guvnor.structure.server.config.ConfigurationFactory;
import org.guvnor.structure.server.config.ConfigurationService;
import org.guvnor.structure.server.deployment.DeploymentConfigFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ApplicationScoped
public class DeploymentConfigServiceImpl implements DeploymentConfigService {
private static final Logger logger = LoggerFactory.getLogger( DeploymentConfigServiceImpl.class );
@Inject
private ConfigurationService configurationService;
@Inject
private ConfigurationFactory configurationFactory;
@Inject
private DeploymentConfigFactory deploymentFactory;
@Inject
@Added
private Event<DeploymentConfigChangedEvent> addedDeploymentEvent;
@Inject
@Removed
private Event<DeploymentConfigChangedEvent> removedDeploymentEvent;
private Map<String, DeploymentConfig> registeredDeployments = new ConcurrentHashMap<String, DeploymentConfig>();
@PostConstruct
public void loadGroups() {
Collection<ConfigGroup> deployments = configurationService.getConfiguration( ConfigType.DEPLOYMENT );
if ( deployments != null ) {
for ( ConfigGroup deploymentConfig : deployments ) {
DeploymentConfig deployment = deploymentFactory.newDeployment( deploymentConfig );
registeredDeployments.put( deployment.getIdentifier(), deployment );
}
}
}
@Override
public void addDeployment( String identifier,
Object deploymentUnit ) {
ConfigGroup deploymentConfig = configurationFactory.newConfigGroup( ConfigType.DEPLOYMENT, identifier, "" );
deploymentConfig.addConfigItem( configurationFactory.newConfigItem( "unit", deploymentUnit ) );
configurationService.addConfiguration( deploymentConfig );
DeploymentConfig deployment = deploymentFactory.newDeployment( deploymentConfig );
registeredDeployments.put( deployment.getIdentifier(), deployment );
}
@Override
public void removeDeployment( String identifier ) {
ConfigGroup deploymentConfig = configurationFactory.newConfigGroup( ConfigType.DEPLOYMENT, identifier, "" );
configurationService.removeConfiguration( deploymentConfig );
registeredDeployments.remove( identifier );
}
@Override
public DeploymentConfig getDeployment( String identifier ) {
return registeredDeployments.get( identifier );
}
@Override
public Collection<DeploymentConfig> getDeployments() {
return Collections.unmodifiableCollection( registeredDeployments.values() );
}
public void updateRegisteredDeployments( @Observes SystemRepositoryChangedEvent changedEvent ) {
logger.debug( "Received deployment changed event, processing..." );
Collection<ConfigGroup> deployments = configurationService.getConfiguration( ConfigType.DEPLOYMENT );
if ( deployments != null ) {
List<String> processedDeployments = new ArrayList<String>();
for ( ConfigGroup deploymentConfig : deployments ) {
String name = deploymentConfig.getName();
if ( !this.registeredDeployments.containsKey( name ) ) {
try {
logger.debug( "New deployment {} has been discovered and will be deployed", name );
// add it to registered deployments
DeploymentConfig deployment = deploymentFactory.newDeployment( deploymentConfig );
// trigger deployment of new element
addedDeploymentEvent.fire( new DeploymentConfigChangedEvent( deployment.getDeploymentUnit() ) );
registeredDeployments.put( deployment.getIdentifier(), deployment );
logger.debug( "Deployment {} deployed successfully", name );
} catch ( RuntimeException e ) {
logger.warn( "Deployment {} failed to deploy due to {}", name, e.getMessage(), e );
}
}
processedDeployments.add( name );
}
Set<String> registeredDeploymedIds = registeredDeployments.keySet();
// process undeploy
for ( String identifier : registeredDeploymedIds ) {
if ( !processedDeployments.contains( identifier ) ) {
try {
logger.debug( "New deployment {} has been discovered and will be deployed", identifier );
DeploymentConfig deployment = registeredDeployments.remove( identifier );
// trigger undeloyment as it was removed
removedDeploymentEvent.fire( new DeploymentConfigChangedEvent( deployment.getDeploymentUnit() ) );
logger.debug( "Deployment {} undeployed successfully", identifier );
} catch ( RuntimeException e ) {
logger.warn( "Undeployment {} failed to deploy due to {}", identifier, e.getMessage(), e );
}
}
}
}
}
}