[jbossws-commits] JBossWS SVN: r10315 - in stack/native/trunk: modules/client and 13 other directories.
jbossws-commits at lists.jboss.org
jbossws-commits at lists.jboss.org
Sat Jul 4 10:44:06 EDT 2009
Author: alessio.soldano at jboss.com
Date: 2009-07-04 10:44:05 -0400 (Sat, 04 Jul 2009)
New Revision: 10315
Added:
stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/client/Marshaller.java
stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/client/NettyClient.java
stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/client/UnMarshaller.java
stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/client/WSClientPipelineFactory.java
stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/client/WSResponseHandler.java
stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/client/WSServerPipelineFactory.java
stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/client/ssl/
stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/client/ssl/JBossWSKeyManager.java
stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/client/ssl/SSLContextFactory.java
Removed:
stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/client/ssl/JBossWSKeyManager.java
stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/client/ssl/SSLContextFactory.java
Modified:
stack/native/trunk/modules/client/pom.xml
stack/native/trunk/modules/core/pom.xml
stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/CommonClient.java
stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/client/FastInfosetConnectionHTTP.java
stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/client/HTTPProtocolConnection.java
stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/client/HTTPRemotingConnection.java
stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/client/JsonConnectionHTTP.java
stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/client/RemoteConnection.java
stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/client/SOAPProtocolConnectionHTTP.java
stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/client/SOAPProtocolConnectionJMS.java
stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/jaxws/binding/HTTPMessageMarshaller.java
stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/jaxws/binding/HTTPMessageUnMarshaller.java
stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/jaxws/binding/JsonMessageMarshaller.java
stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/jaxws/binding/JsonMessageUnMarshaller.java
stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/jaxws/client/ClientImpl.java
stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/soap/EnvelopeBuilderDOM.java
stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/soap/FastInfosetMarshaller.java
stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/soap/SOAPConnectionImpl.java
stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/soap/SOAPMessageMarshaller.java
stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/soap/SOAPMessageUnMarshaller.java
stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/soap/SOAPMessageUnMarshallerHTTP.java
stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/utils/ThreadLocalAssociation.java
stack/native/trunk/modules/core/src/main/java/org/jboss/ws/extensions/wsrm/transport/RMChannelTask.java
stack/native/trunk/modules/core/src/main/java/org/jboss/ws/extensions/wsrm/transport/RMMarshaller.java
stack/native/trunk/modules/core/src/main/java/org/jboss/ws/extensions/wsrm/transport/RMMessageAssembler.java
stack/native/trunk/modules/core/src/main/java/org/jboss/ws/extensions/wsrm/transport/RMMetadata.java
stack/native/trunk/modules/core/src/main/java/org/jboss/ws/extensions/wsrm/transport/RMSender.java
stack/native/trunk/modules/core/src/main/java/org/jboss/ws/extensions/wsrm/transport/RMUnMarshaller.java
stack/native/trunk/modules/core/src/main/java/org/jboss/ws/extensions/wsrm/transport/backchannel/RMBackPortsInvocationHandler.java
stack/native/trunk/modules/core/src/main/java/org/jboss/ws/extensions/wsrm/transport/backchannel/RMBackPortsServer.java
stack/native/trunk/modules/core/src/main/java/org/jboss/ws/extensions/wsrm/transport/backchannel/RMCallbackHandler.java
stack/native/trunk/modules/core/src/main/java/org/jboss/ws/extensions/wsrm/transport/backchannel/RMCallbackHandlerImpl.java
stack/native/trunk/modules/resources/src/main/resources/bin/wsrunclient.bat
stack/native/trunk/modules/resources/src/main/resources/bin/wsrunclient.sh
stack/native/trunk/modules/resources/src/main/resources/bin/wstools.bat
stack/native/trunk/modules/resources/src/main/resources/bin/wstools.sh
stack/native/trunk/modules/resources/src/main/resources/resources/default-deploy.conf
stack/native/trunk/modules/resources/src/main/resources/resources/jbossws-deploy-macros.xml
stack/native/trunk/pom.xml
stack/native/trunk/src/main/scripts/assembly-deploy-artifacts.xml
Log:
[JBWS-2554] Removing dependency on Remoting 2 and using Netty (svn merge -r10240:HEAD https://svn.jboss.org/repos/jbossws/stack/native/branches/netty .)
Modified: stack/native/trunk/modules/client/pom.xml
===================================================================
--- stack/native/trunk/modules/client/pom.xml 2009-07-04 14:37:52 UTC (rev 10314)
+++ stack/native/trunk/modules/client/pom.xml 2009-07-04 14:44:05 UTC (rev 10315)
@@ -49,7 +49,7 @@
<configuration>
<archive>
<manifestEntries>
- <Class-Path>jbossws-spi.jar jbossws-common.jar jbossws-framework.jar jbossws-native-core.jar jbossws-native-jaxrpc.jar jbossws-native-jaxws.jar jbossws-native-jaxws-ext.jar jbossws-native-saaj.jar activation.jar commons-logging.jar concurrent.jar javassist.jar jaxb-api.jar jaxb-impl.jar mail.jar jboss-remoting.jar jboss-xml-binding.jar policy.jar stax-api.jar wsdl4j.jar</Class-Path>
+ <Class-Path>jbossws-spi.jar jbossws-common.jar jbossws-framework.jar jbossws-native-core.jar jbossws-native-jaxrpc.jar jbossws-native-jaxws.jar jbossws-native-jaxws-ext.jar jbossws-native-saaj.jar activation.jar commons-logging.jar concurrent.jar javassist.jar jaxb-api.jar jaxb-impl.jar mail.jar jboss-xml-binding.jar netty.jar policy.jar stax-api.jar wsdl4j.jar</Class-Path>
</manifestEntries>
</archive>
</configuration>
Modified: stack/native/trunk/modules/core/pom.xml
===================================================================
--- stack/native/trunk/modules/core/pom.xml 2009-07-04 14:37:52 UTC (rev 10314)
+++ stack/native/trunk/modules/core/pom.xml 2009-07-04 14:44:05 UTC (rev 10315)
@@ -145,8 +145,8 @@
<artifactId>jboss-jaxb-intros</artifactId>
</dependency>
<dependency>
- <groupId>org.jboss.remoting</groupId>
- <artifactId>jboss-remoting</artifactId>
+ <groupId>org.jboss.netty</groupId>
+ <artifactId>netty</artifactId>
</dependency>
<dependency>
<groupId>wscommons-policy</groupId>
Modified: stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/CommonClient.java
===================================================================
--- stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/CommonClient.java 2009-07-04 14:37:52 UTC (rev 10314)
+++ stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/CommonClient.java 2009-07-04 14:44:05 UTC (rev 10315)
@@ -333,11 +333,12 @@
Map<String, Object> callProps = new HashMap<String, Object>(getRequestContext());
EndpointInfo epInfo = new EndpointInfo(epMetaData, targetAddress, callProps);
- if (shouldMaintainSession())
+ boolean maintainSession = shouldMaintainSession();
+ if (maintainSession)
addSessionInfo(reqMessage, callProps);
RemoteConnection remoteConnection = new RemoteConnectionFactory().getRemoteConnection(epInfo);
- MessageAbstraction resMessage = remoteConnection.invoke(reqMessage, epInfo, oneway);
+ MessageAbstraction resMessage = remoteConnection.invoke(reqMessage, epInfo, oneway, maintainSession);
if (shouldMaintainSession())
saveSessionInfo(callProps, getRequestContext());
Modified: stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/client/FastInfosetConnectionHTTP.java
===================================================================
--- stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/client/FastInfosetConnectionHTTP.java 2009-07-04 14:37:52 UTC (rev 10314)
+++ stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/client/FastInfosetConnectionHTTP.java 2009-07-04 14:44:05 UTC (rev 10315)
@@ -25,8 +25,6 @@
import javax.xml.soap.MimeHeaders;
-import org.jboss.remoting.marshal.Marshaller;
-import org.jboss.remoting.marshal.UnMarshaller;
import org.jboss.ws.core.MessageAbstraction;
import org.jboss.ws.core.soap.FastInfosetMarshaller;
import org.jboss.ws.core.soap.FastInfosetUnMarshaller;
@@ -53,10 +51,12 @@
@Override
protected void populateHeaders(MessageAbstraction reqMessage, Map<String, Object> metadata)
{
- MimeHeaders mimeHeaders = reqMessage.getMimeHeaders();
- mimeHeaders.setHeader(MimeConstants.CONTENT_TYPE, MimeConstants.TYPE_FASTINFOSET);
- mimeHeaders.addHeader(MimeConstants.ACCEPT, MimeConstants.TYPE_FASTINFOSET);
-
+ if (reqMessage != null)
+ {
+ MimeHeaders mimeHeaders = reqMessage.getMimeHeaders();
+ mimeHeaders.setHeader(MimeConstants.CONTENT_TYPE, MimeConstants.TYPE_FASTINFOSET);
+ mimeHeaders.addHeader(MimeConstants.ACCEPT, MimeConstants.TYPE_FASTINFOSET);
+ }
super.populateHeaders(reqMessage, metadata);
}
}
Modified: stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/client/HTTPProtocolConnection.java
===================================================================
--- stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/client/HTTPProtocolConnection.java 2009-07-04 14:37:52 UTC (rev 10314)
+++ stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/client/HTTPProtocolConnection.java 2009-07-04 14:44:05 UTC (rev 10315)
@@ -21,8 +21,6 @@
*/
package org.jboss.ws.core.client;
-import org.jboss.remoting.marshal.Marshaller;
-import org.jboss.remoting.marshal.UnMarshaller;
import org.jboss.ws.core.jaxws.binding.HTTPMessageMarshaller;
import org.jboss.ws.core.jaxws.binding.HTTPMessageUnMarshaller;
Modified: stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/client/HTTPRemotingConnection.java
===================================================================
--- stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/client/HTTPRemotingConnection.java 2009-07-04 14:37:52 UTC (rev 10314)
+++ stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/client/HTTPRemotingConnection.java 2009-07-04 14:44:05 UTC (rev 10315)
@@ -22,42 +22,20 @@
package org.jboss.ws.core.client;
import java.io.IOException;
-import java.lang.reflect.Field;
-import java.net.MalformedURLException;
-import java.net.SocketTimeoutException;
-import java.net.URL;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
-import java.util.Properties;
-import javax.xml.rpc.Stub;
import javax.xml.soap.MimeHeader;
import javax.xml.soap.MimeHeaders;
-import javax.xml.ws.BindingProvider;
import javax.xml.ws.addressing.EndpointReference;
import org.jboss.logging.Logger;
-import org.jboss.remoting.Client;
-import org.jboss.remoting.InvokerLocator;
-import org.jboss.remoting.Version;
-import org.jboss.remoting.marshal.MarshalFactory;
-import org.jboss.remoting.marshal.Marshaller;
-import org.jboss.remoting.marshal.UnMarshaller;
-import org.jboss.remoting.transport.http.HTTPClientInvoker;
-import org.jboss.ws.core.CommonMessageContext;
import org.jboss.ws.core.MessageAbstraction;
import org.jboss.ws.core.MessageTrace;
-import org.jboss.ws.core.StubExt;
-import org.jboss.ws.core.WSTimeoutException;
-import org.jboss.ws.core.soap.MessageContextAssociation;
import org.jboss.ws.extensions.wsrm.transport.RMChannel;
import org.jboss.ws.extensions.wsrm.transport.RMMetadata;
import org.jboss.ws.extensions.wsrm.transport.RMTransportHelper;
-import org.jboss.ws.feature.FastInfosetFeature;
-import org.jboss.ws.metadata.config.CommonConfig;
-import org.jboss.ws.metadata.config.EndpointProperty;
-import org.jboss.ws.metadata.umdm.EndpointMetaData;
/**
* SOAPConnection implementation.
@@ -69,6 +47,7 @@
*
* @author Thomas.Diesler at jboss.org
* @author <a href="mailto:jason at stacksmash.com">Jason T. Greene</a>
+ * @author alessio.soldano at jboss.com
*
* @since 02-Feb-2005
*/
@@ -76,45 +55,15 @@
{
// provide logging
private static Logger log = Logger.getLogger(HTTPRemotingConnection.class);
-
- private Map<String, Object> clientConfig = new HashMap<String, Object>();
-
- private static Map<String, String> metadataMap = new HashMap<String, String>();
- static
- {
- metadataMap.put(Stub.USERNAME_PROPERTY, "http.basic.username");
- metadataMap.put(Stub.PASSWORD_PROPERTY, "http.basic.password");
- metadataMap.put(BindingProvider.USERNAME_PROPERTY, "http.basic.username");
- metadataMap.put(BindingProvider.PASSWORD_PROPERTY, "http.basic.password");
- }
- private static Map<String, String> configMap = new HashMap<String, String>();
- static
- {
- configMap.put(StubExt.PROPERTY_KEY_ALIAS, "org.jboss.remoting.keyAlias");
- configMap.put(StubExt.PROPERTY_KEY_STORE, "org.jboss.remoting.keyStore");
- configMap.put(StubExt.PROPERTY_KEY_STORE_ALGORITHM, "org.jboss.remoting.keyStoreAlgorithm");
- configMap.put(StubExt.PROPERTY_KEY_STORE_PASSWORD, "org.jboss.remoting.keyStorePassword");
- configMap.put(StubExt.PROPERTY_KEY_STORE_TYPE, "org.jboss.remoting.keyStoreType");
- configMap.put(StubExt.PROPERTY_SOCKET_FACTORY, "socketFactoryClassName");
- configMap.put(StubExt.PROPERTY_SSL_PROTOCOL, "org.jboss.remoting.sslProtocol");
- configMap.put(StubExt.PROPERTY_SSL_PROVIDER_NAME, "org.jboss.remoting.sslProviderName");
- configMap.put(StubExt.PROPERTY_TRUST_STORE, "org.jboss.remoting.trustStore");
- configMap.put(StubExt.PROPERTY_TRUST_STORE_ALGORITHM, "org.jboss.remoting.truststoreAlgorithm");
- configMap.put(StubExt.PROPERTY_TRUST_STORE_PASSWORD, "org.jboss.remoting.trustStorePassword");
- configMap.put(StubExt.PROPERTY_TRUST_STORE_TYPE, "org.jboss.remoting.trustStoreType");
- }
-
+
private boolean closed;
- private Integer chunkedLength;
+ private Integer chunkSize;
private static final RMChannel RM_CHANNEL = RMChannel.getInstance();
public HTTPRemotingConnection()
{
- // HTTPClientInvoker connect sends gratuitous POST
- // http://jira.jboss.com/jira/browse/JBWS-711
- clientConfig.put(Client.ENABLE_LEASE, false);
- clientConfig.put(HTTPClientInvoker.UNMARSHAL_NULL_STREAM, "true");
+
}
public boolean isClosed()
@@ -127,22 +76,27 @@
this.closed = closed;
}
- public Integer getChunkedLength()
+ public Integer getChunkSize()
{
- return chunkedLength;
+ return chunkSize;
}
- public void setChunkedLength(Integer chunkedLength)
+ public void setChunkSize(Integer chunkSize)
{
- this.chunkedLength = chunkedLength;
+ this.chunkSize = chunkSize;
}
+ public MessageAbstraction invoke(MessageAbstraction reqMessage, Object endpoint, boolean oneway) throws IOException
+ {
+ return this.invoke(reqMessage, endpoint, oneway, true);
+ }
+
/**
* Sends the given message to the specified endpoint.
*
* A null reqMessage signifies a HTTP GET request.
*/
- public MessageAbstraction invoke(MessageAbstraction reqMessage, Object endpoint, boolean oneway) throws IOException
+ public MessageAbstraction invoke(MessageAbstraction reqMessage, Object endpoint, boolean oneway, boolean maintainSession) throws IOException
{
if (endpoint == null)
throw new IllegalArgumentException("Given endpoint cannot be null");
@@ -150,7 +104,6 @@
if (closed)
throw new IOException("Connection is already closed");
- Object timeout = null;
String targetAddress;
Map<String, Object> callProps = new HashMap<String, Object>();
@@ -159,13 +112,6 @@
EndpointInfo epInfo = (EndpointInfo)endpoint;
targetAddress = epInfo.getTargetAddress();
callProps = epInfo.getProperties();
-
- if (callProps.containsKey(StubExt.PROPERTY_CLIENT_TIMEOUT))
- {
- timeout = callProps.get(StubExt.PROPERTY_CLIENT_TIMEOUT);
- targetAddress = addURLParameter(targetAddress, "timeout", timeout.toString());
- }
-
}
else if (endpoint instanceof EndpointReference)
{
@@ -177,254 +123,77 @@
targetAddress = endpoint.toString();
}
- // setup remoting client
- Map<String, Object> metadata = createRemotingMetaData(reqMessage, callProps);
- Marshaller marshaller = getMarshaller();
- UnMarshaller unmarshaller = getUnmarshaller();
- InvokerLocator locator = null;
- try
+ if (RMTransportHelper.isRMMessage(callProps))
{
- // Get the invoker from Remoting for a given endpoint address
- log.debug("Get locator for: " + endpoint);
-
- /**
- * [JBWS-1704] The Use Of Remoting Causes An Additional 'datatype' Parameter To Be Sent On All Requests
- *
- * An HTTPClientInvoker may disconnect from the server and recreated by the remoting layer.
- * In that case the new invoker does not inherit the marshaller/unmarshaller from the disconnected invoker.
- * We therefore explicitly specify the invoker locator datatype and register the SOAP marshaller/unmarshaller
- * with the MarshalFactory.
- *
- * This applies to remoting-1.4.5 and less
- */
- String version = getRemotingVersion();
- if (version.startsWith("1.4"))
+ try
{
- targetAddress = addURLParameter(targetAddress, InvokerLocator.DATATYPE, "JBossWSMessage");
- MarshalFactory.addMarshaller("JBossWSMessage", marshaller, unmarshaller);
- }
-
- locator = new InvokerLocator(targetAddress);
- }
- catch (MalformedURLException e)
- {
- throw new IllegalArgumentException("Malformed endpoint address", e);
- }
-
- try
- {
- if (RMTransportHelper.isRMMessage(callProps))
- {
- RMMetadata rmMetadata = new RMMetadata(getRemotingVersion(), targetAddress, marshaller, unmarshaller, callProps, metadata, clientConfig);
+ Map<String, Object> additionalHeaders = new HashMap<String, Object>();
+ populateHeaders(reqMessage, additionalHeaders);
+ RMMetadata rmMetadata = new RMMetadata(targetAddress, getMarshaller(), getUnmarshaller(), callProps, additionalHeaders);
return RM_CHANNEL.send(reqMessage, rmMetadata);
}
- else
+ catch (Throwable t)
{
- Client client = new Client(locator, "jbossws", clientConfig);
- client.connect();
-
- client.setMarshaller(marshaller);
-
- client.setUnMarshaller(unmarshaller);
-
- if (log.isDebugEnabled())
- log.debug("Remoting metadata: " + metadata);
-
- // debug the outgoing message
- MessageTrace.traceMessage("Outgoing Request Message", reqMessage);
-
- MessageAbstraction resMessage = null;
-
- if (oneway == true)
- {
- client.invokeOneway(reqMessage, metadata, false);
- }
- else
- {
- resMessage = (MessageAbstraction)client.invoke(reqMessage, metadata);
- }
-
- // Disconnect the remoting client
- client.disconnect();
-
- callProps.clear();
- callProps.putAll(metadata);
-
- // trace the incomming response message
- MessageTrace.traceMessage("Incoming Response Message", resMessage);
-
- return resMessage;
+ IOException io = new IOException();
+ io.initCause(t);
+ throw io;
}
}
- catch (Throwable th)
+ else
{
- if (timeout != null && (th.getCause() instanceof SocketTimeoutException))
+ NettyClient client = new NettyClient(getMarshaller(), getUnmarshaller());
+ if (chunkSize != null)
{
- throw new WSTimeoutException("Timeout after: " + timeout + "ms", new Long(timeout.toString()));
+ client.setChunkSize(chunkSize);
}
-
- IOException io = new IOException("Could not transmit message");
- io.initCause(th);
- throw io;
+
+ Map<String, Object> additionalHeaders = new HashMap<String, Object>();
+ populateHeaders(reqMessage, additionalHeaders);
+ //Trace the outgoing message
+ MessageTrace.traceMessage("Outgoing Request Message", reqMessage);
+ MessageAbstraction resMessage = (MessageAbstraction)client.invoke(reqMessage, targetAddress, !oneway || maintainSession, additionalHeaders, callProps);
+ //Trace the incoming response message
+ MessageTrace.traceMessage("Incoming Response Message", resMessage);
+ return resMessage;
}
}
+
+
- private String addURLParameter(String urlStr, String key, String value) throws MalformedURLException
+ protected void populateHeaders(MessageAbstraction reqMessage, Map<String, Object> metadata)
{
- URL url = new URL(urlStr);
- urlStr += (url.getQuery() == null ? "?" : "&") + key + "=" + value;
- return urlStr;
- }
-
- private String getRemotingVersion()
- {
- String version = null;
- try
- {
- // Access the constant dynamically, otherwise it will be the compile time value
- Field field = Version.class.getDeclaredField("VERSION");
- version = (String)field.get(null);
- }
- catch (Exception ex)
- {
- throw new RuntimeException("Cannot obtain remoting version", ex);
- }
-
- if (version == null)
- {
- URL codeURL = Version.class.getProtectionDomain().getCodeSource().getLocation();
- throw new RuntimeException("Cannot obtain remoting version from: " + codeURL);
- }
- return version;
- }
-
- private Map<String, Object> createRemotingMetaData(MessageAbstraction reqMessage, Map callProps)
- {
- CommonMessageContext msgContext = MessageContextAssociation.peekMessageContext();
-
- Map<String, Object> metadata = new HashMap<String, Object>();
-
- // We need to unmarshall faults (HTTP 500)
- // metadata.put(HTTPMetadataConstants.NO_THROW_ON_ERROR, "true"); // since 2.0.0.GA
- metadata.put("NoThrowOnError", "true");
-
if (reqMessage != null)
{
- populateHeaders(reqMessage, metadata);
+ MimeHeaders mimeHeaders = reqMessage.getMimeHeaders();
- // Enable chunked encoding. This is the default size.
- int chunkSizeValue = (chunkedLength != null ? chunkedLength : 1024);
-
- // Overwrite, through endpoint config
- if (msgContext != null)
+ Iterator i = mimeHeaders.getAllHeaders();
+ while (i.hasNext())
{
- EndpointMetaData epMetaData = msgContext.getEndpointMetaData();
- CommonConfig config = epMetaData.getConfig();
+ MimeHeader header = (MimeHeader)i.next();
+ Object currentValue = metadata.get(header.getName());
- String sizeValue = config.getProperty(EndpointProperty.CHUNKED_ENCODING_SIZE);
- if (sizeValue != null)
- chunkSizeValue = Integer.valueOf(sizeValue);
-
- if (epMetaData.isFeatureEnabled(FastInfosetFeature.class))
- chunkSizeValue = 0;
- }
-
- if (chunkSizeValue > 0)
- {
- clientConfig.put("chunkedLength", String.valueOf(chunkSizeValue));
- }
- else
- {
- clientConfig.remove("chunkedLength");
- }
- }
- else
- {
- metadata.put("TYPE", "GET");
- }
-
- if (callProps != null)
- {
- Iterator it = callProps.entrySet().iterator();
-
- // Get authentication type, default to BASIC authetication
- String authType = (String)callProps.get(StubExt.PROPERTY_AUTH_TYPE);
- if (authType == null)
- authType = StubExt.PROPERTY_AUTH_TYPE_BASIC;
-
- while (it.hasNext())
- {
- Map.Entry entry = (Map.Entry)it.next();
- String key = (String)entry.getKey();
- Object val = entry.getValue();
-
- // pass properties to remoting meta data
- if (metadataMap.containsKey(key))
+ /*
+ * Coalesce multiple headers into one
+ *
+ * From HTTP/1.1 RFC 2616:
+ *
+ * Multiple message-header fields with the same field-name MAY be
+ * present in a message if and only if the entire field-value for that
+ * header field is defined as a comma-separated list [i.e., #(values)].
+ * It MUST be possible to combine the multiple header fields into one
+ * "field-name: field-value" pair, without changing the semantics of
+ * the message, by appending each subsequent field-value to the first,
+ * each separated by a comma.
+ */
+ if (currentValue != null)
{
- String remotingKey = metadataMap.get(key);
- if ("http.basic.username".equals(remotingKey) || "http.basic.password".equals(remotingKey))
- {
- if (authType.equals(StubExt.PROPERTY_AUTH_TYPE_BASIC))
- {
- metadata.put(remotingKey, val);
- }
- else
- {
- log.warn("Ignore '" + key + "' with auth typy: " + authType);
- }
- }
- else
- {
- metadata.put(remotingKey, val);
- }
+ metadata.put(header.getName(), currentValue + "," + header.getValue());
}
-
- // pass properties to remoting client config
- if (configMap.containsKey(key))
+ else
{
- String remotingKey = configMap.get(key);
- clientConfig.put(remotingKey, val);
+ metadata.put(header.getName(), header.getValue());
}
}
}
-
- return metadata;
}
-
- protected void populateHeaders(MessageAbstraction reqMessage, Map<String, Object> metadata)
- {
- MimeHeaders mimeHeaders = reqMessage.getMimeHeaders();
-
- Properties props = new Properties();
- metadata.put("HEADER", props);
-
- Iterator i = mimeHeaders.getAllHeaders();
- while (i.hasNext())
- {
- MimeHeader header = (MimeHeader)i.next();
- String currentValue = props.getProperty(header.getName());
-
- /*
- * Coalesce multiple headers into one
- *
- * From HTTP/1.1 RFC 2616:
- *
- * Multiple message-header fields with the same field-name MAY be
- * present in a message if and only if the entire field-value for that
- * header field is defined as a comma-separated list [i.e., #(values)].
- * It MUST be possible to combine the multiple header fields into one
- * "field-name: field-value" pair, without changing the semantics of
- * the message, by appending each subsequent field-value to the first,
- * each separated by a comma.
- */
- if (currentValue != null)
- {
- props.put(header.getName(), currentValue + "," + header.getValue());
- }
- else
- {
- props.put(header.getName(), header.getValue());
- }
- }
- }
}
Modified: stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/client/JsonConnectionHTTP.java
===================================================================
--- stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/client/JsonConnectionHTTP.java 2009-07-04 14:37:52 UTC (rev 10314)
+++ stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/client/JsonConnectionHTTP.java 2009-07-04 14:44:05 UTC (rev 10315)
@@ -26,8 +26,6 @@
import javax.xml.soap.MimeHeaders;
import javax.xml.soap.SOAPConstants;
-import org.jboss.remoting.marshal.Marshaller;
-import org.jboss.remoting.marshal.UnMarshaller;
import org.jboss.ws.core.MessageAbstraction;
import org.jboss.ws.core.jaxws.binding.JsonMessageMarshaller;
import org.jboss.ws.core.jaxws.binding.JsonMessageUnMarshaller;
@@ -55,9 +53,11 @@
protected void populateHeaders(MessageAbstraction reqMessage, Map<String, Object> metadata)
{
// TODO: fix the content-type
- MimeHeaders mimeHeaders = reqMessage.getMimeHeaders();
- mimeHeaders.setHeader(MimeConstants.CONTENT_TYPE, SOAPConstants.SOAP_1_1_CONTENT_TYPE);
-
+ if (reqMessage != null)
+ {
+ MimeHeaders mimeHeaders = reqMessage.getMimeHeaders();
+ mimeHeaders.setHeader(MimeConstants.CONTENT_TYPE, SOAPConstants.SOAP_1_1_CONTENT_TYPE);
+ }
super.populateHeaders(reqMessage, metadata);
}
}
Copied: stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/client/Marshaller.java (from rev 10312, stack/native/branches/netty/modules/core/src/main/java/org/jboss/ws/core/client/Marshaller.java)
===================================================================
--- stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/client/Marshaller.java (rev 0)
+++ stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/client/Marshaller.java 2009-07-04 14:44:05 UTC (rev 10315)
@@ -0,0 +1,49 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2006, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.ws.core.client;
+
+import java.io.IOException;
+import java.io.OutputStream;
+
+/**
+ * Interface that all data marshallers must implements.
+ * Requires them to take Java data objects and convert
+ * primitive java data types (i.e. byte[]) and write
+ * to output provided.
+ *
+ * @author alessio.soldano at jboss.com
+ * @since 24-Jun-2009
+ *
+ */
+public interface Marshaller
+{
+ /**
+ * Marshaller will need to take the dataObject and convert
+ * into primitive java data types and write to the
+ * given output.
+ *
+ * @param dataObject Object to be writen to output
+ * @param output The data output to write the object
+ * data to.
+ */
+ public void write(Object dataObject, OutputStream output) throws IOException;
+}
Copied: stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/client/NettyClient.java (from rev 10312, stack/native/branches/netty/modules/core/src/main/java/org/jboss/ws/core/client/NettyClient.java)
===================================================================
--- stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/client/NettyClient.java (rev 0)
+++ stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/client/NettyClient.java 2009-07-04 14:44:05 UTC (rev 10315)
@@ -0,0 +1,457 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2006, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.ws.core.client;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.net.InetSocketAddress;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.Map;
+import java.util.concurrent.Executor;
+import java.util.concurrent.Executors;
+
+import javax.net.ssl.SSLEngine;
+import javax.xml.rpc.Stub;
+import javax.xml.ws.BindingProvider;
+
+import org.jboss.netty.bootstrap.ClientBootstrap;
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.jboss.netty.buffer.ChannelBufferOutputStream;
+import org.jboss.netty.buffer.ChannelBuffers;
+import org.jboss.netty.channel.Channel;
+import org.jboss.netty.channel.ChannelFactory;
+import org.jboss.netty.channel.ChannelFuture;
+import org.jboss.netty.channel.socket.nio.NioClientSocketChannelFactory;
+import org.jboss.netty.handler.codec.http.DefaultHttpChunk;
+import org.jboss.netty.handler.codec.http.DefaultHttpRequest;
+import org.jboss.netty.handler.codec.http.HttpChunk;
+import org.jboss.netty.handler.codec.http.HttpHeaders;
+import org.jboss.netty.handler.codec.http.HttpMessage;
+import org.jboss.netty.handler.codec.http.HttpMethod;
+import org.jboss.netty.handler.codec.http.HttpRequest;
+import org.jboss.netty.handler.codec.http.HttpVersion;
+import org.jboss.netty.handler.ssl.SslHandler;
+import org.jboss.security.Base64Encoder;
+import org.jboss.ws.core.CommonMessageContext;
+import org.jboss.ws.core.StubExt;
+import org.jboss.ws.core.WSTimeoutException;
+import org.jboss.ws.core.client.ssl.SSLContextFactory;
+import org.jboss.ws.core.soap.MessageContextAssociation;
+import org.jboss.ws.feature.FastInfosetFeature;
+import org.jboss.ws.metadata.config.CommonConfig;
+import org.jboss.ws.metadata.config.EndpointProperty;
+import org.jboss.ws.metadata.umdm.EndpointMetaData;
+
+/**
+ * A http client using Netty
+ *
+ * @author alessio.soldano at jboss.com
+ * @since 29-Jun-2009
+ *
+ */
+public class NettyClient
+{
+ public static final String RESPONSE_CODE = "ResponseCode";
+ public static final String RESPONSE_CODE_MESSAGE = "ResponseCodeMessage";
+
+ private Marshaller marshaller;
+ private UnMarshaller unmarshaller;
+ private Long timeout;
+ private static final int DEFAULT_CHUNK_SIZE = 1024;
+ //We always use chunked transfer encoding unless explicitely disabled by user
+ private Integer chunkSize = new Integer(DEFAULT_CHUNK_SIZE);
+ private Executor bossExecutor;
+ private Executor workerExecutor;
+
+ /**
+ * Construct a Netty client with the provided marshaller/unmarshaller.
+ *
+ * @param marshaller
+ * @param unmarshaller
+ */
+ public NettyClient(Marshaller marshaller, UnMarshaller unmarshaller)
+ {
+ this.marshaller = marshaller;
+ this.unmarshaller = unmarshaller;
+ this.bossExecutor = Executors.newCachedThreadPool();
+ this.workerExecutor = Executors.newCachedThreadPool();
+ }
+
+ /**
+ * Construct a Netty client with the provided marshaller/unmarshaller and executors.
+ *
+ * @param marshaller
+ * @param unmarshaller
+ * @param bossExecutor
+ * @param workerExecutor
+ */
+ public NettyClient(Marshaller marshaller, UnMarshaller unmarshaller, Executor bossExecutor, Executor workerExecutor)
+ {
+ this.marshaller = marshaller;
+ this.unmarshaller = unmarshaller;
+ this.bossExecutor = bossExecutor;
+ this.workerExecutor = workerExecutor;
+ }
+
+ /**
+ * Performs the invocation; a HTTP GET is performed when the reqMessage is null, otherwise a HTTP POST is performed.
+ *
+ * @param reqMessage The request message
+ * @param targetAddress The target address
+ * @param waitForResponse A boolean saying if the method should wait for the results before returning. Waiting is required for two-ways invocations
+ * and when maintaining sessions using cookies.
+ * @param additionalHeaders Additional http headers to be added to the request
+ * @param callProps
+ * @return
+ * @throws IOException
+ */
+ public Object invoke(Object reqMessage, String targetAddress, boolean waitForResponse, Map<String, Object> additionalHeaders, Map<String, Object> callProps)
+ throws IOException
+ {
+ URL target;
+ try
+ {
+ target = new URL(targetAddress);
+ }
+ catch (MalformedURLException e)
+ {
+ throw new RuntimeException("Invalid address: " + targetAddress, e);
+ }
+
+ ChannelFactory factory = new NioClientSocketChannelFactory(bossExecutor, workerExecutor);
+
+ ClientBootstrap bootstrap = new ClientBootstrap(factory);
+ WSClientPipelineFactory channelPipelineFactory = new WSClientPipelineFactory();
+ WSResponseHandler responseHandler = null;
+ if (waitForResponse)
+ {
+ responseHandler = new WSResponseHandler(unmarshaller);
+ channelPipelineFactory.setResponseHandler(responseHandler);
+ }
+ if ("https".equalsIgnoreCase(target.getProtocol()))
+ {
+ SSLContextFactory sslContextFactory = new SSLContextFactory(callProps);
+ SSLEngine engine = sslContextFactory.getSSLContext().createSSLEngine();
+ engine.setUseClientMode(true);
+ channelPipelineFactory.setSslHandler(new SslHandler(engine));
+ }
+
+ bootstrap.setPipelineFactory(channelPipelineFactory);
+
+ Channel channel = null;
+ try
+ {
+ setActualTimeout(callProps);
+ //Start the connection attempt
+ ChannelFuture future = bootstrap.connect(getSocketAddress(target));
+
+ //Wait until the connection attempt succeeds or fails
+ awaitUninterruptibly(future, timeout);
+ if (!future.isSuccess())
+ {
+ IOException io = new IOException("Could not connect to " + target.getHost());
+ io.initCause(future.getCause());
+ factory.releaseExternalResources();
+ throw io;
+ }
+ channel = future.getChannel();
+
+ //Send the HTTP request
+ HttpRequest request = new DefaultHttpRequest(HttpVersion.HTTP_1_1, reqMessage != null ? HttpMethod.POST : HttpMethod.GET, targetAddress);
+ request.addHeader(HttpHeaders.Names.HOST, target.getHost());
+ request.addHeader(HttpHeaders.Names.CONNECTION, HttpHeaders.Values.KEEP_ALIVE);
+ setAdditionalHeaders(request, additionalHeaders);
+ setActualChunkedLength(request);
+ setAuthorization(request, callProps);
+
+ writeRequest(channel, request, reqMessage);
+
+ if (!waitForResponse)
+ {
+ //No need to wait for the connection to be closed
+ return null;
+ }
+ //Wait for the server to close the connection
+ ChannelFuture closeFuture = channel.getCloseFuture();
+ awaitUninterruptibly(closeFuture, timeout);
+ if (responseHandler.getError() != null)
+ {
+ throw responseHandler.getError();
+ }
+ Object resMessage = null;
+ Map<String, Object> resHeaders = null;
+ //Get the response
+ resMessage = responseHandler.getResponseMessage();
+ resHeaders = responseHandler.getResponseHeaders();
+ //Update props with response headers (required to maintain session using cookies)
+ callProps.clear();
+ if (resHeaders != null)
+ {
+ callProps.putAll(resHeaders);
+ }
+
+ return resMessage;
+ }
+ catch (IOException ioe)
+ {
+ throw ioe;
+ }
+ catch (WSTimeoutException toe)
+ {
+ throw toe;
+ }
+ catch (Throwable t)
+ {
+ IOException io = new IOException("Could not transmit message");
+ io.initCause(t);
+ throw io;
+ }
+ finally
+ {
+ if (channel != null)
+ {
+ channel.close();
+ }
+ //Shut down executor threads to exit
+ factory.releaseExternalResources();
+ }
+ }
+
+ private InetSocketAddress getSocketAddress(URL target)
+ {
+ int port = target.getPort();
+ if (port < 0)
+ {
+ //use default port
+ String protocol = target.getProtocol();
+ if ("http".equalsIgnoreCase(protocol))
+ {
+ port = 80;
+ }
+ else if ("https".equalsIgnoreCase(protocol))
+ {
+ port = 443;
+ }
+ }
+ return new InetSocketAddress(target.getHost(), port);
+ }
+
+ private void writeRequest(Channel channel, HttpRequest request, Object reqMessage) throws IOException
+ {
+ if (reqMessage == null)
+ {
+ channel.write(request);
+ }
+ else
+ {
+ ChannelBuffer content = ChannelBuffers.dynamicBuffer();
+ OutputStream os = new ChannelBufferOutputStream(content);
+ marshaller.write(reqMessage, os);
+
+ int cs = chunkSize;
+ if (cs > 0) //chunked encoding
+ {
+ os.flush();
+ request.addHeader(HttpHeaders.Names.TRANSFER_ENCODING, HttpHeaders.Values.CHUNKED);
+ //write headers
+ channel.write(request);
+ //write content chunks
+ int size = content.readableBytes();
+ int cur = 0;
+ while (cur < size)
+ {
+ int to = Math.min(cur + cs, size);
+ HttpChunk chunk = new DefaultHttpChunk(content.slice(cur, to - cur));
+ channel.write(chunk);
+ cur = to;
+ }
+ //write last chunk
+ channel.write(HttpChunk.LAST_CHUNK);
+ }
+ else
+ {
+ request.setHeader(HttpHeaders.Names.CONTENT_LENGTH, String.valueOf(content.readableBytes()));
+ request.setContent(content);
+ channel.write(request);
+ }
+ }
+ }
+
+ /**
+ * Utility method for awaiting with or without timeout (timeout == null or <=0 implies not timeout)
+ *
+ * @param future
+ * @param timeout
+ * @throws WSTimeoutException
+ */
+ private static void awaitUninterruptibly(ChannelFuture future, Long timeout) throws WSTimeoutException
+ {
+ if (timeout != null && timeout.longValue() > 0)
+ {
+ boolean bool = future.awaitUninterruptibly(timeout);
+ if (!bool)
+ {
+ throw new WSTimeoutException("Timeout after: " + timeout + "ms", timeout);
+ }
+ }
+ else
+ {
+ future.awaitUninterruptibly();
+ }
+ }
+
+ /**
+ * Set the actual chunk size according to the endpoint config overwrite and/or configured features.
+ *
+ * @param message
+ */
+ protected void setActualChunkedLength(HttpRequest message)
+ {
+ if (HttpMethod.POST.equals(message.getMethod()))
+ {
+ CommonMessageContext msgContext = MessageContextAssociation.peekMessageContext();
+ //Overwrite, through endpoint config
+ if (msgContext != null)
+ {
+ EndpointMetaData epMetaData = msgContext.getEndpointMetaData();
+ CommonConfig config = epMetaData.getConfig();
+
+ String sizeValue = config.getProperty(EndpointProperty.CHUNKED_ENCODING_SIZE);
+ if (sizeValue != null)
+ chunkSize = Integer.valueOf(sizeValue);
+ if (epMetaData.isFeatureEnabled(FastInfosetFeature.class))
+ chunkSize = 0;
+ }
+ }
+ }
+
+ /**
+ * Set the actual timeout according to specified caller properties
+ *
+ * @param callProps
+ */
+ protected void setActualTimeout(Map<String, Object> callProps)
+ {
+ if (callProps.containsKey(StubExt.PROPERTY_CLIENT_TIMEOUT))
+ {
+ timeout = new Long(callProps.get(StubExt.PROPERTY_CLIENT_TIMEOUT).toString());
+ }
+ }
+
+ /**
+ * Set the required headers in the Netty's HttpMessage to allow for proper authorization.
+ *
+ * @param message
+ * @param callProps
+ * @throws IOException
+ */
+ protected void setAuthorization(HttpMessage message, Map<String, Object> callProps) throws IOException
+ {
+ //Get authentication type, default to BASIC authetication
+ String authType = (String)callProps.get(StubExt.PROPERTY_AUTH_TYPE);
+ if (authType == null)
+ authType = StubExt.PROPERTY_AUTH_TYPE_BASIC;
+ String username = (String)callProps.get(Stub.USERNAME_PROPERTY);
+ String password = (String)callProps.get(Stub.PASSWORD_PROPERTY);
+ if (username == null || password == null)
+ {
+ username = (String)callProps.get(BindingProvider.USERNAME_PROPERTY);
+ password = (String)callProps.get(BindingProvider.PASSWORD_PROPERTY);
+ }
+ if (username != null && password != null)
+ {
+ if (authType.equals(StubExt.PROPERTY_AUTH_TYPE_BASIC))
+ {
+ message.addHeader(HttpHeaders.Names.AUTHORIZATION, getBasicAuthHeader(username, password));
+ }
+ }
+ }
+
+ private static String getBasicAuthHeader(String username, String password) throws IOException
+ {
+ return "Basic " + Base64Encoder.encode(username + ":" + password);
+ }
+
+ /**
+ * Copy the provided additional headers to the Netty's HttpMessage.
+ *
+ * @param message
+ * @param headers
+ */
+ protected void setAdditionalHeaders(HttpMessage message, Map<String, Object> headers)
+ {
+ for (String key : headers.keySet())
+ {
+ try
+ {
+ String header = (String)headers.get(key);
+ message.addHeader(key, header.replaceAll("[\r\n\f]", " "));
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ throw new RuntimeException(e);
+ }
+ }
+ }
+
+ /**
+ * Set the Netty boss executor
+ *
+ * @param bossExecutor
+ */
+ public void setBossExecutor(Executor bossExecutor)
+ {
+ this.bossExecutor = bossExecutor;
+ }
+
+ /**
+ * Set the Netty worker executor
+ *
+ * @param workerExecutor
+ */
+ public void setWorkerExecutor(Executor workerExecutor)
+ {
+ this.workerExecutor = workerExecutor;
+ }
+
+ /**
+ *
+ * @return The current chunk size
+ */
+ public Integer getChunkSize()
+ {
+ return chunkSize;
+ }
+
+ /**
+ * Set the chunk size for chunked transfer encoding.
+ * The default chunk size is 1024 bytes.
+ *
+ * @param chunkSize
+ */
+ public void setChunkSize(Integer chunkSize)
+ {
+ this.chunkSize = chunkSize;
+ }
+}
Modified: stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/client/RemoteConnection.java
===================================================================
--- stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/client/RemoteConnection.java 2009-07-04 14:37:52 UTC (rev 10314)
+++ stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/client/RemoteConnection.java 2009-07-04 14:44:05 UTC (rev 10315)
@@ -23,8 +23,6 @@
import java.io.IOException;
-import org.jboss.remoting.marshal.Marshaller;
-import org.jboss.remoting.marshal.UnMarshaller;
import org.jboss.ws.core.MessageAbstraction;
@@ -39,6 +37,8 @@
Marshaller getMarshaller();
UnMarshaller getUnmarshaller();
+
+ MessageAbstraction invoke(MessageAbstraction reqMessage, Object endpoint, boolean oneway) throws IOException;
- MessageAbstraction invoke(MessageAbstraction reqMessage, Object endpoint, boolean oneway) throws IOException;
+ MessageAbstraction invoke(MessageAbstraction reqMessage, Object endpoint, boolean oneway, boolean maintainSession) throws IOException;
}
Modified: stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/client/SOAPProtocolConnectionHTTP.java
===================================================================
--- stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/client/SOAPProtocolConnectionHTTP.java 2009-07-04 14:37:52 UTC (rev 10314)
+++ stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/client/SOAPProtocolConnectionHTTP.java 2009-07-04 14:44:05 UTC (rev 10315)
@@ -23,14 +23,11 @@
import java.io.IOException;
import java.util.Map;
-import java.util.Properties;
import javax.xml.soap.MimeHeaders;
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPMessage;
-import org.jboss.remoting.marshal.Marshaller;
-import org.jboss.remoting.marshal.UnMarshaller;
import org.jboss.ws.core.MessageAbstraction;
import org.jboss.ws.core.soap.SOAPMessageMarshaller;
import org.jboss.ws.core.soap.SOAPMessageUnMarshallerHTTP;
@@ -55,7 +52,8 @@
return new SOAPMessageMarshaller();
}
- public MessageAbstraction invoke(MessageAbstraction reqMessage, Object endpoint, boolean oneway) throws IOException
+ @Override
+ public MessageAbstraction invoke(MessageAbstraction reqMessage, Object endpoint, boolean oneway, boolean maintainSession) throws IOException
{
try
{
@@ -68,7 +66,7 @@
if (reqMessage != null && soapMessage.saveRequired())
soapMessage.saveChanges();
- return super.invoke(reqMessage, endpoint, oneway);
+ return super.invoke(reqMessage, endpoint, oneway, maintainSession);
}
catch (SOAPException ex)
{
@@ -82,33 +80,33 @@
{
super.populateHeaders(reqMessage, metadata);
- Properties props = (Properties)metadata.get("HEADER");
+ if (reqMessage != null)
+ {
+ // R2744 A HTTP request MESSAGE MUST contain a SOAPAction HTTP header field
+ // with a quoted value equal to the value of the soapAction attribute of
+ // soapbind:operation, if present in the corresponding WSDL description.
- // R2744 A HTTP request MESSAGE MUST contain a SOAPAction HTTP header field
- // with a quoted value equal to the value of the soapAction attribute of
- // soapbind:operation, if present in the corresponding WSDL description.
+ // R2745 A HTTP request MESSAGE MUST contain a SOAPAction HTTP header field
+ // with a quoted empty string value, if in the corresponding WSDL description,
+ // the soapAction attribute of soapbind:operation is either not present, or
+ // present with an empty string as its value.
- // R2745 A HTTP request MESSAGE MUST contain a SOAPAction HTTP header field
- // with a quoted empty string value, if in the corresponding WSDL description,
- // the soapAction attribute of soapbind:operation is either not present, or
- // present with an empty string as its value.
+ MimeHeaders mimeHeaders = reqMessage.getMimeHeaders();
+ String[] action = mimeHeaders.getHeader("SOAPAction");
+ if (action != null && action.length > 0)
+ {
+ String soapAction = action[0];
- MimeHeaders mimeHeaders = reqMessage.getMimeHeaders();
- String[] action = mimeHeaders.getHeader("SOAPAction");
- if (action != null && action.length > 0)
- {
- String soapAction = action[0];
+ // R1109 The value of the SOAPAction HTTP header field in a HTTP request MESSAGE MUST be a quoted string.
+ if (soapAction.startsWith("\"") == false || soapAction.endsWith("\"") == false)
+ soapAction = "\"" + soapAction + "\"";
- // R1109 The value of the SOAPAction HTTP header field in a HTTP request MESSAGE MUST be a quoted string.
- if (soapAction.startsWith("\"") == false || soapAction.endsWith("\"") == false)
- soapAction = "\"" + soapAction + "\"";
-
- props.put("SOAPAction", soapAction);
+ metadata.put("SOAPAction", soapAction);
+ }
+ else
+ {
+ metadata.put("SOAPAction", "\"\"");
+ }
}
- else
- {
- props.put("SOAPAction", "\"\"");
- }
-
}
}
Modified: stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/client/SOAPProtocolConnectionJMS.java
===================================================================
--- stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/client/SOAPProtocolConnectionJMS.java 2009-07-04 14:37:52 UTC (rev 10314)
+++ stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/client/SOAPProtocolConnectionJMS.java 2009-07-04 14:44:05 UTC (rev 10315)
@@ -41,8 +41,6 @@
import javax.naming.InitialContext;
import javax.xml.ws.addressing.EndpointReference;
-import org.jboss.remoting.marshal.Marshaller;
-import org.jboss.remoting.marshal.UnMarshaller;
import org.jboss.ws.core.MessageAbstraction;
import org.jboss.ws.core.soap.SOAPMessageMarshaller;
import org.jboss.ws.core.soap.SOAPMessageUnMarshaller;
@@ -66,9 +64,14 @@
{
return new SOAPMessageMarshaller();
}
-
+
public MessageAbstraction invoke(MessageAbstraction reqMessage, Object endpoint, boolean oneway) throws IOException
{
+ return this.invoke(reqMessage, endpoint, oneway, true);
+ }
+
+ public MessageAbstraction invoke(MessageAbstraction reqMessage, Object endpoint, boolean oneway, boolean maintainSession) throws IOException
+ {
if (endpoint == null)
throw new IllegalArgumentException("Given endpoint cannot be null");
Copied: stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/client/UnMarshaller.java (from rev 10312, stack/native/branches/netty/modules/core/src/main/java/org/jboss/ws/core/client/UnMarshaller.java)
===================================================================
--- stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/client/UnMarshaller.java (rev 0)
+++ stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/client/UnMarshaller.java 2009-07-04 14:44:05 UTC (rev 10315)
@@ -0,0 +1,48 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2006, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.ws.core.client;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Map;
+
+/**
+ * Takes a marshalled byte array and converts to a Java data object.
+ *
+ * @author alessio.soldano at jboss.com
+ * @since 24-Jun-2009
+ *
+ */
+public interface UnMarshaller
+{
+ /**
+ * Will read from the inputstream and convert contents to java Object.
+ *
+ * @param inputStream stream to read data from to do conversion.
+ * @param metadata can be any transport specific metadata (such as headers from http transport).
+ * This can be null, depending on if transport supports metadata.
+ *
+ * @return
+ * @throws IOException all specific i/o exceptions need to be thrown as this.
+ */
+ Object read(InputStream inputStream, Map<String, Object> metadata) throws IOException;
+}
Copied: stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/client/WSClientPipelineFactory.java (from rev 10312, stack/native/branches/netty/modules/core/src/main/java/org/jboss/ws/core/client/WSClientPipelineFactory.java)
===================================================================
--- stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/client/WSClientPipelineFactory.java (rev 0)
+++ stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/client/WSClientPipelineFactory.java 2009-07-04 14:44:05 UTC (rev 10315)
@@ -0,0 +1,86 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2006, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.ws.core.client;
+
+import static org.jboss.netty.channel.Channels.pipeline;
+
+import org.jboss.netty.channel.ChannelHandler;
+import org.jboss.netty.channel.ChannelPipeline;
+import org.jboss.netty.channel.ChannelPipelineFactory;
+import org.jboss.netty.handler.codec.http.HttpChunkAggregator;
+import org.jboss.netty.handler.codec.http.HttpRequestEncoder;
+import org.jboss.netty.handler.codec.http.HttpResponseDecoder;
+
+/**
+ *
+ * @author alessio.soldano at jboss.com
+ * @since 24-Jun-2009
+ *
+ */
+public class WSClientPipelineFactory implements ChannelPipelineFactory
+{
+ private static final int MAX_CONTENT_SIZE = 1073741824;
+ private ChannelHandler responseHandler;
+ private ChannelHandler sslHandler;
+
+ public ChannelPipeline getPipeline() throws Exception
+ {
+ // Create a default pipeline implementation.
+ ChannelPipeline pipeline = pipeline();
+
+ if (sslHandler != null)
+ {
+ pipeline.addLast("ssl", sslHandler);
+ }
+ pipeline.addLast("decoder", new HttpResponseDecoder());
+ // Uncomment the following line if you don't want to handle HttpChunks.
+ pipeline.addLast("aggregator", new HttpChunkAggregator(MAX_CONTENT_SIZE));
+ pipeline.addLast("encoder", new HttpRequestEncoder());
+ if (responseHandler != null)
+ {
+ pipeline.addLast("handler", responseHandler);
+ }
+ return pipeline;
+ }
+
+ public ChannelHandler getResponseHandler()
+ {
+ return responseHandler;
+ }
+
+ public void setResponseHandler(ChannelHandler responseHandler)
+ {
+ this.responseHandler = responseHandler;
+ }
+
+ public ChannelHandler getSslHandler()
+ {
+ return sslHandler;
+ }
+
+ public void setSslHandler(ChannelHandler sslHandler)
+ {
+ this.sslHandler = sslHandler;
+ }
+
+
+}
Copied: stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/client/WSResponseHandler.java (from rev 10312, stack/native/branches/netty/modules/core/src/main/java/org/jboss/ws/core/client/WSResponseHandler.java)
===================================================================
--- stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/client/WSResponseHandler.java (rev 0)
+++ stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/client/WSResponseHandler.java 2009-07-04 14:44:05 UTC (rev 10315)
@@ -0,0 +1,106 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2006, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.ws.core.client;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.jboss.netty.buffer.ChannelBufferInputStream;
+import org.jboss.netty.channel.ChannelHandlerContext;
+import org.jboss.netty.channel.ChannelPipelineCoverage;
+import org.jboss.netty.channel.MessageEvent;
+import org.jboss.netty.channel.SimpleChannelUpstreamHandler;
+import org.jboss.netty.handler.codec.http.HttpResponse;
+
+/**
+ * A Netty channel upstream handler that receives MessageEvent
+ * and extract the JBossWS message using the provided unmarshaller.
+ *
+ * @author alessio.soldano at jboss.com
+ * @since 24-Jun-2009
+ *
+ */
+ at ChannelPipelineCoverage("one")
+public class WSResponseHandler extends SimpleChannelUpstreamHandler
+{
+ private UnMarshaller unmarshaller;
+ private Object responseMessage;
+ private Map<String, Object> responseHeaders;
+ private Throwable error;
+
+ public WSResponseHandler(UnMarshaller unmarshaller)
+ {
+ super();
+ this.unmarshaller = unmarshaller;
+ }
+
+ @Override
+ public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception
+ {
+ try
+ {
+ reset();
+ HttpResponse response = (HttpResponse)e.getMessage();
+
+ responseHeaders.put(NettyClient.RESPONSE_CODE, response.getStatus().getCode());
+ responseHeaders.put(NettyClient.RESPONSE_CODE_MESSAGE, response.getStatus().getReasonPhrase());
+ for (String headerName : response.getHeaderNames())
+ {
+ responseHeaders.put(headerName, response.getHeaders(headerName));
+ }
+
+ ChannelBuffer content = response.getContent();
+ this.responseMessage = unmarshaller.read(content.readable() ? new ChannelBufferInputStream(content) : null, responseHeaders);
+ }
+ catch (Throwable t)
+ {
+ this.error = t;
+ }
+ finally
+ {
+ e.getChannel().close();
+ }
+ }
+
+ private void reset()
+ {
+ this.error = null;
+ this.responseMessage = null;
+ this.responseHeaders = new HashMap<String, Object>();
+ }
+
+ public Object getResponseMessage()
+ {
+ return this.responseMessage;
+ }
+
+ public Map<String, Object> getResponseHeaders()
+ {
+ return responseHeaders;
+ }
+
+ public Throwable getError()
+ {
+ return error;
+ }
+}
\ No newline at end of file
Copied: stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/client/WSServerPipelineFactory.java (from rev 10312, stack/native/branches/netty/modules/core/src/main/java/org/jboss/ws/core/client/WSServerPipelineFactory.java)
===================================================================
--- stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/client/WSServerPipelineFactory.java (rev 0)
+++ stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/client/WSServerPipelineFactory.java 2009-07-04 14:44:05 UTC (rev 10315)
@@ -0,0 +1,82 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2006, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.ws.core.client;
+
+import static org.jboss.netty.channel.Channels.pipeline;
+
+import org.jboss.netty.channel.ChannelHandler;
+import org.jboss.netty.channel.ChannelPipeline;
+import org.jboss.netty.channel.ChannelPipelineFactory;
+import org.jboss.netty.handler.codec.http.HttpChunkAggregator;
+import org.jboss.netty.handler.codec.http.HttpRequestDecoder;
+import org.jboss.netty.handler.codec.http.HttpResponseEncoder;
+
+/**
+ *
+ * @author alessio.soldano at jboss.com
+ * @since 01-Jul-2009
+ *
+ */
+public class WSServerPipelineFactory implements ChannelPipelineFactory
+{
+ private static final int MAX_CONTENT_SIZE = 1073741824;
+ private ChannelHandler requestHandler;
+ private ChannelHandler sshHandler;
+
+ public ChannelPipeline getPipeline() throws Exception
+ {
+ // Create a default pipeline implementation.
+ ChannelPipeline pipeline = pipeline();
+ // Uncomment the following line if you want HTTPS
+ //SSLEngine engine = SecureChatSslContextFactory.getServerContext().createSSLEngine();
+ //engine.setUseClientMode(false);
+ //pipeline.addLast("ssl", new SslHandler(engine));
+
+ pipeline.addLast("decoder", new HttpRequestDecoder());
+ // Uncomment the following line if you don't want to handle HttpChunks.
+ pipeline.addLast("aggregator", new HttpChunkAggregator(MAX_CONTENT_SIZE));
+ pipeline.addLast("encoder", new HttpResponseEncoder());
+ pipeline.addLast("handler", requestHandler);
+ return pipeline;
+ }
+
+ public ChannelHandler getRequestHandler()
+ {
+ return requestHandler;
+ }
+
+ public void setRequestHandler(ChannelHandler requestHandler)
+ {
+ this.requestHandler = requestHandler;
+ }
+
+ public ChannelHandler getSshHandler()
+ {
+ return sshHandler;
+ }
+
+ public void setSshHandler(ChannelHandler sshHandler)
+ {
+ this.sshHandler = sshHandler;
+ }
+
+}
Copied: stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/client/ssl (from rev 10312, stack/native/branches/netty/modules/core/src/main/java/org/jboss/ws/core/client/ssl)
Deleted: stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/client/ssl/JBossWSKeyManager.java
===================================================================
--- stack/native/branches/netty/modules/core/src/main/java/org/jboss/ws/core/client/ssl/JBossWSKeyManager.java 2009-07-04 08:05:00 UTC (rev 10312)
+++ stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/client/ssl/JBossWSKeyManager.java 2009-07-04 14:44:05 UTC (rev 10315)
@@ -1,78 +0,0 @@
-/*
-* JBoss, Home of Professional Open Source
-* Copyright 2005, JBoss Inc., and individual contributors as indicated
-* by the @authors tag. See the copyright.txt in the distribution for a
-* full listing of individual contributors.
-*
-* This is free software; you can redistribute it and/or modify it
-* under the terms of the GNU Lesser General Public License as
-* published by the Free Software Foundation; either version 2.1 of
-* the License, or (at your option) any later version.
-*
-* This software 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
-* Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public
-* License along with this software; if not, write to the Free
-* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
-*/
-package org.jboss.ws.core.client.ssl;
-
-import java.net.Socket;
-import java.security.Principal;
-import java.security.PrivateKey;
-import java.security.cert.X509Certificate;
-
-import javax.net.ssl.X509KeyManager;
-
-/**
- *
- * @author alessio.soldano at jboss.com
- * @since 03-July-2009
- *
- */
-public class JBossWSKeyManager implements X509KeyManager
-{
- private X509KeyManager targetManager = null;
- private String alias = null;
-
- public JBossWSKeyManager(X509KeyManager x509KeyManager, String alias)
- {
- this.targetManager = x509KeyManager;
- this.alias = alias;
- }
-
- public PrivateKey getPrivateKey(String string)
- {
- return targetManager.getPrivateKey(string);
- }
-
- public X509Certificate[] getCertificateChain(String string)
- {
- return targetManager.getCertificateChain(string);
- }
-
- public String[] getClientAliases(String string, Principal[] principals)
- {
- return targetManager.getClientAliases(string, principals);
- }
-
- public String[] getServerAliases(String string, Principal[] principals)
- {
- return targetManager.getServerAliases(string, principals);
- }
-
- public String chooseServerAlias(String string, Principal[] principals, Socket socket)
- {
- return targetManager.chooseServerAlias(string, principals, socket);
- }
-
- public String chooseClientAlias(String[] strings, Principal[] principals, Socket socket)
- {
- // just returning supplied alias instead of searching
- return alias;
- }
-}
Copied: stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/client/ssl/JBossWSKeyManager.java (from rev 10312, stack/native/branches/netty/modules/core/src/main/java/org/jboss/ws/core/client/ssl/JBossWSKeyManager.java)
===================================================================
--- stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/client/ssl/JBossWSKeyManager.java (rev 0)
+++ stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/client/ssl/JBossWSKeyManager.java 2009-07-04 14:44:05 UTC (rev 10315)
@@ -0,0 +1,78 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2005, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software 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
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.ws.core.client.ssl;
+
+import java.net.Socket;
+import java.security.Principal;
+import java.security.PrivateKey;
+import java.security.cert.X509Certificate;
+
+import javax.net.ssl.X509KeyManager;
+
+/**
+ *
+ * @author alessio.soldano at jboss.com
+ * @since 03-July-2009
+ *
+ */
+public class JBossWSKeyManager implements X509KeyManager
+{
+ private X509KeyManager targetManager = null;
+ private String alias = null;
+
+ public JBossWSKeyManager(X509KeyManager x509KeyManager, String alias)
+ {
+ this.targetManager = x509KeyManager;
+ this.alias = alias;
+ }
+
+ public PrivateKey getPrivateKey(String string)
+ {
+ return targetManager.getPrivateKey(string);
+ }
+
+ public X509Certificate[] getCertificateChain(String string)
+ {
+ return targetManager.getCertificateChain(string);
+ }
+
+ public String[] getClientAliases(String string, Principal[] principals)
+ {
+ return targetManager.getClientAliases(string, principals);
+ }
+
+ public String[] getServerAliases(String string, Principal[] principals)
+ {
+ return targetManager.getServerAliases(string, principals);
+ }
+
+ public String chooseServerAlias(String string, Principal[] principals, Socket socket)
+ {
+ return targetManager.chooseServerAlias(string, principals, socket);
+ }
+
+ public String chooseClientAlias(String[] strings, Principal[] principals, Socket socket)
+ {
+ // just returning supplied alias instead of searching
+ return alias;
+ }
+}
Deleted: stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/client/ssl/SSLContextFactory.java
===================================================================
--- stack/native/branches/netty/modules/core/src/main/java/org/jboss/ws/core/client/ssl/SSLContextFactory.java 2009-07-04 08:05:00 UTC (rev 10312)
+++ stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/client/ssl/SSLContextFactory.java 2009-07-04 14:44:05 UTC (rev 10315)
@@ -1,1303 +0,0 @@
-/*
-* JBoss, Home of Professional Open Source
-* Copyright 2005, JBoss Inc., and individual contributors as indicated
-* by the @authors tag. See the copyright.txt in the distribution for a
-* full listing of individual contributors.
-*
-* This is free software; you can redistribute it and/or modify it
-* under the terms of the GNU Lesser General Public License as
-* published by the Free Software Foundation; either version 2.1 of
-* the License, or (at your option) any later version.
-*
-* This software 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
-* Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public
-* License along with this software; if not, write to the Free
-* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
-*/
-package org.jboss.ws.core.client.ssl;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.security.KeyStore;
-import java.security.KeyStoreException;
-import java.security.NoSuchAlgorithmException;
-import java.security.NoSuchProviderException;
-import java.security.Provider;
-import java.security.SecureRandom;
-import java.security.UnrecoverableKeyException;
-import java.security.cert.CertificateException;
-import java.security.cert.X509Certificate;
-import java.util.Map;
-
-import javax.net.ssl.KeyManager;
-import javax.net.ssl.KeyManagerFactory;
-import javax.net.ssl.SSLContext;
-import javax.net.ssl.TrustManager;
-import javax.net.ssl.TrustManagerFactory;
-import javax.net.ssl.X509KeyManager;
-import javax.net.ssl.X509TrustManager;
-
-import org.jboss.logging.Logger;
-import org.jboss.ws.core.StubExt;
-
-/**
- * This builds SSLContext instances. It's a modified version of org.jboss.remoting.security.SSLSocketBuilder
- *
- * @author <a href="mailto:mazz at jboss.com">John Mazzitelli</a>
- * @author <a href="mailto:telrod at jboss.com">Tom Elrod</a>
- * @author <a href="mailto:alessio.soldano at jboss.com">Alessio Soldano</a>
- *
- */
-public class SSLContextFactory
-{
- /**
- * If the protocol isn't specified, this will be the default.
- * Value is "TLS".
- */
- public static final String DEFAULT_SSL_PROTOCOL = "TLS";
-
- /**
- * Constant defining the config property used to define if the sockets will be in
- * client or server mode.
- */
- public static final String SSL_USE_CLIENT_MODE = "org.jboss.ws.sslUseClientMode";
-
- /**
- * Constant defining the config property used to define if the server sockets will be in
- * client or server mode.
- */
- public static final String SERVER_SSL_USE_CLIENT_MODE = "org.jboss.ws.serverSslUseClientMode";
-
- /**
- * Constant defining the config property used to define if a client should attempt to
- * authenticate a server certificate as one it trusts. The value of such a property is
- * a boolean.
- */
- public static final String SSL_SERVER_AUTH_MODE = "org.jboss.ws.sslServerAuthMode";
-
- /**
- * Constant defining the config property that indicates the key password for the keys in the key store.
- */
- public static final String KEY_PASSWORD = "org.jboss.ws.keyPassword";
-
- /**
- * Constant that defines the standard system property that the javax.net.ssl
- * classes look for when locating the keystore file.
- */
- public static final String STANDARD_KEY_STORE_FILE_PATH = "javax.net.ssl.keyStore";
-
- /**
- * Constant that defines the standard system property that the javax.net.ssl
- * classes look for when needing to know what type the keystore file is.
- */
- public static final String STANDARD_KEY_STORE_TYPE = "javax.net.ssl.keyStoreType";
-
- /**
- * Constant that defines the standard system property that the javax.net.ssl
- * classes look for when needing the keystore password.
- */
- public static final String STANDARD_KEY_STORE_PASSWORD = "javax.net.ssl.keyStorePassword";
-
- /**
- * Default key/trust store type if one not set as bean property, via config, or via system property.
- * Value is 'JKS'.
- */
- public static final String DEFAULT_KEY_STORE_TYPE = "JKS";
-
- /**
- * Default key/trust store algorithm if one net set as bean property or via config.
- * Value is 'SunX509'.
- */
- public static final String DEFAULT_KEY_STORE_ALGORITHM = "SunX509";
-
- /**
- * Constant that defines the standard system property that the javax.net.ssl
- * classes look for when locating the truststore file.
- */
- public static final String STANDARD_TRUST_STORE_FILE_PATH = "javax.net.ssl.trustStore";
-
- /**
- * Constant that defines the standard system property that the javax.net.ssl
- * classes look for when needing to know what type the truststore file is.
- */
- public static final String STANDARD_TRUST_STORE_TYPE = "javax.net.ssl.trustStoreType";
-
- /**
- * Constant that defines the standard system property that the javax.net.ssl
- * classes look for when needing the truststore password.
- */
- public static final String STANDARD_TRUST_STORE_PASSWORD = "javax.net.ssl.trustStorePassword";
-
- private SSLContext sslContextServerSocketFactory = null; // context that builds the server socket factories
- private SSLContext sslContextSocketFactory = null; // context that builds the socket factories
- private Provider provider = null;
- private String providerName = null;
- private String secureSocketProtocol = null;
-
- private KeyManager[] keyManagers = null;
- private TrustManager[] trustManagers = null;
- private SecureRandom secureRandom = null;
-
- private URL keyStoreFilePath = null;
- private String keyStoreType = null;
- private String keyStoreAlgorithm = null;
- private String keyStorePassword = null;
- private String keyAlias = null;
- private String keyPassword = null;
-
- private URL trustStoreFilePath = null;
- private String trustStoreType = null;
- private String trustStoreAlgorithm = null;
- private String trustStorePassword = null;
-
- private Map<String, Object> config = null;
- private Boolean socketUseClientMode = null;
- private Boolean serverSocketUseClientMode = null;
- private Boolean serverAuthMode = null;
-
- private static final Logger log = Logger.getLogger(SSLContextFactory.class);
-
- /**
- * Constructor for {@link SSLContextFactory} that does not have
- * any configuration so it falls back to all defaults.
- */
- public SSLContextFactory()
- {
- this(null);
- }
-
- /**
- * Constructor for {@link SSLContextFactory} that allows the caller to
- * override the default settings for the various SSL configuration
- * properties.
- *
- * @param config configuration with properties defining things like where the
- * keystore and truststore files are, their types, etc.
- */
- public SSLContextFactory(Map<String, Object> config)
- {
- this.config = config;
- }
-
- public SSLContext getSSLContext() throws IOException
- {
- if (sslContextSocketFactory == null)
- {
- initializeSocketFactorySSLContext();
- }
- return sslContextSocketFactory;
- }
-
- public SSLContext getServerSSLContext() throws IOException
- {
- if (sslContextServerSocketFactory == null)
- {
- initializeServerSocketFactorySSLContext();
- }
- return sslContextServerSocketFactory;
- }
-
- /**
- * @see org.jboss.remoting.security.SSLSocketBuilderMBean#getSecureSocketProtocol()
- */
- public String getSecureSocketProtocol()
- {
- if (secureSocketProtocol == null)
- {
- if(config != null)
- {
- secureSocketProtocol = (String) config.get(StubExt.PROPERTY_SSL_PROTOCOL);
- }
- if (secureSocketProtocol == null)
- {
- secureSocketProtocol = DEFAULT_SSL_PROTOCOL;
- }
- }
-
- return secureSocketProtocol;
- }
-
- /**
- * @see org.jboss.remoting.security.SSLSocketBuilderMBean#setSecureSocketProtocol(String)
- */
- public void setSecureSocketProtocol(String protocol)
- {
- if(protocol != null && protocol.length() > 0)
- {
- this.secureSocketProtocol = protocol;
- }
- else
- {
- throw new IllegalArgumentException("Can not set remoting socket factory with null protocol");
- }
- }
-
- /**
- * @see org.jboss.remoting.security.SSLSocketBuilderMBean#getProvider()
- */
- public Provider getProvider()
- {
- return provider;
- }
-
- /**
- * @see org.jboss.remoting.security.SSLSocketBuilderMBean#setProvider(java.security.Provider)
- */
- public void setProvider(Provider provider)
- {
- this.provider = provider;
- }
-
- /**
- * @see org.jboss.remoting.security.SSLSocketBuilderMBean#getProviderName()
- */
- public String getProviderName()
- {
- if (providerName == null)
- {
- if(config != null)
- {
- providerName = (String) config.get(StubExt.PROPERTY_SSL_PROVIDER_NAME);
- }
- }
- return providerName;
- }
-
- /**
- * @see org.jboss.remoting.security.SSLSocketBuilderMBean#setProviderName(java.lang.String)
- */
- public void setProviderName(String providerName)
- {
- this.providerName = providerName;
- }
-
- /**
- * @see org.jboss.remoting.security.SSLSocketBuilderMBean#getSecureRandom()
- */
- public SecureRandom getSecureRandom()
- {
- if(secureRandom != null)
- {
- return secureRandom;
- }
-
- secureRandom = new SecureRandom();
-
- return secureRandom;
- }
-
- /**
- * @see org.jboss.remoting.security.SSLSocketBuilderMBean#setSecureRandom(java.security.SecureRandom)
- */
- public void setSecureRandom(SecureRandom secureRandom)
- {
- this.secureRandom = secureRandom;
- }
-
- /**
- * @see org.jboss.remoting.security.SSLSocketBuilderMBean#getKeyStoreURL()
- */
- public String getKeyStoreURL()
- {
- URL keyStore = getKeyStore();
- if(keyStore != null)
- {
- return keyStore.toString();
- }
- else
- {
- return null;
- }
- }
-
- /**
- * @see org.jboss.remoting.security.SSLSocketBuilderMBean#getKeyStore()
- */
- public URL getKeyStore()
- {
- if(keyStoreFilePath != null)
- {
- return keyStoreFilePath;
- }
-
- if(config != null)
- {
- String path = (String) config.get(StubExt.PROPERTY_KEY_STORE);
- if(path != null && path.length() > 0)
- {
- setKeyStoreURL( path );
- }
- }
-
- if(keyStoreFilePath == null)
- {
- String path = System.getProperty(STANDARD_KEY_STORE_FILE_PATH);
- if(path != null && path.length() > 0)
- {
- setKeyStoreURL( path );
- }
- }
-
- return keyStoreFilePath;
- }
-
- /**
- * @see org.jboss.remoting.security.SSLSocketBuilderMBean#setKeyStoreURL(java.lang.String)
- */
- public void setKeyStoreURL(String keyStoreFilePath)
- {
- try
- {
- this.keyStoreFilePath = validateStoreURL(keyStoreFilePath);
- }
- catch (IOException e)
- {
- throw new RuntimeException( "Cannot validate the store URL: " + keyStoreFilePath , e );
- }
- }
-
- /**
- * @see org.jboss.remoting.security.SSLSocketBuilderMBean#setKeyStore(java.net.URL)
- */
- public void setKeyStore(URL keyStore)
- {
- this.keyStoreFilePath = keyStore;
- }
-
- /**
- * @see org.jboss.remoting.security.SSLSocketBuilderMBean#getKeyStoreType()
- */
- public String getKeyStoreType()
- {
- if(keyStoreType != null)
- {
- return keyStoreType;
- }
-
- if(config != null)
- {
- String type = (String)config.get(StubExt.PROPERTY_KEY_STORE_TYPE);
- if(type != null && type.length() > 0)
- {
- keyStoreType = type;
- }
- }
-
- if(keyStoreType == null)
- {
- keyStoreType = System.getProperty(STANDARD_KEY_STORE_TYPE);
-
- if(keyStoreType == null)
- {
- keyStoreType = DEFAULT_KEY_STORE_TYPE;
- }
- }
-
- return keyStoreType;
- }
-
- /**
- * @see org.jboss.remoting.security.SSLSocketBuilderMBean#setKeyStoreType(java.lang.String)
- */
- public void setKeyStoreType(String keyStoreType)
- {
- this.keyStoreType = keyStoreType;
- }
-
- /**
- * @see org.jboss.remoting.security.SSLSocketBuilderMBean#getKeyStoreAlgorithm()
- */
- public String getKeyStoreAlgorithm()
- {
- if(keyStoreAlgorithm != null)
- {
- return keyStoreAlgorithm;
- }
-
- if(config != null)
- {
- String alg = (String)config.get(StubExt.PROPERTY_KEY_STORE_ALGORITHM);
- if(alg != null && alg.length() > 0)
- {
- keyStoreAlgorithm = alg;
- }
- }
-
- if(keyStoreAlgorithm == null)
- {
- keyStoreAlgorithm = DEFAULT_KEY_STORE_ALGORITHM;
- }
-
- return keyStoreAlgorithm;
- }
-
- /**
- * @see org.jboss.remoting.security.SSLSocketBuilderMBean#setKeyStoreAlgorithm(java.lang.String)
- */
- public void setKeyStoreAlgorithm(String algorithm)
- {
- this.keyStoreAlgorithm = algorithm;
- }
-
- /**
- * Returns the password used to gain access to the keystore.
- *
- * @return keystore password
- */
- public String getKeyStorePassword()
- {
- if(keyStorePassword != null)
- {
- return keyStorePassword;
- }
-
- if(config != null)
- {
- String passwd = (String)config.get(StubExt.PROPERTY_KEY_STORE_PASSWORD);
- if(passwd != null && passwd.length() > 0)
- {
- keyStorePassword = passwd;
- }
- }
-
- if(keyStorePassword == null)
- {
- keyStorePassword = System.getProperty(STANDARD_KEY_STORE_PASSWORD);
- }
-
- return keyStorePassword;
- }
-
- /**
- * @see org.jboss.remoting.security.SSLSocketBuilderMBean#setKeyStorePassword(java.lang.String)
- */
- public void setKeyStorePassword(String keyStorePassword)
- {
- this.keyStorePassword = keyStorePassword;
- }
-
- /**
- * @see org.jboss.remoting.security.SSLSocketBuilderMBean#getTrustStoreURL()
- */
- public String getTrustStoreURL()
- {
- URL trustStore = getTrustStore();
- if(trustStore != null)
- {
- return trustStore.toString();
- }
- else
- {
- return null;
- }
- }
-
- /**
- * @see org.jboss.remoting.security.SSLSocketBuilderMBean#getTrustStore()
- */
- public URL getTrustStore()
- {
- if(trustStoreFilePath != null)
- {
- return trustStoreFilePath;
- }
-
- if(config != null)
- {
- String path = (String)config.get(StubExt.PROPERTY_TRUST_STORE);
- if(path != null && path.length() > 0)
- {
- setTrustStoreURL( path );
- }
- }
-
- if(trustStoreFilePath == null)
- {
- String path = System.getProperty(STANDARD_TRUST_STORE_FILE_PATH);
- if(path != null && path.length() > 0)
- {
- setTrustStoreURL( path );
- }
- }
-
- return trustStoreFilePath;
- }
-
- /**
- * @see org.jboss.remoting.security.SSLSocketBuilderMBean#setTrustStore(java.net.URL)
- */
- public void setTrustStore(URL trustStore)
- {
- this.trustStoreFilePath = trustStore;
- }
-
- /**
- * @see org.jboss.remoting.security.SSLSocketBuilderMBean#setTrustStoreURL(java.lang.String)
- */
- public void setTrustStoreURL(String trustStoreFilePath)
- {
- try
- {
- this.trustStoreFilePath = validateStoreURL(trustStoreFilePath);
- }
- catch (IOException e)
- {
- throw new RuntimeException( "Cannot validate the store URL: " + trustStoreFilePath , e );
- }
- }
-
- /**
- * @see org.jboss.remoting.security.SSLSocketBuilderMBean#getTrustStoreType()
- */
- public String getTrustStoreType()
- {
- if(trustStoreType != null)
- {
- return trustStoreType;
- }
-
- if(config != null)
- {
- String type = (String)config.get(StubExt.PROPERTY_TRUST_STORE_TYPE);
- if(type != null && type.length() > 0)
- {
- trustStoreType = type;
- }
- }
-
- if(trustStoreType == null)
- {
- trustStoreType = System.getProperty(STANDARD_TRUST_STORE_TYPE);
-
- if(trustStoreType == null)
- {
- trustStoreType = getKeyStoreType();
- }
- }
-
- return trustStoreType;
- }
-
- /**
- * @see org.jboss.remoting.security.SSLSocketBuilderMBean#setTrustStoreType(java.lang.String)
- */
- public void setTrustStoreType(String trustStoreType)
- {
- this.trustStoreType = trustStoreType;
- }
-
- /**
- * @see org.jboss.remoting.security.SSLSocketBuilderMBean#getTrustStoreAlgorithm()
- */
- public String getTrustStoreAlgorithm()
- {
- if(trustStoreAlgorithm != null)
- {
- return trustStoreAlgorithm;
- }
-
- if(config != null)
- {
- String alg = (String)config.get(StubExt.PROPERTY_TRUST_STORE_ALGORITHM);
- if(alg != null && alg.length() > 0)
- {
- trustStoreAlgorithm = alg;
- }
- }
-
- if(trustStoreAlgorithm == null)
- {
- trustStoreAlgorithm = getKeyStoreAlgorithm();
- }
-
- return trustStoreAlgorithm;
- }
-
- /**
- * @see org.jboss.remoting.security.SSLSocketBuilderMBean#setTrustStoreAlgorithm(java.lang.String)
- */
- public void setTrustStoreAlgorithm(String algorithm)
- {
- this.trustStoreAlgorithm = algorithm;
- }
-
- /**
- * Returns the password used to gain access to the truststore.
- *
- * @return truststore password
- */
- public String getTrustStorePassword()
- {
- if(trustStorePassword != null)
- {
- return trustStorePassword;
- }
-
- if(config != null)
- {
- String passwd = (String)config.get(StubExt.PROPERTY_TRUST_STORE_PASSWORD);
- if(passwd != null && passwd.length() > 0)
- {
- trustStorePassword = passwd;
- }
- }
-
- if(trustStorePassword == null)
- {
- trustStorePassword = System.getProperty(STANDARD_TRUST_STORE_PASSWORD);
- if(trustStorePassword == null)
- {
- trustStorePassword = getKeyStorePassword();
- }
- }
-
- return trustStorePassword;
- }
-
- /**
- * @see org.jboss.remoting.security.SSLSocketBuilderMBean#setTrustStorePassword(java.lang.String)
- */
- public void setTrustStorePassword(String trustStorePassword)
- {
- this.trustStorePassword = trustStorePassword;
- }
-
- /**
- * @see org.jboss.remoting.security.SSLSocketBuilderMBean#getKeyAlias()
- */
- public String getKeyAlias()
- {
- if(keyAlias != null)
- {
- return keyAlias;
- }
- if(config != null)
- {
- keyAlias = (String)config.get(StubExt.PROPERTY_KEY_ALIAS);
- }
- return keyAlias;
- }
-
- /**
- * @see org.jboss.remoting.security.SSLSocketBuilderMBean#setKeyAlias(java.lang.String)
- */
- public void setKeyAlias(String alias)
- {
- this.keyAlias = alias;
- }
-
- /**
- * Returns the password to use for the keys within the key store.
- * If this value is not set, this will return <code>null</code> but
- * when this value is needed by this class, the value for the key store
- * password will be used instead.
- *
- * @return key password
- */
- public String getKeyPassword()
- {
- if(keyPassword != null)
- {
- return keyPassword;
- }
-
- if(config != null)
- {
- String passwd = (String)config.get(KEY_PASSWORD);
- if(passwd != null && passwd.length() > 0)
- {
- keyPassword = passwd;
- }
- }
-
- return keyPassword;
- }
-
- /**
- * @see org.jboss.remoting.security.SSLSocketBuilderMBean#setKeyPassword(java.lang.String)
- */
- public void setKeyPassword(String keyPassword)
- {
- this.keyPassword = keyPassword;
- }
-
- /**
- * @see org.jboss.remoting.security.SSLSocketBuilderMBean#isSocketUseClientMode()
- */
- public boolean isSocketUseClientMode( )
- {
- if (socketUseClientMode == null)
- {
- if (config != null && config.containsKey(SSL_USE_CLIENT_MODE))
- {
- socketUseClientMode = Boolean.valueOf((String) config.get(SSL_USE_CLIENT_MODE));
- }
- else
- {
- socketUseClientMode = Boolean.TRUE;
- }
- }
-
- return socketUseClientMode.booleanValue();
- }
-
- /**
- * @see org.jboss.remoting.security.SSLSocketBuilderMBean#isServerSocketUseClientMode()
- */
- public boolean isServerSocketUseClientMode( )
- {
- if (serverSocketUseClientMode == null)
- {
- if (config != null && config.containsKey(SERVER_SSL_USE_CLIENT_MODE))
- {
- serverSocketUseClientMode = Boolean.valueOf((String) config.get(SERVER_SSL_USE_CLIENT_MODE));
- }
- else
- {
- serverSocketUseClientMode = Boolean.FALSE;
- }
- }
-
- return serverSocketUseClientMode.booleanValue();
- }
-
- /**
- * @see org.jboss.remoting.security.SSLSocketBuilderMBean#setSocketUseClientMode(boolean)
- */
- public void setSocketUseClientMode( boolean useClientMode )
- {
- this.socketUseClientMode = Boolean.valueOf(useClientMode);
- }
-
- /**
- * @see org.jboss.remoting.security.SSLSocketBuilderMBean#setServerSocketUseClientMode(boolean)
- */
- public void setServerSocketUseClientMode( boolean useClientMode )
- {
- this.serverSocketUseClientMode = Boolean.valueOf(useClientMode);
- }
-
- /**
- * @see org.jboss.remoting.security.SSLSocketBuilderMBean#isServerAuthMode()
- */
- public boolean isServerAuthMode()
- {
- if (serverAuthMode == null)
- {
- if (config != null && config.containsKey(SSL_SERVER_AUTH_MODE))
- {
- serverAuthMode = Boolean.valueOf( (String) config.get(SSL_SERVER_AUTH_MODE) );
- }
- else
- {
- serverAuthMode = Boolean.TRUE;
- }
- }
-
- return serverAuthMode.booleanValue();
- }
-
- /**
- * @see org.jboss.remoting.security.SSLSocketBuilderMBean#setServerAuthMode(boolean)
- */
- public void setServerAuthMode(boolean mode)
- {
- serverAuthMode = Boolean.valueOf(mode);
- }
-
- /**
- * Creates (but does not initialize) the SSL context used by this object
- * to create server socket factories.
- * The provider/protocol is used to determine what SSL context to use.
- * Call {@link #initializeServerSocketFactorySSLContext()} if you want
- * to create and initialize in one method call.
- * If the server socket factory SSL context was already created, this will create
- * a new one and remove the old one.
- *
- * @throws IOException
- */
- protected void createServerSocketFactorySSLContext()
- throws IOException
- {
- try
- {
- if(getProvider() != null)
- {
- sslContextServerSocketFactory = SSLContext.getInstance(getSecureSocketProtocol(), getProvider());
- }
- else if(getProviderName() != null)
- {
- sslContextServerSocketFactory = SSLContext.getInstance(getSecureSocketProtocol(), getProviderName());
- }
- else
- {
- sslContextServerSocketFactory = SSLContext.getInstance(getSecureSocketProtocol());
- }
- }
- catch(Exception e)
- {
- IOException ioe = new IOException("Error creating server socket factory SSL context: " + e.getMessage());
- ioe.setStackTrace(e.getStackTrace());
- throw ioe;
- }
-
- return;
- }
-
- /**
- * Creates (but does not initialize) the SSL context used by this object
- * to create socket factories.
- * The provider/protocol is used to determine what SSL context to use.
- * Call {@link #initializeSocketFactorySSLContext()} if you want
- * to create and initialize in one method call.
- * If the socket factory SSL context was already created, this will create
- * a new one and remove the old one.
- *
- * @throws IOException
- */
- protected void createSocketFactorySSLContext()
- throws IOException
- {
- try
- {
- if(getProvider() != null)
- {
- sslContextSocketFactory = SSLContext.getInstance(getSecureSocketProtocol(), getProvider());
- }
- else if(getProviderName() != null)
- {
- sslContextSocketFactory = SSLContext.getInstance(getSecureSocketProtocol(), getProviderName());
- }
- else
- {
- sslContextSocketFactory = SSLContext.getInstance(getSecureSocketProtocol());
- }
- }
- catch(Exception e)
- {
- IOException ioe = new IOException("Error creating socket factory SSL context: " + e.getMessage());
- ioe.setStackTrace(e.getStackTrace());
- throw ioe;
- }
-
- return;
- }
-
- /**
- * Initializes the SSL context used by this object that will create the server socket factories.
- * If the SSL context is not yet created, this method will also create it.
- * The provider/protocol is used to determine what SSL context to use. Key and trust managers
- * are loaded and a secure random object is created and the SSL context for the
- * protocol/provider is initialized with them.
- *
- * @throws IOException
- */
- protected void initializeServerSocketFactorySSLContext()
- throws IOException
- {
- try
- {
- if (sslContextServerSocketFactory == null)
- {
- createServerSocketFactorySSLContext();
- }
-
- try
- {
- keyManagers = loadKeyManagers();
- }
- catch (NullStoreURLException e)
- {
- if (isServerSocketUseClientMode())
- {
- keyManagers = null;
- log.debug("Could not find keytore url. " + e.getMessage());
- }
- else
- {
- // because this ssl context will create server socket factories, will throw if can not find keystore
- IOException ioe = new IOException("Can not find keystore url.");
- ioe.initCause(e);
- throw ioe;
- }
- }
-
- try
- {
- boolean isClientMode = isServerSocketUseClientMode();
- trustManagers = loadTrustManagers(isClientMode);
- }
- catch (NullStoreURLException e)
- {
- trustManagers = null;
- log.debug("Could not find truststore url. " + e.getMessage());
- }
-
- secureRandom = getSecureRandom();
-
- sslContextServerSocketFactory.init(keyManagers, trustManagers, secureRandom);
- }
- catch(Exception e)
- {
- IOException ioe = new IOException("Error initializing server socket factory SSL context: " + e.getMessage());
- ioe.setStackTrace(e.getStackTrace());
- throw ioe;
- }
-
- return;
- }
-
- /**
- * Initializes the SSL context used by this object that will create the socket factories.
- * If the SSL context is not yet created, this method will also create it.
- * The provider/protocol is used to determine what SSL context to use. Key and trust managers
- * are loaded and a secure random object is created and the SSL context for the
- * protocol/provider is initialized with them.
- *
- * @throws IOException
- */
- protected void initializeSocketFactorySSLContext()
- throws IOException
- {
- try
- {
- if (sslContextSocketFactory == null)
- {
- createSocketFactorySSLContext();
- }
-
- try
- {
- keyManagers = loadKeyManagers();
- }
- catch (NullStoreURLException e)
- {
- // this is allowable since would be the normal scenario
- keyManagers = null;
- log.debug("Could not find keystore url. " + e.getMessage());
- }
-
- try
- {
- boolean isClientMode = isSocketUseClientMode();
- trustManagers = loadTrustManagers(isClientMode);
- }
- catch (NullStoreURLException e)
- {
- // If the keyManagers is not null, could possibly be using in client mode
- // so want to allow it. Otherwise, need to throw exception as will not be able
- // to use in client mode or not
- if(keyManagers != null)
- {
- trustManagers = null;
- log.debug("Could not find truststore url. " + e.getMessage());
- }
- else
- {
- IOException ioe = new IOException("Can not find truststore url.");
- ioe.initCause(e);
- throw ioe;
- }
- }
-
- secureRandom = getSecureRandom();
-
- sslContextSocketFactory.init(keyManagers, trustManagers, secureRandom);
- }
- catch(Exception e)
- {
- IOException ioe = new IOException("Error initializing socket factory SSL context: " + e.getMessage());
- ioe.setStackTrace(e.getStackTrace());
- throw ioe;
- }
-
- return;
- }
-
- /**
- * Loads the trust managers based on this object's truststore.
- *
- * @return array of trust managers that should be loaded in this object's SSL context
- *
- * @throws NoSuchProviderException
- * @throws NoSuchAlgorithmException
- * @throws IOException
- * @throws CertificateException
- * @throws KeyStoreException
- * @throws NullStoreURLException
- */
- protected TrustManager[] loadTrustManagers(boolean isClientMode)
- throws NoSuchProviderException, NoSuchAlgorithmException, IOException, CertificateException, KeyStoreException, NullStoreURLException
- {
- if(isClientMode && !isServerAuthMode())
- {
- // we are in client mode and do not want to perform server cert authentication
- // return a trust manager that trusts all certs
- trustManagers = new TrustManager[] {
- new X509TrustManager() {
- public void checkClientTrusted( X509Certificate[] chain, String authType ) {}
- public void checkServerTrusted( X509Certificate[] chain, String authType ) {}
- public X509Certificate[] getAcceptedIssuers() { return null; }
- }};
- }
- else
- {
- String tsType = getTrustStoreType();
- String tsPasswd = getTrustStorePassword();
- URL tsPathURL = getTrustStore();
-
- String tsAlg = getTrustStoreAlgorithm();
-
- TrustManagerFactory trustMgrFactory;
- KeyStore trustStore = loadKeyStore(tsType, tsPathURL, tsPasswd);
-
- if (getProvider() != null)
- {
- trustMgrFactory = TrustManagerFactory.getInstance(tsAlg, getProvider());
- }
- else if (getProviderName() != null)
- {
- trustMgrFactory = TrustManagerFactory.getInstance(tsAlg, getProviderName());
- }
- else
- {
- trustMgrFactory = TrustManagerFactory.getInstance(tsAlg);
- }
-
- if (trustStore != null)
- {
- trustMgrFactory.init(trustStore);
-
- trustManagers = trustMgrFactory.getTrustManagers();
- }
- }
-
- return trustManagers;
- }
-
- /**
- * Loads the key managers based on this object's truststore.
- *
- * @return array of key managers that should be loaded in this object's SSL context
- *
- * @throws NoSuchProviderException
- * @throws NoSuchAlgorithmException
- * @throws IOException
- * @throws CertificateException
- * @throws KeyStoreException
- * @throws UnrecoverableKeyException
- * @throws NullStoreURLException
- */
- protected KeyManager[] loadKeyManagers()
- throws NoSuchProviderException, NoSuchAlgorithmException, IOException, CertificateException,
- KeyStoreException, UnrecoverableKeyException, NullStoreURLException
- {
- String ksPasswd = getKeyStorePassword();
- String ksType = getKeyStoreType();
- URL ksPathURL = getKeyStore();
-
- KeyStore keyStore = loadKeyStore(ksType, ksPathURL, ksPasswd);
-
- if(keyStore != null)
- {
- String alias = getKeyAlias();
-
- // check that keystore contains supplied alias (if there is one)
- if(alias != null)
- {
- boolean containsAlias = keyStore.isKeyEntry(alias);
- if(!containsAlias)
- {
- // can not continue as supplied alias does not exist as key entry
- throw new IOException("Can not find key entry for key store (" + ksPathURL + ") with given alias (" + alias + ")");
- }
- }
-
- KeyManagerFactory keyMgrFactory = null;
- String alg = getKeyStoreAlgorithm();
-
- if(getProvider() != null)
- {
- keyMgrFactory = KeyManagerFactory.getInstance(alg, getProvider());
- }
- else if(getProviderName() != null)
- {
- keyMgrFactory = KeyManagerFactory.getInstance(alg, getProviderName());
- }
- else
- {
- keyMgrFactory = KeyManagerFactory.getInstance(alg);
- }
-
- // get they key password, if it isn't defined, use the key store password
- String keyPasswd = getKeyPassword();
- if (keyPasswd == null || keyPasswd.length() == 0)
- {
- keyPasswd = ksPasswd;
- }
-
- keyMgrFactory.init(keyStore, keyPasswd.toCharArray());
- keyManagers = keyMgrFactory.getKeyManagers();
-
- // if alias provided, use helper impl to hard wire alias name to be used
- if(alias != null)
- {
- //TODO: -TME Need careful review of if this is really needed or not.
- for(int x = 0; x < keyManagers.length; x++)
- {
- keyManagers[x] = new JBossWSKeyManager((X509KeyManager)keyManagers[x], alias);
- }
- }
-
- }
- return keyManagers;
- }
-
- /**
- * Loads a key store file and returns it.
- *
- * @param storeType the type of store file
- * @param storePathURL the URL to the file - may be relative to the current thread's classloader
- * or may be absolute path to a file on the file system.
- * @param storePassword password to gain access to the store file
- *
- * @return the key store
- *
- * @throws KeyStoreException
- * @throws NoSuchProviderException
- * @throws IOException
- * @throws NoSuchAlgorithmException
- * @throws CertificateException
- * @throws NullStoreURLException
- */
- protected KeyStore loadKeyStore(String storeType, URL storePathURL, String storePassword)
- throws KeyStoreException, NoSuchProviderException, IOException, NoSuchAlgorithmException, CertificateException, NullStoreURLException
- {
- KeyStore keyStore = null;
-
- if(getProvider() != null)
- {
- keyStore = KeyStore.getInstance(storeType, getProvider());
- }
- else if(getProviderName() != null)
- {
- keyStore = KeyStore.getInstance(storeType, getProviderName());
- }
- else
- {
- keyStore = KeyStore.getInstance(storeType);
- }
-
- if ( storePathURL == null )
- {
- throw new NullStoreURLException("Can not find store file for url because store url is null.");
- }
-
- // now that keystore instance created, need to load data from file
- InputStream keyStoreInputStream = null;
-
- try
- {
- keyStoreInputStream = storePathURL.openStream();
-
- // is ok for password to be null, as will just be used to check integrity of store
- char[] password = storePassword != null ? storePassword.toCharArray() : null;
- keyStore.load(keyStoreInputStream, password);
- }
- finally
- {
- if(keyStoreInputStream != null)
- {
- try
- {
- keyStoreInputStream.close();
- }
- catch(IOException e)
- {
- // no op
- }
- keyStoreInputStream = null;
- }
- }
-
- return keyStore;
- }
-
- /**
- * Given a store file path, this will verify that the store actually exists.
- * First, it checks to see if its a valid URL, then it checks to see if the
- * file path is found in the file system and finally will be checked to see
- * if it can be found as a resource within the current thread's classloader.
- * An exception is thrown if the store cannot be found.
- *
- * @param storePath the path which can be a URL, path to a resource in classloader
- * or a file path on the file system.
- *
- * @return the URL of the file that was found
- *
- * @throws IOException if the store could not be found
- */
- protected URL validateStoreURL(String storePath) throws IOException
- {
- URL url = null;
-
- // First see if this is a URL
- try
- {
- url = new URL(storePath);
- }
- catch(MalformedURLException e)
- {
- // Not a URL or a protocol without a handler so...
- // next try to locate this as file path
- File tst = new File(storePath);
-
- if(tst.exists() == true)
- {
- url = tst.toURL();
- }
- else
- {
- // not a file either, lastly try to locate this as a classpath resource
- if(url == null)
- {
- ClassLoader loader = Thread.currentThread().getContextClassLoader();
- url = loader.getResource(storePath);
- }
- }
- }
-
- // Fail if no valid key store was located
- if(url == null)
- {
- String msg = "Failed to find url=" + storePath + " as a URL, file or resource";
- throw new MalformedURLException(msg);
- }
-
- return url;
- }
-
- /**
- * Used to indicate a store URL was not specified and thus the store is not available.
- */
- protected class NullStoreURLException extends Exception
- {
- private static final long serialVersionUID = 1L;
-
- /**
- * @see Exception#Exception(String)
- */
- public NullStoreURLException(String message)
- {
- super(message);
- }
- }
-}
\ No newline at end of file
Copied: stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/client/ssl/SSLContextFactory.java (from rev 10312, stack/native/branches/netty/modules/core/src/main/java/org/jboss/ws/core/client/ssl/SSLContextFactory.java)
===================================================================
--- stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/client/ssl/SSLContextFactory.java (rev 0)
+++ stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/client/ssl/SSLContextFactory.java 2009-07-04 14:44:05 UTC (rev 10315)
@@ -0,0 +1,1303 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2005, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software 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
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.ws.core.client.ssl;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.security.KeyStore;
+import java.security.KeyStoreException;
+import java.security.NoSuchAlgorithmException;
+import java.security.NoSuchProviderException;
+import java.security.Provider;
+import java.security.SecureRandom;
+import java.security.UnrecoverableKeyException;
+import java.security.cert.CertificateException;
+import java.security.cert.X509Certificate;
+import java.util.Map;
+
+import javax.net.ssl.KeyManager;
+import javax.net.ssl.KeyManagerFactory;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.TrustManager;
+import javax.net.ssl.TrustManagerFactory;
+import javax.net.ssl.X509KeyManager;
+import javax.net.ssl.X509TrustManager;
+
+import org.jboss.logging.Logger;
+import org.jboss.ws.core.StubExt;
+
+/**
+ * This builds SSLContext instances. It's a modified version of org.jboss.remoting.security.SSLSocketBuilder
+ *
+ * @author <a href="mailto:mazz at jboss.com">John Mazzitelli</a>
+ * @author <a href="mailto:telrod at jboss.com">Tom Elrod</a>
+ * @author <a href="mailto:alessio.soldano at jboss.com">Alessio Soldano</a>
+ *
+ */
+public class SSLContextFactory
+{
+ /**
+ * If the protocol isn't specified, this will be the default.
+ * Value is "TLS".
+ */
+ public static final String DEFAULT_SSL_PROTOCOL = "TLS";
+
+ /**
+ * Constant defining the config property used to define if the sockets will be in
+ * client or server mode.
+ */
+ public static final String SSL_USE_CLIENT_MODE = "org.jboss.ws.sslUseClientMode";
+
+ /**
+ * Constant defining the config property used to define if the server sockets will be in
+ * client or server mode.
+ */
+ public static final String SERVER_SSL_USE_CLIENT_MODE = "org.jboss.ws.serverSslUseClientMode";
+
+ /**
+ * Constant defining the config property used to define if a client should attempt to
+ * authenticate a server certificate as one it trusts. The value of such a property is
+ * a boolean.
+ */
+ public static final String SSL_SERVER_AUTH_MODE = "org.jboss.ws.sslServerAuthMode";
+
+ /**
+ * Constant defining the config property that indicates the key password for the keys in the key store.
+ */
+ public static final String KEY_PASSWORD = "org.jboss.ws.keyPassword";
+
+ /**
+ * Constant that defines the standard system property that the javax.net.ssl
+ * classes look for when locating the keystore file.
+ */
+ public static final String STANDARD_KEY_STORE_FILE_PATH = "javax.net.ssl.keyStore";
+
+ /**
+ * Constant that defines the standard system property that the javax.net.ssl
+ * classes look for when needing to know what type the keystore file is.
+ */
+ public static final String STANDARD_KEY_STORE_TYPE = "javax.net.ssl.keyStoreType";
+
+ /**
+ * Constant that defines the standard system property that the javax.net.ssl
+ * classes look for when needing the keystore password.
+ */
+ public static final String STANDARD_KEY_STORE_PASSWORD = "javax.net.ssl.keyStorePassword";
+
+ /**
+ * Default key/trust store type if one not set as bean property, via config, or via system property.
+ * Value is 'JKS'.
+ */
+ public static final String DEFAULT_KEY_STORE_TYPE = "JKS";
+
+ /**
+ * Default key/trust store algorithm if one net set as bean property or via config.
+ * Value is 'SunX509'.
+ */
+ public static final String DEFAULT_KEY_STORE_ALGORITHM = "SunX509";
+
+ /**
+ * Constant that defines the standard system property that the javax.net.ssl
+ * classes look for when locating the truststore file.
+ */
+ public static final String STANDARD_TRUST_STORE_FILE_PATH = "javax.net.ssl.trustStore";
+
+ /**
+ * Constant that defines the standard system property that the javax.net.ssl
+ * classes look for when needing to know what type the truststore file is.
+ */
+ public static final String STANDARD_TRUST_STORE_TYPE = "javax.net.ssl.trustStoreType";
+
+ /**
+ * Constant that defines the standard system property that the javax.net.ssl
+ * classes look for when needing the truststore password.
+ */
+ public static final String STANDARD_TRUST_STORE_PASSWORD = "javax.net.ssl.trustStorePassword";
+
+ private SSLContext sslContextServerSocketFactory = null; // context that builds the server socket factories
+ private SSLContext sslContextSocketFactory = null; // context that builds the socket factories
+ private Provider provider = null;
+ private String providerName = null;
+ private String secureSocketProtocol = null;
+
+ private KeyManager[] keyManagers = null;
+ private TrustManager[] trustManagers = null;
+ private SecureRandom secureRandom = null;
+
+ private URL keyStoreFilePath = null;
+ private String keyStoreType = null;
+ private String keyStoreAlgorithm = null;
+ private String keyStorePassword = null;
+ private String keyAlias = null;
+ private String keyPassword = null;
+
+ private URL trustStoreFilePath = null;
+ private String trustStoreType = null;
+ private String trustStoreAlgorithm = null;
+ private String trustStorePassword = null;
+
+ private Map<String, Object> config = null;
+ private Boolean socketUseClientMode = null;
+ private Boolean serverSocketUseClientMode = null;
+ private Boolean serverAuthMode = null;
+
+ private static final Logger log = Logger.getLogger(SSLContextFactory.class);
+
+ /**
+ * Constructor for {@link SSLContextFactory} that does not have
+ * any configuration so it falls back to all defaults.
+ */
+ public SSLContextFactory()
+ {
+ this(null);
+ }
+
+ /**
+ * Constructor for {@link SSLContextFactory} that allows the caller to
+ * override the default settings for the various SSL configuration
+ * properties.
+ *
+ * @param config configuration with properties defining things like where the
+ * keystore and truststore files are, their types, etc.
+ */
+ public SSLContextFactory(Map<String, Object> config)
+ {
+ this.config = config;
+ }
+
+ public SSLContext getSSLContext() throws IOException
+ {
+ if (sslContextSocketFactory == null)
+ {
+ initializeSocketFactorySSLContext();
+ }
+ return sslContextSocketFactory;
+ }
+
+ public SSLContext getServerSSLContext() throws IOException
+ {
+ if (sslContextServerSocketFactory == null)
+ {
+ initializeServerSocketFactorySSLContext();
+ }
+ return sslContextServerSocketFactory;
+ }
+
+ /**
+ * @see org.jboss.remoting.security.SSLSocketBuilderMBean#getSecureSocketProtocol()
+ */
+ public String getSecureSocketProtocol()
+ {
+ if (secureSocketProtocol == null)
+ {
+ if(config != null)
+ {
+ secureSocketProtocol = (String) config.get(StubExt.PROPERTY_SSL_PROTOCOL);
+ }
+ if (secureSocketProtocol == null)
+ {
+ secureSocketProtocol = DEFAULT_SSL_PROTOCOL;
+ }
+ }
+
+ return secureSocketProtocol;
+ }
+
+ /**
+ * @see org.jboss.remoting.security.SSLSocketBuilderMBean#setSecureSocketProtocol(String)
+ */
+ public void setSecureSocketProtocol(String protocol)
+ {
+ if(protocol != null && protocol.length() > 0)
+ {
+ this.secureSocketProtocol = protocol;
+ }
+ else
+ {
+ throw new IllegalArgumentException("Can not set remoting socket factory with null protocol");
+ }
+ }
+
+ /**
+ * @see org.jboss.remoting.security.SSLSocketBuilderMBean#getProvider()
+ */
+ public Provider getProvider()
+ {
+ return provider;
+ }
+
+ /**
+ * @see org.jboss.remoting.security.SSLSocketBuilderMBean#setProvider(java.security.Provider)
+ */
+ public void setProvider(Provider provider)
+ {
+ this.provider = provider;
+ }
+
+ /**
+ * @see org.jboss.remoting.security.SSLSocketBuilderMBean#getProviderName()
+ */
+ public String getProviderName()
+ {
+ if (providerName == null)
+ {
+ if(config != null)
+ {
+ providerName = (String) config.get(StubExt.PROPERTY_SSL_PROVIDER_NAME);
+ }
+ }
+ return providerName;
+ }
+
+ /**
+ * @see org.jboss.remoting.security.SSLSocketBuilderMBean#setProviderName(java.lang.String)
+ */
+ public void setProviderName(String providerName)
+ {
+ this.providerName = providerName;
+ }
+
+ /**
+ * @see org.jboss.remoting.security.SSLSocketBuilderMBean#getSecureRandom()
+ */
+ public SecureRandom getSecureRandom()
+ {
+ if(secureRandom != null)
+ {
+ return secureRandom;
+ }
+
+ secureRandom = new SecureRandom();
+
+ return secureRandom;
+ }
+
+ /**
+ * @see org.jboss.remoting.security.SSLSocketBuilderMBean#setSecureRandom(java.security.SecureRandom)
+ */
+ public void setSecureRandom(SecureRandom secureRandom)
+ {
+ this.secureRandom = secureRandom;
+ }
+
+ /**
+ * @see org.jboss.remoting.security.SSLSocketBuilderMBean#getKeyStoreURL()
+ */
+ public String getKeyStoreURL()
+ {
+ URL keyStore = getKeyStore();
+ if(keyStore != null)
+ {
+ return keyStore.toString();
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * @see org.jboss.remoting.security.SSLSocketBuilderMBean#getKeyStore()
+ */
+ public URL getKeyStore()
+ {
+ if(keyStoreFilePath != null)
+ {
+ return keyStoreFilePath;
+ }
+
+ if(config != null)
+ {
+ String path = (String) config.get(StubExt.PROPERTY_KEY_STORE);
+ if(path != null && path.length() > 0)
+ {
+ setKeyStoreURL( path );
+ }
+ }
+
+ if(keyStoreFilePath == null)
+ {
+ String path = System.getProperty(STANDARD_KEY_STORE_FILE_PATH);
+ if(path != null && path.length() > 0)
+ {
+ setKeyStoreURL( path );
+ }
+ }
+
+ return keyStoreFilePath;
+ }
+
+ /**
+ * @see org.jboss.remoting.security.SSLSocketBuilderMBean#setKeyStoreURL(java.lang.String)
+ */
+ public void setKeyStoreURL(String keyStoreFilePath)
+ {
+ try
+ {
+ this.keyStoreFilePath = validateStoreURL(keyStoreFilePath);
+ }
+ catch (IOException e)
+ {
+ throw new RuntimeException( "Cannot validate the store URL: " + keyStoreFilePath , e );
+ }
+ }
+
+ /**
+ * @see org.jboss.remoting.security.SSLSocketBuilderMBean#setKeyStore(java.net.URL)
+ */
+ public void setKeyStore(URL keyStore)
+ {
+ this.keyStoreFilePath = keyStore;
+ }
+
+ /**
+ * @see org.jboss.remoting.security.SSLSocketBuilderMBean#getKeyStoreType()
+ */
+ public String getKeyStoreType()
+ {
+ if(keyStoreType != null)
+ {
+ return keyStoreType;
+ }
+
+ if(config != null)
+ {
+ String type = (String)config.get(StubExt.PROPERTY_KEY_STORE_TYPE);
+ if(type != null && type.length() > 0)
+ {
+ keyStoreType = type;
+ }
+ }
+
+ if(keyStoreType == null)
+ {
+ keyStoreType = System.getProperty(STANDARD_KEY_STORE_TYPE);
+
+ if(keyStoreType == null)
+ {
+ keyStoreType = DEFAULT_KEY_STORE_TYPE;
+ }
+ }
+
+ return keyStoreType;
+ }
+
+ /**
+ * @see org.jboss.remoting.security.SSLSocketBuilderMBean#setKeyStoreType(java.lang.String)
+ */
+ public void setKeyStoreType(String keyStoreType)
+ {
+ this.keyStoreType = keyStoreType;
+ }
+
+ /**
+ * @see org.jboss.remoting.security.SSLSocketBuilderMBean#getKeyStoreAlgorithm()
+ */
+ public String getKeyStoreAlgorithm()
+ {
+ if(keyStoreAlgorithm != null)
+ {
+ return keyStoreAlgorithm;
+ }
+
+ if(config != null)
+ {
+ String alg = (String)config.get(StubExt.PROPERTY_KEY_STORE_ALGORITHM);
+ if(alg != null && alg.length() > 0)
+ {
+ keyStoreAlgorithm = alg;
+ }
+ }
+
+ if(keyStoreAlgorithm == null)
+ {
+ keyStoreAlgorithm = DEFAULT_KEY_STORE_ALGORITHM;
+ }
+
+ return keyStoreAlgorithm;
+ }
+
+ /**
+ * @see org.jboss.remoting.security.SSLSocketBuilderMBean#setKeyStoreAlgorithm(java.lang.String)
+ */
+ public void setKeyStoreAlgorithm(String algorithm)
+ {
+ this.keyStoreAlgorithm = algorithm;
+ }
+
+ /**
+ * Returns the password used to gain access to the keystore.
+ *
+ * @return keystore password
+ */
+ public String getKeyStorePassword()
+ {
+ if(keyStorePassword != null)
+ {
+ return keyStorePassword;
+ }
+
+ if(config != null)
+ {
+ String passwd = (String)config.get(StubExt.PROPERTY_KEY_STORE_PASSWORD);
+ if(passwd != null && passwd.length() > 0)
+ {
+ keyStorePassword = passwd;
+ }
+ }
+
+ if(keyStorePassword == null)
+ {
+ keyStorePassword = System.getProperty(STANDARD_KEY_STORE_PASSWORD);
+ }
+
+ return keyStorePassword;
+ }
+
+ /**
+ * @see org.jboss.remoting.security.SSLSocketBuilderMBean#setKeyStorePassword(java.lang.String)
+ */
+ public void setKeyStorePassword(String keyStorePassword)
+ {
+ this.keyStorePassword = keyStorePassword;
+ }
+
+ /**
+ * @see org.jboss.remoting.security.SSLSocketBuilderMBean#getTrustStoreURL()
+ */
+ public String getTrustStoreURL()
+ {
+ URL trustStore = getTrustStore();
+ if(trustStore != null)
+ {
+ return trustStore.toString();
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * @see org.jboss.remoting.security.SSLSocketBuilderMBean#getTrustStore()
+ */
+ public URL getTrustStore()
+ {
+ if(trustStoreFilePath != null)
+ {
+ return trustStoreFilePath;
+ }
+
+ if(config != null)
+ {
+ String path = (String)config.get(StubExt.PROPERTY_TRUST_STORE);
+ if(path != null && path.length() > 0)
+ {
+ setTrustStoreURL( path );
+ }
+ }
+
+ if(trustStoreFilePath == null)
+ {
+ String path = System.getProperty(STANDARD_TRUST_STORE_FILE_PATH);
+ if(path != null && path.length() > 0)
+ {
+ setTrustStoreURL( path );
+ }
+ }
+
+ return trustStoreFilePath;
+ }
+
+ /**
+ * @see org.jboss.remoting.security.SSLSocketBuilderMBean#setTrustStore(java.net.URL)
+ */
+ public void setTrustStore(URL trustStore)
+ {
+ this.trustStoreFilePath = trustStore;
+ }
+
+ /**
+ * @see org.jboss.remoting.security.SSLSocketBuilderMBean#setTrustStoreURL(java.lang.String)
+ */
+ public void setTrustStoreURL(String trustStoreFilePath)
+ {
+ try
+ {
+ this.trustStoreFilePath = validateStoreURL(trustStoreFilePath);
+ }
+ catch (IOException e)
+ {
+ throw new RuntimeException( "Cannot validate the store URL: " + trustStoreFilePath , e );
+ }
+ }
+
+ /**
+ * @see org.jboss.remoting.security.SSLSocketBuilderMBean#getTrustStoreType()
+ */
+ public String getTrustStoreType()
+ {
+ if(trustStoreType != null)
+ {
+ return trustStoreType;
+ }
+
+ if(config != null)
+ {
+ String type = (String)config.get(StubExt.PROPERTY_TRUST_STORE_TYPE);
+ if(type != null && type.length() > 0)
+ {
+ trustStoreType = type;
+ }
+ }
+
+ if(trustStoreType == null)
+ {
+ trustStoreType = System.getProperty(STANDARD_TRUST_STORE_TYPE);
+
+ if(trustStoreType == null)
+ {
+ trustStoreType = getKeyStoreType();
+ }
+ }
+
+ return trustStoreType;
+ }
+
+ /**
+ * @see org.jboss.remoting.security.SSLSocketBuilderMBean#setTrustStoreType(java.lang.String)
+ */
+ public void setTrustStoreType(String trustStoreType)
+ {
+ this.trustStoreType = trustStoreType;
+ }
+
+ /**
+ * @see org.jboss.remoting.security.SSLSocketBuilderMBean#getTrustStoreAlgorithm()
+ */
+ public String getTrustStoreAlgorithm()
+ {
+ if(trustStoreAlgorithm != null)
+ {
+ return trustStoreAlgorithm;
+ }
+
+ if(config != null)
+ {
+ String alg = (String)config.get(StubExt.PROPERTY_TRUST_STORE_ALGORITHM);
+ if(alg != null && alg.length() > 0)
+ {
+ trustStoreAlgorithm = alg;
+ }
+ }
+
+ if(trustStoreAlgorithm == null)
+ {
+ trustStoreAlgorithm = getKeyStoreAlgorithm();
+ }
+
+ return trustStoreAlgorithm;
+ }
+
+ /**
+ * @see org.jboss.remoting.security.SSLSocketBuilderMBean#setTrustStoreAlgorithm(java.lang.String)
+ */
+ public void setTrustStoreAlgorithm(String algorithm)
+ {
+ this.trustStoreAlgorithm = algorithm;
+ }
+
+ /**
+ * Returns the password used to gain access to the truststore.
+ *
+ * @return truststore password
+ */
+ public String getTrustStorePassword()
+ {
+ if(trustStorePassword != null)
+ {
+ return trustStorePassword;
+ }
+
+ if(config != null)
+ {
+ String passwd = (String)config.get(StubExt.PROPERTY_TRUST_STORE_PASSWORD);
+ if(passwd != null && passwd.length() > 0)
+ {
+ trustStorePassword = passwd;
+ }
+ }
+
+ if(trustStorePassword == null)
+ {
+ trustStorePassword = System.getProperty(STANDARD_TRUST_STORE_PASSWORD);
+ if(trustStorePassword == null)
+ {
+ trustStorePassword = getKeyStorePassword();
+ }
+ }
+
+ return trustStorePassword;
+ }
+
+ /**
+ * @see org.jboss.remoting.security.SSLSocketBuilderMBean#setTrustStorePassword(java.lang.String)
+ */
+ public void setTrustStorePassword(String trustStorePassword)
+ {
+ this.trustStorePassword = trustStorePassword;
+ }
+
+ /**
+ * @see org.jboss.remoting.security.SSLSocketBuilderMBean#getKeyAlias()
+ */
+ public String getKeyAlias()
+ {
+ if(keyAlias != null)
+ {
+ return keyAlias;
+ }
+ if(config != null)
+ {
+ keyAlias = (String)config.get(StubExt.PROPERTY_KEY_ALIAS);
+ }
+ return keyAlias;
+ }
+
+ /**
+ * @see org.jboss.remoting.security.SSLSocketBuilderMBean#setKeyAlias(java.lang.String)
+ */
+ public void setKeyAlias(String alias)
+ {
+ this.keyAlias = alias;
+ }
+
+ /**
+ * Returns the password to use for the keys within the key store.
+ * If this value is not set, this will return <code>null</code> but
+ * when this value is needed by this class, the value for the key store
+ * password will be used instead.
+ *
+ * @return key password
+ */
+ public String getKeyPassword()
+ {
+ if(keyPassword != null)
+ {
+ return keyPassword;
+ }
+
+ if(config != null)
+ {
+ String passwd = (String)config.get(KEY_PASSWORD);
+ if(passwd != null && passwd.length() > 0)
+ {
+ keyPassword = passwd;
+ }
+ }
+
+ return keyPassword;
+ }
+
+ /**
+ * @see org.jboss.remoting.security.SSLSocketBuilderMBean#setKeyPassword(java.lang.String)
+ */
+ public void setKeyPassword(String keyPassword)
+ {
+ this.keyPassword = keyPassword;
+ }
+
+ /**
+ * @see org.jboss.remoting.security.SSLSocketBuilderMBean#isSocketUseClientMode()
+ */
+ public boolean isSocketUseClientMode( )
+ {
+ if (socketUseClientMode == null)
+ {
+ if (config != null && config.containsKey(SSL_USE_CLIENT_MODE))
+ {
+ socketUseClientMode = Boolean.valueOf((String) config.get(SSL_USE_CLIENT_MODE));
+ }
+ else
+ {
+ socketUseClientMode = Boolean.TRUE;
+ }
+ }
+
+ return socketUseClientMode.booleanValue();
+ }
+
+ /**
+ * @see org.jboss.remoting.security.SSLSocketBuilderMBean#isServerSocketUseClientMode()
+ */
+ public boolean isServerSocketUseClientMode( )
+ {
+ if (serverSocketUseClientMode == null)
+ {
+ if (config != null && config.containsKey(SERVER_SSL_USE_CLIENT_MODE))
+ {
+ serverSocketUseClientMode = Boolean.valueOf((String) config.get(SERVER_SSL_USE_CLIENT_MODE));
+ }
+ else
+ {
+ serverSocketUseClientMode = Boolean.FALSE;
+ }
+ }
+
+ return serverSocketUseClientMode.booleanValue();
+ }
+
+ /**
+ * @see org.jboss.remoting.security.SSLSocketBuilderMBean#setSocketUseClientMode(boolean)
+ */
+ public void setSocketUseClientMode( boolean useClientMode )
+ {
+ this.socketUseClientMode = Boolean.valueOf(useClientMode);
+ }
+
+ /**
+ * @see org.jboss.remoting.security.SSLSocketBuilderMBean#setServerSocketUseClientMode(boolean)
+ */
+ public void setServerSocketUseClientMode( boolean useClientMode )
+ {
+ this.serverSocketUseClientMode = Boolean.valueOf(useClientMode);
+ }
+
+ /**
+ * @see org.jboss.remoting.security.SSLSocketBuilderMBean#isServerAuthMode()
+ */
+ public boolean isServerAuthMode()
+ {
+ if (serverAuthMode == null)
+ {
+ if (config != null && config.containsKey(SSL_SERVER_AUTH_MODE))
+ {
+ serverAuthMode = Boolean.valueOf( (String) config.get(SSL_SERVER_AUTH_MODE) );
+ }
+ else
+ {
+ serverAuthMode = Boolean.TRUE;
+ }
+ }
+
+ return serverAuthMode.booleanValue();
+ }
+
+ /**
+ * @see org.jboss.remoting.security.SSLSocketBuilderMBean#setServerAuthMode(boolean)
+ */
+ public void setServerAuthMode(boolean mode)
+ {
+ serverAuthMode = Boolean.valueOf(mode);
+ }
+
+ /**
+ * Creates (but does not initialize) the SSL context used by this object
+ * to create server socket factories.
+ * The provider/protocol is used to determine what SSL context to use.
+ * Call {@link #initializeServerSocketFactorySSLContext()} if you want
+ * to create and initialize in one method call.
+ * If the server socket factory SSL context was already created, this will create
+ * a new one and remove the old one.
+ *
+ * @throws IOException
+ */
+ protected void createServerSocketFactorySSLContext()
+ throws IOException
+ {
+ try
+ {
+ if(getProvider() != null)
+ {
+ sslContextServerSocketFactory = SSLContext.getInstance(getSecureSocketProtocol(), getProvider());
+ }
+ else if(getProviderName() != null)
+ {
+ sslContextServerSocketFactory = SSLContext.getInstance(getSecureSocketProtocol(), getProviderName());
+ }
+ else
+ {
+ sslContextServerSocketFactory = SSLContext.getInstance(getSecureSocketProtocol());
+ }
+ }
+ catch(Exception e)
+ {
+ IOException ioe = new IOException("Error creating server socket factory SSL context: " + e.getMessage());
+ ioe.setStackTrace(e.getStackTrace());
+ throw ioe;
+ }
+
+ return;
+ }
+
+ /**
+ * Creates (but does not initialize) the SSL context used by this object
+ * to create socket factories.
+ * The provider/protocol is used to determine what SSL context to use.
+ * Call {@link #initializeSocketFactorySSLContext()} if you want
+ * to create and initialize in one method call.
+ * If the socket factory SSL context was already created, this will create
+ * a new one and remove the old one.
+ *
+ * @throws IOException
+ */
+ protected void createSocketFactorySSLContext()
+ throws IOException
+ {
+ try
+ {
+ if(getProvider() != null)
+ {
+ sslContextSocketFactory = SSLContext.getInstance(getSecureSocketProtocol(), getProvider());
+ }
+ else if(getProviderName() != null)
+ {
+ sslContextSocketFactory = SSLContext.getInstance(getSecureSocketProtocol(), getProviderName());
+ }
+ else
+ {
+ sslContextSocketFactory = SSLContext.getInstance(getSecureSocketProtocol());
+ }
+ }
+ catch(Exception e)
+ {
+ IOException ioe = new IOException("Error creating socket factory SSL context: " + e.getMessage());
+ ioe.setStackTrace(e.getStackTrace());
+ throw ioe;
+ }
+
+ return;
+ }
+
+ /**
+ * Initializes the SSL context used by this object that will create the server socket factories.
+ * If the SSL context is not yet created, this method will also create it.
+ * The provider/protocol is used to determine what SSL context to use. Key and trust managers
+ * are loaded and a secure random object is created and the SSL context for the
+ * protocol/provider is initialized with them.
+ *
+ * @throws IOException
+ */
+ protected void initializeServerSocketFactorySSLContext()
+ throws IOException
+ {
+ try
+ {
+ if (sslContextServerSocketFactory == null)
+ {
+ createServerSocketFactorySSLContext();
+ }
+
+ try
+ {
+ keyManagers = loadKeyManagers();
+ }
+ catch (NullStoreURLException e)
+ {
+ if (isServerSocketUseClientMode())
+ {
+ keyManagers = null;
+ log.debug("Could not find keytore url. " + e.getMessage());
+ }
+ else
+ {
+ // because this ssl context will create server socket factories, will throw if can not find keystore
+ IOException ioe = new IOException("Can not find keystore url.");
+ ioe.initCause(e);
+ throw ioe;
+ }
+ }
+
+ try
+ {
+ boolean isClientMode = isServerSocketUseClientMode();
+ trustManagers = loadTrustManagers(isClientMode);
+ }
+ catch (NullStoreURLException e)
+ {
+ trustManagers = null;
+ log.debug("Could not find truststore url. " + e.getMessage());
+ }
+
+ secureRandom = getSecureRandom();
+
+ sslContextServerSocketFactory.init(keyManagers, trustManagers, secureRandom);
+ }
+ catch(Exception e)
+ {
+ IOException ioe = new IOException("Error initializing server socket factory SSL context: " + e.getMessage());
+ ioe.setStackTrace(e.getStackTrace());
+ throw ioe;
+ }
+
+ return;
+ }
+
+ /**
+ * Initializes the SSL context used by this object that will create the socket factories.
+ * If the SSL context is not yet created, this method will also create it.
+ * The provider/protocol is used to determine what SSL context to use. Key and trust managers
+ * are loaded and a secure random object is created and the SSL context for the
+ * protocol/provider is initialized with them.
+ *
+ * @throws IOException
+ */
+ protected void initializeSocketFactorySSLContext()
+ throws IOException
+ {
+ try
+ {
+ if (sslContextSocketFactory == null)
+ {
+ createSocketFactorySSLContext();
+ }
+
+ try
+ {
+ keyManagers = loadKeyManagers();
+ }
+ catch (NullStoreURLException e)
+ {
+ // this is allowable since would be the normal scenario
+ keyManagers = null;
+ log.debug("Could not find keystore url. " + e.getMessage());
+ }
+
+ try
+ {
+ boolean isClientMode = isSocketUseClientMode();
+ trustManagers = loadTrustManagers(isClientMode);
+ }
+ catch (NullStoreURLException e)
+ {
+ // If the keyManagers is not null, could possibly be using in client mode
+ // so want to allow it. Otherwise, need to throw exception as will not be able
+ // to use in client mode or not
+ if(keyManagers != null)
+ {
+ trustManagers = null;
+ log.debug("Could not find truststore url. " + e.getMessage());
+ }
+ else
+ {
+ IOException ioe = new IOException("Can not find truststore url.");
+ ioe.initCause(e);
+ throw ioe;
+ }
+ }
+
+ secureRandom = getSecureRandom();
+
+ sslContextSocketFactory.init(keyManagers, trustManagers, secureRandom);
+ }
+ catch(Exception e)
+ {
+ IOException ioe = new IOException("Error initializing socket factory SSL context: " + e.getMessage());
+ ioe.setStackTrace(e.getStackTrace());
+ throw ioe;
+ }
+
+ return;
+ }
+
+ /**
+ * Loads the trust managers based on this object's truststore.
+ *
+ * @return array of trust managers that should be loaded in this object's SSL context
+ *
+ * @throws NoSuchProviderException
+ * @throws NoSuchAlgorithmException
+ * @throws IOException
+ * @throws CertificateException
+ * @throws KeyStoreException
+ * @throws NullStoreURLException
+ */
+ protected TrustManager[] loadTrustManagers(boolean isClientMode)
+ throws NoSuchProviderException, NoSuchAlgorithmException, IOException, CertificateException, KeyStoreException, NullStoreURLException
+ {
+ if(isClientMode && !isServerAuthMode())
+ {
+ // we are in client mode and do not want to perform server cert authentication
+ // return a trust manager that trusts all certs
+ trustManagers = new TrustManager[] {
+ new X509TrustManager() {
+ public void checkClientTrusted( X509Certificate[] chain, String authType ) {}
+ public void checkServerTrusted( X509Certificate[] chain, String authType ) {}
+ public X509Certificate[] getAcceptedIssuers() { return null; }
+ }};
+ }
+ else
+ {
+ String tsType = getTrustStoreType();
+ String tsPasswd = getTrustStorePassword();
+ URL tsPathURL = getTrustStore();
+
+ String tsAlg = getTrustStoreAlgorithm();
+
+ TrustManagerFactory trustMgrFactory;
+ KeyStore trustStore = loadKeyStore(tsType, tsPathURL, tsPasswd);
+
+ if (getProvider() != null)
+ {
+ trustMgrFactory = TrustManagerFactory.getInstance(tsAlg, getProvider());
+ }
+ else if (getProviderName() != null)
+ {
+ trustMgrFactory = TrustManagerFactory.getInstance(tsAlg, getProviderName());
+ }
+ else
+ {
+ trustMgrFactory = TrustManagerFactory.getInstance(tsAlg);
+ }
+
+ if (trustStore != null)
+ {
+ trustMgrFactory.init(trustStore);
+
+ trustManagers = trustMgrFactory.getTrustManagers();
+ }
+ }
+
+ return trustManagers;
+ }
+
+ /**
+ * Loads the key managers based on this object's truststore.
+ *
+ * @return array of key managers that should be loaded in this object's SSL context
+ *
+ * @throws NoSuchProviderException
+ * @throws NoSuchAlgorithmException
+ * @throws IOException
+ * @throws CertificateException
+ * @throws KeyStoreException
+ * @throws UnrecoverableKeyException
+ * @throws NullStoreURLException
+ */
+ protected KeyManager[] loadKeyManagers()
+ throws NoSuchProviderException, NoSuchAlgorithmException, IOException, CertificateException,
+ KeyStoreException, UnrecoverableKeyException, NullStoreURLException
+ {
+ String ksPasswd = getKeyStorePassword();
+ String ksType = getKeyStoreType();
+ URL ksPathURL = getKeyStore();
+
+ KeyStore keyStore = loadKeyStore(ksType, ksPathURL, ksPasswd);
+
+ if(keyStore != null)
+ {
+ String alias = getKeyAlias();
+
+ // check that keystore contains supplied alias (if there is one)
+ if(alias != null)
+ {
+ boolean containsAlias = keyStore.isKeyEntry(alias);
+ if(!containsAlias)
+ {
+ // can not continue as supplied alias does not exist as key entry
+ throw new IOException("Can not find key entry for key store (" + ksPathURL + ") with given alias (" + alias + ")");
+ }
+ }
+
+ KeyManagerFactory keyMgrFactory = null;
+ String alg = getKeyStoreAlgorithm();
+
+ if(getProvider() != null)
+ {
+ keyMgrFactory = KeyManagerFactory.getInstance(alg, getProvider());
+ }
+ else if(getProviderName() != null)
+ {
+ keyMgrFactory = KeyManagerFactory.getInstance(alg, getProviderName());
+ }
+ else
+ {
+ keyMgrFactory = KeyManagerFactory.getInstance(alg);
+ }
+
+ // get they key password, if it isn't defined, use the key store password
+ String keyPasswd = getKeyPassword();
+ if (keyPasswd == null || keyPasswd.length() == 0)
+ {
+ keyPasswd = ksPasswd;
+ }
+
+ keyMgrFactory.init(keyStore, keyPasswd.toCharArray());
+ keyManagers = keyMgrFactory.getKeyManagers();
+
+ // if alias provided, use helper impl to hard wire alias name to be used
+ if(alias != null)
+ {
+ //TODO: -TME Need careful review of if this is really needed or not.
+ for(int x = 0; x < keyManagers.length; x++)
+ {
+ keyManagers[x] = new JBossWSKeyManager((X509KeyManager)keyManagers[x], alias);
+ }
+ }
+
+ }
+ return keyManagers;
+ }
+
+ /**
+ * Loads a key store file and returns it.
+ *
+ * @param storeType the type of store file
+ * @param storePathURL the URL to the file - may be relative to the current thread's classloader
+ * or may be absolute path to a file on the file system.
+ * @param storePassword password to gain access to the store file
+ *
+ * @return the key store
+ *
+ * @throws KeyStoreException
+ * @throws NoSuchProviderException
+ * @throws IOException
+ * @throws NoSuchAlgorithmException
+ * @throws CertificateException
+ * @throws NullStoreURLException
+ */
+ protected KeyStore loadKeyStore(String storeType, URL storePathURL, String storePassword)
+ throws KeyStoreException, NoSuchProviderException, IOException, NoSuchAlgorithmException, CertificateException, NullStoreURLException
+ {
+ KeyStore keyStore = null;
+
+ if(getProvider() != null)
+ {
+ keyStore = KeyStore.getInstance(storeType, getProvider());
+ }
+ else if(getProviderName() != null)
+ {
+ keyStore = KeyStore.getInstance(storeType, getProviderName());
+ }
+ else
+ {
+ keyStore = KeyStore.getInstance(storeType);
+ }
+
+ if ( storePathURL == null )
+ {
+ throw new NullStoreURLException("Can not find store file for url because store url is null.");
+ }
+
+ // now that keystore instance created, need to load data from file
+ InputStream keyStoreInputStream = null;
+
+ try
+ {
+ keyStoreInputStream = storePathURL.openStream();
+
+ // is ok for password to be null, as will just be used to check integrity of store
+ char[] password = storePassword != null ? storePassword.toCharArray() : null;
+ keyStore.load(keyStoreInputStream, password);
+ }
+ finally
+ {
+ if(keyStoreInputStream != null)
+ {
+ try
+ {
+ keyStoreInputStream.close();
+ }
+ catch(IOException e)
+ {
+ // no op
+ }
+ keyStoreInputStream = null;
+ }
+ }
+
+ return keyStore;
+ }
+
+ /**
+ * Given a store file path, this will verify that the store actually exists.
+ * First, it checks to see if its a valid URL, then it checks to see if the
+ * file path is found in the file system and finally will be checked to see
+ * if it can be found as a resource within the current thread's classloader.
+ * An exception is thrown if the store cannot be found.
+ *
+ * @param storePath the path which can be a URL, path to a resource in classloader
+ * or a file path on the file system.
+ *
+ * @return the URL of the file that was found
+ *
+ * @throws IOException if the store could not be found
+ */
+ protected URL validateStoreURL(String storePath) throws IOException
+ {
+ URL url = null;
+
+ // First see if this is a URL
+ try
+ {
+ url = new URL(storePath);
+ }
+ catch(MalformedURLException e)
+ {
+ // Not a URL or a protocol without a handler so...
+ // next try to locate this as file path
+ File tst = new File(storePath);
+
+ if(tst.exists() == true)
+ {
+ url = tst.toURL();
+ }
+ else
+ {
+ // not a file either, lastly try to locate this as a classpath resource
+ if(url == null)
+ {
+ ClassLoader loader = Thread.currentThread().getContextClassLoader();
+ url = loader.getResource(storePath);
+ }
+ }
+ }
+
+ // Fail if no valid key store was located
+ if(url == null)
+ {
+ String msg = "Failed to find url=" + storePath + " as a URL, file or resource";
+ throw new MalformedURLException(msg);
+ }
+
+ return url;
+ }
+
+ /**
+ * Used to indicate a store URL was not specified and thus the store is not available.
+ */
+ protected class NullStoreURLException extends Exception
+ {
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * @see Exception#Exception(String)
+ */
+ public NullStoreURLException(String message)
+ {
+ super(message);
+ }
+ }
+}
\ No newline at end of file
Modified: stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/jaxws/binding/HTTPMessageMarshaller.java
===================================================================
--- stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/jaxws/binding/HTTPMessageMarshaller.java 2009-07-04 14:37:52 UTC (rev 10314)
+++ stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/jaxws/binding/HTTPMessageMarshaller.java 2009-07-04 14:44:05 UTC (rev 10315)
@@ -25,15 +25,14 @@
import java.io.OutputStream;
import org.jboss.logging.Logger;
-import org.jboss.remoting.InvocationRequest;
-import org.jboss.remoting.invocation.OnewayInvocation;
-import org.jboss.remoting.marshal.Marshaller;
import org.jboss.ws.core.HTTPMessageImpl;
+import org.jboss.ws.core.client.Marshaller;
import org.jboss.wsf.common.DOMWriter;
import org.w3c.dom.Element;
/**
* @author Thomas.Diesler at jboss.org
+ * @author alessio.soldano at jboss.com
* @since 25-Nov-2004
*/
public class HTTPMessageMarshaller implements Marshaller
@@ -52,12 +51,6 @@
*/
public void write(Object dataObject, OutputStream output) throws IOException
{
- if (dataObject instanceof InvocationRequest)
- dataObject = ((InvocationRequest)dataObject).getParameter();
-
- if (dataObject instanceof OnewayInvocation)
- dataObject = ((OnewayInvocation)dataObject).getParameters()[0];
-
if ((dataObject instanceof HTTPMessageImpl) == false)
throw new IllegalArgumentException("Not a HTTPMessage: " + dataObject);
@@ -72,9 +65,4 @@
new DOMWriter(output).print(root);
}
-
- public Marshaller cloneMarshaller() throws CloneNotSupportedException
- {
- return new HTTPMessageMarshaller();
- }
}
Modified: stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/jaxws/binding/HTTPMessageUnMarshaller.java
===================================================================
--- stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/jaxws/binding/HTTPMessageUnMarshaller.java 2009-07-04 14:37:52 UTC (rev 10314)
+++ stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/jaxws/binding/HTTPMessageUnMarshaller.java 2009-07-04 14:44:05 UTC (rev 10315)
@@ -24,7 +24,6 @@
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
-import java.util.Iterator;
import java.util.List;
import java.util.Map;
@@ -32,10 +31,10 @@
import javax.xml.soap.MimeHeaders;
import org.jboss.logging.Logger;
-import org.jboss.remoting.marshal.UnMarshaller;
-import org.jboss.remoting.transport.http.HTTPMetadataConstants;
import org.jboss.ws.WSException;
import org.jboss.ws.core.HTTPMessageImpl;
+import org.jboss.ws.core.client.NettyClient;
+import org.jboss.ws.core.client.UnMarshaller;
/**
* @author Thomas.Diesler at jboss.org
@@ -46,7 +45,7 @@
// Provide logging
private static Logger log = Logger.getLogger(HTTPMessageUnMarshaller.class);
- private static List validResponseCodes = new ArrayList();
+ private static List<Integer> validResponseCodes = new ArrayList<Integer>();
static
{
validResponseCodes.add(HttpServletResponse.SC_OK);
@@ -54,15 +53,15 @@
validResponseCodes.add(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
}
- public Object read(InputStream inputStream, Map metadata) throws IOException, ClassNotFoundException
+ public Object read(InputStream inputStream, Map<String, Object> metadata) throws IOException
{
if (log.isTraceEnabled())
{
log.trace("Read input stream with metadata=" + metadata);
}
- Integer resCode = (Integer)metadata.get(HTTPMetadataConstants.RESPONSE_CODE);
- String resMessage = (String)metadata.get(HTTPMetadataConstants.RESPONSE_CODE_MESSAGE);
+ Integer resCode = (Integer)metadata.get(NettyClient.RESPONSE_CODE);
+ String resMessage = (String)metadata.get(NettyClient.RESPONSE_CODE_MESSAGE);
if (resCode != null && validResponseCodes.contains(resCode) == false)
throw new WSException("Invalid HTTP server response [" + resCode + "] - " + resMessage);
@@ -71,37 +70,17 @@
return soapMsg;
}
- /**
- * Set the class loader to use for unmarhsalling. This may
- * be needed when need to have access to class definitions that
- * are not part of this unmarshaller's parent classloader (especially
- * when doing remote classloading).
- *
- * @param classloader
- */
- public void setClassLoader(ClassLoader classloader)
+ private MimeHeaders getMimeHeaders(Map<String, Object> metadata)
{
- //NO OP
- }
-
- public UnMarshaller cloneUnMarshaller() throws CloneNotSupportedException
- {
- return new HTTPMessageUnMarshaller();
- }
-
- private MimeHeaders getMimeHeaders(Map metadata)
- {
log.debug("getMimeHeaders from: " + metadata);
MimeHeaders headers = new MimeHeaders();
- Iterator i = metadata.keySet().iterator();
- while (i.hasNext())
+ for (String key : metadata.keySet())
{
- String key = (String)i.next();
Object value = metadata.get(key);
if (key != null && value instanceof List)
{
- for (Object listValue : (List)value)
+ for (Object listValue : (List<?>)value)
{
headers.addHeader(key, listValue.toString());
}
Modified: stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/jaxws/binding/JsonMessageMarshaller.java
===================================================================
--- stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/jaxws/binding/JsonMessageMarshaller.java 2009-07-04 14:37:52 UTC (rev 10314)
+++ stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/jaxws/binding/JsonMessageMarshaller.java 2009-07-04 14:44:05 UTC (rev 10315)
@@ -28,23 +28,18 @@
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPMessage;
-import org.jboss.logging.Logger;
-import org.jboss.remoting.InvocationRequest;
-import org.jboss.remoting.invocation.OnewayInvocation;
-import org.jboss.remoting.marshal.Marshaller;
+import org.jboss.ws.core.client.Marshaller;
import org.jboss.ws.core.soap.SOAPBodyImpl;
import org.jboss.ws.core.soap.SOAPMessageImpl;
import org.jboss.ws.extensions.json.BadgerFishDOMDocumentSerializer;
/**
* @author Thomas.Diesler at jboss.org
+ * @author alessio.soldano at jboss.com
* @since 25-Nov-2004
*/
public class JsonMessageMarshaller implements Marshaller
{
- // Provide logging
- private static Logger log = Logger.getLogger(JsonMessageMarshaller.class);
-
/**
* Marshaller will need to take the dataObject and convert
* into primitive java data types and write to the
@@ -56,12 +51,6 @@
*/
public void write(Object dataObject, OutputStream output) throws IOException
{
- if (dataObject instanceof InvocationRequest)
- dataObject = ((InvocationRequest)dataObject).getParameter();
-
- if (dataObject instanceof OnewayInvocation)
- dataObject = ((OnewayInvocation)dataObject).getParameters()[0];
-
// TODO: this should not be a SOAP message
if ((dataObject instanceof SOAPMessageImpl) == false)
throw new IllegalArgumentException("Not a SOAPMessageImpl: " + dataObject);
@@ -80,9 +69,4 @@
throw ioex;
}
}
-
- public Marshaller cloneMarshaller() throws CloneNotSupportedException
- {
- return new JsonMessageMarshaller();
- }
}
Modified: stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/jaxws/binding/JsonMessageUnMarshaller.java
===================================================================
--- stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/jaxws/binding/JsonMessageUnMarshaller.java 2009-07-04 14:37:52 UTC (rev 10314)
+++ stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/jaxws/binding/JsonMessageUnMarshaller.java 2009-07-04 14:44:05 UTC (rev 10315)
@@ -23,16 +23,13 @@
import java.io.IOException;
import java.io.InputStream;
-import java.util.Iterator;
-import java.util.List;
import java.util.Map;
-import javax.xml.soap.MimeHeaders;
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPMessage;
import org.jboss.logging.Logger;
-import org.jboss.remoting.marshal.UnMarshaller;
+import org.jboss.ws.core.client.UnMarshaller;
import org.jboss.ws.core.soap.MessageFactoryImpl;
import org.jboss.ws.extensions.json.BadgerFishDOMDocumentParser;
import org.w3c.dom.Document;
@@ -46,7 +43,7 @@
// Provide logging
private static Logger log = Logger.getLogger(JsonMessageUnMarshaller.class);
- public Object read(InputStream inputStream, Map metadata) throws IOException, ClassNotFoundException
+ public Object read(InputStream inputStream, Map<String, Object> metadata) throws IOException
{
if (log.isTraceEnabled())
{
@@ -69,43 +66,4 @@
throw ioex;
}
}
-
- /**
- * Set the class loader to use for unmarhsalling. This may
- * be needed when need to have access to class definitions that
- * are not part of this unmarshaller's parent classloader (especially
- * when doing remote classloading).
- *
- * @param classloader
- */
- public void setClassLoader(ClassLoader classloader)
- {
- //NO OP
- }
-
- public UnMarshaller cloneUnMarshaller() throws CloneNotSupportedException
- {
- return new JsonMessageUnMarshaller();
- }
-
- private MimeHeaders getMimeHeaders(Map metadata)
- {
- log.debug("getMimeHeaders from: " + metadata);
-
- MimeHeaders headers = new MimeHeaders();
- Iterator i = metadata.keySet().iterator();
- while (i.hasNext())
- {
- String key = (String)i.next();
- Object value = metadata.get(key);
- if (key != null && value instanceof List)
- {
- for (Object listValue : (List)value)
- {
- headers.addHeader(key, listValue.toString());
- }
- }
- }
- return headers;
- }
}
Modified: stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/jaxws/client/ClientImpl.java
===================================================================
--- stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/jaxws/client/ClientImpl.java 2009-07-04 14:37:52 UTC (rev 10314)
+++ stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/jaxws/client/ClientImpl.java 2009-07-04 14:44:05 UTC (rev 10315)
@@ -49,11 +49,11 @@
import javax.xml.ws.soap.SOAPBinding;
import javax.xml.ws.soap.SOAPFaultException;
-import org.jboss.remoting.transport.http.HTTPMetadataConstants;
import org.jboss.util.NotImplementedException;
import org.jboss.ws.core.CommonBindingProvider;
import org.jboss.ws.core.CommonClient;
import org.jboss.ws.core.CommonMessageContext;
+import org.jboss.ws.core.client.NettyClient;
import org.jboss.ws.core.jaxws.binding.BindingExt;
import org.jboss.ws.core.jaxws.binding.BindingProviderImpl;
import org.jboss.ws.core.jaxws.handler.HandlerChainExecutor;
@@ -216,7 +216,7 @@
Map<?, ?> remotingMetadata = (Map)msgContext.get(CommonMessageContext.REMOTING_METADATA);
// Get the HTTP_RESPONSE_CODE
- Integer resposeCode = (Integer)remotingMetadata.get(HTTPMetadataConstants.RESPONSE_CODE);
+ Integer resposeCode = (Integer)remotingMetadata.get(NettyClient.RESPONSE_CODE);
if (resposeCode != null)
msgContext.put(MessageContextJAXWS.HTTP_RESPONSE_CODE, resposeCode);
Modified: stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/soap/EnvelopeBuilderDOM.java
===================================================================
--- stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/soap/EnvelopeBuilderDOM.java 2009-07-04 14:37:52 UTC (rev 10314)
+++ stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/soap/EnvelopeBuilderDOM.java 2009-07-04 14:44:05 UTC (rev 10315)
@@ -89,6 +89,7 @@
{
return null;
}
+ log.error("Exception while building envelope", ex);
QName faultCode = Constants.SOAP11_FAULT_CODE_CLIENT;
throw new CommonSOAPFaultException(faultCode, ex.getMessage());
}
Modified: stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/soap/FastInfosetMarshaller.java
===================================================================
--- stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/soap/FastInfosetMarshaller.java 2009-07-04 14:37:52 UTC (rev 10314)
+++ stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/soap/FastInfosetMarshaller.java 2009-07-04 14:44:05 UTC (rev 10315)
@@ -28,14 +28,13 @@
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPMessage;
-import org.jboss.remoting.InvocationRequest;
-import org.jboss.remoting.invocation.OnewayInvocation;
-import org.jboss.remoting.marshal.Marshaller;
+import org.jboss.ws.core.client.Marshaller;
import com.sun.xml.fastinfoset.dom.DOMDocumentSerializer;
/**
* @author Thomas.Diesler at jboss.org
+ * @author alessio.soldano at jboss.com
* @since 12-Mar-2008
*/
public class FastInfosetMarshaller implements Marshaller
@@ -51,12 +50,6 @@
*/
public void write(Object dataObject, OutputStream output) throws IOException
{
- if (dataObject instanceof InvocationRequest)
- dataObject = ((InvocationRequest)dataObject).getParameter();
-
- if (dataObject instanceof OnewayInvocation)
- dataObject = ((OnewayInvocation)dataObject).getParameters()[0];
-
if ((dataObject instanceof SOAPMessage) == false)
throw new IllegalArgumentException("Not a SOAPMessage: " + dataObject);
@@ -78,9 +71,4 @@
throw ioex;
}
}
-
- public Marshaller cloneMarshaller() throws CloneNotSupportedException
- {
- return new FastInfosetMarshaller();
- }
}
Modified: stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/soap/SOAPConnectionImpl.java
===================================================================
--- stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/soap/SOAPConnectionImpl.java 2009-07-04 14:37:52 UTC (rev 10314)
+++ stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/soap/SOAPConnectionImpl.java 2009-07-04 14:44:05 UTC (rev 10315)
@@ -84,7 +84,7 @@
if (reqMessage == null)
throw new IllegalArgumentException("Given SOAPMessage cannot be null");
- MessageAbstraction resMessage = callInternal(reqMessage, endpoint, true);
+ MessageAbstraction resMessage = callInternal(reqMessage, endpoint, false);
return (SOAPMessage)resMessage;
}
@@ -140,7 +140,7 @@
try
{
remotingConnection = getRemotingConnection(endpoint);
- MessageAbstraction resMessage = remotingConnection.invoke((SOAPMessageImpl)reqMessage, endpoint, oneway);
+ MessageAbstraction resMessage = remotingConnection.invoke((SOAPMessageImpl)reqMessage, endpoint, oneway, false);
return resMessage;
}
catch (Exception ex)
Modified: stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/soap/SOAPMessageMarshaller.java
===================================================================
--- stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/soap/SOAPMessageMarshaller.java 2009-07-04 14:37:52 UTC (rev 10314)
+++ stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/soap/SOAPMessageMarshaller.java 2009-07-04 14:44:05 UTC (rev 10315)
@@ -27,12 +27,11 @@
import javax.xml.soap.SOAPMessage;
import org.jboss.logging.Logger;
-import org.jboss.remoting.InvocationRequest;
-import org.jboss.remoting.invocation.OnewayInvocation;
-import org.jboss.remoting.marshal.Marshaller;
+import org.jboss.ws.core.client.Marshaller;
/**
* @author Thomas.Diesler at jboss.org
+ * @author alessio.soldano at jboss.com
* @since 25-Nov-2004
*/
public class SOAPMessageMarshaller implements Marshaller
@@ -51,21 +50,10 @@
*/
public void write(Object dataObject, OutputStream output) throws IOException
{
- if (dataObject instanceof InvocationRequest)
- dataObject = ((InvocationRequest)dataObject).getParameter();
-
- if (dataObject instanceof OnewayInvocation)
- dataObject = ((OnewayInvocation)dataObject).getParameters()[0];
-
if ((dataObject instanceof SOAPMessage) == false)
throw new IllegalArgumentException("Not a SOAPMessage: " + dataObject);
SOAPMessageImpl soapMessage = (SOAPMessageImpl)dataObject;
soapMessage.writeTo(output);
}
-
- public Marshaller cloneMarshaller() throws CloneNotSupportedException
- {
- return new SOAPMessageMarshaller();
- }
}
Modified: stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/soap/SOAPMessageUnMarshaller.java
===================================================================
--- stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/soap/SOAPMessageUnMarshaller.java 2009-07-04 14:37:52 UTC (rev 10314)
+++ stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/soap/SOAPMessageUnMarshaller.java 2009-07-04 14:44:05 UTC (rev 10315)
@@ -29,10 +29,11 @@
import javax.xml.soap.SOAPMessage;
import org.jboss.logging.Logger;
-import org.jboss.remoting.marshal.UnMarshaller;
+import org.jboss.ws.core.client.UnMarshaller;
/**
* @author Thomas.Diesler at jboss.org
+ * @author alessio.soldano at jboss.com
* @since 25-Nov-2004
*/
public class SOAPMessageUnMarshaller implements UnMarshaller
@@ -40,7 +41,7 @@
// Provide logging
private static Logger log = Logger.getLogger(SOAPMessageUnMarshaller.class);
- public Object read(InputStream inputStream, Map metadata) throws IOException, ClassNotFoundException
+ public Object read(InputStream inputStream, Map<String, Object> metadata) throws IOException
{
if (log.isTraceEnabled())
log.trace("Read input stream with metadata=" + metadata);
@@ -64,13 +65,4 @@
{
return new MessageFactoryImpl();
}
-
- public void setClassLoader(ClassLoader classloader)
- {
- }
-
- public UnMarshaller cloneUnMarshaller() throws CloneNotSupportedException
- {
- return new SOAPMessageUnMarshaller();
- }
}
Modified: stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/soap/SOAPMessageUnMarshallerHTTP.java
===================================================================
--- stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/soap/SOAPMessageUnMarshallerHTTP.java 2009-07-04 14:37:52 UTC (rev 10314)
+++ stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/soap/SOAPMessageUnMarshallerHTTP.java 2009-07-04 14:44:05 UTC (rev 10315)
@@ -24,7 +24,6 @@
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
-import java.util.Iterator;
import java.util.List;
import java.util.Map;
@@ -34,12 +33,13 @@
import javax.xml.soap.SOAPMessage;
import org.jboss.logging.Logger;
-import org.jboss.remoting.marshal.UnMarshaller;
-import org.jboss.remoting.transport.http.HTTPMetadataConstants;
import org.jboss.ws.WSException;
+import org.jboss.ws.core.client.NettyClient;
+import org.jboss.ws.core.client.UnMarshaller;
/**
* @author Thomas.Diesler at jboss.org
+ * @author alessio.soldano at jboss.com
* @since 25-Nov-2004
*/
public class SOAPMessageUnMarshallerHTTP implements UnMarshaller
@@ -47,7 +47,7 @@
// Provide logging
private static Logger log = Logger.getLogger(SOAPMessageUnMarshallerHTTP.class);
- private static List validResponseCodes = new ArrayList();
+ private static List<Integer> validResponseCodes = new ArrayList<Integer>();
static
{
validResponseCodes.add(HttpServletResponse.SC_OK);
@@ -56,21 +56,21 @@
validResponseCodes.add(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
}
- public Object read(InputStream inputStream, Map metadata) throws IOException, ClassNotFoundException
+ public Object read(InputStream inputStream, Map<String, Object> metadata) throws IOException
{
if (log.isTraceEnabled())
log.trace("Read input stream with metadata=" + metadata);
try
{
- Integer resCode = (Integer)metadata.get(HTTPMetadataConstants.RESPONSE_CODE);
+ Integer resCode = (Integer)metadata.get(NettyClient.RESPONSE_CODE);
if (resCode == null)
{
log.warn("No HTTP resonse code, assuming: SC_OK");
resCode = HttpServletResponse.SC_OK;
}
- String resMessage = (String)metadata.get(HTTPMetadataConstants.RESPONSE_CODE_MESSAGE);
+ String resMessage = (String)metadata.get("ResponseCodeMessage");
if (validResponseCodes.contains(resCode) == false)
throw new WSException("Invalid HTTP server response [" + resCode + "] - " + resMessage);
@@ -98,37 +98,17 @@
return new MessageFactoryImpl();
}
- /**
- * Set the class loader to use for unmarhsalling. This may
- * be needed when need to have access to class definitions that
- * are not part of this unmarshaller's parent classloader (especially
- * when doing remote classloading).
- *
- * @param classloader
- */
- public void setClassLoader(ClassLoader classloader)
+ private MimeHeaders getMimeHeaders(Map<String, Object> metadata)
{
- //NO OP
- }
-
- public UnMarshaller cloneUnMarshaller() throws CloneNotSupportedException
- {
- return new SOAPMessageUnMarshallerHTTP();
- }
-
- private MimeHeaders getMimeHeaders(Map metadata)
- {
log.debug("getMimeHeaders from: " + metadata);
MimeHeaders headers = new MimeHeaders();
- Iterator i = metadata.keySet().iterator();
- while (i.hasNext())
+ for (String key : metadata.keySet())
{
- String key = (String)i.next();
Object value = metadata.get(key);
if (key != null && value instanceof List)
{
- for (Object listValue : (List)value)
+ for (Object listValue : (List<?>)value)
{
headers.addHeader(key, listValue.toString());
}
Modified: stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/utils/ThreadLocalAssociation.java
===================================================================
--- stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/utils/ThreadLocalAssociation.java 2009-07-04 14:37:52 UTC (rev 10314)
+++ stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/utils/ThreadLocalAssociation.java 2009-07-04 14:44:05 UTC (rev 10315)
@@ -42,17 +42,17 @@
* SOAP message context
* @see org.jboss.ws.core.soap.MessageContextAssociation
*/
- private static ThreadLocal<Stack<CommonMessageContext>> msgContextAssoc = new ThreadLocal<Stack<CommonMessageContext>>();
+ private static ThreadLocal<Stack<CommonMessageContext>> msgContextAssoc = new InheritableThreadLocal<Stack<CommonMessageContext>>();
/**
* @see org.jboss.ws.extensions.security.STRTransform
*/
- private static ThreadLocal<SecurityStore> strTransformAssoc = new ThreadLocal<SecurityStore>();
+ private static ThreadLocal<SecurityStore> strTransformAssoc = new InheritableThreadLocal<SecurityStore>();
/**
* Public keys used to sign incoming message
*/
- private static ThreadLocal<List<PublicKey>> signatureKeysAssoc = new ThreadLocal<List<PublicKey>>();
+ private static ThreadLocal<List<PublicKey>> signatureKeysAssoc = new InheritableThreadLocal<List<PublicKey>>();
public static ThreadLocal<Stack<CommonMessageContext>> localMsgContextAssoc()
{
Modified: stack/native/trunk/modules/core/src/main/java/org/jboss/ws/extensions/wsrm/transport/RMChannelTask.java
===================================================================
--- stack/native/trunk/modules/core/src/main/java/org/jboss/ws/extensions/wsrm/transport/RMChannelTask.java 2009-07-04 14:37:52 UTC (rev 10314)
+++ stack/native/trunk/modules/core/src/main/java/org/jboss/ws/extensions/wsrm/transport/RMChannelTask.java 2009-07-04 14:44:05 UTC (rev 10315)
@@ -23,15 +23,13 @@
import java.io.IOException;
import java.net.URI;
+import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.Callable;
import org.jboss.logging.Logger;
-import org.jboss.remoting.CannotConnectException;
-import org.jboss.remoting.Client;
-import org.jboss.remoting.InvokerLocator;
-import org.jboss.remoting.marshal.MarshalFactory;
import org.jboss.ws.core.MessageTrace;
+import org.jboss.ws.core.client.NettyClient;
import org.jboss.ws.extensions.wsrm.RMClientSequence;
import org.jboss.ws.extensions.wsrm.transport.backchannel.RMCallbackHandler;
import org.jboss.ws.extensions.wsrm.transport.backchannel.RMCallbackHandlerFactory;
@@ -44,7 +42,6 @@
final class RMChannelTask implements Callable<RMChannelResponse>
{
private static final Logger logger = Logger.getLogger(RMChannelTask.class);
- private static final String JBOSSWS_SUBSYSTEM = "jbossws-wsrm";
private final RMMessage rmRequest;
RMChannelTask(RMMessage rmRequest)
@@ -58,14 +55,6 @@
try
{
String targetAddress = (String)rmRequest.getMetadata().getContext(RMChannelConstants.INVOCATION_CONTEXT).get(RMChannelConstants.TARGET_ADDRESS);
- String version = (String)rmRequest.getMetadata().getContext(RMChannelConstants.INVOCATION_CONTEXT).get(RMChannelConstants.REMOTING_VERSION);
-
- if (version.startsWith("1.4"))
- {
- MarshalFactory.addMarshaller("JBossWSMessage", RMMarshaller.getInstance(), RMUnMarshaller.getInstance());
- }
-
- InvokerLocator locator = new InvokerLocator(targetAddress);
URI backPort = RMTransportHelper.getBackPortURI(rmRequest);
String messageId = RMTransportHelper.getAddressingMessageId(rmRequest);
@@ -83,39 +72,19 @@
}
boolean oneWay = RMTransportHelper.isOneWayOperation(rmRequest);
- Client client = new Client(locator, JBOSSWS_SUBSYSTEM, rmRequest.getMetadata().getContext(RMChannelConstants.REMOTING_CONFIGURATION_CONTEXT));
- client.connect();
-
- client.setMarshaller(RMMarshaller.getInstance());
-
- if ((false == oneWay) && (null == backPort))
- client.setUnMarshaller(RMUnMarshaller.getInstance());
-
- Map<String, Object> remotingInvocationContext = rmRequest.getMetadata().getContext(RMChannelConstants.REMOTING_INVOCATION_CONTEXT);
-
- // debug the outgoing request message
- MessageTrace.traceMessage("Outgoing RM Request Message", rmRequest.getPayload());
-
+ NettyClient client = new NettyClient(RMMarshaller.getInstance(), RMUnMarshaller.getInstance());
+ Map<String, Object> additionalHeaders = rmRequest.getMetadata().getContext(RMChannelConstants.REMOTING_INVOCATION_CONTEXT);
+ Map<String, Object> callProps = new HashMap<String, Object>();
+ callProps.putAll(rmRequest.getMetadata().getContext(RMChannelConstants.INVOCATION_CONTEXT));
+
RMMessage rmResponse = null;
if (oneWay && (null == backPort))
{
- client.invokeOneway(rmRequest.getPayload(), remotingInvocationContext, false);
+ client.invoke(rmRequest.getPayload(), targetAddress, false, additionalHeaders, callProps);
}
else
{
- Object retVal = null;
- try
- {
- retVal = client.invoke(rmRequest.getPayload(), remotingInvocationContext);
- }
- catch (CannotConnectException cce)
- {
- // remoting hack - ignore NullPointerException cause
- if (false == (cce.getCause() instanceof NullPointerException))
- {
- throw cce;
- }
- }
+ Object retVal = client.invoke(rmRequest.getPayload(), targetAddress, true, additionalHeaders, callProps);
if ((null != retVal) && (false == (retVal instanceof RMMessage)))
{
String msg = retVal.getClass().getName() + ": '" + retVal + "'";
@@ -124,10 +93,8 @@
}
rmResponse = (RMMessage)retVal;
}
+ rmRequest.getMetadata().getContext(RMChannelConstants.INVOCATION_CONTEXT).putAll(callProps);
- // Disconnect the remoting client
- client.disconnect();
-
// trace the incomming response message
if ((rmResponse != null) && (backPort == null))
MessageTrace.traceMessage("Incoming RM Response Message", rmResponse.getPayload());
@@ -148,4 +115,4 @@
return new RMChannelResponse(t);
}
}
-}
+}
\ No newline at end of file
Modified: stack/native/trunk/modules/core/src/main/java/org/jboss/ws/extensions/wsrm/transport/RMMarshaller.java
===================================================================
--- stack/native/trunk/modules/core/src/main/java/org/jboss/ws/extensions/wsrm/transport/RMMarshaller.java 2009-07-04 14:37:52 UTC (rev 10314)
+++ stack/native/trunk/modules/core/src/main/java/org/jboss/ws/extensions/wsrm/transport/RMMarshaller.java 2009-07-04 14:44:05 UTC (rev 10315)
@@ -24,9 +24,7 @@
import java.io.IOException;
import java.io.OutputStream;
-import org.jboss.remoting.InvocationRequest;
-import org.jboss.remoting.invocation.OnewayInvocation;
-import org.jboss.remoting.marshal.Marshaller;
+import org.jboss.ws.core.client.Marshaller;
/**
* Marshalls byte array to the output stream
@@ -49,12 +47,6 @@
public void write(Object dataObject, OutputStream output) throws IOException
{
- if (dataObject instanceof InvocationRequest)
- dataObject = ((InvocationRequest)dataObject).getParameter();
-
- if (dataObject instanceof OnewayInvocation)
- dataObject = ((OnewayInvocation)dataObject).getParameters()[0];
-
if ((dataObject instanceof byte[]) == false)
throw new IllegalArgumentException("Not a byte array: " + dataObject);
Modified: stack/native/trunk/modules/core/src/main/java/org/jboss/ws/extensions/wsrm/transport/RMMessageAssembler.java
===================================================================
--- stack/native/trunk/modules/core/src/main/java/org/jboss/ws/extensions/wsrm/transport/RMMessageAssembler.java 2009-07-04 14:37:52 UTC (rev 10314)
+++ stack/native/trunk/modules/core/src/main/java/org/jboss/ws/extensions/wsrm/transport/RMMessageAssembler.java 2009-07-04 14:44:05 UTC (rev 10315)
@@ -28,9 +28,9 @@
import java.io.InputStream;
import java.util.Map;
-import org.jboss.remoting.marshal.Marshaller;
-import org.jboss.remoting.marshal.UnMarshaller;
import org.jboss.ws.core.MessageAbstraction;
+import org.jboss.ws.core.client.Marshaller;
+import org.jboss.ws.core.client.UnMarshaller;
/**
* Translates JBoss messages to RM sources and vice-versa.
Modified: stack/native/trunk/modules/core/src/main/java/org/jboss/ws/extensions/wsrm/transport/RMMetadata.java
===================================================================
--- stack/native/trunk/modules/core/src/main/java/org/jboss/ws/extensions/wsrm/transport/RMMetadata.java 2009-07-04 14:37:52 UTC (rev 10314)
+++ stack/native/trunk/modules/core/src/main/java/org/jboss/ws/extensions/wsrm/transport/RMMetadata.java 2009-07-04 14:44:05 UTC (rev 10315)
@@ -23,9 +23,10 @@
import java.util.Map;
import java.util.HashMap;
-import org.jboss.remoting.marshal.Marshaller;
-import org.jboss.remoting.marshal.UnMarshaller;
+import org.jboss.ws.core.client.Marshaller;
+import org.jboss.ws.core.client.UnMarshaller;
+
/**
* RM metadata heavily used by this RM transport
*
@@ -36,19 +37,16 @@
private Map<String, Map<String, Object>> contexts = new HashMap<String, Map<String, Object>>();
public RMMetadata(
- String remotingVersion,
String targetAddress,
Marshaller marshaller,
UnMarshaller unmarshaller,
Map<String, Object> invocationContext,
- Map<String, Object> remotingInvocationContext,
- Map<String, Object> remotingConfigurationContext)
+ Map<String, Object> remotingInvocationContext)
{
if (targetAddress == null)
throw new IllegalArgumentException("Target address cannot be null");
invocationContext.put(RMChannelConstants.TARGET_ADDRESS, targetAddress);
- invocationContext.put(RMChannelConstants.REMOTING_VERSION, remotingVersion);
setContext(RMChannelConstants.INVOCATION_CONTEXT, invocationContext);
if (marshaller == null || unmarshaller == null)
@@ -63,11 +61,6 @@
throw new IllegalArgumentException("Remoting invocation context cannot be null");
setContext(RMChannelConstants.REMOTING_INVOCATION_CONTEXT, remotingInvocationContext);
-
- if (remotingConfigurationContext == null)
- throw new IllegalArgumentException("Remoting configuraton context cannot be null");
-
- setContext(RMChannelConstants.REMOTING_CONFIGURATION_CONTEXT, remotingConfigurationContext);
}
public RMMetadata(Map<String, Object> remotingInvocationContext)
Modified: stack/native/trunk/modules/core/src/main/java/org/jboss/ws/extensions/wsrm/transport/RMSender.java
===================================================================
--- stack/native/trunk/modules/core/src/main/java/org/jboss/ws/extensions/wsrm/transport/RMSender.java 2009-07-04 14:37:52 UTC (rev 10314)
+++ stack/native/trunk/modules/core/src/main/java/org/jboss/ws/extensions/wsrm/transport/RMSender.java 2009-07-04 14:44:05 UTC (rev 10315)
@@ -33,7 +33,7 @@
import javax.servlet.http.HttpServletResponse;
import org.jboss.logging.Logger;
-import org.jboss.remoting.transport.http.HTTPMetadataConstants;
+import org.jboss.ws.core.client.NettyClient;
import org.jboss.ws.extensions.wsrm.api.RMException;
import org.jboss.ws.extensions.wsrm.config.RMMessageRetransmissionConfig;
@@ -124,7 +124,7 @@
Map<String, Object> remotingCtx = result.getResponse().getMetadata().getContext(RMChannelConstants.REMOTING_INVOCATION_CONTEXT);
if (remotingCtx != null)
{
- if (Integer.valueOf(HttpServletResponse.SC_INTERNAL_SERVER_ERROR).equals(remotingCtx.get(HTTPMetadataConstants.RESPONSE_CODE)))
+ if (Integer.valueOf(HttpServletResponse.SC_INTERNAL_SERVER_ERROR).equals(remotingCtx.get(NettyClient.RESPONSE_CODE)))
{
logger.debug("Response message received in " + (endTime - startTime) + " miliseconds, but contains internal server code, going to resend the request message");
continue;
Modified: stack/native/trunk/modules/core/src/main/java/org/jboss/ws/extensions/wsrm/transport/RMUnMarshaller.java
===================================================================
--- stack/native/trunk/modules/core/src/main/java/org/jboss/ws/extensions/wsrm/transport/RMUnMarshaller.java 2009-07-04 14:37:52 UTC (rev 10314)
+++ stack/native/trunk/modules/core/src/main/java/org/jboss/ws/extensions/wsrm/transport/RMUnMarshaller.java 2009-07-04 14:44:05 UTC (rev 10315)
@@ -26,7 +26,7 @@
import java.io.InputStream;
import java.util.Map;
-import org.jboss.remoting.marshal.UnMarshaller;
+import org.jboss.ws.core.client.UnMarshaller;
/**
* Unmarshalls byte array from the input stream
@@ -41,13 +41,13 @@
{
return getInstance();
}
-
+
public static UnMarshaller getInstance()
{
return instance;
}
-
- public Object read(InputStream is, Map metadata) throws IOException, ClassNotFoundException
+
+ public Object read(InputStream is, Map metadata) throws IOException
{
if (is == null)
return RMMessageFactory.newMessage(null, new RMMetadata(metadata)); // TODO: investigate why is == null (WSAddressing reply-to test)
@@ -64,10 +64,4 @@
return RMMessageFactory.newMessage(baos.toByteArray(), new RMMetadata(metadata));
}
- public void setClassLoader(ClassLoader classloader)
- {
- // do nothing
- }
-
}
-
Modified: stack/native/trunk/modules/core/src/main/java/org/jboss/ws/extensions/wsrm/transport/backchannel/RMBackPortsInvocationHandler.java
===================================================================
--- stack/native/trunk/modules/core/src/main/java/org/jboss/ws/extensions/wsrm/transport/backchannel/RMBackPortsInvocationHandler.java 2009-07-04 14:37:52 UTC (rev 10314)
+++ stack/native/trunk/modules/core/src/main/java/org/jboss/ws/extensions/wsrm/transport/backchannel/RMBackPortsInvocationHandler.java 2009-07-04 14:44:05 UTC (rev 10315)
@@ -21,76 +21,179 @@
*/
package org.jboss.ws.extensions.wsrm.transport.backchannel;
+import java.net.URL;
+import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
+import java.util.Map;
+import java.util.Set;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
-import javax.management.MBeanServer;
-
import org.jboss.logging.Logger;
-import org.jboss.remoting.InvocationRequest;
-import org.jboss.remoting.ServerInvocationHandler;
-import org.jboss.remoting.ServerInvoker;
-import org.jboss.remoting.callback.InvokerCallbackHandler;
-import org.jboss.remoting.transport.coyote.RequestMap;
-import org.jboss.remoting.transport.http.HTTPMetadataConstants;
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.jboss.netty.buffer.ChannelBufferInputStream;
+import org.jboss.netty.channel.ChannelHandlerContext;
+import org.jboss.netty.channel.ChannelStateEvent;
+import org.jboss.netty.channel.ExceptionEvent;
+import org.jboss.netty.channel.MessageEvent;
+import org.jboss.netty.channel.SimpleChannelUpstreamHandler;
+import org.jboss.netty.handler.codec.http.Cookie;
+import org.jboss.netty.handler.codec.http.CookieDecoder;
+import org.jboss.netty.handler.codec.http.CookieEncoder;
+import org.jboss.netty.handler.codec.http.DefaultHttpResponse;
+import org.jboss.netty.handler.codec.http.HttpHeaders;
+import org.jboss.netty.handler.codec.http.HttpRequest;
+import org.jboss.netty.handler.codec.http.HttpResponse;
+import org.jboss.netty.handler.codec.http.HttpResponseStatus;
+import org.jboss.netty.handler.codec.http.HttpVersion;
+import org.jboss.ws.extensions.wsrm.transport.RMMessage;
+import org.jboss.ws.extensions.wsrm.transport.RMUnMarshaller;
/**
* TODO: Add comment
*
* @author richard.opalka at jboss.com
+ * @author alessio.soldano at jboss.com
*
* @since Nov 20, 2007
*/
-public final class RMBackPortsInvocationHandler implements ServerInvocationHandler
+public final class RMBackPortsInvocationHandler extends SimpleChannelUpstreamHandler
{
private static final Logger LOG = Logger.getLogger(RMBackPortsInvocationHandler.class);
private final List<RMCallbackHandler> callbacks = new LinkedList<RMCallbackHandler>();
private final Lock lock = new ReentrantLock();
-
+
+
public RMBackPortsInvocationHandler()
{
}
- public RMCallbackHandler getCallback(String requestPath)
+ @Override
+ public void channelOpen(ChannelHandlerContext ctx, ChannelStateEvent e)
{
+ // HERE: Add all accepted channels to the group
+ // so that they are closed properly on shutdown
+ // If the added channel is closed before shutdown,
+ // it will be removed from the group automatically.
+ RMBackPortsServer.channelGroup.add(ctx.getChannel());
+ }
+
+ @Override
+ public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception
+ {
+ HttpRequest request = (HttpRequest)e.getMessage();
+ ChannelBuffer content = request.getContent();
+
+ Map<String, Object> requestHeaders = new HashMap<String, Object>();
+ for (String headerName : request.getHeaderNames())
+ {
+ requestHeaders.put(headerName, request.getHeaders(headerName));
+ }
+ boolean error = false;
+ try
+ {
+ String requestPath = new URL(request.getUri()).getPath();
+ RMMessage message = (RMMessage)RMUnMarshaller.getInstance().read(content.readable() ? new ChannelBufferInputStream(content) : null, requestHeaders);
+ handle(requestPath, message);
+ }
+ catch (Throwable t)
+ {
+ error = true;
+ LOG.error("Error decoding request to the backport", t);
+ }
+ finally
+ {
+ writeResponse(e, request, error);
+ }
+ }
+
+
+ private void handle(String requestPath, RMMessage message)
+ {
this.lock.lock();
try
{
+ boolean handlerExists = false;
for (RMCallbackHandler handler : this.callbacks)
{
if (handler.getHandledPath().equals(requestPath))
- return handler;
+ {
+ handlerExists = true;
+ LOG.debug("Handling request path: " + requestPath);
+ handler.handle(message);
+ break;
+ }
}
+ if (handlerExists == false)
+ LOG.warn("No callback handler registered for path: " + requestPath);
}
finally
{
this.lock.unlock();
}
+ }
+
+ private void writeResponse(MessageEvent e, HttpRequest request, boolean error)
+ {
+ // Build the response object.
+ HttpResponse response = new DefaultHttpResponse(HttpVersion.HTTP_1_1, error ? HttpResponseStatus.INTERNAL_SERVER_ERROR : HttpResponseStatus.OK);
+ response.setHeader(HttpHeaders.Names.CONTENT_TYPE, "text/plain; charset=UTF-8");
- return null;
+ String cookieString = request.getHeader(HttpHeaders.Names.COOKIE);
+ if (cookieString != null)
+ {
+ CookieDecoder cookieDecoder = new CookieDecoder();
+ Set<Cookie> cookies = cookieDecoder.decode(cookieString);
+ if (!cookies.isEmpty())
+ {
+ // Reset the cookies if necessary.
+ CookieEncoder cookieEncoder = new CookieEncoder(true);
+ for (Cookie cookie : cookies)
+ {
+ cookieEncoder.addCookie(cookie);
+ }
+ response.addHeader(HttpHeaders.Names.SET_COOKIE, cookieEncoder.encode());
+ }
+ }
+
+ // Write the response.
+ e.getChannel().write(response);
+ e.getChannel().close();
}
- public void registerCallback(RMCallbackHandler callbackHandler)
+ @Override
+ public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) throws Exception
{
+ e.getCause().printStackTrace();
+ e.getChannel().close();
+ }
+
+ public RMCallbackHandler getCallback(String requestPath)
+ {
this.lock.lock();
try
{
- this.callbacks.add(callbackHandler);
+ for (RMCallbackHandler handler : this.callbacks)
+ {
+ if (handler.getHandledPath().equals(requestPath))
+ return handler;
+ }
}
finally
{
this.lock.unlock();
}
+
+ return null;
}
- public void unregisterCallback(RMCallbackHandler callbackHandler)
+ public void registerCallback(RMCallbackHandler callbackHandler)
{
this.lock.lock();
try
{
- this.callbacks.remove(callbackHandler);
+ this.callbacks.add(callbackHandler);
}
finally
{
@@ -98,53 +201,16 @@
}
}
- public Object invoke(InvocationRequest request) throws Throwable
+ public void unregisterCallback(RMCallbackHandler callbackHandler)
{
this.lock.lock();
try
{
- RequestMap rm = (RequestMap)request.getRequestPayload();
- String requestPath = (String)rm.get(HTTPMetadataConstants.PATH);
- boolean handlerExists = false;
- for (RMCallbackHandler handler : this.callbacks)
- {
- if (handler.getHandledPath().equals(requestPath))
- {
- handlerExists = true;
- LOG.debug("Handling request path: " + requestPath);
- handler.handle(request);
- break;
- }
- }
- if (handlerExists == false)
- LOG.warn("No callback handler registered for path: " + requestPath);
-
- return null;
+ this.callbacks.remove(callbackHandler);
}
finally
{
this.lock.unlock();
}
}
-
- public void addListener(InvokerCallbackHandler callbackHandler)
- {
- // do nothing - we're using custom callback handlers
- }
-
- public void removeListener(InvokerCallbackHandler callbackHandler)
- {
- // do nothing - we're using custom callback handlers
- }
-
- public void setInvoker(ServerInvoker arg0)
- {
- // do nothing
- }
-
- public void setMBeanServer(MBeanServer arg0)
- {
- // do nothing
- }
-
}
Modified: stack/native/trunk/modules/core/src/main/java/org/jboss/ws/extensions/wsrm/transport/backchannel/RMBackPortsServer.java
===================================================================
--- stack/native/trunk/modules/core/src/main/java/org/jboss/ws/extensions/wsrm/transport/backchannel/RMBackPortsServer.java 2009-07-04 14:37:52 UTC (rev 10314)
+++ stack/native/trunk/modules/core/src/main/java/org/jboss/ws/extensions/wsrm/transport/backchannel/RMBackPortsServer.java 2009-07-04 14:44:05 UTC (rev 10315)
@@ -21,20 +21,26 @@
*/
package org.jboss.ws.extensions.wsrm.transport.backchannel;
+import java.net.InetSocketAddress;
+import java.util.concurrent.Executors;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import org.jboss.logging.Logger;
-import org.jboss.remoting.InvokerLocator;
-import org.jboss.remoting.transport.Connector;
+import org.jboss.netty.bootstrap.ServerBootstrap;
+import org.jboss.netty.channel.Channel;
+import org.jboss.netty.channel.ChannelFactory;
+import org.jboss.netty.channel.group.ChannelGroup;
+import org.jboss.netty.channel.group.DefaultChannelGroup;
+import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory;
+import org.jboss.ws.core.client.WSServerPipelineFactory;
import org.jboss.ws.extensions.wsrm.api.RMException;
-import org.jboss.ws.extensions.wsrm.transport.RMMarshaller;
-import org.jboss.ws.extensions.wsrm.transport.RMUnMarshaller;
/**
* Back ports server used by addressable clients
*
* @author richard.opalka at jboss.com
+ * @author alessio.soldano at jboss.com
*
* @since Nov 20, 2007
*/
@@ -44,9 +50,9 @@
private static final Lock CLASS_LOCK = new ReentrantLock();
private static final long WAIT_PERIOD = 100;
private static RMBackPortsServer INSTANCE;
+ static final ChannelGroup channelGroup = new DefaultChannelGroup("rmBackPortsServer");
private final Object instanceLock = new Object();
- private final Connector connector;
private final String scheme;
private final String host;
private final int port;
@@ -54,6 +60,7 @@
private boolean started;
private boolean stopped;
private boolean terminated;
+ private ChannelFactory factory;
public final void registerCallback(RMCallbackHandler callbackHandler)
{
@@ -70,8 +77,7 @@
return this.handler.getCallback(requestPath);
}
- private RMBackPortsServer(String scheme, String host, int port)
- throws RMException
+ private RMBackPortsServer(String scheme, String host, int port) throws RMException
{
super();
this.scheme = scheme;
@@ -79,17 +85,19 @@
this.port = port;
try
{
- // we have to use custom unmarshaller because default one removes CRNLs
- String customUnmarshaller = "/?unmarshaller=" + RMUnMarshaller.class.getName();
- InvokerLocator il = new InvokerLocator(this.scheme + "://" + this.host + ":" + this.port + customUnmarshaller);
- this.connector = new Connector();
- this.connector.setInvokerLocator(il.getLocatorURI());
- this.connector.create();
-
+ factory = new NioServerSocketChannelFactory(Executors.newCachedThreadPool(), Executors.newCachedThreadPool());
+
+ ServerBootstrap bootstrap = new ServerBootstrap(factory);
this.handler = new RMBackPortsInvocationHandler();
- this.connector.addInvocationHandler("wsrmBackPortsHandler", this.handler);
- this.connector.start();
- LOG.debug("WS-RM Backports Server started on: " + il.getLocatorURI());
+ WSServerPipelineFactory channelPipelineFactory = new WSServerPipelineFactory();
+ channelPipelineFactory.setRequestHandler(this.handler);
+ bootstrap.setPipelineFactory(channelPipelineFactory);
+ bootstrap.setOption("child.tcpNoDelay", true);
+ bootstrap.setOption("child.keepAlive", true);
+ // Bind and start to accept incoming connections.
+ Channel c = bootstrap.bind(new InetSocketAddress(this.port));
+ channelGroup.add(c);
+ LOG.debug("WS-RM Backports Server started on port: " + this.port);
}
catch (Exception e)
{
@@ -136,7 +144,13 @@
}
try
{
- connector.stop();
+ //Close all connections and server sockets.
+ channelGroup.close().awaitUninterruptibly();
+ //Shutdown the selector loop (boss and worker).
+ if (factory != null)
+ {
+ factory.releaseExternalResources();
+ }
}
finally
{
@@ -178,8 +192,7 @@
* @return WS-RM back ports server
* @throws RMException
*/
- public static RMBackPortsServer getInstance(String scheme, String host, int port)
- throws RMException
+ public static RMBackPortsServer getInstance(String scheme, String host, int port) throws RMException
{
CLASS_LOCK.lock();
try
Modified: stack/native/trunk/modules/core/src/main/java/org/jboss/ws/extensions/wsrm/transport/backchannel/RMCallbackHandler.java
===================================================================
--- stack/native/trunk/modules/core/src/main/java/org/jboss/ws/extensions/wsrm/transport/backchannel/RMCallbackHandler.java 2009-07-04 14:37:52 UTC (rev 10314)
+++ stack/native/trunk/modules/core/src/main/java/org/jboss/ws/extensions/wsrm/transport/backchannel/RMCallbackHandler.java 2009-07-04 14:44:05 UTC (rev 10315)
@@ -21,7 +21,6 @@
*/
package org.jboss.ws.extensions.wsrm.transport.backchannel;
-import org.jboss.remoting.InvocationRequest;
import org.jboss.ws.extensions.wsrm.transport.RMMessage;
import org.jboss.ws.extensions.wsrm.transport.RMUnassignedMessageListener;
@@ -35,7 +34,7 @@
public interface RMCallbackHandler
{
String getHandledPath();
- void handle(InvocationRequest payload);
+ void handle(RMMessage message);
RMMessage getMessage(String messageId);
Throwable getFault(String messageId);
void addUnassignedMessageListener(RMUnassignedMessageListener listener);
Modified: stack/native/trunk/modules/core/src/main/java/org/jboss/ws/extensions/wsrm/transport/backchannel/RMCallbackHandlerImpl.java
===================================================================
--- stack/native/trunk/modules/core/src/main/java/org/jboss/ws/extensions/wsrm/transport/backchannel/RMCallbackHandlerImpl.java 2009-07-04 14:37:52 UTC (rev 10314)
+++ stack/native/trunk/modules/core/src/main/java/org/jboss/ws/extensions/wsrm/transport/backchannel/RMCallbackHandlerImpl.java 2009-07-04 14:44:05 UTC (rev 10315)
@@ -27,7 +27,6 @@
import java.util.Map;
import org.jboss.logging.Logger;
-import org.jboss.remoting.InvocationRequest;
import org.jboss.ws.core.MessageTrace;
import org.jboss.ws.extensions.wsrm.transport.RMMessage;
import org.jboss.ws.extensions.wsrm.transport.RMUnassignedMessageListener;
@@ -70,9 +69,8 @@
return this.handledPath;
}
- public final void handle(InvocationRequest request)
+ public final void handle(RMMessage message)
{
- RMMessage message = (RMMessage)request.getParameter();
synchronized (instanceLock)
{
String requestMessage = new String(message.getPayload());
Modified: stack/native/trunk/modules/resources/src/main/resources/bin/wsrunclient.bat
===================================================================
--- stack/native/trunk/modules/resources/src/main/resources/bin/wsrunclient.bat 2009-07-04 14:37:52 UTC (rev 10314)
+++ stack/native/trunk/modules/resources/src/main/resources/bin/wsrunclient.bat 2009-07-04 14:44:05 UTC (rev 10315)
@@ -53,6 +53,7 @@
set WSRUNCLIENT_CLASSPATH=%WSRUNCLIENT_CLASSPATH%;%JBOSS_HOME%/client/FastInfoset.jar
set WSRUNCLIENT_CLASSPATH=%WSRUNCLIENT_CLASSPATH%;%JBOSS_HOME%/client/log4j.jar
set WSRUNCLIENT_CLASSPATH=%WSRUNCLIENT_CLASSPATH%;%JBOSS_HOME%/client/mail.jar
+set WSRUNCLIENT_CLASSPATH=%WSRUNCLIENT_CLASSPATH%;%JBOSS_HOME%/client/netty.jar
set WSRUNCLIENT_CLASSPATH=%WSRUNCLIENT_CLASSPATH%;%JBOSS_HOME%/client/policy.jar
set WSRUNCLIENT_CLASSPATH=%WSRUNCLIENT_CLASSPATH%;%JBOSS_HOME%/client/stax-api.jar
set WSRUNCLIENT_CLASSPATH=%WSRUNCLIENT_CLASSPATH%;%JBOSS_HOME%/client/xmlsec.jar
Modified: stack/native/trunk/modules/resources/src/main/resources/bin/wsrunclient.sh
===================================================================
--- stack/native/trunk/modules/resources/src/main/resources/bin/wsrunclient.sh 2009-07-04 14:37:52 UTC (rev 10314)
+++ stack/native/trunk/modules/resources/src/main/resources/bin/wsrunclient.sh 2009-07-04 14:44:05 UTC (rev 10315)
@@ -80,6 +80,7 @@
WSRUNCLIENT_CLASSPATH="$WSRUNCLIENT_CLASSPATH:$JBOSS_HOME/client/FastInfoset.jar"
WSRUNCLIENT_CLASSPATH="$WSRUNCLIENT_CLASSPATH:$JBOSS_HOME/client/log4j.jar"
WSRUNCLIENT_CLASSPATH="$WSRUNCLIENT_CLASSPATH:$JBOSS_HOME/client/mail.jar"
+WSRUNCLIENT_CLASSPATH="$WSRUNCLIENT_CLASSPATH:$JBOSS_HOME/client/netty.jar"
WSRUNCLIENT_CLASSPATH="$WSRUNCLIENT_CLASSPATH:$JBOSS_HOME/client/policy.jar"
WSRUNCLIENT_CLASSPATH="$WSRUNCLIENT_CLASSPATH:$JBOSS_HOME/client/stax-api.jar"
WSRUNCLIENT_CLASSPATH="$WSRUNCLIENT_CLASSPATH:$JBOSS_HOME/client/xmlsec.jar"
Modified: stack/native/trunk/modules/resources/src/main/resources/bin/wstools.bat
===================================================================
--- stack/native/trunk/modules/resources/src/main/resources/bin/wstools.bat 2009-07-04 14:37:52 UTC (rev 10314)
+++ stack/native/trunk/modules/resources/src/main/resources/bin/wstools.bat 2009-07-04 14:44:05 UTC (rev 10315)
@@ -18,6 +18,7 @@
set WSTOOLS_CLASSPATH=%WSTOOLS_CLASSPATH%;%JAVA_HOME%/lib/tools.jar
set WSTOOLS_CLASSPATH=%WSTOOLS_CLASSPATH%;%JBOSS_HOME%/client/activation.jar
set WSTOOLS_CLASSPATH=%WSTOOLS_CLASSPATH%;%JBOSS_HOME%/client/getopt.jar
+set WSTOOLS_CLASSPATH=%WSTOOLS_CLASSPATH%;%JBOSS_HOME%/client/netty.jar
set WSTOOLS_CLASSPATH=%WSTOOLS_CLASSPATH%;%JBOSS_HOME%/client/wstx.jar
set WSTOOLS_CLASSPATH=%WSTOOLS_CLASSPATH%;%JBOSS_HOME%/client/wsdl4j.jar
set WSTOOLS_CLASSPATH=%WSTOOLS_CLASSPATH%;%JBOSS_HOME%/client/jbossall-client.jar
Modified: stack/native/trunk/modules/resources/src/main/resources/bin/wstools.sh
===================================================================
--- stack/native/trunk/modules/resources/src/main/resources/bin/wstools.sh 2009-07-04 14:37:52 UTC (rev 10314)
+++ stack/native/trunk/modules/resources/src/main/resources/bin/wstools.sh 2009-07-04 14:44:05 UTC (rev 10315)
@@ -48,6 +48,7 @@
WSTOOLS_CLASSPATH="$WSTOOLS_CLASSPATH:$JAVA_HOME/lib/tools.jar"
WSTOOLS_CLASSPATH="$WSTOOLS_CLASSPATH:$JBOSS_HOME/client/activation.jar"
WSTOOLS_CLASSPATH="$WSTOOLS_CLASSPATH:$JBOSS_HOME/client/getopt.jar"
+WSTOOLS_CLASSPATH="$WSTOOLS_CLASSPATH:$JBOSS_HOME/client/netty.jar"
WSTOOLS_CLASSPATH="$WSTOOLS_CLASSPATH:$JBOSS_HOME/client/wstx.jar"
WSTOOLS_CLASSPATH="$WSTOOLS_CLASSPATH:$JBOSS_HOME/client/wsdl4j.jar"
WSTOOLS_CLASSPATH="$WSTOOLS_CLASSPATH:$JBOSS_HOME/client/jbossall-client.jar"
Modified: stack/native/trunk/modules/resources/src/main/resources/resources/default-deploy.conf
===================================================================
--- stack/native/trunk/modules/resources/src/main/resources/resources/default-deploy.conf 2009-07-04 14:37:52 UTC (rev 10314)
+++ stack/native/trunk/modules/resources/src/main/resources/resources/default-deploy.conf 2009-07-04 14:44:05 UTC (rev 10315)
@@ -1 +1 @@
-bin/wsconsume.bat bin/wsconsume.sh bin/wsprovide.bat bin/wsprovide.sh bin/wsrunclient.bat bin/wsrunclient.sh bin/wstools.bat bin/wstools.sh client/jettison.jar client/jaxb-api.jar client/jaxb-impl.jar client/jaxb-xjc.jar client/jaxws-rt.jar client/jaxws-tools.jar client/jboss-jaxrpc.jar client/jboss-jaxws-ext.jar client/jboss-jaxws.jar client/jboss-saaj.jar client/jbossws-native-jaxrpc.jar client/jbossws-native-jaxws-ext.jar client/jbossws-native-jaxws.jar client/jbossws-native-saaj.jar client/jbossws-client.jar client/jbossws-native-client.jar client/jbossws-native-core.jar client/jbossws-common.jar client/jbossws-framework.jar client/jbossws-spi.jar client/policy.jar client/stax-ex.jar client/streambuffer.jar client/wsdl4j.jar lib/jaxb-api.jar lib/jaxb-impl.jar common/lib/jboss-jaxrpc.jar common/lib/jboss-jaxws-ext.jar common/lib/jboss-jaxws.jar common/lib/jboss-saaj.jar common/lib/jbossws-native-jaxrpc.jar common/lib/jbossws-native-jaxws-ext.jar common/lib/jbossws-native!
-jaxws.jar common/lib/jbossws-native-saaj.jar common/lib/jbossws-common.jar common/lib/jbossws-framework.jar common/lib/jbossws-spi.jar server/default/deploy/jbossws.sar server/default/deploy/juddi-service.sar server/default/deploy/jbossws-container-jboss-beans.xml server/default/deployers/jbossws.deployer/FastInfoset.jar server/default/deployers/jbossws.deployer/jboss-jaxb-intros.jar server/default/deployers/jbossws.deployer/jbossws-native-core.jar server/default/deployers/jbossws.deployer/jettison.jar server/default/deployers/jbossws.deployer/policy.jar server/default/deployers/jbossws.deployer/wsdl4j.jar server/default/deployers/jbossws.deployer/xmlsec.jar server/default/deployers/jbossws.deployer/META-INF/jbossws-container-jboss-beans.xml lib/endorsed/jbossws-native-* lib/endorsed/jaxb-api.jar
+bin/wsconsume.bat bin/wsconsume.sh bin/wsprovide.bat bin/wsprovide.sh bin/wsrunclient.bat bin/wsrunclient.sh bin/wstools.bat bin/wstools.sh client/jettison.jar client/jaxb-api.jar client/jaxb-impl.jar client/jaxb-xjc.jar client/jaxws-rt.jar client/jaxws-tools.jar client/jboss-jaxrpc.jar client/jboss-jaxws-ext.jar client/jboss-jaxws.jar client/jboss-saaj.jar client/jbossws-native-jaxrpc.jar client/jbossws-native-jaxws-ext.jar client/jbossws-native-jaxws.jar client/jbossws-native-saaj.jar client/jbossws-client.jar client/jbossws-native-client.jar client/jbossws-native-core.jar client/jbossws-common.jar client/jbossws-framework.jar client/jbossws-spi.jar client/netty.jar client/policy.jar client/stax-ex.jar client/streambuffer.jar client/wsdl4j.jar lib/jaxb-api.jar lib/jaxb-impl.jar common/lib/jboss-jaxrpc.jar common/lib/jboss-jaxws-ext.jar common/lib/jboss-jaxws.jar common/lib/jboss-saaj.jar common/lib/jbossws-native-jaxrpc.jar common/lib/jbossws-native-jaxws-ext.jar common/l!
ib/jbossws-native-jaxws.jar common/lib/jbossws-native-saaj.jar common/lib/jbossws-common.jar common/lib/jbossws-framework.jar common/lib/jbossws-spi.jar server/default/deploy/jbossws.sar server/default/deploy/juddi-service.sar server/default/deploy/jbossws-container-jboss-beans.xml server/default/deployers/jbossws.deployer/FastInfoset.jar server/default/deployers/jbossws.deployer/jboss-jaxb-intros.jar server/default/deployers/jbossws.deployer/jbossws-native-core.jar server/default/deployers/jbossws.deployer/jettison.jar server/default/deployers/jbossws.deployer/netty.jar server/default/deployers/jbossws.deployer/policy.jar server/default/deployers/jbossws.deployer/wsdl4j.jar server/default/deployers/jbossws.deployer/xmlsec.jar server/default/deployers/jbossws.deployer/META-INF/jbossws-container-jboss-beans.xml lib/endorsed/jbossws-native-* lib/endorsed/jaxb-api.jar
Modified: stack/native/trunk/modules/resources/src/main/resources/resources/jbossws-deploy-macros.xml
===================================================================
--- stack/native/trunk/modules/resources/src/main/resources/resources/jbossws-deploy-macros.xml 2009-07-04 14:37:52 UTC (rev 10314)
+++ stack/native/trunk/modules/resources/src/main/resources/resources/jbossws-deploy-macros.xml 2009-07-04 14:44:05 UTC (rev 10315)
@@ -44,6 +44,7 @@
<include name="**/jbossws-native-saaj.jar"/>
<include name="**/jbossws-spi.jar"/>
<include name="**/jettison.jar"/>
+ <include name="**/netty.jar"/>
<include name="**/policy.jar"/>
<include name="**/stax-api.jar"/>
<include name="**/stax-ex.jar"/>
@@ -79,6 +80,7 @@
<include name="**/jboss-jaxb-intros.jar"/>
<include name="**/jbossws-native-core.jar"/>
<include name="**/jettison.jar"/>
+ <include name="**/netty.jar"/>
<include name="**/policy.jar"/>
<include name="**/wsdl4j.jar"/>
<include name="**/xmlsec.jar"/>
Modified: stack/native/trunk/pom.xml
===================================================================
--- stack/native/trunk/pom.xml 2009-07-04 14:37:52 UTC (rev 10314)
+++ stack/native/trunk/pom.xml 2009-07-04 14:44:05 UTC (rev 10315)
@@ -68,10 +68,10 @@
<jboss.common.version>1.2.1.GA</jboss.common.version>
<jboss.jaxbintros.version>1.0.0.GA</jboss.jaxbintros.version>
<jboss.logging.version>2.0.5.GA</jboss.logging.version>
- <jboss.remoting.version>2.5.0.SP2</jboss.remoting.version>
<jboss.jaxr.version>1.2.1.GA</jboss.jaxr.version>
<apache.scout.version>0.7rc2</apache.scout.version>
<juddi.version>0.9RC4</juddi.version>
+ <netty.version>3.1.0.CR1</netty.version>
<sun.fastinfoset.version>1.2.2</sun.fastinfoset.version>
<sun.jaxws.version>2.1.3</sun.jaxws.version>
<woodstox.version>3.2.6</woodstox.version>
@@ -215,11 +215,6 @@
<artifactId>jboss-common</artifactId>
<version>${jboss.common.version}</version>
</dependency>
- <dependency>
- <groupId>org.jboss.remoting</groupId>
- <artifactId>jboss-remoting</artifactId>
- <version>${jboss.remoting.version}</version>
- </dependency>
<!-- transitive dependencies -->
<dependency>
<groupId>commons-logging</groupId>
@@ -337,6 +332,11 @@
<artifactId>xmlsec</artifactId>
<version>${xmlsec.version}</version>
</dependency>
+ <dependency>
+ <groupId>org.jboss.netty</groupId>
+ <artifactId>netty</artifactId>
+ <version>${netty.version}</version>
+ </dependency>
</dependencies>
</dependencyManagement>
Modified: stack/native/trunk/src/main/scripts/assembly-deploy-artifacts.xml
===================================================================
--- stack/native/trunk/src/main/scripts/assembly-deploy-artifacts.xml 2009-07-04 14:37:52 UTC (rev 10314)
+++ stack/native/trunk/src/main/scripts/assembly-deploy-artifacts.xml 2009-07-04 14:44:05 UTC (rev 10315)
@@ -52,6 +52,7 @@
<include>com.sun.xml.stream.buffer:streambuffer:jar</include>
<include>wsdl4j:wsdl4j:jar</include>
<include>org.apache:xmlsec:jar</include>
+ <include>org.jboss.netty:netty:jar</include>
</includes>
</dependencySet>
<dependencySet>
More information about the jbossws-commits
mailing list