de.cismet.cids.custom.utils.nas.CidsActionClient.java Source code

Java tutorial

Introduction

Here is the source code for de.cismet.cids.custom.utils.nas.CidsActionClient.java

Source

/***************************************************
*
* cismet GmbH, Saarbruecken, Germany
*
*              ... and it just works.
*
****************************************************/
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package de.cismet.cids.custom.utils.nas;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;

import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.config.ClientConfig;
import com.sun.jersey.api.client.config.DefaultClientConfig;
import com.sun.jersey.api.client.filter.HTTPBasicAuthFilter;
import com.sun.jersey.api.json.JSONConfiguration;
import com.sun.jersey.multipart.FormDataMultiPart;
import com.sun.jersey.multipart.impl.MultiPartWriter;

import org.apache.commons.io.IOUtils;
import org.apache.log4j.Logger;

import org.openide.util.Exceptions;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

import java.util.HashMap;
import java.util.List;

import javax.ws.rs.core.MediaType;

import de.cismet.cidsx.server.api.types.Action;
import de.cismet.cidsx.server.api.types.ActionResultInfo;
import de.cismet.cidsx.server.api.types.ActionTask;
import de.cismet.cidsx.server.api.types.CollectionResource;

/**
 * DOCUMENT ME!
 *
 * @author   daniel
 * @version  $Revision$, $Date$
 */
public class CidsActionClient {

    //~ Static fields/initializers ---------------------------------------------

    protected static final String ACTION_URL = "/actions";
    //    private static final ApacheHttpClient client = ApacheHttpClient.create();
    private static final Logger LOG = Logger.getLogger(CidsActionClient.class);

    //~ Instance fields --------------------------------------------------------

    protected String domain;
    protected String baseURL;
    private final Client client;
    private final ObjectMapper mapper = new ObjectMapper();
    private final String RESOURCE_URL = "/%1$s.%2$s/tasks/%3$s/results/%4$s";

    //~ Constructors -----------------------------------------------------------

    /**
     * Creates a new AbstractCidsActionClient object.
     *
     * @param  domain   DOCUMENT ME!
     * @param  baseURL  DOCUMENT ME!
     */
    public CidsActionClient(final String domain, final String baseURL) {
        this.domain = domain;
        this.baseURL = baseURL;
        final ClientConfig clientConfig = new DefaultClientConfig();
        clientConfig.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE);
        clientConfig.getClasses().add(MultiPartWriter.class);
        client = Client.create(clientConfig);
    }

    //~ Methods ----------------------------------------------------------------

    /**
     * DOCUMENT ME!
     *
     * @return  DOCUMENT ME!
     */
    public Client getClient() {
        return client;
    }

    /**
     * DOCUMENT ME!
     *
     * @param  user      DOCUMENT ME!
     * @param  password  DOCUMENT ME!
     */
    public void setBasicAuthentication(final String user, final String password) {
        client.addFilter(new HTTPBasicAuthFilter(user, password));
    }

    /**
     * DOCUMENT ME!
     *
     * @param   <T>  DOCUMENT ME!
     * @param   c    DOCUMENT ME!
     * @param   url  DOCUMENT ME!
     *
     * @return  DOCUMENT ME!
     */
    private <T extends Object> T getSimpleResource(final Class<T> c, final String url) {
        final WebResource r = client.resource(url);
        final String jsonResult = r.get(String.class);
        try {
            final T result = mapper.readValue(jsonResult, c);
            return result;
        } catch (IOException ex) {
            LOG.error(ex.getMessage(), ex);
        }
        return null;
    }

    /**
     * DOCUMENT ME!
     *
     * @param   <E>  DOCUMENT ME!
     * @param   c    DOCUMENT ME!
     * @param   url  DOCUMENT ME!
     *
     * @return  DOCUMENT ME!
     */
    private <E extends Object> List<E> getCollectionResource(final Class<E> c, final String url) {
        try {
            final String json = client.resource(url).queryParam("domain", "cids").accept(MediaType.APPLICATION_JSON)
                    .get(String.class);

            final CollectionResource resource = mapper.readValue(json, CollectionResource.class);
            final String actionJson = mapper.writeValueAsString(resource.get$collection());
            final List<E> result = mapper.readValue(actionJson, new TypeReference<List<E>>() {
            });

            return result;
        } catch (IOException ex) {
            LOG.error(ex.getMessage(), ex);
        }
        return null;
    }

    /**
     * DOCUMENT ME!
     *
     * @return  DOCUMENT ME!
     */
    protected List<Action> getAllActions() {
        final String url = baseURL + ACTION_URL;
        return getCollectionResource(Action.class, url);
    }

    /**
     * DOCUMENT ME!
     *
     * @param   actionKey  DOCUMENT ME!
     *
     * @return  DOCUMENT ME!
     */
    protected Action getAction(final String actionKey) {
        final String formattedUrl = String.format(RESOURCE_URL, domain, actionKey, "", "");
        final String url = baseURL + ACTION_URL + formattedUrl.substring(0, formattedUrl.lastIndexOf("/tasks"));
        return getSimpleResource(Action.class, url);
    }

    /**
     * DOCUMENT ME!
     *
     * @param   actionKey  DOCUMENT ME!
     *
     * @return  DOCUMENT ME!
     */
    protected List<ActionTask> getAllRunningTasks(final String actionKey) {
        final String formattedUrl = String.format(RESOURCE_URL, domain, actionKey, "", "");
        final String url = baseURL + ACTION_URL + formattedUrl.substring(0, formattedUrl.lastIndexOf("//results"));
        return getCollectionResource(ActionTask.class, url);
    }

    /**
     * DOCUMENT ME!
     *
     * @param   actionKey  DOCUMENT ME!
     * @param   taskKey    DOCUMENT ME!
     *
     * @return  DOCUMENT ME!
     */
    protected ActionTask.Status getTaskStatus(final String actionKey, final String taskKey) {
        final String formattedUrl = String.format(RESOURCE_URL, domain, actionKey, taskKey, "");
        final String url = baseURL + ACTION_URL + formattedUrl.substring(0, formattedUrl.lastIndexOf("/results"));
        final ActionTask status = getSimpleResource(ActionTask.class, url);
        if (status != null) {
            return status.getStatus();
        }
        return null;
    }

    /**
     * DOCUMENT ME!
     *
     * @param  actionKey  DOCUMENT ME!
     * @param  taskKey    DOCUMENT ME!
     */
    protected void cancelTask(final String actionKey, final String taskKey) {
        final String formattedUrl = String.format(RESOURCE_URL, domain, actionKey, taskKey, "");
        final String url = baseURL + ACTION_URL + formattedUrl.substring(0, formattedUrl.lastIndexOf("/results"));
        client.resource(url).delete();
    }

    /**
     * DOCUMENT ME!
     *
     * @param   actionKey                 DOCUMENT ME!
     * @param   task                      DOCUMENT ME!
     * @param   f                         DOCUMENT ME!
     * @param   fileType                  DOCUMENT ME!
     * @param   requestResultingInstance  DOCUMENT ME!
     *
     * @return  DOCUMENT ME!
     */
    protected ActionTask createTask(final String actionKey, final ActionTask task, final File f,
            final MediaType fileType, final boolean requestResultingInstance) {
        try {
            final String formattedUrl = String.format(RESOURCE_URL, domain, actionKey, "", "");
            final String url = baseURL + ACTION_URL
                    + formattedUrl.substring(0, formattedUrl.lastIndexOf("//results"));
            final WebResource webResource = client.resource(url).queryParam("requestResultingInstance",
                    Boolean.toString(requestResultingInstance));

            final FormDataMultiPart form = new FormDataMultiPart();
            form.field("taskparams", mapper.writeValueAsString(task), MediaType.APPLICATION_JSON_TYPE);
            if (f != null) {
                form.field("file", f, fileType);
            }
            final String responseJson = webResource.type(MediaType.MULTIPART_FORM_DATA)
                    .accept(MediaType.APPLICATION_JSON).post(String.class, form);

            final ActionTask resultingInstance = mapper.readValue(responseJson, ActionTask.class);

            return resultingInstance;
        } catch (JsonProcessingException ex) {
            LOG.error(ex.getMessage(), ex);
        } catch (IOException ex) {
            LOG.error(ex.getMessage(), ex);
        }
        return null;
    }

    /**
     * DOCUMENT ME!
     *
     * @param   <T>        DOCUMENT ME!
     * @param   c          DOCUMENT ME!
     * @param   actionKey  DOCUMENT ME!
     * @param   taskKey    DOCUMENT ME!
     * @param   resultKey  DOCUMENT ME!
     *
     * @return  DOCUMENT ME!
     */
    protected <T extends Object> T getTaskResult(final Class<T> c, final String actionKey, final String taskKey,
            final String resultKey) {
        final String url = baseURL + ACTION_URL
                + String.format(RESOURCE_URL, domain, actionKey, taskKey, resultKey);
        final WebResource r = client.resource(url);

        return r.get(c);
    }

    /**
     * DOCUMENT ME!
     *
     * @param   actionKey  DOCUMENT ME!
     * @param   taskKey    DOCUMENT ME!
     *
     * @return  DOCUMENT ME!
     */
    protected List<ActionResultInfo> getTaskResults(final String actionKey, final String taskKey) {
        final String url = baseURL + ACTION_URL + String.format(RESOURCE_URL, domain, actionKey, taskKey, "")
                .substring(0, RESOURCE_URL.lastIndexOf("/"));

        return getCollectionResource(ActionResultInfo.class, url);
    }

    /**
     * DOCUMENT ME!
     *
     * @param  args  DOCUMENT ME!
     */
    public static void main(final String[] args) {
        final CidsActionClient client = new CidsActionClient("cids", "http://s102x002:8890");
        final ActionTask at = new ActionTask();
        at.setParameters(new HashMap<String, Object>());
        final File f = new File("ci_test_klein.zip");
        //        final ActionTask.Status status = client.getTaskStatus("dxf", "1406735852661");
        //        System.out.println("Status " + status);
        final ActionTask resultInstance = client.createTask("dummydxf", at, f, new MediaType("application", "zip"),
                true);
        System.out.println("Resulting instance: " + resultInstance.getKey());

        ActionTask.Status status = client.getTaskStatus("dummydxf", resultInstance.getKey());
        while (status != ActionTask.Status.FINISHED) {
            try {
                Thread.sleep(1000);
                status = client.getTaskStatus("dummydxf", resultInstance.getKey());
            } catch (InterruptedException ex) {
                Exceptions.printStackTrace(ex);
            }
        }

        final File tmpFile = client.getTaskResult(File.class, "dummydxf", resultInstance.getKey(), "dxfOutput");
        final File result = new File("result.dxf");
        try {
            IOUtils.copy(new FileInputStream(tmpFile), new FileOutputStream(result));
        } catch (IOException ex) {
            Exceptions.printStackTrace(ex);
        }
        System.out.println("Done");
    }
}