View Javadoc

1   /*
2    * Copyright 2006 the original author or authors.
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    *      http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  
17  package org.springframework.ws.client.support;
18  
19  import java.io.IOException;
20  import java.net.URI;
21  import java.net.URISyntaxException;
22  
23  import org.springframework.beans.factory.InitializingBean;
24  import org.springframework.util.Assert;
25  import org.springframework.ws.WebServiceMessageFactory;
26  import org.springframework.ws.transport.WebServiceConnection;
27  import org.springframework.ws.transport.WebServiceMessageSender;
28  import org.springframework.xml.transform.TransformerObjectSupport;
29  
30  /**
31   * Base class for <code>WebServiceTemplate</code> and other WS-accessing helpers. Defines common properties like the
32   * {@link WebServiceMessageFactory} and {@link WebServiceMessageSender}.
33   * <p/>
34   * Not intended to be used directly. See {@link org.springframework.ws.client.core.WebServiceTemplate}.
35   *
36   * @author Arjen Poutsma
37   * @see org.springframework.ws.client.core.WebServiceTemplate
38   * @since 1.0.0
39   */
40  public abstract class WebServiceAccessor extends TransformerObjectSupport implements InitializingBean {
41  
42      private WebServiceMessageFactory messageFactory;
43  
44      private WebServiceMessageSender[] messageSenders;
45  
46      /** Returns the message factory used for creating messages. */
47      public WebServiceMessageFactory getMessageFactory() {
48          return messageFactory;
49      }
50  
51      /** Sets the message factory used for creating messages. */
52      public void setMessageFactory(WebServiceMessageFactory messageFactory) {
53          this.messageFactory = messageFactory;
54      }
55  
56      /** Returns the message senders used for sending messages. */
57      public WebServiceMessageSender[] getMessageSenders() {
58          return messageSenders;
59      }
60  
61      /**
62       * Sets the single message sender used for sending messages.
63       * <p/>
64       * This message sender will be used to resolve an URI to a {@link WebServiceConnection}.
65       *
66       * @see #createConnection(URI)
67       */
68      public void setMessageSender(WebServiceMessageSender messageSender) {
69          Assert.notNull(messageSender, "'messageSender' must not be null");
70          messageSenders = new WebServiceMessageSender[]{messageSender};
71      }
72  
73      /**
74       * Sets the message senders used for sending messages.
75       * <p/>
76       * These message senders will be used to resolve an URI to a {@link WebServiceConnection}.
77       *
78       * @see #createConnection(URI)
79       */
80      public void setMessageSenders(WebServiceMessageSender[] messageSenders) {
81          Assert.notEmpty(messageSenders, "'messageSenders' must not be empty");
82          this.messageSenders = messageSenders;
83      }
84  
85      public void afterPropertiesSet() {
86          Assert.notNull(getMessageFactory(), "Property 'messageFactory' is required");
87          Assert.notEmpty(getMessageSenders(), "Property 'messageSenders' is required");
88      }
89  
90      /**
91       * Creates a connection to the given URI, or throws an exception when it cannot be resolved.
92       * <p/>
93       * Default implementation iterates over all configured {@link WebServiceMessageSender} objects, and calls {@link
94       * WebServiceMessageSender#supports(URI)} for each of them. If the sender supports the parameter URI, it creates a
95       * connection using {@link WebServiceMessageSender#createConnection(URI)} .
96       *
97       * @param uri the URI to open a connection to
98       * @return the created connection
99       * @throws IllegalArgumentException when the uri cannot be resolved
100      * @throws IOException              when an I/O error occurs
101      */
102     protected WebServiceConnection createConnection(URI uri) throws IOException {
103         Assert.notEmpty(getMessageSenders(), "Property 'messageSenders' is required");
104         WebServiceMessageSender[] messageSenders = getMessageSenders();
105         for (int i = 0; i < messageSenders.length; i++) {
106             if (messageSenders[i].supports(uri)) {
107                 WebServiceConnection connection = messageSenders[i].createConnection(uri);
108                 if (logger.isDebugEnabled()) {
109                     try {
110                         logger.debug("Opening [" + connection + "] to [" + connection.getUri() + "]");
111                     }
112                     catch (URISyntaxException e) {
113                         // ignore
114                     }
115                 }
116                 return connection;
117             }
118         }
119         throw new IllegalArgumentException("Could not resolve [" + uri + "] to a WebServiceMessageSender");
120     }
121 
122 }