org.mule.modules.jobvite.DefaultJobviteClient.java Source code

Java tutorial

Introduction

Here is the source code for org.mule.modules.jobvite.DefaultJobviteClient.java

Source

/**
 * (c) 2003-2014 MuleSoft, Inc. The software in this package is published under
 * the terms of the CPAL v1.0 license, a copy of which has been included with this
 * distribution in the LICENSE.md file.
 */

package org.mule.modules.jobvite;

import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;

import org.joda.time.format.DateTimeFormatterBuilder;
import org.mule.modules.hrxml.candidate.CandidateType;
import org.mule.modules.hrxml.newhire.NewHireType;
import org.mule.modules.jobvite.api.ResourceFetcher;
import org.mule.modules.jobvite.api.ResultsPaginatedIterable;
import org.mule.modules.jobvite.parser.ResultsPage;
import org.mule.modules.jobvite.parser.ResultsParser;
import org.mule.modules.jobvite.parser.ResultsParsers;

import com.google.gson.Gson;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.config.DefaultClientConfig;
import com.sun.jersey.core.util.MultivaluedMapImpl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * @author Gaston Ponti
 * @since Dec 26, 2011
 */
public class DefaultJobviteClient implements JobviteClient {
    private final String baseUri;
    private WebResource webResource;
    private final String accessKey;
    private final String accessSecret;
    private boolean init;

    private static Logger logger = LoggerFactory.getLogger(DefaultJobviteClient.class);

    public DefaultJobviteClient(String baseUri, String accessKey, String accessSecret) {
        this.baseUri = baseUri;
        this.accessKey = accessKey;
        this.accessSecret = accessSecret;
    }

    /** @see org.mule.modules.jobvite.JobviteClient#getCandidate() */
    @Override
    public Iterable<CandidateType> getCandidates(String candidateState, Date dateStart, Date dateEnd) {
        MultivaluedMap<String, String> params = new MultivaluedMapImpl();
        params.add("action", "getCandidates");

        if (candidateState != null)
            params.add("wflowstate", candidateState);

        return fetchCandidates(new WebResourceFetcher<CandidateType>(params, ResultsParsers.newCandidatesParser(),
                dateStart, dateEnd));
    }

    /** @see org.mule.modules.jobvite.JobviteClient#getNewHires() */
    @Override
    public Iterable<NewHireType> getNewHires(Date dateStart, Date dateEnd) {
        MultivaluedMap<String, String> params = new MultivaluedMapImpl();
        params.add("action", "getNewHires");

        return fetchCandidates(
                new WebResourceFetcher<NewHireType>(params, ResultsParsers.newNewHireParser(), dateStart, dateEnd));
    }

    @Override
    public void updateCandidates(Map<String, String> candidateUpdates) {
        MultivaluedMap<String, String> params = new MultivaluedMapImpl();
        params.add("action", "updateCandidates");
        params.add("format", "hrxml");
        params.add("api", accessKey);
        params.add("secret", accessSecret);
        params.add("data", candidateUpdatesFormat(candidateUpdates));
        String str = getWebResource().path("/candidate").queryParams(params).accept(MediaType.APPLICATION_XML)
                .post(String.class);
    }

    private String candidateUpdatesFormat(Map<String, String> candidateUpdates) {
        String str = "[";
        for (Entry<String, String> candidate : candidateUpdates.entrySet()) {
            str += "{\"applicationId\":\"" + candidate.getKey() + "\"," + "\"wflowstate\":\"" + candidate.getValue()
                    + "\"},";
        }

        return str.substring(0, str.length() - 1) + "]";
    }

    @Override
    public String updateEmployees(String companyId, String importerEmail, String reportEmail,
            boolean doNotSyncOnWarnings, boolean overwriteEmployeeNamesAndEmail,
            List<Map<String, Object>> employeeUpdates) {
        MultivaluedMap<String, String> params = new MultivaluedMapImpl();
        params.add("json", employeeUpdatesFormat(companyId, importerEmail, reportEmail, doNotSyncOnWarnings,
                overwriteEmployeeNamesAndEmail, employeeUpdates));
        params.add("api", accessKey);
        params.add("sc", accessSecret);
        params.add("companyId", companyId);
        String str = getWebResource().path("/employee").entity(params).post(String.class);

        return str;
    }

    private String employeeUpdatesFormat(String companyId, String importerEmail, String reportEmail,
            boolean doNotSyncOnWarnings, boolean overwriteEmployeeNamesAndEmail,
            List<Map<String, Object>> employeeUpdates) {
        Gson gson = new Gson();
        String str0 = gson.toJson(employeeUpdates);

        String str = "{\"CompanyId\":\"" + companyId + "\"," + "\"ImporterEmail\":\"" + importerEmail + "\","
                + "\"ReportEmail\":\"" + reportEmail + "\"," + "\"DoNotSyncOnWarnings\":"
                + (doNotSyncOnWarnings ? "true" : "false") + "," + "\"OverwriteEmployeeNamesAndEmail\":"
                + (overwriteEmployeeNamesAndEmail ? "true" : "false") + "," + "\"Employees\":" + str0 + "}";

        return str;
    }

    private String formatDate(Date date) {
        return new DateTimeFormatterBuilder().appendMonthOfYear(2).appendLiteral('/').appendDayOfMonth(2)
                .appendLiteral('/').appendYear(4, 4).toFormatter().print(date.getTime());
    }

    protected <T> Iterable<T> fetchCandidates(final ResourceFetcher<T> fetcher) {
        return new ResultsPaginatedIterable<T>(fetcher);
    }

    private WebResource getWebResource() {
        if (!init) {
            DefaultClientConfig config = new DefaultClientConfig();
            this.webResource = Client.create(config).resource(this.baseUri);
            init = true;
        }
        return this.webResource;
    }

    class WebResourceFetcher<T> implements ResourceFetcher<T> {
        final MultivaluedMap<String, String> params;
        final ResultsParser<T> parser;

        public WebResourceFetcher(MultivaluedMap<String, String> params, ResultsParser<T> parser, Date dateStart,
                Date dateEnd) {
            this.params = params;
            this.parser = parser;
            params.add("format", "hrxml");
            params.add("api", accessKey);
            params.add("secret", accessSecret);
            if (dateStart != null)
                params.add("datestart", formatDate(dateStart));
            if (dateEnd != null)
                params.add("dateend", formatDate(dateEnd));
        }

        public ResultsPage<T> fetchPage(Integer firstElementNumber) throws InvalidConnectionException {
            params.remove("start");
            params.add("start", firstElementNumber.toString());
            String xml = getWebResource().path("/candidate").queryParams(params)
                    .header("Content-Type", "application/xml").accept(MediaType.APPLICATION_XML).get(String.class);

            if (!xml.contains("Invalid api/secret")) {
                logger.info("result xml = " + xml);
            } else {
                throw new InvalidConnectionException(
                        "Invalid Api Key " + params.get("api") + " and Api Secret " + params.get("secret"));
            }
            return parser.parse(xml);
        }
    }
}