Author: richard.opalka(a)jboss.com
Date: 2007-12-11 17:29:42 -0500 (Tue, 11 Dec 2007)
New Revision: 5261
Added:
stack/native/trunk/src/main/java/org/jboss/ws/extensions/wsrm/server/
stack/native/trunk/src/main/java/org/jboss/ws/extensions/wsrm/server/RMDeploymentAspect.java
stack/native/trunk/src/main/java/org/jboss/ws/extensions/wsrm/server/RMInvocationHandler.java
Modified:
stack/native/trunk/src/main/java/org/jboss/ws/core/CommonSOAPBinding.java
stack/native/trunk/src/main/java/org/jboss/ws/core/server/ServiceEndpointInvoker.java
stack/native/trunk/src/main/java/org/jboss/ws/extensions/wsrm/common/RMHelper.java
stack/native/trunk/src/main/java/org/jboss/ws/metadata/builder/jaxws/JAXWSClientMetaDataBuilder.java
stack/native/trunk/src/main/java/org/jboss/ws/metadata/umdm/OperationMetaData.java
stack/native/trunk/src/main/resources/jbossws-native-config.xml
Log:
introducing RM deployment aspect + adding some RM related hacks + some minor refactorings
Modified: stack/native/trunk/src/main/java/org/jboss/ws/core/CommonSOAPBinding.java
===================================================================
--- stack/native/trunk/src/main/java/org/jboss/ws/core/CommonSOAPBinding.java 2007-12-11
21:14:35 UTC (rev 5260)
+++ stack/native/trunk/src/main/java/org/jboss/ws/core/CommonSOAPBinding.java 2007-12-11
22:29:42 UTC (rev 5261)
@@ -73,6 +73,7 @@
import org.jboss.ws.core.soap.attachment.CIDGenerator;
import org.jboss.ws.core.utils.MimeUtils;
import org.jboss.ws.extensions.wsrm.RMConstant;
+import org.jboss.ws.extensions.wsrm.common.RMHelper;
import org.jboss.ws.extensions.xop.XOPContext;
import org.jboss.ws.metadata.umdm.OperationMetaData;
import org.jboss.ws.metadata.umdm.ParameterMetaData;
@@ -172,13 +173,10 @@
if (opMetaData.getEndpointMetaData().getConfig().getRMMetaData() != null)
{
- for (QName wsrmQN : RMConstant.PROTOCOL_OPERATION_QNAMES)
+ // RM hack to JAX-RPC serialization
+ if (RMHelper.isRMOperation(opMetaData.getQName()))
{
- if (wsrmQN.equals(opMetaData.getQName()))
- {
- serialize = false;
- break;
- }
+ serialize = false;
}
}
@@ -373,7 +371,7 @@
if (node instanceof SOAPElement)
numChildElements++;
}
- if (numChildElements != numParameters)
+ if (numChildElements != numParameters &&
(RMHelper.isRMOperation(opMetaData.getQName()) == false))
throw new WSException("Invalid number of payload elements: " +
numChildElements);
}
Modified:
stack/native/trunk/src/main/java/org/jboss/ws/core/server/ServiceEndpointInvoker.java
===================================================================
---
stack/native/trunk/src/main/java/org/jboss/ws/core/server/ServiceEndpointInvoker.java 2007-12-11
21:14:35 UTC (rev 5260)
+++
stack/native/trunk/src/main/java/org/jboss/ws/core/server/ServiceEndpointInvoker.java 2007-12-11
22:29:42 UTC (rev 5261)
@@ -342,31 +342,39 @@
{
Class implClass = endpoint.getTargetBeanClass();
Method seiMethod = sepInv.getJavaMethod();
+ Method implMethod = null;
- String methodName = seiMethod.getName();
- Class[] paramTypes = seiMethod.getParameterTypes();
- for (int i = 0; i < paramTypes.length; i++)
+ if (seiMethod != null) // RM hack
{
- Class paramType = paramTypes[i];
- if (JavaUtils.isPrimitive(paramType) == false)
+ String methodName = seiMethod.getName();
+ Class[] paramTypes = seiMethod.getParameterTypes();
+ for (int i = 0; i < paramTypes.length; i++)
{
- String paramTypeName = paramType.getName();
- paramType = JavaUtils.loadJavaType(paramTypeName);
- paramTypes[i] = paramType;
+ Class paramType = paramTypes[i];
+ if (JavaUtils.isPrimitive(paramType) == false)
+ {
+ String paramTypeName = paramType.getName();
+ paramType = JavaUtils.loadJavaType(paramTypeName);
+ paramTypes[i] = paramType;
+ }
}
- }
- Method implMethod = null;
- try
- {
- implMethod = implClass.getMethod(methodName, paramTypes);
+ try
+ {
+ implMethod = implClass.getMethod(methodName, paramTypes);
+ }
+ catch (NoSuchMethodException ex)
+ {
+ log.error("CodeSource: " +
implClass.getProtectionDomain().getCodeSource());
+ log.error("ClassLoader: " + implClass.getClassLoader());
+ throw ex;
+ }
}
- catch (NoSuchMethodException ex)
+ else
{
- log.error("CodeSource: " +
implClass.getProtectionDomain().getCodeSource());
- log.error("ClassLoader: " + implClass.getClassLoader());
- throw ex;
+ log.debug("RM method returned as null");
}
+
return implMethod;
}
Modified:
stack/native/trunk/src/main/java/org/jboss/ws/extensions/wsrm/common/RMHelper.java
===================================================================
---
stack/native/trunk/src/main/java/org/jboss/ws/extensions/wsrm/common/RMHelper.java 2007-12-11
21:14:35 UTC (rev 5260)
+++
stack/native/trunk/src/main/java/org/jboss/ws/extensions/wsrm/common/RMHelper.java 2007-12-11
22:29:42 UTC (rev 5261)
@@ -27,14 +27,19 @@
import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.Duration;
+import javax.xml.namespace.QName;
import org.jboss.logging.Logger;
import org.jboss.ws.extensions.wsrm.RMClientHandler;
+import org.jboss.ws.extensions.wsrm.RMConstant;
import org.jboss.ws.extensions.wsrm.RMSequenceImpl;
import org.jboss.ws.extensions.wsrm.api.RMException;
+import org.jboss.ws.extensions.wsrm.spi.RMProvider;
import org.jboss.ws.extensions.wsrm.spi.protocol.RMAckRequested;
import org.jboss.ws.extensions.wsrm.spi.protocol.RMSequence;
import org.jboss.ws.extensions.wsrm.spi.protocol.RMSequenceAcknowledgement;
+import org.jboss.ws.metadata.umdm.EndpointMetaData;
+import org.jboss.ws.metadata.umdm.OperationMetaData;
/**
* RM utility library
@@ -140,4 +145,38 @@
sequence.addReceivedInboundMessage(seqHeader.getMessageNumber());
}
+ public static void setupRMOperations(EndpointMetaData endpointMD)
+ {
+ RMProvider rmProvider = RMProvider.get();
+
+ // register createSequence method
+ QName createSequenceQName = rmProvider.getConstants().getCreateSequenceQName();
+ OperationMetaData createSequenceMD = new OperationMetaData(endpointMD,
createSequenceQName, "createSequence");
+ createSequenceMD.setOneWay(false);
+ endpointMD.addOperation(createSequenceMD);
+
+ // register sequenceAcknowledgement method
+ QName sequenceAcknowledgementQName =
rmProvider.getConstants().getSequenceAcknowledgementQName();
+ OperationMetaData sequenceAcknowledgementMD = new OperationMetaData(endpointMD,
sequenceAcknowledgementQName, "sequenceAcknowledgement");
+ sequenceAcknowledgementMD.setOneWay(true);
+ endpointMD.addOperation(sequenceAcknowledgementMD);
+
+ // register closeSequence method
+ QName closeSequenceQName = rmProvider.getConstants().getCloseSequenceQName();
+ OperationMetaData closeSequenceMD = new OperationMetaData(endpointMD,
closeSequenceQName, "closeSequence");
+ closeSequenceMD.setOneWay(false);
+ endpointMD.addOperation(closeSequenceMD);
+
+ // register terminateSequence method
+ QName terminateSequenceQName =
rmProvider.getConstants().getTerminateSequenceQName();
+ OperationMetaData terminateSequenceMD = new OperationMetaData(endpointMD,
terminateSequenceQName, "terminateSequence");
+ terminateSequenceMD.setOneWay(false);
+ endpointMD.addOperation(terminateSequenceMD);
+ }
+
+ public static boolean isRMOperation(QName operationQName)
+ {
+ return RMConstant.PROTOCOL_OPERATION_QNAMES.contains(operationQName);
+ }
+
}
Added:
stack/native/trunk/src/main/java/org/jboss/ws/extensions/wsrm/server/RMDeploymentAspect.java
===================================================================
---
stack/native/trunk/src/main/java/org/jboss/ws/extensions/wsrm/server/RMDeploymentAspect.java
(rev 0)
+++
stack/native/trunk/src/main/java/org/jboss/ws/extensions/wsrm/server/RMDeploymentAspect.java 2007-12-11
22:29:42 UTC (rev 5261)
@@ -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.extensions.wsrm.server;
+
+import org.jboss.ws.extensions.wsrm.common.RMHelper;
+import org.jboss.ws.metadata.umdm.ServerEndpointMetaData;
+import org.jboss.wsf.spi.deployment.Deployment;
+import org.jboss.wsf.spi.deployment.DeploymentAspect;
+import org.jboss.wsf.spi.deployment.Endpoint;
+import org.jboss.wsf.spi.invocation.InvocationHandler;
+
+/**
+ * Registers RMInvocationHandler if WS-RM is detected
+ *
+ * @author richard.opalka(a)jboss.com
+ *
+ * @since Dec 11, 2007
+ */
+public final class RMDeploymentAspect extends DeploymentAspect
+{
+
+ @Override
+ public final void create(Deployment dep)
+ {
+ for (Endpoint ep : dep.getService().getEndpoints())
+ {
+ ServerEndpointMetaData sepMetaData =
ep.getAttachment(ServerEndpointMetaData.class);
+ if (sepMetaData == null)
+ throw new IllegalStateException("Cannot obtain endpoint meta
data");
+
+ if (sepMetaData.getConfig().getRMMetaData() != null)
+ {
+ InvocationHandler origInvHandler = ep.getInvocationHandler();
+ InvocationHandler wsrmInvHandler = new RMInvocationHandler(origInvHandler);
+ ep.setInvocationHandler(wsrmInvHandler);
+ RMHelper.setupRMOperations(sepMetaData);
+ }
+ }
+ }
+
+ @Override
+ public final void destroy(Deployment dep)
+ {
+ for (Endpoint ep : dep.getService().getEndpoints())
+ {
+ ServerEndpointMetaData sepMetaData =
ep.getAttachment(ServerEndpointMetaData.class);
+ if (sepMetaData == null)
+ throw new IllegalStateException("Cannot obtain endpoint meta
data");
+
+ InvocationHandler invHandler = ep.getInvocationHandler();
+ if (invHandler instanceof RMInvocationHandler)
+ {
+ RMInvocationHandler rmInvHandler = (RMInvocationHandler)invHandler;
+ ep.setInvocationHandler(rmInvHandler.getDelegate());
+ }
+ }
+ }
+
+}
Property changes on:
stack/native/trunk/src/main/java/org/jboss/ws/extensions/wsrm/server/RMDeploymentAspect.java
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ LF
Added:
stack/native/trunk/src/main/java/org/jboss/ws/extensions/wsrm/server/RMInvocationHandler.java
===================================================================
---
stack/native/trunk/src/main/java/org/jboss/ws/extensions/wsrm/server/RMInvocationHandler.java
(rev 0)
+++
stack/native/trunk/src/main/java/org/jboss/ws/extensions/wsrm/server/RMInvocationHandler.java 2007-12-11
22:29:42 UTC (rev 5261)
@@ -0,0 +1,87 @@
+/*
+ * 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.extensions.wsrm.server;
+
+import org.jboss.logging.Logger;
+import org.jboss.wsf.spi.deployment.Endpoint;
+import org.jboss.wsf.spi.invocation.Invocation;
+import org.jboss.wsf.spi.invocation.InvocationHandler;
+
+/**
+ * RM Invocation Handler
+ *
+ * @author richard.opalka(a)jboss.com
+ *
+ * @since Dec 11, 2007
+ */
+public final class RMInvocationHandler extends InvocationHandler
+{
+
+ private static final Logger logger = Logger.getLogger(RMInvocationHandler.class);
+
+ private final InvocationHandler delegate;
+
+ RMInvocationHandler(InvocationHandler delegate)
+ {
+ this.delegate = delegate;
+ }
+
+ @Override
+ public final Invocation createInvocation()
+ {
+ return this.delegate.createInvocation();
+ }
+
+ @Override
+ public final void handleInvocationException(Throwable th) throws Exception
+ {
+ // TODO is it necessary to handle it specially in the case of WS-RM ?
+ super.handleInvocationException(th);
+ }
+
+ @Override
+ public final void init(Endpoint ep)
+ {
+ this.delegate.init(ep);
+ }
+
+ @Override
+ public final void invoke(Endpoint ep, Invocation inv) throws Exception
+ {
+ // TODO: do WS-RM magic here (such as create, close or terminate sequence
+ if (inv.getJavaMethod() != null)
+ {
+ logger.debug("Invoking method: " + inv.getJavaMethod().getName());
+ this.delegate.invoke(ep, inv);
+ }
+ else
+ {
+ logger.debug("RM protocol method detected");
+ }
+ }
+
+ public final InvocationHandler getDelegate()
+ {
+ return this.delegate;
+ }
+
+}
Property changes on:
stack/native/trunk/src/main/java/org/jboss/ws/extensions/wsrm/server/RMInvocationHandler.java
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ LF
Modified:
stack/native/trunk/src/main/java/org/jboss/ws/metadata/builder/jaxws/JAXWSClientMetaDataBuilder.java
===================================================================
---
stack/native/trunk/src/main/java/org/jboss/ws/metadata/builder/jaxws/JAXWSClientMetaDataBuilder.java 2007-12-11
21:14:35 UTC (rev 5260)
+++
stack/native/trunk/src/main/java/org/jboss/ws/metadata/builder/jaxws/JAXWSClientMetaDataBuilder.java 2007-12-11
22:29:42 UTC (rev 5261)
@@ -36,6 +36,7 @@
import org.jboss.ws.core.jaxws.client.ServiceObjectFactoryJAXWS;
import org.jboss.ws.core.soap.Style;
import org.jboss.ws.extensions.policy.metadata.PolicyMetaDataBuilder;
+import org.jboss.ws.extensions.wsrm.common.RMHelper;
import org.jboss.ws.extensions.wsrm.spi.RMProvider;
import org.jboss.ws.metadata.umdm.ClientEndpointMetaData;
import org.jboss.ws.metadata.umdm.EndpointMetaData;
@@ -113,35 +114,6 @@
}
}
- private void setupRMOperations(EndpointMetaData endpointMD)
- {
- RMProvider rmProvider = RMProvider.get();
-
- // register createSequence method
- QName createSequenceQName = rmProvider.getConstants().getCreateSequenceQName();
- OperationMetaData createSequenceMD = new OperationMetaData(endpointMD,
createSequenceQName, "createSequence");
- createSequenceMD.setOneWay(false);
- endpointMD.addOperation(createSequenceMD);
-
- // register sequenceAcknowledgement method
- QName sequenceAcknowledgementQName =
rmProvider.getConstants().getSequenceAcknowledgementQName();
- OperationMetaData sequenceAcknowledgementMD = new OperationMetaData(endpointMD,
sequenceAcknowledgementQName, "sequenceAcknowledgement");
- sequenceAcknowledgementMD.setOneWay(true);
- endpointMD.addOperation(sequenceAcknowledgementMD);
-
- // register closeSequence method
- QName closeSequenceQName = rmProvider.getConstants().getCloseSequenceQName();
- OperationMetaData closeSequenceMD = new OperationMetaData(endpointMD,
closeSequenceQName, "closeSequence");
- closeSequenceMD.setOneWay(false);
- endpointMD.addOperation(closeSequenceMD);
-
- // register terminateSequence method
- QName terminateSequenceQName =
rmProvider.getConstants().getTerminateSequenceQName();
- OperationMetaData terminateSequenceMD = new OperationMetaData(endpointMD,
terminateSequenceQName, "terminateSequence");
- terminateSequenceMD.setOneWay(false);
- endpointMD.addOperation(terminateSequenceMD);
- }
-
/** Build from WSDL and service name
*/
public ServiceMetaData buildMetaData(QName serviceName, URL wsdlURL)
@@ -346,7 +318,7 @@
// wsrm initialization
if (epMetaData.getConfig().getRMMetaData() != null)
{
- setupRMOperations(epMetaData);
+ RMHelper.setupRMOperations(epMetaData);
}
if(log.isDebugEnabled()) log.debug("END: rebuildMetaData\n" +
epMetaData.getServiceMetaData());
Modified:
stack/native/trunk/src/main/java/org/jboss/ws/metadata/umdm/OperationMetaData.java
===================================================================
---
stack/native/trunk/src/main/java/org/jboss/ws/metadata/umdm/OperationMetaData.java 2007-12-11
21:14:35 UTC (rev 5260)
+++
stack/native/trunk/src/main/java/org/jboss/ws/metadata/umdm/OperationMetaData.java 2007-12-11
22:29:42 UTC (rev 5261)
@@ -37,6 +37,8 @@
import org.jboss.ws.WSException;
import org.jboss.ws.core.soap.Style;
import org.jboss.ws.core.soap.Use;
+import org.jboss.ws.extensions.wsrm.RMConstant;
+import org.jboss.ws.extensions.wsrm.spi.RMProvider;
import org.jboss.ws.metadata.umdm.EndpointMetaData.Type;
import org.jboss.wsf.common.JavaUtils;
import org.jboss.wsf.common.ResourceLoaderAdapter;
@@ -185,7 +187,7 @@
}
}
- if (tmpMethod == null)
+ if ((tmpMethod == null) && (epMetaData.getConfig().getRMMetaData() ==
null)) // RM hack
throw new WSException("Cannot find java method: " + javaName);
}
return tmpMethod;
@@ -474,7 +476,8 @@
}
// Report unsynchronized java method
- if (javaMethod == null)
+ boolean isRMMethod =
RMProvider.get().getConstants().getNamespaceURI().equals(qname.getNamespaceURI());
+ if ((javaMethod == null) && (isRMMethod == false)) // RM hack
{
StringBuilder errMsg = new StringBuilder("Cannot synchronize to any of
these methods:");
for (Method method : unsynchronizedMethods)
Modified: stack/native/trunk/src/main/resources/jbossws-native-config.xml
===================================================================
--- stack/native/trunk/src/main/resources/jbossws-native-config.xml 2007-12-11 21:14:35
UTC (rev 5260)
+++ stack/native/trunk/src/main/resources/jbossws-native-config.xml 2007-12-11 22:29:42
UTC (rev 5261)
@@ -69,6 +69,10 @@
<property name="requires">UnifiedMetaDataModel</property>
</bean>
+ <bean name="WSNativeRMDeploymentAspect"
class="org.jboss.ws.extensions.wsrm.server.RMDeploymentAspect">
+ <property name="requires">StackEndpointHandler,
UnifiedMetaDataModel</property>
+ </bean>
+
<bean name="WSNativeUnifiedMetaDataDeploymentAspect"
class="org.jboss.wsf.stack.jbws.UnifiedMetaDataDeploymentAspect">
<property name="requires">RuntimeLoader, ContainerMetaData,
URLPattern, VFSRoot, JAXBIntros</property>
<property name="provides">UnifiedMetaDataModel</property>
@@ -100,6 +104,7 @@
<inject bean="WSNativeEventingDeploymentAspect"/>
<inject bean="WSNativePublishContractDeploymentAspect"/>
<inject bean="WSNativeServiceEndpointInvokerDeploymentAspect"/>
+ <inject bean="WSNativeRMDeploymentAspect"/>
<inject bean="WSNativeUnifiedMetaDataDeploymentAspect"/>
<inject bean="WSNativeEagerInitializeDeploymentAspect"/>
<inject bean="WSJAXBIntroDeploymentAspect"/>
@@ -119,6 +124,7 @@
<inject bean="WSNativeEventingDeploymentAspect"/>
<inject bean="WSNativePublishContractDeploymentAspect"/>
<inject bean="WSNativeServiceEndpointInvokerDeploymentAspect"/>
+ <inject bean="WSNativeRMDeploymentAspect"/>
<inject bean="WSNativeUnifiedMetaDataDeploymentAspect"/>
<inject bean="WSJAXBIntroDeploymentAspect"/>
</set>
@@ -137,10 +143,11 @@
<inject bean="WSNativeEventingDeploymentAspect"/>
<inject bean="WSNativePublishContractDeploymentAspect"/>
<inject bean="WSNativeServiceEndpointInvokerDeploymentAspect"/>
+ <inject bean="WSNativeRMDeploymentAspect"/>
<inject bean="WSNativeUnifiedMetaDataDeploymentAspect"/>
<inject bean="WSJAXBIntroDeploymentAspect"/>
</set>
</property>
<depends>WSDeploymentAspectInstallerEndpointAPI</depends>
</bean>
-
\ No newline at end of file
+