com.revo.deployr.client.call.repository.RepositoryFileUploadCall.java Source code

Java tutorial

Introduction

Here is the source code for com.revo.deployr.client.call.repository.RepositoryFileUploadCall.java

Source

/*
 * RepositoryFileUploadCall.java
 *
 * Copyright (C) 2010-2016, Microsoft Corporation
 *
 * This program is licensed to you under the terms of Version 2.0 of the
 * Apache License. This program is distributed WITHOUT
 * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,
 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the
 * Apache License 2.0 (http://www.apache.org/licenses/LICENSE-2.0) for more details.
 *
 */
package com.revo.deployr.client.call.repository;

import com.revo.deployr.client.call.AbstractCall;
import com.revo.deployr.client.core.RCoreResult;
import com.revo.deployr.client.core.REndpoints;
import com.revo.deployr.client.core.impl.RCoreResultImpl;
import com.revo.deployr.client.params.RepoUploadOptions;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.StatusLine;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.mime.HttpMultipartMode;
import org.apache.http.entity.mime.MultipartEntity;
import org.apache.http.entity.mime.content.InputStreamBody;
import org.apache.http.entity.mime.content.StringBody;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;

import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Callable;

/**
 * Provides support for DeployR API call: /r/repository/file/upload.
 * <p/>
 * Simply construct an instance of this call and pass it on the
 * execute() method of your {@link com.revo.deployr.client.RClient}.
 */
public class RepositoryFileUploadCall extends AbstractCall implements Callable<RCoreResult> {

    private Log log = LogFactory.getLog(RepositoryFileUploadCall.class);

    private InputStream fileStream;
    private RepoUploadOptions options;

    private final String API = REndpoints.RREPOSITORYFILEUPLOAD;

    public RepositoryFileUploadCall(InputStream fileStream, RepoUploadOptions options) {
        this.fileStream = fileStream;
        this.options = options;
    }

    /**
     * Internal use only, to execute call use RClient.execute().
     */
    public RCoreResult call() {

        RCoreResultImpl pResult = null;

        try {

            HttpPost httpPost = new HttpPost(serverUrl + API);
            super.httpUriRequest = httpPost;

            List<NameValuePair> postParams = new ArrayList<NameValuePair>();
            postParams.add(new BasicNameValuePair("format", "json"));

            MultipartEntity entity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);

            entity.addPart("file", new InputStreamBody(((InputStream) fileStream), "application/zip"));
            if (options.filename != null)
                entity.addPart("filename",
                        new StringBody(options.filename, "text/plain", Charset.forName("UTF-8")));
            if (options.directory != null)
                entity.addPart("directory",
                        new StringBody(options.directory, "text/plain", Charset.forName("UTF-8")));
            if (options.descr != null)
                entity.addPart("descr", new StringBody(options.descr, "text/plain", Charset.forName("UTF-8")));
            entity.addPart("newversion",
                    new StringBody(Boolean.toString(options.newversion), "text/plain", Charset.forName("UTF-8")));
            if (options.newversionmsg != null)
                entity.addPart("newversionmsg",
                        new StringBody(options.newversionmsg, "text/plain", Charset.forName("UTF-8")));
            if (options.restricted != null)
                entity.addPart("restricted",
                        new StringBody(options.restricted, "text/plain", Charset.forName("UTF-8")));
            entity.addPart("shared",
                    new StringBody(Boolean.toString(options.shared), "text/plain", Charset.forName("UTF-8")));
            entity.addPart("published",
                    new StringBody(Boolean.toString(options.published), "text/plain", Charset.forName("UTF-8")));
            if (options.inputs != null)
                entity.addPart("inputs", new StringBody(options.inputs, "text/plain", Charset.forName("UTF-8")));
            if (options.outputs != null)
                entity.addPart("outputs", new StringBody(options.outputs, "text/plain", Charset.forName("UTF-8")));
            entity.addPart("format", new StringBody("json", "text/plain", Charset.forName("UTF-8")));

            httpPost.setEntity(entity);

            // set any custom headers on the request            
            for (Map.Entry<String, String> entry : httpHeaders.entrySet()) {
                httpPost.addHeader(entry.getKey(), entry.getValue());
            }

            HttpResponse response = httpClient.execute(httpPost);
            StatusLine statusLine = response.getStatusLine();
            HttpEntity responseEntity = response.getEntity();
            String markup = EntityUtils.toString(responseEntity);

            pResult = new RCoreResultImpl(response.getAllHeaders());
            pResult.parseMarkup(markup, API, statusLine.getStatusCode(), statusLine.getReasonPhrase());

        } catch (UnsupportedEncodingException ueex) {
            log.warn("RepositoryFileUploadCall: unsupported encoding exception.", ueex);
        } catch (IOException ioex) {
            log.warn("RepositoryFileUploadCall: io exception.", ioex);
        }

        return pResult;
    }

}