package org.talend.esb.mep.requestcallback.impl;
import java.util.Dictionary;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.namespace.QName;
import org.apache.cxf.common.logging.LogUtils;
import org.talend.esb.mep.requestcallback.feature.Configuration;
public abstract class AbstractConfiguration implements Configuration {
private static final Logger LOGGER = LogUtils.getL7dLogger(AbstractConfiguration.class);
public interface NamespaceUriEncoder {
String encodedNamespaceURI(String namespaceURI);
}
public static final String CONFIG_ID_PREFIX = "org.talend.esb.mep.requestcallback";
private static NamespaceUriEncoder namespaceUriEncoder =
new StandardNamespaceUriEncoder();
protected AbstractConfiguration() {
super();
}
@Override
public String getProperty(String key) {
final Object raw = get(key);
return raw == null ? null : raw.toString();
}
@Override
public Integer getIntegerProperty(String key) {
final Object raw = get(key);
if (raw == null) {
return null;
}
if (raw instanceof Integer) {
return (Integer) raw;
}
if (raw instanceof Number) {
return new Integer(((Number) raw).intValue());
}
try {
return Integer.valueOf(raw.toString());
} catch (NumberFormatException e) {
if (LOGGER.isLoggable(Level.FINER)) {
LOGGER.log(Level.FINER, "Exception caught: ", e);
}
return null;
}
}
@Override
public Long getLongProperty(String key) {
final Object raw = get(key);
if (raw == null) {
return null;
}
if (raw instanceof Long) {
return (Long) raw;
}
if (raw instanceof Number) {
return new Long(((Number) raw).longValue());
}
try {
return Long.valueOf(raw.toString());
} catch (NumberFormatException e) {
if (LOGGER.isLoggable(Level.FINER)) {
LOGGER.log(Level.FINER, "Exception caught: ", e);
}
return null;
}
}
@Override
public Boolean getBooleanProperty(String key) {
final Object raw = get(key);
if (raw == null) {
return null;
}
if (raw instanceof Boolean) {
return (Boolean) raw;
}
return Boolean.valueOf(raw.toString());
}
@Override
public PidMode getPidModeProperty(String key) {
final Object raw = get(key);
if (raw == null) {
return null;
}
if (raw instanceof PidMode) {
return (PidMode) raw;
}
final String s = raw.toString();
if ("fullName".equalsIgnoreCase(s)) {
return PidMode.FULL_NAME;
}
if ("localName".equalsIgnoreCase(s)) {
return PidMode.LOCAL_NAME;
}
return null;
}
@Override
public String getExpandedProperty(String key) {
return expandedValue(get(key), this);
}
@Override
public void fillProperties(String prefix,
Map<? super String, Object> properties) {
transferProperties(prefix, this, properties);
}
@Override
public void fillExpandedProperties(String prefix,
Map<? super String, Object> properties) {
transferExpandedProperties(prefix, this, properties, this);
}
@Override
public void updateDynamicConfiguration(
Map<?, ?> updateMap, boolean replaceCurrent) {
// empty default implementation
}
@Override
public void updateDynamicConfiguration(
Dictionary<?, ?> updateDict, boolean replaceCurrent) {
// empty default implementation
}
@Override
public void refreshStaticConfiguration() {
// empty default implementation
}
@Override
public QName getConfigurationName() {
return null;
}
@Override
public String getConfigurationIdentifier() {
return null;
}
@Override
public String getAlternateConfigurationIdentifier() {
return null;
}
@Override
public ChangeListener getChangeListener() {
return null;
}
@Override
public void setChangeListener(ChangeListener changeListener) {
// empty default implementation
}
public static String expandedValue(
final Object rawValue, final Map<?, ?> replacements) {
if (rawValue == null) {
return null;
}
final String input = rawValue.toString();
int varStart = input.indexOf("${");
if (varStart < 0) {
return input;
}
final int strlen = input.length();
StringBuilder buf = new StringBuilder(input.substring(0, varStart));
varStart += 2;
while (varStart < strlen) {
int varEnd = input.indexOf("}", varStart);
if (varEnd < 0) {
varEnd = strlen;
}
String varKey = input.substring(varStart, varEnd);
Object varValue = varKey.length() > 0 ? replacements.get(varKey) : null;
if (varValue != null) {
buf.append(varValue.toString());
}
varEnd += 1;
varStart = varEnd;
if (varEnd < strlen) {
varStart = input.indexOf("${", varEnd);
if (varStart < 0) {
varStart = strlen;
}
buf.append(input.substring(varEnd, varStart));
}
varStart += 2;
}
return buf.toString();
}
public static void transferProperties(String prefix,
Map<String, Object> source, Map<? super String, Object> target) {
final String fullPrefix = prefix == null ? null : prefix + ".";
if (fullPrefix == null) {
target.putAll(source);
}
for (Entry<String, Object> e : source.entrySet()) {
String key = e.getKey();
if (key.startsWith(fullPrefix)) {
target.put(key.substring(fullPrefix.length()), e.getValue());
}
}
}
public static void transferExpandedProperties(String prefix,
Map<String, Object> source, Map<? super String, Object> target,
Map<?, ?> replacements) {
final String fullPrefix = prefix == null ? null : prefix + ".";
for (Entry<String, Object> e : source.entrySet()) {
String key = e.getKey();
if (fullPrefix == null) {
target.put(key, expandedValue(e.getValue(), replacements));
} else if (key.startsWith(fullPrefix)) {
target.put(key.substring(fullPrefix.length()),
expandedValue(e.getValue(), replacements));
}
}
}
public static String asConfigIdentifier(QName serviceName) {
if (serviceName == null) {
return CONFIG_ID_PREFIX;
}
final StringBuilder buf = new StringBuilder(CONFIG_ID_PREFIX);
String namespaceName = serviceName.getNamespaceURI();
if (namespaceName != null && namespaceName.length() > 0) {
buf.append(".").append(
namespaceUriEncoder.encodedNamespaceURI(namespaceName));
}
String localName = serviceName.getLocalPart();
if (localName != null && localName.length() > 0) {
buf.append(".").append(localName);
}
return buf.toString();
}
public static String asConfigIdentifier(String serviceLocalName) {
if (serviceLocalName == null || serviceLocalName.length() == 0) {
return CONFIG_ID_PREFIX;
}
if (serviceLocalName.startsWith("{")) {
return asConfigIdentifier(QName.valueOf(serviceLocalName));
}
return CONFIG_ID_PREFIX + "." + serviceLocalName;
}
public static NamespaceUriEncoder getNamespaceUriEncoder() {
return namespaceUriEncoder;
}
public static void setNamespaceUriEncoder(NamespaceUriEncoder encoder) {
namespaceUriEncoder = encoder;
}
}