package org.pac4j.oauth.profile.linkedin2; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.JsonNode; import com.github.scribejava.core.model.OAuth2AccessToken; import org.pac4j.core.exception.HttpAction; import org.pac4j.core.profile.converter.Converters; import org.pac4j.oauth.client.LinkedIn2Client; import org.pac4j.oauth.config.OAuth20Configuration; import org.pac4j.oauth.profile.JsonHelper; import org.pac4j.oauth.profile.converter.JsonConverter; import org.pac4j.oauth.profile.definition.OAuth20ProfileDefinition; import java.util.Arrays; import java.util.List; /** * This class is the LinkedIn profile definition. * * @author Jerome Leleu * @since 1.4.1 */ public class LinkedIn2ProfileDefinition extends OAuth20ProfileDefinition<LinkedIn2Profile> { public static final String FIRST_NAME = "firstName"; public static final String LAST_NAME = "lastName"; public static final String MAIDEN_NAME = "maidenName"; public static final String FORMATTED_NAME = "formattedName"; public static final String PHONETIC_FIRST_NAME = "phoneticFirstName"; public static final String PHONETIC_LAST_NAME = "phoneticLastName"; public static final String FORMATTED_PHONETIC_NAME = "formattedPhoneticName"; public static final String HEADLINE = "headline"; public static final String INDUSTRY = "industry"; public static final String CURRENT_SHARE = "currentShare"; public static final String NUM_CONNECTIONS = "numConnections"; public static final String NUM_CONNECTIONS_CAPPED = "numConnectionsCapped"; public static final String SUMMARY = "summary"; public static final String SPECIALTIES = "specialties"; public static final String POSITIONS = "positions"; public static final String PICTURE_URL = "pictureUrl"; public static final String PUBLIC_PROFILE_URL = "publicProfileUrl"; public static final String SITE_STANDARD_PROFILE_REQUEST = "siteStandardProfileRequest"; public static final String API_STANDARD_PROFILE_REQUEST = "apiStandardProfileRequest"; public static final String EMAIL_ADDRESS = "emailAddress"; public LinkedIn2ProfileDefinition() { super(x -> new LinkedIn2Profile()); Arrays.stream(new String[] { FIRST_NAME, LAST_NAME, MAIDEN_NAME, FORMATTED_NAME, PHONETIC_FIRST_NAME, PHONETIC_LAST_NAME, FORMATTED_PHONETIC_NAME, HEADLINE, INDUSTRY, CURRENT_SHARE, SUMMARY, SPECIALTIES, EMAIL_ADDRESS}) .forEach(a -> primary(a, Converters.STRING)); primary(NUM_CONNECTIONS, Converters.INTEGER); primary(NUM_CONNECTIONS_CAPPED, Converters.BOOLEAN); primary(PICTURE_URL, Converters.URL); primary(PUBLIC_PROFILE_URL, Converters.URL); primary(LOCATION, new JsonConverter<>(LinkedIn2Location.class)); secondary(POSITIONS, new JsonConverter(List.class, new TypeReference<List<LinkedIn2Position>>() {})); } @Override public String getProfileUrl(final OAuth2AccessToken accessToken, final OAuth20Configuration configuration) { final LinkedIn2Client client = (LinkedIn2Client) configuration.getClient(); return "https://api.linkedin.com/v1/people/~:(" + client.getFields() + ")?format=json"; } @Override public LinkedIn2Profile extractUserProfile(final String body) throws HttpAction { LinkedIn2Profile profile = newProfile(); final JsonNode json = JsonHelper.getFirstNode(body); profile.setId(JsonHelper.getElement(json, "id")); for (final String attribute : getPrimaryAttributes()) { convertAndAdd(profile, attribute, JsonHelper.getElement(json, attribute)); } final Object positions = JsonHelper.getElement(json, LinkedIn2ProfileDefinition.POSITIONS); if (positions != null && positions instanceof JsonNode) { convertAndAdd(profile, LinkedIn2ProfileDefinition.POSITIONS, JsonHelper.getElement((JsonNode) positions, "values")); } addUrl(profile, json, LinkedIn2ProfileDefinition.SITE_STANDARD_PROFILE_REQUEST); addUrl(profile, json, LinkedIn2ProfileDefinition.API_STANDARD_PROFILE_REQUEST); return profile; } private void addUrl(final LinkedIn2Profile profile, final JsonNode json, final String name) { final String url = (String) JsonHelper.getElement(json, name + ".url"); convertAndAdd(profile, name, url); } }