001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one
003: * or more contributor license agreements. See the NOTICE file
004: * distributed with this work for additional information
005: * regarding copyright ownership. The ASF licenses this file
006: * to you under the Apache License, Version 2.0 (the
007: * "License"); you may not use this file except in compliance
008: * with the License. You may obtain a copy of the License at
009: *
010: * http://www.apache.org/licenses/LICENSE-2.0
011: *
012: * Unless required by applicable law or agreed to in writing,
013: * software distributed under the License is distributed on an
014: * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015: * KIND, either express or implied. See the License for the
016: * specific language governing permissions and limitations
017: * under the License.
018: */
019:
020: package org.apache.axis2.transport.http;
021:
022: import org.apache.axiom.om.OMOutputFormat;
023: import org.apache.axis2.AxisFault;
024: import org.apache.axis2.context.MessageContext;
025: import org.apache.axis2.transport.MessageFormatter;
026: import org.apache.axis2.util.JavaUtils;
027: import org.apache.commons.httpclient.methods.RequestEntity;
028:
029: import javax.xml.stream.FactoryConfigurationError;
030: import java.io.IOException;
031: import java.io.OutputStream;
032: import java.util.zip.GZIPOutputStream;
033:
034: /**
035: * This Request Entity is used by the HTTPCommonsTransportSender. This wraps the
036: * Axis2 message formatter object.
037: */
038: public class AxisRequestEntity implements RequestEntity {
039:
040: private MessageFormatter messageFormatter;
041:
042: private boolean chunked = false;
043:
044: private MessageContext messageContext;
045:
046: private byte[] bytes;
047:
048: private boolean isAllowedRetry;
049:
050: private OMOutputFormat format;
051:
052: private String soapAction;
053:
054: /**
055: * Method calls to this request entity are delegated to the following Axis2
056: * message formatter object.
057: *
058: * @param messageFormatter
059: */
060: public AxisRequestEntity(MessageFormatter messageFormatter,
061: MessageContext msgContext, OMOutputFormat format,
062: String soapAction, boolean chunked, boolean isAllowedRetry) {
063: this .messageFormatter = messageFormatter;
064: this .messageContext = msgContext;
065: this .chunked = chunked;
066: this .isAllowedRetry = isAllowedRetry;
067: this .format = format;
068: this .soapAction = soapAction;
069: }
070:
071: public boolean isRepeatable() {
072: // All Axis2 request entity implementations were returning this true
073: // So we return true as defualt
074: return true;
075: }
076:
077: public void writeRequest(OutputStream outStream) throws IOException {
078: Object gzip = messageContext.getOptions().getProperty(
079: HTTPConstants.MC_GZIP_REQUEST);
080: if (gzip != null && JavaUtils.isTrueExplicitly(gzip) && chunked) {
081: outStream = new GZIPOutputStream(outStream);
082: }
083: try {
084: if (chunked) {
085: messageFormatter.writeTo(messageContext, format,
086: outStream, isAllowedRetry);
087: } else {
088: if (bytes == null) {
089: bytes = messageFormatter.getBytes(messageContext,
090: format);
091: }
092: outStream.write(bytes);
093: }
094: if (outStream instanceof GZIPOutputStream) {
095: ((GZIPOutputStream) outStream).finish();
096: }
097: outStream.flush();
098: } catch (FactoryConfigurationError e) {
099: throw AxisFault.makeFault(e);
100: } catch (IOException e) {
101: throw AxisFault.makeFault(e);
102: }
103:
104: }
105:
106: public long getContentLength() {
107: if (chunked) {
108: return -1;
109: }
110: if (bytes == null) {
111: try {
112: bytes = messageFormatter.getBytes(messageContext,
113: format);
114: } catch (AxisFault e) {
115: return -1;
116: }
117: }
118: return bytes.length;
119: }
120:
121: public String getContentType() {
122: return messageFormatter.getContentType(messageContext, format,
123: soapAction);
124: }
125: }
|