| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| |
| package org.apache.axis2.transport.testkit.message; |
| |
| import java.io.ByteArrayInputStream; |
| import java.io.ByteArrayOutputStream; |
| import java.io.StringReader; |
| import java.util.Iterator; |
| import java.util.LinkedList; |
| import java.util.List; |
| |
| import javax.activation.DataHandler; |
| import javax.mail.internet.ContentType; |
| |
| import junit.framework.Assert; |
| |
| import org.apache.axiom.attachments.Attachments; |
| import org.apache.axiom.om.OMElement; |
| import org.apache.axiom.om.OMNode; |
| import org.apache.axiom.om.OMText; |
| import org.apache.axiom.om.OMXMLBuilderFactory; |
| import org.apache.axiom.soap.SOAPEnvelope; |
| import org.apache.axis2.transport.base.BaseConstants; |
| import org.apache.axis2.transport.testkit.message.RESTMessage.Parameter; |
| |
| public interface MessageDecoder<T,U> { |
| MessageDecoder<AxisMessage,byte[]> AXIS_TO_BYTE = |
| new MessageDecoder<AxisMessage,byte[]>() { |
| |
| public byte[] decode(ContentType contentType, AxisMessage message) throws Exception { |
| SOAPEnvelope envelope = message.getEnvelope(); |
| OMElement wrapper = envelope.getBody().getFirstElement(); |
| Assert.assertEquals(BaseConstants.DEFAULT_BINARY_WRAPPER, wrapper.getQName()); |
| OMNode child = wrapper.getFirstOMChild(); |
| Assert.assertTrue(child instanceof OMText); |
| ByteArrayOutputStream baos = new ByteArrayOutputStream(); |
| ((DataHandler)((OMText)child).getDataHandler()).writeTo(baos); |
| return baos.toByteArray(); |
| } |
| }; |
| |
| MessageDecoder<AxisMessage,String> AXIS_TO_STRING = |
| new MessageDecoder<AxisMessage,String>() { |
| |
| public String decode(ContentType contentType, AxisMessage message) throws Exception { |
| SOAPEnvelope envelope = message.getEnvelope(); |
| OMElement wrapper = envelope.getBody().getFirstElement(); |
| Assert.assertEquals(BaseConstants.DEFAULT_TEXT_WRAPPER, wrapper.getQName()); |
| return wrapper.getText(); |
| } |
| }; |
| |
| MessageDecoder<AxisMessage,XMLMessage> AXIS_TO_XML = |
| new MessageDecoder<AxisMessage,XMLMessage>() { |
| |
| public XMLMessage decode(ContentType contentType, AxisMessage message) throws Exception { |
| Attachments attachments = message.getAttachments(); |
| XMLMessage.Type type; |
| if (attachments != null) { |
| type = XMLMessage.Type.SWA; |
| } else { |
| type = null; |
| for (XMLMessage.Type candidate : XMLMessage.Type.values()) { |
| if (candidate.getContentType().equals(message.getMessageType())) { |
| type = candidate; |
| break; |
| } |
| } |
| if (type == null) { |
| // TODO: make this an error later |
| type = XMLMessage.Type.POX; |
| // throw new UnsupportedOperationException("Content type " + message.getMessageType() + " not supported"); |
| } |
| } |
| return new XMLMessage(message.getEnvelope().getBody().getFirstElement(), type, attachments); |
| } |
| }; |
| |
| MessageDecoder<AxisMessage,RESTMessage> AXIS_TO_REST = |
| new MessageDecoder<AxisMessage,RESTMessage>() { |
| |
| public RESTMessage decode(ContentType contentType, AxisMessage message) throws Exception { |
| List<Parameter> parameters = new LinkedList<Parameter>(); |
| OMElement content = message.getEnvelope().getBody().getFirstElement(); |
| for (Iterator<?> it = content.getChildElements(); it.hasNext(); ) { |
| OMElement child = (OMElement)it.next(); |
| parameters.add(new Parameter(child.getLocalName(), child.getText())); |
| } |
| return new RESTMessage(parameters.toArray(new Parameter[parameters.size()])); |
| } |
| }; |
| |
| MessageDecoder<byte[],XMLMessage> BYTE_TO_XML = |
| new MessageDecoder<byte[],XMLMessage>() { |
| |
| public XMLMessage decode(ContentType contentType, byte[] message) throws Exception { |
| XMLMessage.Type type = XMLMessage.getTypeFromContentType(contentType); |
| if (type == null) { |
| throw new Exception("Unrecognized content type " + contentType); |
| } |
| ByteArrayInputStream in = new ByteArrayInputStream(message); |
| if (type == XMLMessage.Type.SWA) { |
| Attachments attachments = new Attachments(in, contentType.toString()); |
| OMElement payload = OMXMLBuilderFactory.createSOAPModelBuilder( |
| attachments.getSOAPPartInputStream(), null).getSOAPEnvelope().getBody().getFirstElement(); |
| return new XMLMessage(payload, type, attachments); |
| } else { |
| String charset = contentType.getParameter("charset"); |
| OMElement payload; |
| if (type == XMLMessage.Type.POX) { |
| payload = OMXMLBuilderFactory.createOMBuilder(in, charset).getDocumentElement(); |
| } else { |
| payload = OMXMLBuilderFactory.createSOAPModelBuilder(in, charset).getSOAPEnvelope().getBody().getFirstElement(); |
| } |
| return new XMLMessage(payload, type); |
| } |
| } |
| }; |
| |
| MessageDecoder<String,XMLMessage> STRING_TO_XML = |
| new MessageDecoder<String,XMLMessage>() { |
| |
| public XMLMessage decode(ContentType contentType, String message) throws Exception { |
| XMLMessage.Type type = XMLMessage.getTypeFromContentType(contentType); |
| if (type == null) { |
| throw new Exception("Unrecognized content type " + contentType); |
| } |
| OMElement payload; |
| if (type == XMLMessage.Type.POX) { |
| payload = OMXMLBuilderFactory.createOMBuilder(new StringReader(message)).getDocumentElement(); |
| } else { |
| payload = OMXMLBuilderFactory.createSOAPModelBuilder(new StringReader(message)).getSOAPEnvelope().getBody().getFirstElement(); |
| } |
| return new XMLMessage(payload, type); |
| } |
| }; |
| |
| MessageDecoder<byte[],String> BYTE_TO_STRING = |
| new MessageDecoder<byte[],String>() { |
| |
| public String decode(ContentType contentType, byte[] message) throws Exception { |
| String charset = contentType.getParameter("charset"); |
| return new String(message, charset); |
| } |
| }; |
| |
| U decode(ContentType contentType, T message) throws Exception; |
| } |