blob: 933337f3aca344a0cda22fe9f4727d0d612c778e [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
*
* 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.
*/
package org.apache.streams.fullcontact;
import org.apache.juneau.rest.client.RestCallException;
import org.apache.streams.config.ComponentConfigurator;
import org.apache.streams.fullcontact.api.EnrichCompanyRequest;
import org.apache.streams.fullcontact.api.EnrichPersonRequest;
import org.apache.streams.fullcontact.api.EnrichPersonResponse;
import org.apache.streams.fullcontact.config.FullContactConfiguration;
import org.apache.streams.fullcontact.pojo.CompanySummary;
import org.apache.streams.fullcontact.pojo.PersonSummary;
import com.google.common.util.concurrent.Uninterruptibles;
import org.apache.juneau.json.JsonParser;
import org.apache.juneau.json.JsonSerializer;
import org.apache.juneau.rest.client.RestCall;
import org.apache.juneau.rest.client.RestClient;
import org.apache.juneau.rest.client.RestClientBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.StringReader;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;
/**
* Implementation of api.fullcontact.com interfaces using juneau.
*/
public class FullContact implements CompanyEnrichment, PersonEnrichment {
private static final Logger LOGGER = LoggerFactory.getLogger(FullContact.class);
private FullContactConfiguration configuration;
protected JsonParser parser;
protected JsonSerializer serializer;
protected RestClientBuilder restClientBuilder;
protected RestClient restClient;
private static Map<FullContactConfiguration, FullContact> INSTANCE_MAP = new ConcurrentHashMap<>();
public static FullContact getInstance() throws InstantiationException {
return getInstance(new ComponentConfigurator<>(FullContactConfiguration.class).detectConfiguration());
}
public static FullContact getInstance(FullContactConfiguration configuration) throws InstantiationException {
if (INSTANCE_MAP.containsKey(configuration) && INSTANCE_MAP.get(configuration) != null) {
return INSTANCE_MAP.get(configuration);
} else {
FullContact fullContact = new FullContact(configuration);
INSTANCE_MAP.put(configuration, fullContact);
return INSTANCE_MAP.get(configuration);
}
}
private FullContact(FullContactConfiguration configuration) {
this.configuration = configuration;
this.parser = JsonParser.DEFAULT.builder()
.ignoreUnknownBeanProperties(true)
.build();
this.serializer = JsonSerializer.DEFAULT.builder()
.trimEmptyCollections(true)
.trimEmptyMaps(true)
.build();
this.restClientBuilder = RestClient.create()
.accept("application/json")
.contentType("application/json")
.disableAutomaticRetries()
.disableCookieManagement()
.disableRedirectHandling()
.header("Authorization", "Bearer "+configuration.getToken())
.parser(parser)
.serializer(serializer)
.rootUrl(baseUrl());
if(configuration.getDebug() == true) {
this.restClientBuilder.debug();
}
this.restClient = restClientBuilder.build();
}
private String baseUrl() {
return "https://api.fullcontact.com/v3/";
}
@Override
public CompanySummary enrichCompany(EnrichCompanyRequest request) {
try {
String requestJson = serializer.serialize(request);
RestCall call = restClient
.doPost(baseUrl() + "company.enrich")
.accept("application/json")
.contentType("application/json")
.body(new StringReader(requestJson));
String responseJson = call.getResponseAsString();
CompanySummary result = parser.parse(responseJson, CompanySummary.class);
return result;
} catch( Exception e ) {
LOGGER.error("Exception", e);
return new CompanySummary();
} finally {
Uninterruptibles.sleepUninterruptibly(1, TimeUnit.SECONDS);
}
}
@Override
public EnrichPersonResponse enrichPerson(EnrichPersonRequest request) {
try {
String requestJson = serializer.serialize(request);
RestCall call = restClient
.doPost(baseUrl() + "person.enrich")
.accept("application/json")
.contentType("application/json")
.ignoreErrors()
.body(new StringReader(requestJson));
String responseJson = call.getResponseAsString();
EnrichPersonResponse response = parser.parse(responseJson, EnrichPersonResponse.class);
return response;
} catch( Exception e ) {
LOGGER.error("Exception", e);
return new EnrichPersonResponse().withMessage(e.getMessage());
} finally {
Uninterruptibles.sleepUninterruptibly(1, TimeUnit.SECONDS);
}
}
}