Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance. Project price only 1 $
You can buy this project and download/modify it how often you want.
/*
* Copyright 2010 DTO Labs, Inc. (http://dtolabs.com)
*
* 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.
*/
/*
* ColonyHttpClientChannel.java
*
* User: greg
* Created: Jan 14, 2005 11:57:17 AM
* $Id: CommanderHttpClientChannel.java 8443 2008-07-18 02:03:59Z gschueler $
*/
package com.dtolabs.client.utils;
import com.dtolabs.rundeck.core.CoreException;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.RequestEntity;
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.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.io.SAXReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.OutputStream;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Map;
/**
* WebserviceHttpClientChannel is a {@link WebserviceHttpClient} implementation. Used to
* make api requests to Webservice via HTTP. Instances should be obtained via {@link WebserviceHttpClientFactory}.
*
* @author Greg Schueler [email protected]
* @version $Revision: 8443 $
*/
class WebserviceHttpClientChannel extends BaseHttpClientChannel implements WebserviceHttpClient {
public static org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger(WebserviceHttpClientChannel.class);
public static final String XML_CONTENT_TYPE = "text/xml";
public static final String HTTP_SECURE_PROTOCOL = "https";
boolean errorResponse = false;
boolean validResponse = false;
boolean hasDoc = false;
String responseMessage = null;
private Document resultDoc = null;
private File uploadFile = null;
private Map formData=null;
private String fileparam = null;
/**
* Creates a new instance of ColonyHttpChannel.
*
* @param urlSpec The base URL for the request
* @param authenticator a ColonyHttpAuthenticator instance
* @param query a Map of query parameters to be added to the URL
*
* @throws com.dtolabs.rundeck.core.CoreException
* if the Bean cannot be correctly marshalled via the {@link com.networkgps.itnav.colony.MarshallFacility}.
*/
public WebserviceHttpClientChannel(final String urlSpec,
final HttpAuthenticator authenticator,
final Map query)
throws CoreException {
super(urlSpec, authenticator, query);
}
/**
* Creates a new instance of ColonyHttpChannel.
*
* @param urlSpec The base URL for the request
* @param authenticator a ColonyHttpAuthenticator instance
* @param query a Map of query parameters to be added to the URL
* @param uploadFile a file to upload as part of a multipart request
* @param fileparam parameter name for the uploaded file in the multipart request
*
* @throws com.dtolabs.rundeck.core.CoreException
* if the Bean cannot be correctly marshalled via the {@link com.networkgps.itnav.colony.MarshallFacility}.
*/
public WebserviceHttpClientChannel(final String urlSpec,
final HttpAuthenticator authenticator,
final Map query,
final File uploadFile,
final String fileparam)
throws CoreException {
this(urlSpec, authenticator, query);
setUploadFile(uploadFile);
setFileparam(fileparam);
}
/**
* Creates a new instance of ColonyHttpChannel.
*
* @param urlSpec The base URL for the request
* @param authenticator a ColonyHttpAuthenticator instance
* @param query a Map of query parameters to be added to the URL
* @param uploadFile a file to upload as part of a multipart request
* @param fileparam parameter name for the uploaded file in the multipart request
*
* @throws com.dtolabs.rundeck.core.CoreException
* if the Bean cannot be correctly marshalled via the {@link com.networkgps.itnav.colony.MarshallFacility}.
*/
public WebserviceHttpClientChannel(final String urlSpec,
final HttpAuthenticator authenticator,
final Map query,
final Map formData)
throws CoreException {
this(urlSpec, authenticator, query);
setFormData(formData);
}
/**
* Creates a new instance of ColonyHttpChannel.
*
* @param urlSpec The base URL for the request
* @param authenticator a ColonyHttpAuthenticator instance
* @param query a Map of query parameters to be added to the URL
* @param destination outputstream to write the response to
* @param expectedContentType an expected content type
*
* @throws com.dtolabs.rundeck.core.CoreException
* if the Bean cannot be correctly marshalled via the {@link com.networkgps.itnav.colony.MarshallFacility}.
*/
public WebserviceHttpClientChannel(final String urlSpec,
final HttpAuthenticator authenticator,
final Map query,
final OutputStream destination,
final String expectedContentType) {
super(urlSpec, authenticator, query, destination, expectedContentType);
}
/**
* Creates a new instance of ColonyHttpChannel.
*
* @param urlSpec The base URL for the request
* @param authenticator a ColonyHttpAuthenticator instance
* @param query a Map of query parameters to be added to the URL
* @param uploadFile file to upload in a multipart request
* @param fileparam parameter name for the uploaded file in the multipart request
* @param destination outputstream to write the response to
* @param expectedContentType an expected content type
*
* @throws com.dtolabs.rundeck.core.CoreException
* if the Bean cannot be correctly marshalled via the {@link com.networkgps.itnav.colony.MarshallFacility}.
*/
public WebserviceHttpClientChannel(final String urlSpec,
final HttpAuthenticator authenticator,
final Map query,
final File uploadFile,
final String fileparam,
final OutputStream destination,
final String expectedContentType) {
this(urlSpec, authenticator, query, destination, expectedContentType);
setUploadFile(uploadFile);
setFileparam(fileparam);
}
/**
* Returns the RequestEntity for the Post method request. If a file upload is included, it will return a
* MultipartRequestEntity with the file as one part. otherwise, null is returned.
*/
protected RequestEntity getRequestEntity(final PostMethod method) {
if (uploadFile != null) {
logger.debug("attempting to upload file with colony request");
try {
final Part[] parts = new Part[]{
new FilePart(null != getFileparam() ? getFileparam() : "uploadFile",
uploadFile.getName(),
uploadFile)
};
return new MultipartRequestEntity(parts, method.getParams());
} catch (FileNotFoundException e) {
throw new CoreException(
"Could not upload file in request to server: " + uploadFile.getAbsolutePath(), e);
}
} else {
return null;
}
}
@Override
protected NameValuePair[] getRequestBody(final PostMethod method) {
if(null!=formData && formData.size()>0) {
final ArrayList list = new ArrayList();
for (final Map.Entry stringStringEntry : formData.entrySet()) {
final Object value = stringStringEntry.getValue();
if(value instanceof String){
list.add(new NameValuePair(stringStringEntry.getKey(), (String) value));
}else if(value instanceof Collection) {
Collection values = (Collection) value;
for (final Object o : values) {
list.add(new NameValuePair(stringStringEntry.getKey(), o.toString()));
}
}
}
return list.toArray(new NameValuePair[formData.size()]);
}else{
return null;
}
}
protected boolean isPostMethod() {
return null != uploadFile || null!=formData && formData.size()>0;
}
/**
* return a response message
*/
public String getResponseMessage() {
return responseMessage;
}
/**
* true if the response was an error message
*/
public boolean isErrorResponse() {
return errorResponse;
}
/**
* return true if the resultbean was present
*/
public boolean hasResultDoc() {
if (null == getResultDoc()) {
hasDoc = false;
}
return hasDoc;
}
/**
* return a result bean if it was unmarshalled successfully. return null otherwise or if none was received.
*/
public Document getResultDoc() {
return resultDoc;
}
/**
* is the response valid
*/
public boolean isValidResponse() {
return validResponse;
}
/**
* called by makeRequest. Evaluates the response to determine the state of the response and deserialize the content
* (bean).
*/
protected void postMakeRequest() {
responseMessage = getResponseHeader(Constants.X_RUNDECK_RESULT_HEADER) != null ?
getResponseHeader(Constants.X_RUNDECK_RESULT_HEADER).getValue() : getReasonCode();
validResponse = getResultCode() >= 200 && getResultCode() < 300;
errorResponse = !validResponse;
String type = getResultContentType();
if (type!=null && type.indexOf(";") > 0) {
type = type.substring(0, type.indexOf(";")).trim();
}
if (XML_CONTENT_TYPE.equals(type)) {
final SAXReader reader = new SAXReader();
final Document document;
try {
document = reader.read(getResultStream());
setResultDoc(document);
} catch (DocumentException e) {
logger.error("Unable to parse result document: " + e.getMessage(), e);
}
}
}
private void setUploadFile(final File uploadFile) {
this.uploadFile = uploadFile;
if (null != uploadFile) {
logger.debug("uploading file: " + uploadFile.getAbsolutePath());
}
}
public String getFileparam() {
return fileparam;
}
public void setFileparam(final String fileparam) {
this.fileparam = fileparam;
}
private void setResultDoc(final Document resultDoc) {
this.resultDoc = resultDoc;
}
public Map getFormData() {
return formData;
}
public void setFormData(Map formData) {
this.formData = formData;
}
}