/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.apache.ode.axis2;
import org.apache.axis2.Constants;
import org.apache.axis2.client.Options;
import org.apache.axis2.transport.http.HTTPConstants;
import org.apache.axis2.transport.http.HttpTransportProperties;
import org.apache.commons.httpclient.Header;
import org.apache.commons.httpclient.HttpVersion;
import org.apache.commons.httpclient.ProtocolException;
import org.apache.commons.httpclient.params.DefaultHttpParams;
import org.apache.commons.httpclient.params.HttpConnectionParams;
import org.apache.commons.httpclient.params.HttpMethodParams;
import org.apache.commons.httpclient.params.HttpParams;
import org.apache.commons.httpclient.params.HttpClientParams;
import org.apache.commons.httpclient.params.HostParams;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import java.util.ArrayList;
import java.util.Map;
import java.util.List;
import java.util.Collection;
/**
* @author <a href="mailto:midon@intalio.com">Alexis Midon</a>
*/
public class Properties {
/**
* Property used to define how long (in miiliseconds) the message will wait for a response. Default value is {@link #DEFAULT_MEX_TIMEOUT}
*/
public static final String PROP_MEX_TIMEOUT = "mex.timeout";
// its default value
public static final int DEFAULT_MEX_TIMEOUT = 2 * 60 * 1000;
public static final String PROP_HTTP_CONNECTION_TIMEOUT = HttpConnectionParams.CONNECTION_TIMEOUT;
public static final String PROP_HTTP_SOCKET_TIMEOUT = HttpMethodParams.SO_TIMEOUT;
public static final String PROP_HTTP_PROTOCOL_VERSION = HttpMethodParams.PROTOCOL_VERSION;
public static final String PROP_HTTP_HEADER_PREFIX = "http.default-headers.";
public static final String PROP_HTTP_PROXY_PREFIX = "http.proxy.";
public static final String PROP_HTTP_PROXY_HOST = PROP_HTTP_PROXY_PREFIX + "host";
public static final String PROP_HTTP_PROXY_PORT = PROP_HTTP_PROXY_PREFIX + "port";
public static final String PROP_HTTP_PROXY_DOMAIN = PROP_HTTP_PROXY_PREFIX + "domain";
public static final String PROP_HTTP_PROXY_USER = PROP_HTTP_PROXY_PREFIX + "user";
public static final String PROP_HTTP_PROXY_PASSWORD = PROP_HTTP_PROXY_PREFIX + "password";
// Httpclient specific
public static final String PROP_HTTP_MAX_REDIRECTS = HttpClientParams.MAX_REDIRECTS;
// Axis2-specific
public static final String PROP_HTTP_PROTOCOL_ENCODING = "http.protocol.encoding";
public static final String PROP_HTTP_REQUEST_CHUNK = "http.request.chunk";
public static final String PROP_HTTP_REQUEST_GZIP = "http.request.gzip";
public static final String PROP_HTTP_ACCEPT_GZIP = "http.accept.gzip";
protected static final Log log = LogFactory.getLog(Properties.class);
public static Object[] getProxyAndHeaders(Map<String, String> properties) {
ArrayList<Header> headers = null; // /!\ Axis2 requires an ArrayList (not a List implementation)
HttpTransportProperties.ProxyProperties proxy = null;
for (Map.Entry<String, String> e : properties.entrySet()) {
final String k = e.getKey();
final String v = e.getValue();
if (k.startsWith(PROP_HTTP_HEADER_PREFIX)) {
if (headers == null) headers = new ArrayList<Header>();
// extract the header name
String name = k.substring(PROP_HTTP_HEADER_PREFIX.length());
headers.add(new Header(name, v));
} else if (k.startsWith(PROP_HTTP_PROXY_PREFIX)) {
if (proxy == null) proxy = new HttpTransportProperties.ProxyProperties();
if (PROP_HTTP_PROXY_HOST.equals(k)) proxy.setProxyName(v);
else if (PROP_HTTP_PROXY_PORT.equals(k)) proxy.setProxyPort(Integer.parseInt(v));
else if (PROP_HTTP_PROXY_DOMAIN.equals(k)) proxy.setDomain(v);
else if (PROP_HTTP_PROXY_USER.equals(k)) proxy.setUserName(v);
else if (PROP_HTTP_PROXY_PASSWORD.equals(k)) proxy.setPassWord(v);
else if (log.isWarnEnabled())
log.warn("Unknown proxy properties [" + k + "]. " + PROP_HTTP_PROXY_PREFIX + " is a refix reserved for proxy properties.");
}
}
if (proxy != null) {
String host = proxy.getProxyHostName();
if (host == null || host.length() == 0) {
// disable proxy if the host is not null
proxy=null;
if(log.isDebugEnabled()) log.debug("Proxy host is null. Proxy will not be taken into account.");
}
}
return new Object[]{proxy, headers};
}
public static class Axis2 {
public static Options translate(Map<String, String> properties) {
return translate(properties, new Options());
}
public static Options translate(Map<String, String> properties, Options options) {
if (log.isDebugEnabled()) log.debug("Translating IL Properties for Axis2");
if (properties.isEmpty()) return options;
if (properties.containsKey(PROP_HTTP_CONNECTION_TIMEOUT)) {
final String value = properties.get(PROP_HTTP_CONNECTION_TIMEOUT);
try {
options.setProperty(HTTPConstants.CONNECTION_TIMEOUT, Integer.valueOf(value));
} catch (NumberFormatException e) {
if (log.isWarnEnabled())
log.warn("Mal-formatted Property: [" + Properties.PROP_HTTP_CONNECTION_TIMEOUT + "=" + value + "] Property will be skipped.");
}
}
if (properties.containsKey(PROP_HTTP_SOCKET_TIMEOUT)) {
final String value = properties.get(PROP_HTTP_SOCKET_TIMEOUT);
try {
options.setProperty(HTTPConstants.SO_TIMEOUT, Integer.valueOf(value));
} catch (NumberFormatException e) {
if (log.isWarnEnabled())
log.warn("Mal-formatted Property: [" + Properties.PROP_HTTP_SOCKET_TIMEOUT + "=" + value + "] Property will be skipped.");
}
}
if (properties.containsKey(PROP_HTTP_PROTOCOL_ENCODING)) {
options.setProperty(Constants.Configuration.CHARACTER_SET_ENCODING, properties.get(PROP_HTTP_PROTOCOL_ENCODING));
}
if (properties.containsKey(PROP_HTTP_PROTOCOL_VERSION)) {
options.setProperty(HTTPConstants.HTTP_PROTOCOL_VERSION, properties.get(PROP_HTTP_PROTOCOL_VERSION));
}
if (properties.containsKey(PROP_HTTP_REQUEST_CHUNK)) {
options.setProperty(HTTPConstants.CHUNKED, properties.get(PROP_HTTP_REQUEST_CHUNK));
}
if (properties.containsKey(PROP_HTTP_REQUEST_GZIP)) {
options.setProperty(HTTPConstants.MC_GZIP_REQUEST, properties.get(PROP_HTTP_REQUEST_GZIP));
}
if (properties.containsKey(PROP_HTTP_ACCEPT_GZIP)) {
options.setProperty(HTTPConstants.MC_ACCEPT_GZIP, properties.get(PROP_HTTP_ACCEPT_GZIP));
}
if (properties.containsKey(PROP_HTTP_MAX_REDIRECTS)) {
if (log.isWarnEnabled()) log.warn("Property Not Supported: " + PROP_HTTP_MAX_REDIRECTS);
}
// iterate through the properties to get Headers & Proxy information
Object[] o = getProxyAndHeaders(properties);
HttpTransportProperties.ProxyProperties proxy = (HttpTransportProperties.ProxyProperties) o[0];
ArrayList<Header> headers = (ArrayList<Header>) o[1]; // /!\ Axis2 requires an ArrayList (not a List implementation)
if (headers != null && !headers.isEmpty()) options.setProperty(HTTPConstants.HTTP_HEADERS, headers);
if (proxy != null) options.setProperty(HTTPConstants.PROXY, proxy);
return options;
}
}
public static class HttpClient {
public static HttpParams translate(Map<String, String> properties) {
return translate(properties, new DefaultHttpParams());
}
public static HttpParams translate(Map<String, String> properties, HttpParams p) {
if (log.isDebugEnabled()) log.debug("Translating IL Properties for HttpClient. Properties size="+properties.size());
if (properties.isEmpty()) return p;
// initialize the collection of headers
p.setParameter(HostParams.DEFAULT_HEADERS, new ArrayList());
if (properties.containsKey(PROP_HTTP_CONNECTION_TIMEOUT)) {
final String value = properties.get(PROP_HTTP_CONNECTION_TIMEOUT);
try {
p.setParameter(HttpConnectionParams.CONNECTION_TIMEOUT, Integer.valueOf(value));
} catch (NumberFormatException e) {
if (log.isWarnEnabled())
log.warn("Mal-formatted Property: [" + Properties.PROP_HTTP_CONNECTION_TIMEOUT + "=" + value + "] Property will be skipped.");
}
}
if (properties.containsKey(PROP_HTTP_SOCKET_TIMEOUT)) {
final String value = properties.get(PROP_HTTP_SOCKET_TIMEOUT);
try {
p.setParameter(HttpMethodParams.SO_TIMEOUT, Integer.valueOf(value));
} catch (NumberFormatException e) {
if (log.isWarnEnabled())
log.warn("Mal-formatted Property: [" + Properties.PROP_HTTP_SOCKET_TIMEOUT + "=" + value + "] Property will be skipped.");
}
}
if (properties.containsKey(PROP_HTTP_PROTOCOL_ENCODING)) {
p.setParameter(HttpMethodParams.HTTP_CONTENT_CHARSET, properties.get(PROP_HTTP_PROTOCOL_ENCODING));
}
if (properties.containsKey(PROP_HTTP_PROTOCOL_VERSION)) {
try {
p.setParameter(HttpMethodParams.PROTOCOL_VERSION, HttpVersion.parse(properties.get(PROP_HTTP_PROTOCOL_VERSION)));
} catch (ProtocolException e) {
if (log.isWarnEnabled())
log.warn("Mal-formatted Property: [" + PROP_HTTP_PROTOCOL_VERSION + "]", e);
}
}
if (properties.containsKey(PROP_HTTP_REQUEST_CHUNK)) {
// see org.apache.commons.httpclient.methods.EntityEnclosingMethod.setContentChunked()
p.setBooleanParameter(PROP_HTTP_REQUEST_CHUNK, Boolean.parseBoolean(properties.get(PROP_HTTP_REQUEST_CHUNK)));
}
if (properties.containsKey(PROP_HTTP_REQUEST_GZIP)) {
if (log.isWarnEnabled()) log.warn("Property Not Supported: " + PROP_HTTP_REQUEST_GZIP);
}
if (Boolean.parseBoolean(properties.get(PROP_HTTP_ACCEPT_GZIP))) {
// append gzip to the list of accepted encoding
((Collection) p.getParameter(HostParams.DEFAULT_HEADERS)).add(new Header("Accept-Encoding", "gzip"));
}
if (properties.containsKey(PROP_HTTP_MAX_REDIRECTS)) {
final String value = properties.get(PROP_HTTP_MAX_REDIRECTS);
try {
p.setParameter(HttpClientParams.MAX_REDIRECTS, Integer.valueOf(value));
} catch (NumberFormatException e) {
if (log.isWarnEnabled())
log.warn("Mal-formatted Property: [" + Properties.PROP_HTTP_MAX_REDIRECTS + "=" + value + "] Property will be skipped.");
}
}
Object[] o = getProxyAndHeaders(properties);
HttpTransportProperties.ProxyProperties proxy = (HttpTransportProperties.ProxyProperties) o[0];
Collection headers = (Collection) o[1];
if (headers != null && !headers.isEmpty())
((Collection) p.getParameter(HostParams.DEFAULT_HEADERS)).addAll(headers);
if (proxy != null) p.setParameter(PROP_HTTP_PROXY_PREFIX, proxy);
return p;
}
}
}