package com.feth.play.module.pa.providers.oauth1.linkedin; import java.util.*; import org.apache.commons.lang3.StringUtils; import com.fasterxml.jackson.databind.JsonNode; import com.feth.play.module.pa.providers.oauth1.BasicOAuth1AuthUser; import com.feth.play.module.pa.providers.oauth1.OAuth1AuthInfo; import com.feth.play.module.pa.user.BasicIdentity; import com.feth.play.module.pa.user.EducationsIdentity; import com.feth.play.module.pa.user.EmploymentsIdentity; import com.feth.play.module.pa.user.FirstLastNameIdentity; import com.feth.play.module.pa.user.PicturedIdentity; import com.feth.play.module.pa.user.ProfiledIdentity; public class LinkedinAuthUser extends BasicOAuth1AuthUser implements BasicIdentity, FirstLastNameIdentity, PicturedIdentity, EmploymentsIdentity, EducationsIdentity, ProfiledIdentity { /** * */ private static final long serialVersionUID = 1L; private static abstract class Constants { public static final String ID = "id"; public static final String PROFILE_IMAGE_URL = "pictureUrl"; public static final String FIRST_NAME = "firstName"; public static final String LAST_NAME = "lastName"; public static final String INDUSTRY = "industry"; public static final String POSITIONS = "positions/values"; public static final String EDUCATIONS = "educations/values"; public static final String PUBLIC_PROFILE_URL = "publicProfileUrl"; private static abstract class Education { public static final String ID = "id"; public static final String SCHOOL_NAME = "schoolName"; public static final String DEGREE = "degree"; public static final String START_DATE_YEAR = "startDate/year"; public static final String END_DATE_YEAR = "endDate/year"; } private static abstract class Employment { public static final String ID = "id"; public static final String TITLE = "title"; public static final String SUMMARY = "summary"; public static final String START_DATE_MONTH = "startDate/month"; public static final String START_DATE_YEAR = "startDate/year"; public static final String END_DATE_MONTH = "endDate/month"; public static final String END_DATE_YEAR = "endDate/year"; public static final String IS_CURRENT = "isCurrent"; public static final String COMPANY_NAME = "company/name"; } } private String picture; private String firstName; private String lastName; private String industry; private String email; private List<EmploymentInfo> employments; private List<EducationInfo> educations; private String publicProfileUrl; public LinkedinAuthUser(final JsonNode nodeInfo, final String email, final OAuth1AuthInfo info) { super(nodeInfo.get(Constants.ID).asText(), info, null); if (nodeInfo.has(Constants.FIRST_NAME)) { this.firstName = nodeInfo.get(Constants.FIRST_NAME).asText(); } if (nodeInfo.has(Constants.LAST_NAME)) { this.lastName = nodeInfo.get(Constants.LAST_NAME).asText(); } if (nodeInfo.has(Constants.PROFILE_IMAGE_URL)) { this.picture = nodeInfo.get(Constants.PROFILE_IMAGE_URL).asText(); } if (nodeInfo.has(Constants.INDUSTRY)) { this.industry = nodeInfo.get(Constants.INDUSTRY).asText(); } JsonNode node; if ((node = traverse(nodeInfo, Constants.POSITIONS)) != null) { this.employments = new ArrayList<EmploymentInfo>(); for (JsonNode j : node) { this.employments.add(makeEmployment(j)); } } if ((node = traverse(nodeInfo, Constants.EDUCATIONS)) != null) { this.educations = new ArrayList<EducationInfo>(); for (JsonNode j : node) { this.educations.add(makeEducation(j)); } } if (!StringUtils.isBlank(email)) { this.email = email; } if (nodeInfo.has(Constants.PUBLIC_PROFILE_URL)) { this.publicProfileUrl = nodeInfo.get(Constants.PUBLIC_PROFILE_URL) .asText(); } } private static EducationInfo makeEducation(final JsonNode node) { String id = null, schoolName = null, degree = null; int startDateYear = 0, endDateYear = 0; if (node.has(Constants.Education.ID)) { id = node.get(Constants.ID).asText(); } if (node.has(Constants.Education.SCHOOL_NAME)) { schoolName = node.get(Constants.Education.SCHOOL_NAME).asText(); } if (node.has(Constants.Education.DEGREE)) { degree = node.get(Constants.Education.DEGREE).asText(); } JsonNode childNode; if ((childNode = LinkedinAuthUser.traverse(node, Constants.Education.START_DATE_YEAR)) != null) { startDateYear = childNode.asInt(); } if ((childNode = LinkedinAuthUser.traverse(node, Constants.Education.END_DATE_YEAR)) != null) { endDateYear = childNode.asInt(); } return new EducationInfo(id, schoolName, degree, startDateYear, endDateYear); } private static EmploymentInfo makeEmployment(final JsonNode node) { String id = null, title = null, summary = null, companyName = null; int startDateMonth = 0, startDateYear = 0, endDateMonth = 0, endDateYear = 0; boolean isCurrent = false; if (node.has(Constants.Employment.ID)) { id = node.get(Constants.Employment.ID).asText(); } if (node.has(Constants.Employment.TITLE)) { title = node.get(Constants.Employment.TITLE).asText(); } if (node.has(Constants.Employment.SUMMARY)) { summary = node.get(Constants.Employment.SUMMARY).asText(); } JsonNode childNode; if ((childNode = LinkedinAuthUser.traverse(node, Constants.Employment.START_DATE_MONTH)) != null) { startDateMonth = childNode.asInt(); } if ((childNode = LinkedinAuthUser.traverse(node, Constants.Employment.START_DATE_YEAR)) != null) { startDateYear = childNode.asInt(); } if ((childNode = LinkedinAuthUser.traverse(node, Constants.Employment.END_DATE_MONTH)) != null) { endDateMonth = childNode.asInt(); } if ((childNode = LinkedinAuthUser.traverse(node, Constants.Employment.END_DATE_YEAR)) != null) { endDateYear = childNode.asInt(); } if (node.has(Constants.Employment.IS_CURRENT)) { isCurrent = node.get(Constants.Employment.IS_CURRENT).asBoolean(); } if ((childNode = LinkedinAuthUser.traverse(node, Constants.Employment.COMPANY_NAME)) != null) { companyName = childNode.asText(); } return new EmploymentInfo(id, title, summary, startDateMonth, startDateYear, endDateMonth, endDateYear, isCurrent, companyName); } /** * Gets the child node from a top node, by going going down the json tree * via consuming '/'s. * * @param topNode * @return */ private static JsonNode traverse(final JsonNode topNode, final String childExpression) { JsonNode jsonNode = topNode; final String[] segments = childExpression.split("/"); for (final String segment : segments) { if (jsonNode != null) { jsonNode = jsonNode.get(segment); } else { return null; } } return jsonNode; } @Override public String getProvider() { return LinkedinAuthProvider.PROVIDER_KEY; } @Override public String getName() { return firstName + " " + lastName; } @Override public String getPicture() { return picture; } @Override public String getFirstName() { return firstName; } @Override public String getLastName() { return lastName; } public String getIndustry() { return industry; } @Override public Collection<EmploymentInfo> getEmployments() { return employments; } @Override public String getEmail() { return email; } @Override public Collection<EducationInfo> getEducations() { return educations; } @Override public String getProfileLink() { return publicProfileUrl; } }