/* * 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.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.apache.commons.httpclient.Header; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.HttpMethodBase; import org.apache.commons.httpclient.URI; import org.apache.commons.httpclient.URIException; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.Task; import org.apache.tools.ant.taskdefs.Property; import org.apache.tools.ant.util.FileUtils; public abstract class AbstractMethodTask extends Task { private HttpMethodBase method; private File responseDataFile; private String responseDataProperty; private String statusCodeProperty; private HttpClient httpClient; private List responseHeaders = new ArrayList(); public static class ResponseHeader { private String name; private String property; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getProperty() { return property; } public void setProperty(String property) { this.property = property; } } protected abstract HttpMethodBase createNewMethod(); protected void configureMethod(HttpMethodBase method) { } protected void cleanupResources(HttpMethodBase method) { } public void addConfiguredResponseHeader(ResponseHeader responseHeader) { this.responseHeaders.add(responseHeader); } public void addConfiguredHttpClient(HttpClientType httpClientType) { this.httpClient = httpClientType.getClient(); } protected HttpMethodBase createMethodIfNecessary() { if (method == null) { method = createNewMethod(); } return method; } public void setResponseDataFile(File responseDataFile) { this.responseDataFile = responseDataFile; } public void setResponseDataProperty(String responseDataProperty) { this.responseDataProperty = responseDataProperty; } public void setStatusCodeProperty(String statusCodeProperty) { this.statusCodeProperty = statusCodeProperty; } public void setClientRefId(String clientRefId) { Object clientRef = getProject().getReference(clientRefId); if (clientRef == null) { throw new BuildException("Reference '" + clientRefId + "' does not exist."); } if (! (clientRef instanceof HttpClientType)) { throw new BuildException("Reference '" + clientRefId + "' is of the wrong type."); } httpClient = ((HttpClientType) clientRef).getClient(); } public void setDoAuthentication(boolean doAuthentication) { createMethodIfNecessary().setDoAuthentication(doAuthentication); } public void setFollowRedirects(boolean doFollowRedirects) { createMethodIfNecessary().setFollowRedirects(doFollowRedirects); } public void addConfiguredParams(MethodParams params) { createMethodIfNecessary().setParams(params); } public void setPath(String path) { createMethodIfNecessary().setPath(path); } public void setURL(String url) { try { createMethodIfNecessary().setURI(new URI(url, false)); } catch (URIException e) { throw new BuildException(e); } } public void setQueryString(String queryString) { createMethodIfNecessary().setQueryString(queryString); } public void addConfiguredHeader(Header header) { createMethodIfNecessary().setRequestHeader(header); } public void execute() throws BuildException { if (httpClient == null) { httpClient = new HttpClient(); } HttpMethodBase method = createMethodIfNecessary(); configureMethod(method); try { int statusCode = httpClient.executeMethod(method); if (statusCodeProperty != null) { Property p = (Property)getProject().createTask("property"); p.setName(statusCodeProperty); p.setValue(String.valueOf(statusCode)); p.perform(); } Iterator it = responseHeaders.iterator(); while (it.hasNext()) { ResponseHeader header = (ResponseHeader)it.next(); Property p = (Property)getProject().createTask("property"); p.setName(header.getProperty()); Header h = method.getResponseHeader(header.getName()); if (h != null && h.getValue() != null) { p.setValue(h.getValue()); p.perform(); } } if (responseDataProperty != null) { Property p = (Property)getProject().createTask("property"); p.setName(responseDataProperty); p.setValue(method.getResponseBodyAsString()); p.perform(); } else if (responseDataFile != null) { FileOutputStream fos = null; InputStream is = null; try { is = method.getResponseBodyAsStream(); fos = new FileOutputStream(responseDataFile); byte buf[] = new byte[10*1024]; int read = 0; while ((read = is.read(buf, 0, 10*1024)) != -1) { fos.write(buf, 0, read); } } finally { FileUtils.close(fos); FileUtils.close(is); } } } catch (IOException e) { throw new BuildException(e); } finally { cleanupResources(method); } } }