- * Instances of this class are typically picked up by an {@link AbstractAnnotationEndpointMapping} implementation, such
- * as {@link SoapActionAnnotationEndpointMapping}.
+ * Instances of this class are typically picked up by an {@link AbstractAnnotationMethodEndpointMapping} implementation,
+ * such as {@link SoapActionAnnotationMethodEndpointMapping}.
*
* @author Arjen Poutsma
*/
diff --git a/sandbox/src/main/java/org/springframework/ws/server/endpoint/annotation/PayloadRootQName.java b/core-tiger/src/main/java/org/springframework/ws/server/endpoint/annotation/PayloadRoot.java
similarity index 69%
rename from sandbox/src/main/java/org/springframework/ws/server/endpoint/annotation/PayloadRootQName.java
rename to core-tiger/src/main/java/org/springframework/ws/server/endpoint/annotation/PayloadRoot.java
index e6c55b8d3..06bbef367 100644
--- a/sandbox/src/main/java/org/springframework/ws/server/endpoint/annotation/PayloadRootQName.java
+++ b/core-tiger/src/main/java/org/springframework/ws/server/endpoint/annotation/PayloadRoot.java
@@ -16,14 +16,23 @@
package org.springframework.ws.server.endpoint.annotation;
+import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
+/**
+ * Marks an endpoint method as the handler for an incoming request. The annotation value signifies the value for the
+ * request payload root element that is handled by the method.
+ *
+ * @author Arjen Poutsma
+ * @see org.springframework.ws.server.endpoint.mapping.PayloadRootAnnotationMethodEndpointMapping
+ */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
-public @interface PayloadRootQName {
+@Documented
+public @interface PayloadRoot {
String value();
diff --git a/sandbox/src/main/java/org/springframework/ws/server/endpoint/annotation/XPathParam.java b/core-tiger/src/main/java/org/springframework/ws/server/endpoint/annotation/XPathParam.java
similarity index 64%
rename from sandbox/src/main/java/org/springframework/ws/server/endpoint/annotation/XPathParam.java
rename to core-tiger/src/main/java/org/springframework/ws/server/endpoint/annotation/XPathParam.java
index c5ba87172..c2acc9e4b 100644
--- a/sandbox/src/main/java/org/springframework/ws/server/endpoint/annotation/XPathParam.java
+++ b/core-tiger/src/main/java/org/springframework/ws/server/endpoint/annotation/XPathParam.java
@@ -21,15 +21,18 @@
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
-/** @author Arjen Poutsma */
+/**
+ * Indicates that a method parameter should be bound to an XPath expression. The annotation value signifies the XPath
+ * expression to use. The parameter can be of the following types:
boolean, or {@link
+ * Boolean}
double, or {@link Double}
{@link String}
{@link
+ * org.w3c.dom.Node}
{@link org.w3c.dom.NodeList}
+ *
+ * @author Arjen Poutsma
+ * @see org.springframework.ws.server.endpoint.adapter.XPathParamAnnotationEndpointAdapter
+ */
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface XPathParam {
- /**
- * The XPathParam value.
- *
- * @return the
- */
String value();
}
diff --git a/sandbox/src/main/java/org/springframework/ws/server/endpoint/annotation/package.html b/core-tiger/src/main/java/org/springframework/ws/server/endpoint/annotation/package.html
similarity index 100%
rename from sandbox/src/main/java/org/springframework/ws/server/endpoint/annotation/package.html
rename to core-tiger/src/main/java/org/springframework/ws/server/endpoint/annotation/package.html
diff --git a/sandbox/src/main/java/org/springframework/ws/server/endpoint/mapping/AbstractAnnotationEndpointMapping.java b/core-tiger/src/main/java/org/springframework/ws/server/endpoint/mapping/AbstractAnnotationMethodEndpointMapping.java
similarity index 83%
rename from sandbox/src/main/java/org/springframework/ws/server/endpoint/mapping/AbstractAnnotationEndpointMapping.java
rename to core-tiger/src/main/java/org/springframework/ws/server/endpoint/mapping/AbstractAnnotationMethodEndpointMapping.java
index 54f2c3a8f..42321cfed 100644
--- a/sandbox/src/main/java/org/springframework/ws/server/endpoint/mapping/AbstractAnnotationEndpointMapping.java
+++ b/core-tiger/src/main/java/org/springframework/ws/server/endpoint/mapping/AbstractAnnotationMethodEndpointMapping.java
@@ -26,15 +26,17 @@
* Abstract base for {@link org.springframework.ws.server.EndpointMapping} implementations that map classes tagged with
* an annotation. By default the annotation is {@link Endpoint}, but this can be overriden in subclasses.
*
- * Each bean
+ * The methods of each bean carrying @Endpoint will be registered using {@link #registerMethods(Object)}.
*
* @author Arjen Poutsma
*/
-public abstract class AbstractAnnotationEndpointMapping extends AbstractMethodEndpointMapping
+public abstract class AbstractAnnotationMethodEndpointMapping extends AbstractMethodEndpointMapping
implements BeanPostProcessor {
public final Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
- registerMethods(bean);
+ if (getEndpointClass(bean).getAnnotation(getEndpointAnnotationType()) != null) {
+ registerMethods(bean);
+ }
return bean;
}
diff --git a/sandbox/src/main/java/org/springframework/ws/server/endpoint/mapping/PayloadRootQNameMethodEndpointMapping.java b/core-tiger/src/main/java/org/springframework/ws/server/endpoint/mapping/PayloadRootAnnotationMethodEndpointMapping.java
similarity index 63%
rename from sandbox/src/main/java/org/springframework/ws/server/endpoint/mapping/PayloadRootQNameMethodEndpointMapping.java
rename to core-tiger/src/main/java/org/springframework/ws/server/endpoint/mapping/PayloadRootAnnotationMethodEndpointMapping.java
index 02e096017..0383d970e 100644
--- a/sandbox/src/main/java/org/springframework/ws/server/endpoint/mapping/PayloadRootQNameMethodEndpointMapping.java
+++ b/core-tiger/src/main/java/org/springframework/ws/server/endpoint/mapping/PayloadRootAnnotationMethodEndpointMapping.java
@@ -18,20 +18,34 @@
import java.lang.reflect.Method;
import javax.xml.namespace.QName;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.dom.DOMResult;
import org.springframework.core.annotation.AnnotationUtils;
-import org.springframework.ws.WebServiceMessage;
import org.springframework.ws.context.MessageContext;
-import org.springframework.ws.server.endpoint.annotation.PayloadRootQName;
+import org.springframework.ws.server.EndpointMapping;
+import org.springframework.ws.server.endpoint.annotation.PayloadRoot;
+import org.springframework.xml.dom.DomUtils;
import org.springframework.xml.namespace.QNameUtils;
import org.w3c.dom.Element;
-/** @author Arjen Poutsma */
-public class PayloadRootQNameMethodEndpointMapping extends AbstractAnnotationEndpointMapping {
+/**
+ * Implementation of the {@link EndpointMapping} interface that uses the {@link PayloadRoot} annotation to map methods
+ * to request payload root elements.
+ *
+ * Endpoints typically have the following form:
+ *
+ * @Endpoint
+ * public class MyEndpoint{
+ * @Payload("{http://springframework.org/spring-ws}Request")
+ * public Source doSomethingWithRequest() {
+ * ...
+ * }
+ * }
+ *
+ *
+ * @author Arjen Poutsma
+ */
+public class PayloadRootAnnotationMethodEndpointMapping extends AbstractAnnotationMethodEndpointMapping {
private static TransformerFactory transformerFactory;
@@ -40,22 +54,15 @@ public class PayloadRootQNameMethodEndpointMapping extends AbstractAnnotationEnd
}
protected String getLookupKeyForMessage(MessageContext messageContext) throws Exception {
- Element payloadElement = getMessagePayloadElement(messageContext.getRequest());
+ Element payloadElement =
+ DomUtils.getRootElement(messageContext.getRequest().getPayloadSource(), transformerFactory);
QName qName = QNameUtils.getQNameForNode(payloadElement);
return qName != null ? qName.toString() : null;
}
protected String getLookupKeyForMethod(Method method) {
- PayloadRootQName annotation = AnnotationUtils.getAnnotation(method, PayloadRootQName.class);
+ PayloadRoot annotation = AnnotationUtils.getAnnotation(method, PayloadRoot.class);
return annotation != null ? annotation.value() : null;
}
- private Element getMessagePayloadElement(WebServiceMessage message) throws TransformerException {
- Transformer transformer = transformerFactory.newTransformer();
- DOMResult domResult = new DOMResult();
- transformer.transform(message.getPayloadSource(), domResult);
- return (Element) domResult.getNode().getFirstChild();
- }
-
-
}
diff --git a/sandbox/src/main/java/org/springframework/ws/soap/server/endpoint/annotation/SoapAction.java b/core-tiger/src/main/java/org/springframework/ws/soap/server/endpoint/annotation/SoapAction.java
similarity index 72%
rename from sandbox/src/main/java/org/springframework/ws/soap/server/endpoint/annotation/SoapAction.java
rename to core-tiger/src/main/java/org/springframework/ws/soap/server/endpoint/annotation/SoapAction.java
index 3857ce457..477e104f9 100644
--- a/sandbox/src/main/java/org/springframework/ws/soap/server/endpoint/annotation/SoapAction.java
+++ b/core-tiger/src/main/java/org/springframework/ws/soap/server/endpoint/annotation/SoapAction.java
@@ -16,14 +16,22 @@
package org.springframework.ws.soap.server.endpoint.annotation;
+import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
-/** @author Arjen Poutsma */
+/**
+ * Marks an endpoint method as the handler for an incoming request. The annotation value signifies the value for the
+ * request SOAPAction header that is handled by the method.
+ *
+ * @author Arjen Poutsma
+ * @see org.springframework.ws.soap.server.endpoint.mapping.SoapActionAnnotationMethodEndpointMapping
+ */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
+@Documented
public @interface SoapAction {
String value();
diff --git a/core-tiger/src/main/java/org/springframework/ws/soap/server/endpoint/annotation/package.html b/core-tiger/src/main/java/org/springframework/ws/soap/server/endpoint/annotation/package.html
new file mode 100644
index 000000000..a6125b84d
--- /dev/null
+++ b/core-tiger/src/main/java/org/springframework/ws/soap/server/endpoint/annotation/package.html
@@ -0,0 +1,5 @@
+
+
+JDK 1.5+ annotations for Spring-WS SOAP endpoints.
+
+
diff --git a/sandbox/src/main/java/org/springframework/ws/soap/server/endpoint/mapping/SoapActionAnnotationEndpointMapping.java b/core-tiger/src/main/java/org/springframework/ws/soap/server/endpoint/mapping/SoapActionAnnotationMethodEndpointMapping.java
similarity index 74%
rename from sandbox/src/main/java/org/springframework/ws/soap/server/endpoint/mapping/SoapActionAnnotationEndpointMapping.java
rename to core-tiger/src/main/java/org/springframework/ws/soap/server/endpoint/mapping/SoapActionAnnotationMethodEndpointMapping.java
index 0fc27a535..e960070af 100644
--- a/sandbox/src/main/java/org/springframework/ws/soap/server/endpoint/mapping/SoapActionAnnotationEndpointMapping.java
+++ b/core-tiger/src/main/java/org/springframework/ws/soap/server/endpoint/mapping/SoapActionAnnotationMethodEndpointMapping.java
@@ -24,35 +24,30 @@
import org.springframework.ws.context.MessageContext;
import org.springframework.ws.server.EndpointInterceptor;
import org.springframework.ws.server.EndpointInvocationChain;
-import org.springframework.ws.server.endpoint.mapping.AbstractAnnotationEndpointMapping;
+import org.springframework.ws.server.endpoint.mapping.AbstractAnnotationMethodEndpointMapping;
import org.springframework.ws.soap.SoapEndpointMapping;
import org.springframework.ws.soap.SoapMessage;
import org.springframework.ws.soap.server.SoapEndpointInvocationChain;
import org.springframework.ws.soap.server.endpoint.annotation.SoapAction;
/**
- * Implementation of the EndpointMapping interface to map from SOAPAction headers to endpoint
- * beans. Supports both mapping to bean instances and mapping to bean names: the latter is required for prototype
- * handlers.
+ * Implementation of the {@link org.springframework.ws.server.EndpointMapping} interface that uses the {@link
+ * SoapAction} annotation to map methods to the request SOAPAction header.
*
- * The endpointMap property is suitable for populating the endpoint map with bean references, e.g. via the
- * map element in XML bean definitions.
- *
- * Mappings to bean names can be set via the mappings property, in a form accepted by the
- * java.util.Properties class, like as follows:
+ * Endpoints typically have the following form:
*