/**
* Copyright (C) 2013 Red Hat, Inc. (jdcasey@commonjava.org)
*
* 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.commonjava.cartographer.conf;
import org.apache.commons.lang.StringUtils;
import org.commonjava.maven.atlas.ident.util.JoinString;
import org.commonjava.propulsor.boot.BootOptions;
import org.commonjava.propulsor.config.Configurator;
import org.commonjava.propulsor.config.ConfiguratorException;
import org.commonjava.web.config.ConfigurationException;
import org.commonjava.web.config.ConfigurationListener;
import org.commonjava.web.config.DefaultConfigurationListener;
import org.commonjava.web.config.dotconf.DotConfConfigurationReader;
import org.commonjava.web.config.io.ConfigFileUtils;
import org.commonjava.web.config.section.BeanSectionListener;
import org.commonjava.web.config.section.ConfigurationSectionListener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.inject.Instance;
import javax.inject.Inject;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import static org.apache.commons.lang.StringUtils.isNotEmpty;
@ApplicationScoped
public class CartoDeploymentConfigurator
implements Configurator
{
@Inject
private CartographerConfig cartoConfig;
@Inject
private Instance<CartoSubConfig> subConfigs;
@Override
public void load( BootOptions options )
throws ConfiguratorException
{
Logger logger = LoggerFactory.getLogger( getClass() );
String config = options.getConfig();
File configFile = new File( config );
cartoConfig.setHomeDir( new File( options.getHomeDir() ) );
if ( !configFile.exists() )
{
File homeConfigFile = new File( cartoConfig.getConfigDir(), "main.conf" );
// TODO: Make resilient enough to write default configs.
logger.warn( "Cannot find configuration file: {}. Trying: {}", configFile, homeConfigFile );
if ( homeConfigFile.exists() )
{
logger.warn( "Using configuration file from home directory: {}", homeConfigFile );
configFile = homeConfigFile;
}
else
{
logger.warn( "Cannot find home directory configuration file: {}. Using built-in application defaults.", homeConfigFile );
return;
}
// throw new ConfiguratorException( "Missing configuration: %s", configFile );
}
cartoConfig.setConfigDir( configFile.getAbsoluteFile().getParentFile() );
try (InputStream stream = ConfigFileUtils.readFileWithIncludes( configFile, System.getProperties() ) )
{
DefaultConfigurationListener configListener = new DefaultConfigurationListener( new BeanSectionListener( cartoConfig ));
if ( subConfigs != null )
{
for ( CartoSubConfig subConfig : subConfigs )
{
logger.debug( "Adding configuration section listener for: {}", subConfig );
configListener.with(subConfig);
}
}
new DotConfConfigurationReader( configListener ).loadConfiguration( stream );
}
catch ( ConfigurationException | IOException e )
{
throw new ConfiguratorException( "Failed to read configuration: %s. Reason: %s", e, configFile,
e.getMessage() );
}
cartoConfig.configurationDone();
String validationErrors = cartoConfig.getValidationErrors();
if ( isNotEmpty( validationErrors ) )
{
throw new ConfiguratorException( "Cartographer configuration is not complete!\n\n%s", validationErrors );
}
}
}