Java tutorial
/** * (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); } } }