package org.talend.esb.mep.requestcallback.feature;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import javax.xml.namespace.QName;
import org.talend.esb.mep.requestcallback.impl.AbstractConfiguration;
import org.talend.esb.mep.requestcallback.impl.ConfigurationImpl;
import org.talend.esb.mep.requestcallback.impl.DotOnlyNamespaceUriEncoder;
import org.talend.esb.mep.requestcallback.impl.StandardNamespaceUriEncoder;
public final class ConfigurationInitializer {
public enum NamespaceToFileNameEncodingMode {
STANDARD, DOTONLY
}
public interface ConfigurationCreationListener {
void configurationCreated(Configuration configuration);
}
private static final class Manager {
private final Map<QName, Configuration> configs =
new HashMap<QName, Configuration>();
private final List<ConfigurationCreationListener> listeners =
new LinkedList<ConfigurationCreationListener>();
public Manager() {
super();
}
public synchronized Configuration resolveConfiguration(QName serviceName) {
final QName key = serviceName == null ? NULL_NAME : serviceName;
Configuration config = configs.get(key);
if (config == null) {
config = createConfiguration(serviceName);
configs.put(key, config);
}
return config;
}
public Map<QName, Configuration> getConfigurations() {
return Collections.unmodifiableMap(configs);
}
public synchronized boolean addConfigurationCreationListener(
ConfigurationCreationListener listener,
boolean triggerForExisting) {
if (listeners.add(listener)) {
if (triggerForExisting) {
for (Configuration config : configs.values()) {
listener.configurationCreated(config);
}
}
return true;
}
return false;
}
public synchronized boolean removeConfigurationCreationListener(
ConfigurationCreationListener listener) {
return listeners.remove(listener);
}
public synchronized void addConfigurations(Collection<Configuration> configurations) {
for (Configuration configuration : configurations) {
configs.put(configuration.getConfigurationName(), configuration);
}
}
private Configuration createConfiguration(QName serviceName) {
ConfigurationImpl result = new ConfigurationImpl(serviceName);
result.refreshStaticConfiguration();
for (ConfigurationCreationListener listener : listeners) {
listener.configurationCreated(result);
}
return result;
}
}
private static final QName NULL_NAME = new QName("!NULL!");
private static final Manager MANAGER = new Manager();
static {
MANAGER.resolveConfiguration(null);
}
private ConfigurationInitializer() {
super();
}
public static Configuration resolveConfiguration(QName serviceName) {
return MANAGER.resolveConfiguration(serviceName);
}
public Map<QName, Configuration> getConfigurations() {
return MANAGER.getConfigurations();
}
public static boolean addConfigurationCreationListener(
ConfigurationCreationListener listener,
boolean triggerForExisting) {
return MANAGER.addConfigurationCreationListener(
listener, triggerForExisting);
}
public static boolean removeConfigurationCreationListener(
ConfigurationCreationListener listener) {
return MANAGER.removeConfigurationCreationListener(listener);
}
public static void addConfigurations(Collection<Configuration> configurations) {
MANAGER.addConfigurations(configurations);
}
public static void setConfigurationNamespaceToFileEncoding(
NamespaceToFileNameEncodingMode mode) {
switch (mode) {
case STANDARD:
if (!(AbstractConfiguration.getNamespaceUriEncoder()
instanceof StandardNamespaceUriEncoder)) {
AbstractConfiguration.setNamespaceUriEncoder(
new StandardNamespaceUriEncoder());
}
return;
case DOTONLY:
if (!(AbstractConfiguration.getNamespaceUriEncoder()
instanceof DotOnlyNamespaceUriEncoder)) {
AbstractConfiguration.setNamespaceUriEncoder(
new DotOnlyNamespaceUriEncoder());
}
return;
default:
return;
}
}
}