001 /**
002 *
003 * Copyright 2004 Protique Ltd
004 *
005 * Licensed under the Apache License, Version 2.0 (the "License");
006 * you may not use this file except in compliance with the License.
007 * You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 *
017 **/
018 package org.codehaus.activesoap;
019
020 import org.codehaus.activesoap.handler.QNameHandler;
021 import org.codehaus.activesoap.handler.Policy;
022 import org.codehaus.activesoap.handler.DefaultHandlerRegistry;
023 import org.codehaus.activesoap.util.XMLStreamFactory;
024 import org.codehaus.activesoap.util.NullXMLStreamWriter;
025
026 import javax.xml.stream.XMLStreamReader;
027 import javax.xml.stream.XMLStreamWriter;
028 import javax.xml.stream.XMLStreamException;
029 import java.io.Reader;
030 import java.io.Writer;
031
032 /**
033 * A pure RESTful service which processes inbound XML using some {@link Handler}
034 * instances without using the SOAP protocol.
035 *
036 * @version $Revision: 1.12 $
037 */
038 public class RestService {
039 private HandlerRegistry handlerRegistry = new DefaultHandlerRegistry();
040 private Handler rootHandler;
041 private XMLStreamFactory streamFactory = new XMLStreamFactory();
042
043 public RestService() {
044 this(new DefaultHandlerRegistry());
045 }
046
047 public RestService(HandlerRegistry handlerRegistry) {
048 this.handlerRegistry = handlerRegistry;
049 this.rootHandler = new QNameHandler(handlerRegistry);
050 }
051
052
053 /**
054 * Creates a new MessageExchange from an input and output stream
055 */
056 public MessageExchange createMessageExchange(XMLStreamReader in, XMLStreamWriter out) {
057 if (out == null) {
058 out = NullXMLStreamWriter.getInstance();
059 }
060 return new MessageExchange(this, in, out);
061 }
062
063 /**
064 * Creates a new MessageExchange from an input and output stream
065 */
066 public MessageExchange createMessageExchange(Reader request, Writer response) throws XMLStreamException {
067 XMLStreamReader in = getStreamFactory().getInputFactory().createXMLStreamReader(request);
068 XMLStreamWriter out = getStreamFactory().getOutputFactory().createXMLStreamWriter(response);
069 MessageExchange exchange = createMessageExchange(in, out);
070 return exchange;
071 }
072
073 /**
074 * Performs a in invocation using the given message exchange
075 */
076 public void invoke(MessageExchange exchange) throws Exception {
077 getRootHandler().invoke(exchange);
078 }
079
080 /**
081 * Performs a SOAP RPC operation, returning the response
082 */
083 public void invoke(Reader request, Writer response) throws Exception {
084 MessageExchange exchange = createMessageExchange(request, response);
085 invoke(exchange);
086 }
087
088 /**
089 * Performs a SOAP RPC operation, returning the response
090 */
091 public void invoke(XMLStreamReader in, XMLStreamWriter out) throws Exception {
092 getRootHandler().invoke(createMessageExchange(in, out));
093 }
094
095
096 public void addPolicy(Policy policy) {
097 policy.addPolicy(getHandlerRegistry());
098 }
099
100 public void removePolicy(Policy policy) {
101 policy.removePolicy(getHandlerRegistry());
102 }
103
104 // Properties
105 //-------------------------------------------------------------------------
106 public HandlerRegistry getHandlerRegistry() {
107 return handlerRegistry;
108 }
109
110 public Handler getRootHandler() {
111 return rootHandler;
112 }
113
114 public void setRootHandler(Handler rootHandler) {
115 this.rootHandler = rootHandler;
116 }
117
118 public XMLStreamFactory getStreamFactory() {
119 return streamFactory;
120 }
121
122 public void setStreamFactory(XMLStreamFactory streamFactory) {
123 this.streamFactory = streamFactory;
124 }
125
126 public boolean isRepairingNamespace() {
127 return streamFactory.isRepairingNamespace();
128 }
129
130 public void setRepairingNamespace(boolean flag) {
131 streamFactory.setRepairingNamespace(flag);
132 }
133 }