001: /*
002: * Copyright 2006 the original author or authors.
003: *
004: * Licensed under the Apache License, Version 2.0 (the "License");
005: * you may not use this file except in compliance with the License.
006: * You may obtain a copy of the License at
007: *
008: * http://www.apache.org/licenses/LICENSE-2.0
009: *
010: * Unless required by applicable law or agreed to in writing, software
011: * distributed under the License is distributed on an "AS IS" BASIS,
012: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013: * See the License for the specific language governing permissions and
014: * limitations under the License.
015: */
016:
017: package org.springframework.ws.client.support;
018:
019: import java.io.IOException;
020:
021: import org.springframework.beans.factory.InitializingBean;
022: import org.springframework.util.Assert;
023: import org.springframework.ws.WebServiceMessageFactory;
024: import org.springframework.ws.transport.WebServiceConnection;
025: import org.springframework.ws.transport.WebServiceMessageSender;
026: import org.springframework.xml.transform.TransformerObjectSupport;
027:
028: /**
029: * Base class for <code>WebServiceTemplate</code> and other WS-accessing helpers. Defines common properties like the
030: * {@link WebServiceMessageFactory} and {@link WebServiceMessageSender}.
031: * <p/>
032: * Not intended to be used directly. See {@link org.springframework.ws.client.core.WebServiceTemplate}.
033: *
034: * @author Arjen Poutsma
035: * @see org.springframework.ws.client.core.WebServiceTemplate
036: * @since 1.0.0
037: */
038: public abstract class WebServiceAccessor extends
039: TransformerObjectSupport implements InitializingBean {
040:
041: private WebServiceMessageFactory messageFactory;
042:
043: private WebServiceMessageSender[] messageSenders;
044:
045: /** Returns the message factory used for creating messages. */
046: public WebServiceMessageFactory getMessageFactory() {
047: return messageFactory;
048: }
049:
050: /** Sets the message factory used for creating messages. */
051: public void setMessageFactory(
052: WebServiceMessageFactory messageFactory) {
053: this .messageFactory = messageFactory;
054: }
055:
056: /** Returns the message senders used for sending messages. */
057: public WebServiceMessageSender[] getMessageSenders() {
058: return messageSenders;
059: }
060:
061: /**
062: * Sets the single message sender used for sending messages.
063: * <p/>
064: * This message sender will be used to resolve an URI to a {@link WebServiceConnection}.
065: *
066: * @see #createConnection(String)
067: */
068: public void setMessageSender(WebServiceMessageSender messageSender) {
069: Assert.notNull(messageSender,
070: "'messageSender' must not be null");
071: messageSenders = new WebServiceMessageSender[] { messageSender };
072: }
073:
074: /**
075: * Sets the message senders used for sending messages.
076: * <p/>
077: * These message senders will be used to resolve an URI to a {@link WebServiceConnection}.
078: *
079: * @see #createConnection(String)
080: */
081: public void setMessageSenders(
082: WebServiceMessageSender[] messageSenders) {
083: Assert.notEmpty(messageSenders,
084: "'messageSenders' must not be empty");
085: this .messageSenders = messageSenders;
086: }
087:
088: public void afterPropertiesSet() {
089: Assert.notNull(getMessageFactory(),
090: "Property 'messageFactory' is required");
091: Assert.notEmpty(getMessageSenders(),
092: "Property 'messageSenders' is required");
093: }
094:
095: /**
096: * Creates a connection to the given URI, or throws an exception when it cannot be resolved.
097: * <p/>
098: * Default implementation iterates over all configured {@link WebServiceMessageSender} objects, and calls {@link
099: * WebServiceMessageSender#supports(String)} for each of them. If the sender supports the parameter URI, it creates
100: * a connection using {@link WebServiceMessageSender#createConnection(String)} .
101: *
102: * @param uri the URI to open a connection to
103: * @return the created connection
104: * @throws IllegalArgumentException when the uri cannot be resolved
105: * @throws IOException when an I/O error occurs
106: */
107: protected WebServiceConnection createConnection(String uri)
108: throws IOException {
109: Assert.notEmpty(getMessageSenders(),
110: "Property 'messageSenders' is required");
111: WebServiceMessageSender[] messageSenders = getMessageSenders();
112: for (int i = 0; i < messageSenders.length; i++) {
113: if (messageSenders[i].supports(uri)) {
114: if (logger.isDebugEnabled()) {
115: logger.debug("Opening connection to [" + uri
116: + "] using [" + messageSenders[i] + "]");
117: }
118: return messageSenders[i].createConnection(uri);
119: }
120: }
121: throw new IllegalArgumentException("Could not resolve [" + uri
122: + "] to a WebServiceMessageSender");
123: }
124:
125: }
|