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: package org.apache.axis2.transport.http.util;
020:
021: import org.apache.commons.httpclient.methods.multipart.PartBase;
022: import org.apache.commons.httpclient.util.EncodingUtil;
023:
024: import java.io.IOException;
025: import java.io.OutputStream;
026:
027: public class ComplexPart extends PartBase {
028:
029: /**
030: * Default content encoding of string parameters.
031: */
032: public static final String DEFAULT_CONTENT_TYPE = "application/xml";
033:
034: /**
035: * Default charset of string parameters
036: */
037: public static final String DEFAULT_CHARSET = "US-ASCII";
038:
039: /**
040: * Default transfer encoding of string parameters
041: */
042: public static final String DEFAULT_TRANSFER_ENCODING = "8bit";
043:
044: /**
045: * Contents of this StringPart.
046: */
047: private byte[] content;
048:
049: /**
050: * The String value of this part.
051: */
052: private String value;
053:
054: /**
055: * Constructor.
056: *
057: * @param name The name of the part
058: * @param value the string to post
059: * @param charset the charset to be used to encode the string, if <code>null</code>
060: * the {@link #DEFAULT_CHARSET default} is used
061: */
062: public ComplexPart(String name, String value, String charset) {
063:
064: super (name, DEFAULT_CONTENT_TYPE,
065: charset == null ? DEFAULT_CHARSET : charset,
066: DEFAULT_TRANSFER_ENCODING);
067: if (value == null) {
068: throw new IllegalArgumentException("Value may not be null");
069: }
070: if (value.indexOf(0) != -1) {
071: // See RFC 2048, 2.8. "8bit Data"
072: throw new IllegalArgumentException(
073: "NULs may not be present in string parts");
074: }
075: this .value = value;
076: }
077:
078: /**
079: * Constructor.
080: *
081: * @param name The name of the part
082: * @param value the string to post
083: */
084: public ComplexPart(String name, String value) {
085: this (name, value, null);
086: }
087:
088: /**
089: * Gets the content in bytes. Bytes are lazily created to allow the charset to be changed
090: * after the part is created.
091: *
092: * @return the content in bytes
093: */
094: private byte[] getContent() {
095: if (content == null) {
096: content = EncodingUtil.getBytes(value, getCharSet());
097: }
098: return content;
099: }
100:
101: /**
102: * Writes the data to the given OutputStream.
103: *
104: * @param out the OutputStream to write to
105: * @throws IOException if there is a write error
106: */
107: protected void sendData(OutputStream out) throws IOException {
108: out.write(getContent());
109: }
110:
111: /**
112: * Return the length of the data.
113: *
114: * @return The length of the data.
115: * @throws IOException If an IO problem occurs
116: * @see org.apache.commons.httpclient.methods.multipart.Part#lengthOfData()
117: */
118: protected long lengthOfData() throws IOException {
119: return getContent().length;
120: }
121:
122: /* (non-Javadoc)
123: * @see org.apache.commons.httpclient.methods.multipart.BasePart#setCharSet(java.lang.String)
124: */
125: public void setCharSet(String charSet) {
126: super.setCharSet(charSet);
127: this.content = null;
128: }
129:
130: }
|