/*
* R Service Bus
*
* Copyright (c) Copyright of Open Analytics NV, 2010-2015
*
* ===========================================================================
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package eu.openanalytics.rsb.config;
import java.io.File;
import java.net.URI;
import java.net.URL;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import org.apache.commons.pool.impl.GenericKeyedObjectPool.Config;
import eu.openanalytics.rsb.Constants;
import eu.openanalytics.rsb.Util;
import eu.openanalytics.rsb.config.PersistedConfiguration.PersistedJobStatisticsHandlerConfiguration;
/**
* Adapts a {@link PersistedConfiguration} into a {@link Configuration}.
*
* @author "OpenAnalytics <rsb.development@openanalytics.eu>"
*/
public class PersistedConfigurationAdapter implements Configuration
{
public static final JmxConfiguration DEFAULT_JMX_RMI_CONFIGURATION = new PersistedConfiguration.PersistedJmxConfiguration(
9098, 9099, 8889);
private final PersistedConfiguration persistedConfiguration;
private final URL configurationUrl;
private final String nodeName;
public PersistedConfigurationAdapter(final URL configurationUrl,
final PersistedConfiguration persistedConfiguration)
{
this.persistedConfiguration = persistedConfiguration;
this.configurationUrl = configurationUrl;
nodeName = StringUtils.isNotBlank(persistedConfiguration.getNodeName())
? persistedConfiguration.getNodeName()
: getDefaultNodeName();
}
private String getDefaultNodeName()
{
// find something unique about the running node like the location of resource
final URL resourceUrl = getClass().getResource("/META-INF/spring/core-beans.xml");
final String uniqueId = Long.toHexString(Math.abs((long) resourceUrl.toExternalForm().hashCode()));
return StringUtils.lowerCase(Constants.HOST_NAME + "-" + uniqueId);
}
@Override
public String toString()
{
return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE) + "\n"
+ persistedConfiguration.toString();
}
// for JMX access
public String exportAsString()
{
return toString();
}
// for JMX access
public String exportAsJson()
{
return Util.toJson(persistedConfiguration);
}
@Override
public URL getConfigurationUrl()
{
return configurationUrl;
}
@Override
public String getNodeName()
{
return nodeName;
}
@Override
public File getCatalogRootDirectory()
{
return persistedConfiguration.getCatalogRootDirectory();
}
@Override
public File getActiveMqWorkDirectory()
{
return persistedConfiguration.getActiveMqWorkDirectory();
}
@Override
public int getJobTimeOut()
{
return persistedConfiguration.getJobTimeOut();
}
@Override
public int getNumberOfConcurrentJobWorkersPerQueue()
{
return persistedConfiguration.getNumberOfConcurrentJobWorkersPerQueue();
}
@Override
public File getResultsDirectory()
{
return persistedConfiguration.getResultsDirectory();
}
@Override
public Map<String, Set<URI>> getApplicationSpecificRserviPoolUris()
{
final Map<String, ?> sourcePoolUris = persistedConfiguration.getApplicationSpecificRserviPoolUris();
if ((sourcePoolUris == null) || (sourcePoolUris.isEmpty()))
{
return Collections.emptyMap();
}
final Map<String, Set<URI>> applicationSpecificRserviPoolUris = new HashMap<String, Set<URI>>();
for (final Entry<String, ?> sourcePoolUri : sourcePoolUris.entrySet())
{
if (sourcePoolUri.getValue() instanceof String)
{
applicationSpecificRserviPoolUris.put(sourcePoolUri.getKey(),
Collections.singleton(Util.newURI((String) sourcePoolUri.getValue())));
}
else
{
// assuming array of string, will die otherwise
@SuppressWarnings("unchecked")
final Collection<String> urisForOneApplication = (Collection<String>) sourcePoolUri.getValue();
final Set<URI> uris = new HashSet<URI>();
for (final String uri : urisForOneApplication)
{
uris.add(Util.newURI(uri));
}
applicationSpecificRserviPoolUris.put(sourcePoolUri.getKey(),
Collections.unmodifiableSet(uris));
}
}
return applicationSpecificRserviPoolUris;
}
@Override
public URI getDefaultRserviPoolUri()
{
return persistedConfiguration.getDefaultRserviPoolUri();
}
@Override
public String getAdministratorEmail()
{
return persistedConfiguration.getAdministratorEmail();
}
@Override
public SmtpConfiguration getSmtpConfiguration()
{
return persistedConfiguration.getSmtpConfiguration();
}
@Override
public JmxConfiguration getJmxConfiguration()
{
if (persistedConfiguration.getJmxConfiguration() == null)
{
return DEFAULT_JMX_RMI_CONFIGURATION;
}
return persistedConfiguration.getJmxConfiguration();
}
@Override
public JobStatisticsHandlerConfiguration getJobStatisticsHandlerConfiguration()
{
final PersistedJobStatisticsHandlerConfiguration persisted = persistedConfiguration.getJobStatisticsHandlerConfiguration();
return persisted != null ? persisted : new PersistedJobStatisticsHandlerConfiguration();
}
@Override
@SuppressWarnings({"unchecked", "rawtypes"})
public List<DepositDirectoryConfiguration> getDepositRootDirectories()
{
return (List) persistedConfiguration.getDepositRootDirectories();
}
@Override
@SuppressWarnings({"unchecked", "rawtypes"})
public List<DepositEmailConfiguration> getDepositEmailAccounts()
{
return (List) persistedConfiguration.getDepositEmailAccounts();
}
@Override
public List<File> getDataDirectories()
{
return persistedConfiguration.getDataDirectories();
}
@Override
public Config getRServiClientPoolConfig()
{
return persistedConfiguration.getrServiClientPoolConfig();
}
@Override
public RServiClientPoolValidationStrategy getRServiClientPoolValidationStrategy()
{
return persistedConfiguration.getrServiClientPoolValidationStrategy();
}
@Override
public boolean isCheckHealthOnStart()
{
return persistedConfiguration.isCheckHealthOnStart();
}
@Override
@SuppressWarnings({"unchecked", "rawtypes"})
public Map<String, ApplicationSecurityAuthorization> getApplicationSecurityConfiguration()
{
return (Map) persistedConfiguration.getApplicationSecurityConfiguration();
}
@Override
public AdminSecurityAuthorization getRsbSecurityConfiguration()
{
return persistedConfiguration.getRsbSecurityConfiguration();
}
@Override
public boolean isApplicationAwareCatalog()
{
return persistedConfiguration.isApplicationAwareCatalog();
}
@Override
public boolean isPropagateSecurityContext()
{
return persistedConfiguration.isPropagateSecurityContext();
}
}