/*
* Copyright (c) 2001-2006 Ant-Contrib project. All rights reserved.
*
* Licensed 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 net.sf.antcontrib.net.httpclient;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import org.apache.commons.httpclient.HttpMethodBase;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.methods.InputStreamRequestEntity;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.StringRequestEntity;
import org.apache.commons.httpclient.methods.multipart.FilePart;
import org.apache.commons.httpclient.methods.multipart.MultipartRequestEntity;
import org.apache.commons.httpclient.methods.multipart.Part;
import org.apache.commons.httpclient.methods.multipart.StringPart;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.util.FileUtils;
public class PostMethodTask
extends AbstractMethodTask {
private List parts = new ArrayList();
private boolean multipart;
private transient FileInputStream stream;
public static class FilePartType {
private File path;
private String contentType = FilePart.DEFAULT_CONTENT_TYPE;
private String charSet = FilePart.DEFAULT_CHARSET;
public File getPath() {
return path;
}
public void setPath(File path) {
this.path = path;
}
public String getContentType() {
return contentType;
}
public void setContentType(String contentType) {
this.contentType = contentType;
}
public String getCharSet() {
return charSet;
}
public void setCharSet(String charSet) {
this.charSet = charSet;
}
}
public static class TextPartType {
private String name = "";
private String value = "";
private String charSet = StringPart.DEFAULT_CHARSET;
private String contentType = StringPart.DEFAULT_CONTENT_TYPE;
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCharSet() {
return charSet;
}
public void setCharSet(String charSet) {
this.charSet = charSet;
}
public String getContentType() {
return contentType;
}
public void setContentType(String contentType) {
this.contentType = contentType;
}
public void setText(String text) {
this.value = text;
}
}
public void addConfiguredFile(FilePartType file) {
this.parts.add(file);
}
public void setMultipart(boolean multipart) {
this.multipart = multipart;
}
public void addConfiguredText(TextPartType text) {
this.parts.add(text);
}
public void setParameters(File parameters) {
PostMethod post = getPostMethod();
Properties p = new Properties();
Iterator it = p.entrySet().iterator();
while (it.hasNext()) {
Map.Entry entry = (Map.Entry) it.next();
post.addParameter(entry.getKey().toString(),
entry.getValue().toString());
}
}
protected HttpMethodBase createNewMethod() {
return new PostMethod();
}
private PostMethod getPostMethod() {
return ((PostMethod)createMethodIfNecessary());
}
public void addConfiguredParameter(NameValuePair pair) {
getPostMethod().setParameter(pair.getName(), pair.getValue());
}
public void setContentChunked(boolean contentChunked) {
getPostMethod().setContentChunked(contentChunked);
}
protected void configureMethod(HttpMethodBase method) {
PostMethod post = (PostMethod) method;
if (parts.size() == 1 && ! multipart) {
Object part = parts.get(0);
if (part instanceof FilePartType) {
FilePartType filePart = (FilePartType)part;
try {
stream = new FileInputStream(
filePart.getPath().getAbsolutePath());
post.setRequestEntity(
new InputStreamRequestEntity(stream,
filePart.getPath().length(),
filePart.getContentType()));
}
catch (IOException e) {
throw new BuildException(e);
}
}
else if (part instanceof TextPartType) {
TextPartType textPart = (TextPartType)part;
try {
post.setRequestEntity(
new StringRequestEntity(textPart.getValue(),
textPart.getContentType(),
textPart.getCharSet()));
}
catch (UnsupportedEncodingException e) {
throw new BuildException(e);
}
}
}
else if (! parts.isEmpty()){
Part partArray[] = new Part[parts.size()];
for (int i=0;i<parts.size();i++) {
Object part = parts.get(i);
if (part instanceof FilePartType) {
FilePartType filePart = (FilePartType)part;
try {
partArray[i] = new FilePart(filePart.getPath().getName(),
filePart.getPath().getName(),
filePart.getPath(),
filePart.getContentType(),
filePart.getCharSet());
}
catch (FileNotFoundException e) {
throw new BuildException(e);
}
}
else if (part instanceof TextPartType) {
TextPartType textPart = (TextPartType)part;
partArray[i] = new StringPart(textPart.getName(),
textPart.getValue(),
textPart.getCharSet());
((StringPart)partArray[i]).setContentType(textPart.getContentType());
}
}
MultipartRequestEntity entity = new MultipartRequestEntity(
partArray,
post.getParams());
post.setRequestEntity(entity);
}
}
protected void cleanupResources(HttpMethodBase method) {
FileUtils.close(stream);
}
}