All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.dtolabs.client.utils.WebserviceHttpClientChannel Maven / Gradle / Ivy

There is a newer version: 5.6.0-20240912
Show newest version
/*
 * 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;
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy