/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.cms.core.security.userstore.connector.config;
import java.util.Collection;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.enonic.cms.framework.util.PropertiesUtil;
import com.enonic.cms.core.config.ConfigProperties;
import com.enonic.cms.core.security.userstore.config.InvalidUserStoreConfigException;
@Component
public class UserStoreConnectorConfigLoader
{
private Properties properties;
private Set<String> userStoreConnectorNames = null;
public Map<String, UserStoreConnectorConfig> getAllUserStoreConnectorConfigs()
{
Collection<String> allNames = doGetAllUserStoreConnectorNames();
Map<String, UserStoreConnectorConfig> configs = new LinkedHashMap<String, UserStoreConnectorConfig>( allNames.size() );
for ( final String name : allNames )
{
configs.put( name, doGetUserStoreConnectorConfig( name, true ) );
}
return configs;
}
public UserStoreConnectorConfig getUserStoreConnectorConfig( final String connectorName )
{
return doGetUserStoreConnectorConfig( connectorName, false );
}
private UserStoreConnectorConfig doGetUserStoreConnectorConfig( final String connectorName, final boolean failSilent )
{
if ( !doGetAllUserStoreConnectorNames().contains( connectorName ) )
{
//FIXME localization impossible, message shown directly in GUI
final String errorMessage =
InvalidUserStoreConnectorConfigException.createMessage( connectorName, "No configuration found in cms.properties" );
if ( failSilent )
{
final UserStoreConnectorConfig config =
new UserStoreConnectorConfig( connectorName, null, UserPolicyConfig.ALL_FALSE, GroupPolicyConfig.ALL_FALSE );
config.addErrorMessage( errorMessage );
return config;
}
else
{
throw new InvalidUserStoreConfigException( errorMessage );
}
}
return doLoadConfig( connectorName );
}
private UserStoreConnectorConfig doLoadConfig( final String connectorName )
{
UserPolicyConfig userPolicyConfig;
String userPolicyConfigErrorMessage = null;
try
{
userPolicyConfig = getUserPolicy( connectorName );
}
catch ( InvalidUserStoreConnectorConfigException e )
{
userPolicyConfigErrorMessage = e.getMessage();
userPolicyConfig = UserPolicyConfig.ALL_FALSE;
}
GroupPolicyConfig groupPolicyConfig;
String groupPolicyConfigErrorMessage = null;
try
{
groupPolicyConfig = getGroupPolicy( connectorName );
}
catch ( Exception e )
{
groupPolicyConfigErrorMessage = e.getMessage();
groupPolicyConfig = GroupPolicyConfig.ALL_FALSE;
}
final String pluginType = getPluginType( connectorName );
final Boolean resurrectDeletedUsers = getResurrectDeletedUsers( connectorName );
final Boolean resurrectDeletedGroups = getResurrectDeletedGroups( connectorName );
final UserStoreConnectorConfig config =
new UserStoreConnectorConfig( connectorName, pluginType, userPolicyConfig, groupPolicyConfig, resurrectDeletedUsers,
resurrectDeletedGroups );
config.addProperties( getPluginProperties( connectorName ) );
if ( userPolicyConfigErrorMessage != null )
{
config.addErrorMessage( userPolicyConfigErrorMessage );
}
if ( groupPolicyConfigErrorMessage != null )
{
config.addErrorMessage( groupPolicyConfigErrorMessage );
}
return config;
}
private Set<String> doGetAllUserStoreConnectorNames()
{
if ( userStoreConnectorNames != null )
{
return userStoreConnectorNames;
}
userStoreConnectorNames = new HashSet<String>();
final Properties allProperties = getSubSet( "cms.userstore.connector." );
for ( final Object propertyName : allProperties.keySet() )
{
final String configName = ( (String) propertyName ).replaceAll( "^(cms\\.userstore\\.)?(.*?)\\..*$", "$2" );
userStoreConnectorNames.add( configName );
}
return userStoreConnectorNames;
}
private String getPluginType( final String connectorName )
{
return getProperty( String.format( "cms.userstore.connector.%s.plugin", connectorName ) );
}
private Boolean getResurrectDeletedUsers( final String connectorName )
{
String stringValue = getProperty( String.format( "cms.userstore.connector.%s.resurrectDeletedUsers", connectorName ) );
if ( StringUtils.isBlank( stringValue ) )
{
return null;
}
return Boolean.valueOf( stringValue );
}
private Boolean getResurrectDeletedGroups( final String connectorName )
{
String stringValue = getProperty( String.format( "cms.userstore.connector.%s.resurrectDeletedGroups", connectorName ) );
if ( StringUtils.isBlank( stringValue ) )
{
return null;
}
return Boolean.valueOf( stringValue );
}
private Properties getPluginProperties( final String connectorName )
{
return getSubSet( String.format( "cms.userstore.connector.%s.plugin.", connectorName ) );
}
private UserPolicyConfig getUserPolicy( final String connectorName )
throws InvalidUserStoreConnectorConfigException
{
return new UserPolicyConfig( connectorName, getProperty(
String.format( "cms.userstore.connector.%s.userPolicy", connectorName ) ) );
}
private GroupPolicyConfig getGroupPolicy( final String connectorName )
{
return new GroupPolicyConfig( connectorName, getProperty(
String.format( "cms.userstore.connector.%s.groupPolicy", connectorName ) ) );
}
private String getProperty( final String key )
{
final String systemProperty = StringUtils.trimToNull( System.getProperty( key ) );
if ( systemProperty != null )
{
return systemProperty;
}
return StringUtils.trimToNull( properties.getProperty( key ) );
}
private Properties getSubSet( final String base )
{
return PropertiesUtil.getSubSet( properties, base );
}
@Autowired
public void setProperties( ConfigProperties properties )
{
this.properties = properties;
}
}