001 /*
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements. See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License. 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 package org.apache.servicemix.http.endpoints;
018
019 import java.io.BufferedInputStream;
020 import java.io.InputStream;
021 import java.io.PrintWriter;
022 import java.io.StringWriter;
023 import java.net.URI;
024
025 import javax.jbi.component.ComponentContext;
026 import javax.jbi.messaging.Fault;
027 import javax.jbi.messaging.MessageExchange;
028 import javax.jbi.messaging.NormalizedMessage;
029 import javax.servlet.http.HttpServletRequest;
030 import javax.servlet.http.HttpServletResponse;
031 import javax.xml.stream.XMLStreamReader;
032 import javax.xml.stream.XMLStreamWriter;
033 import javax.xml.transform.stream.StreamSource;
034
035 import org.apache.servicemix.jbi.jaxp.StAXSourceTransformer;
036 import org.apache.servicemix.jbi.jaxp.XMLStreamHelper;
037 import org.apache.servicemix.common.JbiConstants;
038
039 /**
040 * The default consumer marshaler used for non-soap consumer endpoints.
041 *
042 * @author gnodet
043 * @since 3.2
044 */
045 public class DefaultHttpConsumerMarshaler implements HttpConsumerMarshaler {
046
047 private StAXSourceTransformer transformer = new StAXSourceTransformer();
048 private URI defaultMep;
049
050 public DefaultHttpConsumerMarshaler() {
051 this(JbiConstants.IN_OUT);
052 }
053
054 public DefaultHttpConsumerMarshaler(URI defaultMep) {
055 this.defaultMep = defaultMep;
056 }
057
058 public URI getDefaultMep() {
059 return defaultMep;
060 }
061
062 public void setDefaultMep(URI defaultMep) {
063 this.defaultMep = defaultMep;
064 }
065
066 public MessageExchange createExchange(HttpServletRequest request, ComponentContext context) throws Exception {
067 MessageExchange me = context.getDeliveryChannel().createExchangeFactory().createExchange(getDefaultMep());
068 NormalizedMessage in = me.createMessage();
069 InputStream is = request.getInputStream();
070 is = new BufferedInputStream(is);
071 in.setContent(new StreamSource(is));
072 me.setMessage(in, "in");
073 return me;
074 }
075
076 public void sendOut(MessageExchange exchange, NormalizedMessage outMsg, HttpServletRequest request,
077 HttpServletResponse response) throws Exception {
078 XMLStreamReader reader = transformer.toXMLStreamReader(outMsg.getContent());
079 XMLStreamWriter writer = transformer.getOutputFactory().createXMLStreamWriter(response.getWriter());
080 writer.writeStartDocument();
081 XMLStreamHelper.copy(reader, writer);
082 writer.writeEndDocument();
083 writer.flush();
084 response.setStatus(HttpServletResponse.SC_OK);
085 }
086
087 public void sendFault(MessageExchange exchange, Fault fault, HttpServletRequest request,
088 HttpServletResponse response) throws Exception {
089 response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
090 XMLStreamReader reader = transformer.toXMLStreamReader(fault.getContent());
091 XMLStreamWriter writer = transformer.getOutputFactory().createXMLStreamWriter(response.getWriter());
092 XMLStreamHelper.copy(reader, writer);
093 }
094
095 public void sendError(MessageExchange exchange, Exception error, HttpServletRequest request,
096 HttpServletResponse response) throws Exception {
097 response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
098 XMLStreamWriter writer = transformer.getOutputFactory().createXMLStreamWriter(response.getWriter());
099 writer.writeStartDocument();
100 writer.writeStartElement("error");
101 StringWriter sw = new StringWriter();
102 PrintWriter pw = new PrintWriter(sw);
103 error.printStackTrace(pw);
104 pw.close();
105 writer.writeCData(sw.toString());
106 writer.writeEndElement();
107 writer.writeEndDocument();
108 }
109
110 public void sendAccepted(MessageExchange exchange, HttpServletRequest request, HttpServletResponse response)
111 throws Exception {
112 response.setStatus(HttpServletResponse.SC_ACCEPTED);
113 }
114
115 }