From 46f0bb524b51d3bc0983a8ec750069d16fb12237 Mon Sep 17 00:00:00 2001 From: robdrysdale Date: Fri, 4 Nov 2011 18:06:41 +0000 Subject: [PATCH] Updates to handle retrieval of LinkedIn Network Updates --- gradle.properties | 2 +- .../social/linkedin/api/Company.java | 22 ++++ .../social/linkedin/api/LinkedIn.java | 10 ++ .../linkedin/api/LinkedInNetworkUpdate.java | 96 +++++++++++++++ .../linkedin/api/LinkedInNetworkUpdates.java | 41 +++++++ .../social/linkedin/api/LinkedInProfile.java | 9 ++ .../social/linkedin/api/MemberGroup.java | 29 +++++ .../social/linkedin/api/PersonActivity.java | 23 ++++ .../social/linkedin/api/Recommendation.java | 43 +++++++ .../social/linkedin/api/UpdateContent.java | 15 +++ .../linkedin/api/UpdateContentConnection.java | 24 ++++ .../linkedin/api/UpdateContentFollow.java | 26 ++++ .../linkedin/api/UpdateContentGroup.java | 24 ++++ .../api/UpdateContentPersonActivity.java | 24 ++++ .../api/UpdateContentRecommendation.java | 22 ++++ .../linkedin/api/UpdateContentStatus.java | 20 ++++ .../social/linkedin/api/UpdateType.java | 21 ++++ .../linkedin/api/impl/CompanyMixin.java | 30 +++++ .../linkedin/api/impl/LinkedInModule.java | 29 +++++ ...LinkedInNetworkUpdateListDeserializer.java | 113 ++++++++++++++++++ .../api/impl/LinkedInNetworkUpdateMixin.java | 109 +++++++++++++++++ .../api/impl/LinkedInNetworkUpdatesMixin.java | 31 +++++ .../api/impl/LinkedInProfileMixin.java | 17 +-- .../linkedin/api/impl/LinkedInTemplate.java | 33 ++++- .../linkedin/api/impl/MemberGroupMixin.java | 31 +++++ .../api/impl/PersonActivityMixin.java | 29 +++++ .../api/impl/RecommendationMixin.java | 49 ++++++++ .../api/impl/RequestUrlDeserializer.java | 17 +++ .../impl/UpdateContentConnectionMixin.java | 71 +++++++++++ .../api/impl/UpdateContentDeserializer.java | 29 +++++ .../api/impl/UpdateContentFollowMixin.java | 40 +++++++ .../api/impl/UpdateContentGroupMixin.java | 68 +++++++++++ .../linkedin/api/impl/UpdateContentMixin.java | 37 ++++++ .../UpdateContentPersonActivityMixin.java | 68 +++++++++++ .../UpdateContentRecommendationMixin.java | 69 +++++++++++ .../api/impl/UpdateContentStatusMixin.java | 40 +++++++ 36 files changed, 1344 insertions(+), 17 deletions(-) create mode 100644 spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/Company.java create mode 100644 spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/LinkedInNetworkUpdate.java create mode 100644 spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/LinkedInNetworkUpdates.java create mode 100644 spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/MemberGroup.java create mode 100644 spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/PersonActivity.java create mode 100644 spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/Recommendation.java create mode 100644 spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/UpdateContent.java create mode 100644 spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/UpdateContentConnection.java create mode 100644 spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/UpdateContentFollow.java create mode 100644 spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/UpdateContentGroup.java create mode 100644 spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/UpdateContentPersonActivity.java create mode 100644 spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/UpdateContentRecommendation.java create mode 100644 spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/UpdateContentStatus.java create mode 100644 spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/UpdateType.java create mode 100644 spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/impl/CompanyMixin.java create mode 100644 spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/impl/LinkedInNetworkUpdateListDeserializer.java create mode 100644 spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/impl/LinkedInNetworkUpdateMixin.java create mode 100644 spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/impl/LinkedInNetworkUpdatesMixin.java create mode 100644 spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/impl/MemberGroupMixin.java create mode 100644 spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/impl/PersonActivityMixin.java create mode 100644 spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/impl/RecommendationMixin.java create mode 100644 spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/impl/RequestUrlDeserializer.java create mode 100644 spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/impl/UpdateContentConnectionMixin.java create mode 100644 spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/impl/UpdateContentDeserializer.java create mode 100644 spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/impl/UpdateContentFollowMixin.java create mode 100644 spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/impl/UpdateContentGroupMixin.java create mode 100644 spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/impl/UpdateContentMixin.java create mode 100644 spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/impl/UpdateContentPersonActivityMixin.java create mode 100644 spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/impl/UpdateContentRecommendationMixin.java create mode 100644 spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/impl/UpdateContentStatusMixin.java diff --git a/gradle.properties b/gradle.properties index 050090ff..a7d16d1c 100644 --- a/gradle.properties +++ b/gradle.properties @@ -17,7 +17,7 @@ # version to be applied to all projects in this multi-project build. this is # the one and only location version changes need to be made. # ------------------------------------------------------------------------------ -springSocialLinkedInVersion=1.0.0.BUILD-SNAPSHOT +springSocialLinkedInVersion=1.0.1.BUILD-SNAPSHOT # ------------------------------------------------------------------------------ # build system user roles diff --git a/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/Company.java b/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/Company.java new file mode 100644 index 00000000..da649ff8 --- /dev/null +++ b/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/Company.java @@ -0,0 +1,22 @@ +package org.springframework.social.linkedin.api; + +import java.io.Serializable; + +public class Company implements Serializable { + private static final long serialVersionUID = 1L; + + private final String id; + private final String name; + + public Company(String id, String name) { + this.id = id; + this.name = name; + } + + public String getId() { + return id; + } + public String getName() { + return name; + } +} diff --git a/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/LinkedIn.java b/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/LinkedIn.java index 3a58abc1..5cc313df 100644 --- a/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/LinkedIn.java +++ b/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/LinkedIn.java @@ -62,4 +62,14 @@ public interface LinkedIn extends ApiBinding { * @return the user's connections */ List getConnections(); + + List getNetworkUpdates(); + + List getNetworkUpdates(int start, int count); + + public String getNetworkUpdatesJson(); + + public String getJson(String url); + + public String getNetworkUpdatesJson(int start, int count); } diff --git a/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/LinkedInNetworkUpdate.java b/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/LinkedInNetworkUpdate.java new file mode 100644 index 00000000..8d9fed75 --- /dev/null +++ b/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/LinkedInNetworkUpdate.java @@ -0,0 +1,96 @@ +/* + * Copyright 2010 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * 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.springframework.social.linkedin.api; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * Model class containing a user's LinkedIn Network update information. + * @author Robert Drysdale + */ +public class LinkedInNetworkUpdate implements Serializable { + + private static final long serialVersionUID = 1L; + + private final Date timestamp; + + private final String updateKey; + + private final UpdateType updateType; + + private boolean commentable; + + private boolean likable; + + private boolean liked; + + private int numLikes; + + private List likes; + + private UpdateContent updateContent; + + private List updatedFields; + + public LinkedInNetworkUpdate(Date timestamp, String updateKey, UpdateType updateType) { + this.timestamp = timestamp; + this.updateKey = updateKey; + this.updateType = updateType; + } + + public Date getTimestamp() { + return timestamp; + } + + public String getUpdateKey() { + return updateKey; + } + + public UpdateType getUpdateType() { + return updateType; + } + + public UpdateContent getUpdateContent() { + return updateContent; + } + + public boolean isCommentable() { + return commentable; + } + + public boolean isLikable() { + return likable; + } + + public boolean isLiked() { + return liked; + } + + public int getNumLikes() { + return numLikes; + } + + public List getLikes() { + return likes; + } + + public List getUpdatedFields() { + return updatedFields; + } + +} diff --git a/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/LinkedInNetworkUpdates.java b/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/LinkedInNetworkUpdates.java new file mode 100644 index 00000000..1fe0701c --- /dev/null +++ b/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/LinkedInNetworkUpdates.java @@ -0,0 +1,41 @@ +/* + * Copyright 2010 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * 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.springframework.social.linkedin.api; + +import java.util.List; + +/** + * A model class containing a list of a user's network updates on LinkedIn. + * + * @author Robert Drysdale + */ +public class LinkedInNetworkUpdates { + + private List updates; + + public LinkedInNetworkUpdates(List updates) { + this.updates = updates; + } + + /** + * Retrieves the list of network updates + * + * @return a list of network updates + */ + public List getUpdates() { + return updates; + } +} diff --git a/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/LinkedInProfile.java b/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/LinkedInProfile.java index 8d6e64f0..6ad628ca 100644 --- a/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/LinkedInProfile.java +++ b/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/LinkedInProfile.java @@ -41,6 +41,8 @@ public class LinkedInProfile implements Serializable { private final String profilePictureUrl; + private String summary; + public LinkedInProfile(String id, String firstName, String lastName, String headline, String industry, String publicProfileUrl, String standardProfileUrl, String profilePictureUrl) { this.id = id; this.firstName = firstName; @@ -108,4 +110,11 @@ public String getPublicProfileUrl() { public String getProfilePictureUrl() { return profilePictureUrl; } + + /** + * The user's summary. + */ + public String getSummary() { + return summary; + } } diff --git a/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/MemberGroup.java b/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/MemberGroup.java new file mode 100644 index 00000000..e37728c3 --- /dev/null +++ b/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/MemberGroup.java @@ -0,0 +1,29 @@ +package org.springframework.social.linkedin.api; + +import java.io.Serializable; + +public class MemberGroup implements Serializable { + private static final long serialVersionUID = 1L; + + private final String id; + private final String name; + private final String url; + + public MemberGroup(String id, String name, String url) { + this.id = id; + this.name = name; + this.url = url; + } + + public String getId() { + return id; + } + + public String getName() { + return name; + } + + public String getUrl() { + return url; + } +} diff --git a/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/PersonActivity.java b/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/PersonActivity.java new file mode 100644 index 00000000..d1942eb5 --- /dev/null +++ b/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/PersonActivity.java @@ -0,0 +1,23 @@ +package org.springframework.social.linkedin.api; + +import java.io.Serializable; + +public class PersonActivity implements Serializable { + private static final long serialVersionUID = 1L; + + private final int appId; + private final String body; + + public PersonActivity(int appId, String body) { + this.appId = appId; + this.body = body; + } + + public int getAppId() { + return appId; + } + + public String getBody() { + return body; + } +} diff --git a/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/Recommendation.java b/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/Recommendation.java new file mode 100644 index 00000000..923cdb94 --- /dev/null +++ b/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/Recommendation.java @@ -0,0 +1,43 @@ +package org.springframework.social.linkedin.api; + +import java.io.Serializable; + +public class Recommendation implements Serializable { + private static final long serialVersionUID = 1L; + + private final String id; + private final String recommendationSnippet; + private final RecommendationType recommendationType; + private final LinkedInProfile recommender; + + public Recommendation(String id, String recommendationSnippet, + RecommendationType recommendationType, LinkedInProfile recommender) { + this.id = id; + this.recommendationSnippet = recommendationSnippet; + this.recommendationType = recommendationType; + this.recommender = recommender; + } + + public String getId() { + return id; + } + + public String getRecommendationSnippet() { + return recommendationSnippet; + } + + public RecommendationType getRecommendationType() { + return recommendationType; + } + + public LinkedInProfile getRecommender() { + return recommender; + } + + public static enum RecommendationType { + BUSINESS_PARTNER, + COLLEAGUE, + EDUCATION, + SERVICE_PROVIDER + } +} diff --git a/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/UpdateContent.java b/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/UpdateContent.java new file mode 100644 index 00000000..00924141 --- /dev/null +++ b/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/UpdateContent.java @@ -0,0 +1,15 @@ +package org.springframework.social.linkedin.api; + + +public class UpdateContent extends LinkedInProfile { + + private static final long serialVersionUID = 1L; + + public UpdateContent(String id, String firstName, String lastName, + String headline, String industry, String publicProfileUrl, + String standardProfileUrl, String profilePictureUrl) { + super(id, firstName, lastName, headline, industry, publicProfileUrl, + standardProfileUrl, profilePictureUrl); + } + +} diff --git a/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/UpdateContentConnection.java b/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/UpdateContentConnection.java new file mode 100644 index 00000000..b4c65cf9 --- /dev/null +++ b/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/UpdateContentConnection.java @@ -0,0 +1,24 @@ +package org.springframework.social.linkedin.api; + +import java.util.List; + + + +public class UpdateContentConnection extends UpdateContent { + private static final long serialVersionUID = 1L; + + private List connections; + + public UpdateContentConnection(String id, String firstName, + String lastName, String headline, String industry, + String publicProfileUrl, String standardProfileUrl, + String profilePictureUrl) { + super(id, firstName, lastName, headline, industry, publicProfileUrl, + standardProfileUrl, profilePictureUrl); + } + + public List getConnections() { + return connections; + } + +} diff --git a/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/UpdateContentFollow.java b/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/UpdateContentFollow.java new file mode 100644 index 00000000..9bc4583a --- /dev/null +++ b/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/UpdateContentFollow.java @@ -0,0 +1,26 @@ +package org.springframework.social.linkedin.api; + +public class UpdateContentFollow extends UpdateContent { + + private static final long serialVersionUID = 1L; + + private String action; + + private Company following; + + public UpdateContentFollow(String id, String firstName, String lastName, + String headline, String industry, String publicProfileUrl, + String standardProfileUrl, String profilePictureUrl) { + super(id, firstName, lastName, headline, industry, publicProfileUrl, + standardProfileUrl, profilePictureUrl); + } + + public String getAction() { + return action; + } + + public Company getFollowing() { + return following; + } + +} diff --git a/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/UpdateContentGroup.java b/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/UpdateContentGroup.java new file mode 100644 index 00000000..f207b550 --- /dev/null +++ b/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/UpdateContentGroup.java @@ -0,0 +1,24 @@ +package org.springframework.social.linkedin.api; + +import java.util.List; + +public class UpdateContentGroup extends UpdateContent { + + private static final long serialVersionUID = 1L; + + private List memberGroups; + + public UpdateContentGroup(String id, String firstName, String lastName, + String headline, String industry, String publicProfileUrl, + String standardProfileUrl, String profilePictureUrl) { + super(id, firstName, lastName, headline, industry, publicProfileUrl, + standardProfileUrl, profilePictureUrl); + } + + public List getMemberGroups() { + return memberGroups; + } + + + +} diff --git a/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/UpdateContentPersonActivity.java b/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/UpdateContentPersonActivity.java new file mode 100644 index 00000000..387f083e --- /dev/null +++ b/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/UpdateContentPersonActivity.java @@ -0,0 +1,24 @@ +package org.springframework.social.linkedin.api; + +import java.util.List; + +public class UpdateContentPersonActivity extends UpdateContent { + + private static final long serialVersionUID = 1L; + + private List personActivities; + + public UpdateContentPersonActivity(String id, String firstName, String lastName, + String headline, String industry, String publicProfileUrl, + String standardProfileUrl, String profilePictureUrl) { + super(id, firstName, lastName, headline, industry, publicProfileUrl, + standardProfileUrl, profilePictureUrl); + } + + public List getPersonActivities() { + return personActivities; + } + + + +} diff --git a/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/UpdateContentRecommendation.java b/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/UpdateContentRecommendation.java new file mode 100644 index 00000000..297d52d2 --- /dev/null +++ b/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/UpdateContentRecommendation.java @@ -0,0 +1,22 @@ +package org.springframework.social.linkedin.api; + +import java.util.List; + +public class UpdateContentRecommendation extends UpdateContent { + + private static final long serialVersionUID = 1L; + + private List recommendations; + + public UpdateContentRecommendation(String id, String firstName, String lastName, + String headline, String industry, String publicProfileUrl, + String standardProfileUrl, String profilePictureUrl) { + super(id, firstName, lastName, headline, industry, publicProfileUrl, + standardProfileUrl, profilePictureUrl); + } + + public List getRecommendations() { + return recommendations; + } + +} diff --git a/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/UpdateContentStatus.java b/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/UpdateContentStatus.java new file mode 100644 index 00000000..8d136fb7 --- /dev/null +++ b/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/UpdateContentStatus.java @@ -0,0 +1,20 @@ +package org.springframework.social.linkedin.api; + +public class UpdateContentStatus extends UpdateContent { + + private static final long serialVersionUID = 1L; + + private String currentStatus; + + public UpdateContentStatus(String id, String firstName, String lastName, + String headline, String industry, String publicProfileUrl, + String standardProfileUrl, String profilePictureUrl) { + super(id, firstName, lastName, headline, industry, publicProfileUrl, + standardProfileUrl, profilePictureUrl); + } + + public String getCurrentStatus() { + return currentStatus; + } + +} diff --git a/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/UpdateType.java b/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/UpdateType.java new file mode 100644 index 00000000..84a9eeda --- /dev/null +++ b/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/UpdateType.java @@ -0,0 +1,21 @@ +package org.springframework.social.linkedin.api; + +public enum UpdateType { + ANSW, + APPM, + APPS, + CMPY, + CONN, + JOBS, + JGRP, + MSFC, + PICU, + PREC, + PRFX, + RECU, + PROF, + QSTN, + SHAR, + STAT, + VIRL +} diff --git a/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/impl/CompanyMixin.java b/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/impl/CompanyMixin.java new file mode 100644 index 00000000..71bcf80c --- /dev/null +++ b/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/impl/CompanyMixin.java @@ -0,0 +1,30 @@ +/* + * Copyright 2011 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * 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.springframework.social.linkedin.api.impl; + +import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonIgnoreProperties; +import org.codehaus.jackson.annotate.JsonProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +public class CompanyMixin { + + @JsonCreator + public CompanyMixin( + @JsonProperty("id") String id, + @JsonProperty("name") String name) {} + +} diff --git a/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/impl/LinkedInModule.java b/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/impl/LinkedInModule.java index f37b32ec..ad0bda3e 100644 --- a/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/impl/LinkedInModule.java +++ b/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/impl/LinkedInModule.java @@ -17,8 +17,21 @@ import org.codehaus.jackson.Version; import org.codehaus.jackson.map.module.SimpleModule; +import org.springframework.social.linkedin.api.Company; import org.springframework.social.linkedin.api.LinkedInConnections; +import org.springframework.social.linkedin.api.LinkedInNetworkUpdate; +import org.springframework.social.linkedin.api.LinkedInNetworkUpdates; import org.springframework.social.linkedin.api.LinkedInProfile; +import org.springframework.social.linkedin.api.MemberGroup; +import org.springframework.social.linkedin.api.PersonActivity; +import org.springframework.social.linkedin.api.Recommendation; +import org.springframework.social.linkedin.api.UpdateContent; +import org.springframework.social.linkedin.api.UpdateContentConnection; +import org.springframework.social.linkedin.api.UpdateContentFollow; +import org.springframework.social.linkedin.api.UpdateContentGroup; +import org.springframework.social.linkedin.api.UpdateContentPersonActivity; +import org.springframework.social.linkedin.api.UpdateContentRecommendation; +import org.springframework.social.linkedin.api.UpdateContentStatus; /** * Jackson module for registering mixin annotations against LinkedIn model classes. @@ -33,6 +46,22 @@ public LinkedInModule() { public void setupModule(SetupContext context) { context.setMixInAnnotations(LinkedInConnections.class, LinkedInConnectionsMixin.class); context.setMixInAnnotations(LinkedInProfile.class, LinkedInProfileMixin.class); + context.setMixInAnnotations(MemberGroup.class, MemberGroupMixin.class); + context.setMixInAnnotations(Recommendation.class, RecommendationMixin.class); + context.setMixInAnnotations(PersonActivity.class, PersonActivityMixin.class); + context.setMixInAnnotations(Company.class, CompanyMixin.class); + + context.setMixInAnnotations(LinkedInNetworkUpdate.class, LinkedInNetworkUpdateMixin.class); + context.setMixInAnnotations(LinkedInNetworkUpdates.class, LinkedInNetworkUpdatesMixin.class); + + context.setMixInAnnotations(UpdateContent.class, UpdateContentMixin.class); + context.setMixInAnnotations(UpdateContentConnection.class, UpdateContentConnectionMixin.class); + context.setMixInAnnotations(UpdateContentStatus.class, UpdateContentStatusMixin.class); + context.setMixInAnnotations(UpdateContentGroup.class, UpdateContentGroupMixin.class); + context.setMixInAnnotations(UpdateContentRecommendation.class, UpdateContentRecommendationMixin.class); + context.setMixInAnnotations(UpdateContentPersonActivity.class, UpdateContentPersonActivityMixin.class); + context.setMixInAnnotations(UpdateContentFollow.class, UpdateContentFollowMixin.class); + } } diff --git a/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/impl/LinkedInNetworkUpdateListDeserializer.java b/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/impl/LinkedInNetworkUpdateListDeserializer.java new file mode 100644 index 00000000..3fcd08e1 --- /dev/null +++ b/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/impl/LinkedInNetworkUpdateListDeserializer.java @@ -0,0 +1,113 @@ +package org.springframework.social.linkedin.api.impl; + +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; + +import org.codehaus.jackson.JsonNode; +import org.codehaus.jackson.JsonParser; +import org.codehaus.jackson.JsonProcessingException; +import org.codehaus.jackson.map.DeserializationContext; +import org.codehaus.jackson.map.JsonDeserializer; +import org.codehaus.jackson.map.ObjectMapper; +import org.codehaus.jackson.type.TypeReference; +import org.springframework.social.linkedin.api.Company; +import org.springframework.social.linkedin.api.LinkedInNetworkUpdate; +import org.springframework.social.linkedin.api.UpdateContent; +import org.springframework.social.linkedin.api.UpdateContentConnection; +import org.springframework.social.linkedin.api.UpdateContentFollow; +import org.springframework.social.linkedin.api.UpdateContentGroup; +import org.springframework.social.linkedin.api.UpdateContentPersonActivity; +import org.springframework.social.linkedin.api.UpdateContentRecommendation; +import org.springframework.social.linkedin.api.UpdateContentStatus; +import org.springframework.social.linkedin.api.UpdateType; + +public class LinkedInNetworkUpdateListDeserializer extends JsonDeserializer> { + @Override + public List deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException { + ObjectMapper mapper = new ObjectMapper(); + mapper.setDeserializationConfig(ctxt.getConfig()); + jp.setCodec(mapper); + List linkedInNetworkUpdates = new ArrayList(); + + if(jp.hasCurrentToken()) { + // Iterate through list of Network Updates + for (JsonNode dataNode : jp.readValueAsTree()) { + if(dataNode != null) { + LinkedInNetworkUpdate linkedInNetworkUpdate = (LinkedInNetworkUpdate) mapper.readValue(dataNode, new TypeReference() {}); + + UpdateContent updatedContent = null; + UpdateType type = linkedInNetworkUpdate.getUpdateType(); + JsonNode updatedNode = dataNode.get("updateContent"); + JsonNode person = updatedNode.get("person"); + if (type == UpdateType.MSFC) { + // Totally different. Looks like a bad API to be honest. + person = updatedNode.get("companyPersonUpdate").get("person"); + } + + switch (type) { + case CONN: + updatedContent = mapper.readValue(person, new TypeReference() {}); + break; + case STAT: + updatedContent = mapper.readValue(person, new TypeReference() {}); + break; + case JGRP: + updatedContent = mapper.readValue(person, new TypeReference() {}); + break; + case PREC: + updatedContent = mapper.readValue(person, new TypeReference() {}); + break; + case APPM: + updatedContent = mapper.readValue(person, new TypeReference() {}); + break; + case MSFC: + updatedContent = mapper.readValue(person, new TypeReference() {}); + break; + default: + updatedContent = mapper.readValue(person, new TypeReference() {}); + } + + // Need to use reflection to set private updateContent field + try { + Field f = LinkedInNetworkUpdate.class.getDeclaredField("updateContent"); + f.setAccessible(true); + f.set(linkedInNetworkUpdate, updatedContent); + } + catch (Exception e) { + throw new RuntimeException(e); + } + + if (type == UpdateType.MSFC) { + // Set the action via reflection as it's private + String action = updatedNode.get("companyPersonUpdate").get("action").get("code").getValueAsText(); + try { + Field f = UpdateContentFollow.class.getDeclaredField("action"); + f.setAccessible(true); + f.set(updatedContent, action); + } + catch (Exception e) { + throw new RuntimeException(e); + } + + // Set following via reflection as it's private + Company company = mapper.readValue(updatedNode.get("company"), new TypeReference() {}); + try { + Field f = UpdateContentFollow.class.getDeclaredField("following"); + f.setAccessible(true); + f.set(updatedContent, company); + } + catch (Exception e) { + throw new RuntimeException(e); + } + } + + linkedInNetworkUpdates.add(linkedInNetworkUpdate); + } + } + } + + return linkedInNetworkUpdates; + } +} diff --git a/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/impl/LinkedInNetworkUpdateMixin.java b/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/impl/LinkedInNetworkUpdateMixin.java new file mode 100644 index 00000000..44e15c1e --- /dev/null +++ b/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/impl/LinkedInNetworkUpdateMixin.java @@ -0,0 +1,109 @@ +/* + * Copyright 2011 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * 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.springframework.social.linkedin.api.impl; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +import org.codehaus.jackson.JsonNode; +import org.codehaus.jackson.JsonParser; +import org.codehaus.jackson.JsonProcessingException; +import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonIgnoreProperties; +import org.codehaus.jackson.annotate.JsonProperty; +import org.codehaus.jackson.map.DeserializationContext; +import org.codehaus.jackson.map.JsonDeserializer; +import org.codehaus.jackson.map.ObjectMapper; +import org.codehaus.jackson.map.annotate.JsonDeserialize; +import org.codehaus.jackson.type.TypeReference; +import org.springframework.social.linkedin.api.LinkedInProfile; +import org.springframework.social.linkedin.api.UpdateType; + +@JsonIgnoreProperties(ignoreUnknown = true) +public class LinkedInNetworkUpdateMixin { + + @JsonCreator + public LinkedInNetworkUpdateMixin( + @JsonProperty("timestamp") Date timestamp, + @JsonProperty("updateKey") String updateKey, + @JsonProperty("updateType") @JsonDeserialize(using = UpdateTypeDeserializer.class) UpdateType updateType) {} + + @JsonProperty("isCommentable") + boolean commentable; + + @JsonProperty("isLikable") + boolean likeable; + + @JsonProperty("isLiked") + boolean liked; + + @JsonProperty("numLikes") + int numLikes; + + @JsonProperty("likes") + @JsonDeserialize(using = LikesListDeserializer.class) + List likes; + + + @JsonProperty("updatedFields") + @JsonDeserialize(using = UpdatedFieldsListDeserializer.class) + List updatedFields; + + private static class UpdateTypeDeserializer extends JsonDeserializer { + @Override + public UpdateType deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException { + return UpdateType.valueOf(jp.getText().toUpperCase()); + } + } + + private static class LikesListDeserializer extends JsonDeserializer> { + @SuppressWarnings("unchecked") + @Override + public List deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException { + ObjectMapper mapper = new ObjectMapper(); + mapper.setDeserializationConfig(ctxt.getConfig()); + jp.setCodec(mapper); + if(jp.hasCurrentToken()) { + JsonNode dataNode = jp.readValueAsTree().get("values"); + return (List) mapper.readValue(dataNode, new TypeReference>() {}); + } + + return null; + } + } + + private static class UpdatedFieldsListDeserializer extends JsonDeserializer> { + @Override + public List deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException { + ObjectMapper mapper = new ObjectMapper(); + mapper.setDeserializationConfig(ctxt.getConfig()); + jp.setCodec(mapper); + if(jp.hasCurrentToken()) { + JsonNode dataNode = jp.readValueAsTree().get("values"); + List values = new ArrayList(); + for (JsonNode value : dataNode) { + values.add(value.get("name").getTextValue()); + } + + return values; + } + + return null; + } + } +} diff --git a/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/impl/LinkedInNetworkUpdatesMixin.java b/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/impl/LinkedInNetworkUpdatesMixin.java new file mode 100644 index 00000000..29b9bf77 --- /dev/null +++ b/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/impl/LinkedInNetworkUpdatesMixin.java @@ -0,0 +1,31 @@ +/* + * Copyright 2010 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * 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.springframework.social.linkedin.api.impl; + +import java.util.List; + +import org.codehaus.jackson.annotate.JsonIgnoreProperties; +import org.codehaus.jackson.annotate.JsonProperty; +import org.codehaus.jackson.map.annotate.JsonDeserialize; +import org.springframework.social.linkedin.api.LinkedInNetworkUpdate; + +@JsonIgnoreProperties(ignoreUnknown = true) +public class LinkedInNetworkUpdatesMixin { + + public LinkedInNetworkUpdatesMixin( + @JsonProperty("values") @JsonDeserialize(using = LinkedInNetworkUpdateListDeserializer.class) List updates) {} + +} diff --git a/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/impl/LinkedInProfileMixin.java b/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/impl/LinkedInProfileMixin.java index 53d30020..2cec8531 100644 --- a/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/impl/LinkedInProfileMixin.java +++ b/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/impl/LinkedInProfileMixin.java @@ -15,16 +15,9 @@ */ package org.springframework.social.linkedin.api.impl; -import java.io.IOException; - -import org.codehaus.jackson.JsonNode; -import org.codehaus.jackson.JsonParser; -import org.codehaus.jackson.JsonProcessingException; import org.codehaus.jackson.annotate.JsonCreator; import org.codehaus.jackson.annotate.JsonIgnoreProperties; import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.map.DeserializationContext; -import org.codehaus.jackson.map.JsonDeserializer; import org.codehaus.jackson.map.annotate.JsonDeserialize; @JsonIgnoreProperties(ignoreUnknown = true) @@ -41,11 +34,7 @@ public LinkedInProfileMixin( @JsonProperty("siteStandardProfileRequest") @JsonDeserialize(using=RequestUrlDeserializer.class) String standardProfileUrl, @JsonProperty("pictureUrl") String profilePictureUrl) {} - private static class RequestUrlDeserializer extends JsonDeserializer { - @Override - public String deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException { - JsonNode tree = jp.readValueAsTree(); - return tree.get("url").getValueAsText(); - } - } + @JsonProperty("summary") + String summary; + } diff --git a/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/impl/LinkedInTemplate.java b/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/impl/LinkedInTemplate.java index 12adc89a..497762e1 100644 --- a/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/impl/LinkedInTemplate.java +++ b/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/impl/LinkedInTemplate.java @@ -22,6 +22,8 @@ import org.springframework.http.converter.json.MappingJacksonHttpMessageConverter; import org.springframework.social.linkedin.api.LinkedIn; import org.springframework.social.linkedin.api.LinkedInConnections; +import org.springframework.social.linkedin.api.LinkedInNetworkUpdate; +import org.springframework.social.linkedin.api.LinkedInNetworkUpdates; import org.springframework.social.linkedin.api.LinkedInProfile; import org.springframework.social.oauth1.AbstractOAuth1ApiBinding; @@ -59,9 +61,33 @@ public String getProfileUrl() { public LinkedInProfile getUserProfile() { return getRestTemplate().getForObject(PROFILE_URL, LinkedInProfile.class); } + + public List getNetworkUpdates() { + return getNetworkUpdates(0,100); + } + + public List getNetworkUpdates(int start, int count) { + return getNetworkUpdates(start, count, LinkedInNetworkUpdates.class).getUpdates(); + } + + public T getNetworkUpdates(int start, int count, Class responseType) { + return getRestTemplate().getForObject(UPDATES_URL, responseType, count, start); + } + + public String getNetworkUpdatesJson() { + return getNetworkUpdates(0, 100, String.class); + } + + public String getNetworkUpdatesJson(int start, int count) { + return getNetworkUpdates(start, count, String.class); + } + + public String getJson(String url) { + return getRestTemplate().getForObject(url, String.class); + } public List getConnections() { - LinkedInConnections connections = getRestTemplate().getForObject("https://api.linkedin.com/v1/people/~/connections?format=json", LinkedInConnections.class); + LinkedInConnections connections = getRestTemplate().getForObject(CONNECTIONS_URL, LinkedInConnections.class); return connections.getConnections(); } @@ -79,6 +105,9 @@ private void registerLinkedInJsonModule() { } } - static final String PROFILE_URL = "https://api.linkedin.com/v1/people/~:(id,first-name,last-name,headline,industry,site-standard-profile-request,public-profile-url,picture-url)?format=json"; + static final String PROFILE_URL = "https://api.linkedin.com/v1/people/~:(id,first-name,last-name,headline,industry,site-standard-profile-request,public-profile-url,picture-url,summary)?format=json"; + static final String UPDATES_URL = "https://api.linkedin.com/v1/people/~/network/updates?format=json&count={count}&start={start}"; + + static final String CONNECTIONS_URL = "https://api.linkedin.com/v1/people/~/connections?format=json"; } diff --git a/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/impl/MemberGroupMixin.java b/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/impl/MemberGroupMixin.java new file mode 100644 index 00000000..58cd388a --- /dev/null +++ b/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/impl/MemberGroupMixin.java @@ -0,0 +1,31 @@ +/* + * Copyright 2011 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * 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.springframework.social.linkedin.api.impl; + +import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonIgnoreProperties; +import org.codehaus.jackson.annotate.JsonProperty; +import org.codehaus.jackson.map.annotate.JsonDeserialize; + +@JsonIgnoreProperties(ignoreUnknown = true) +public class MemberGroupMixin { + + @JsonCreator + public MemberGroupMixin( + @JsonProperty("id") String id, + @JsonProperty("name") String name, + @JsonProperty("siteGroupRequest") @JsonDeserialize(using=RequestUrlDeserializer.class) String url) {} +} diff --git a/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/impl/PersonActivityMixin.java b/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/impl/PersonActivityMixin.java new file mode 100644 index 00000000..7463ec6d --- /dev/null +++ b/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/impl/PersonActivityMixin.java @@ -0,0 +1,29 @@ +/* + * Copyright 2011 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * 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.springframework.social.linkedin.api.impl; + +import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonIgnoreProperties; +import org.codehaus.jackson.annotate.JsonProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +public class PersonActivityMixin { + + @JsonCreator + public PersonActivityMixin( + @JsonProperty("appId") int appId, + @JsonProperty("body") String body) {} +} diff --git a/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/impl/RecommendationMixin.java b/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/impl/RecommendationMixin.java new file mode 100644 index 00000000..2ecc1d8a --- /dev/null +++ b/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/impl/RecommendationMixin.java @@ -0,0 +1,49 @@ +/* + * Copyright 2011 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * 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.springframework.social.linkedin.api.impl; + +import java.io.IOException; + +import org.codehaus.jackson.JsonNode; +import org.codehaus.jackson.JsonParser; +import org.codehaus.jackson.JsonProcessingException; +import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonIgnoreProperties; +import org.codehaus.jackson.annotate.JsonProperty; +import org.codehaus.jackson.map.DeserializationContext; +import org.codehaus.jackson.map.JsonDeserializer; +import org.codehaus.jackson.map.annotate.JsonDeserialize; +import org.springframework.social.linkedin.api.LinkedInProfile; +import org.springframework.social.linkedin.api.Recommendation.RecommendationType; + +@JsonIgnoreProperties(ignoreUnknown = true) +public class RecommendationMixin { + + @JsonCreator + public RecommendationMixin( + @JsonProperty("id") String id, + @JsonProperty("recommendationSnippet") String recommendationSnippet, + @JsonProperty("recommendationType") @JsonDeserialize(using=RecommendationTypeDeserializer.class) RecommendationType recommendationType, + @JsonProperty("recommender") LinkedInProfile recommender) {} + + private static class RecommendationTypeDeserializer extends JsonDeserializer { + @Override + public RecommendationType deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException { + JsonNode node = jp.readValueAsTree(); + return RecommendationType.valueOf(node.get("code").getTextValue().replace('-', '_').toUpperCase()); + } + } +} diff --git a/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/impl/RequestUrlDeserializer.java b/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/impl/RequestUrlDeserializer.java new file mode 100644 index 00000000..1c22b7fc --- /dev/null +++ b/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/impl/RequestUrlDeserializer.java @@ -0,0 +1,17 @@ +package org.springframework.social.linkedin.api.impl; + +import java.io.IOException; + +import org.codehaus.jackson.JsonNode; +import org.codehaus.jackson.JsonParser; +import org.codehaus.jackson.JsonProcessingException; +import org.codehaus.jackson.map.DeserializationContext; +import org.codehaus.jackson.map.JsonDeserializer; + +public class RequestUrlDeserializer extends JsonDeserializer { + @Override + public String deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException { + JsonNode tree = jp.readValueAsTree(); + return tree.get("url").getValueAsText(); + } +} diff --git a/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/impl/UpdateContentConnectionMixin.java b/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/impl/UpdateContentConnectionMixin.java new file mode 100644 index 00000000..e1f7f2c8 --- /dev/null +++ b/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/impl/UpdateContentConnectionMixin.java @@ -0,0 +1,71 @@ +/* + * Copyright 2011 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * 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.springframework.social.linkedin.api.impl; + +import java.io.IOException; +import java.util.List; + +import org.codehaus.jackson.JsonNode; +import org.codehaus.jackson.JsonParser; +import org.codehaus.jackson.JsonProcessingException; +import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonIgnoreProperties; +import org.codehaus.jackson.annotate.JsonProperty; +import org.codehaus.jackson.map.DeserializationContext; +import org.codehaus.jackson.map.JsonDeserializer; +import org.codehaus.jackson.map.ObjectMapper; +import org.codehaus.jackson.map.annotate.JsonDeserialize; +import org.codehaus.jackson.type.TypeReference; +import org.springframework.social.linkedin.api.LinkedInProfile; + +@JsonIgnoreProperties(ignoreUnknown = true) +public class UpdateContentConnectionMixin { + + @JsonCreator + public UpdateContentConnectionMixin ( + @JsonProperty("id") String id, + @JsonProperty("firstName") String firstName, + @JsonProperty("lastName") String lastName, + @JsonProperty("headline") String headline, + @JsonProperty("industry") String industry, + @JsonProperty("publicProfileUrl") String publicProfileUrl, + @JsonProperty("siteStandardProfileRequest") @JsonDeserialize(using=RequestUrlDeserializer.class) String standardProfileUrl, + @JsonProperty("pictureUrl") String profilePictureUrl) {} + + @JsonProperty("summary") + String summary; + + @JsonProperty("connections") + @JsonDeserialize(using=LinkedInConnectionsListDeserializer.class) + List connections; + + private static class LinkedInConnectionsListDeserializer extends JsonDeserializer> { + @SuppressWarnings("unchecked") + @Override + public List deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException { + ObjectMapper mapper = new ObjectMapper(); + mapper.setDeserializationConfig(ctxt.getConfig()); + jp.setCodec(mapper); + if(jp.hasCurrentToken()) { + JsonNode dataNode = jp.readValueAsTree().get("values"); + return (List) mapper.readValue(dataNode, new TypeReference>() {}); + } + + return null; + } + } + +} diff --git a/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/impl/UpdateContentDeserializer.java b/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/impl/UpdateContentDeserializer.java new file mode 100644 index 00000000..e3b0c878 --- /dev/null +++ b/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/impl/UpdateContentDeserializer.java @@ -0,0 +1,29 @@ +package org.springframework.social.linkedin.api.impl; + +import java.io.IOException; + +import org.codehaus.jackson.JsonNode; +import org.codehaus.jackson.JsonParser; +import org.codehaus.jackson.JsonProcessingException; +import org.codehaus.jackson.map.DeserializationContext; +import org.codehaus.jackson.map.JsonDeserializer; +import org.codehaus.jackson.map.ObjectMapper; +import org.codehaus.jackson.type.TypeReference; +import org.springframework.social.linkedin.api.UpdateContent; + +public class UpdateContentDeserializer extends JsonDeserializer { + @Override + public UpdateContent deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException { + ObjectMapper mapper = new ObjectMapper(); + mapper.setDeserializationConfig(ctxt.getConfig()); + jp.setCodec(mapper); + if(jp.hasCurrentToken()) { + JsonNode dataNode = jp.readValueAsTree(); + if(dataNode != null) { + return (UpdateContent) mapper.readValue(dataNode, new TypeReference() {}); + } + } + + return null; + } +} diff --git a/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/impl/UpdateContentFollowMixin.java b/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/impl/UpdateContentFollowMixin.java new file mode 100644 index 00000000..bdf593fa --- /dev/null +++ b/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/impl/UpdateContentFollowMixin.java @@ -0,0 +1,40 @@ +/* + * Copyright 2011 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * 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.springframework.social.linkedin.api.impl; + +import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonIgnoreProperties; +import org.codehaus.jackson.annotate.JsonProperty; +import org.codehaus.jackson.map.annotate.JsonDeserialize; + +@JsonIgnoreProperties(ignoreUnknown = true) +public class UpdateContentFollowMixin { + + @JsonCreator + public UpdateContentFollowMixin( + @JsonProperty("id") String id, + @JsonProperty("firstName") String firstName, + @JsonProperty("lastName") String lastName, + @JsonProperty("headline") String headline, + @JsonProperty("industry") String industry, + @JsonProperty("publicProfileUrl") String publicProfileUrl, + @JsonProperty("siteStandardProfileRequest") @JsonDeserialize(using=RequestUrlDeserializer.class) String standardProfileUrl, + @JsonProperty("pictureUrl") String profilePictureUrl) {} + + @JsonProperty("summary") + String summary; + +} diff --git a/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/impl/UpdateContentGroupMixin.java b/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/impl/UpdateContentGroupMixin.java new file mode 100644 index 00000000..8132e9fd --- /dev/null +++ b/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/impl/UpdateContentGroupMixin.java @@ -0,0 +1,68 @@ +/* + * Copyright 2011 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * 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.springframework.social.linkedin.api.impl; + +import java.io.IOException; +import java.util.List; + +import org.codehaus.jackson.JsonNode; +import org.codehaus.jackson.JsonParser; +import org.codehaus.jackson.JsonProcessingException; +import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonIgnoreProperties; +import org.codehaus.jackson.annotate.JsonProperty; +import org.codehaus.jackson.map.DeserializationContext; +import org.codehaus.jackson.map.JsonDeserializer; +import org.codehaus.jackson.map.ObjectMapper; +import org.codehaus.jackson.map.annotate.JsonDeserialize; +import org.codehaus.jackson.type.TypeReference; +import org.springframework.social.linkedin.api.MemberGroup; + +@JsonIgnoreProperties(ignoreUnknown = true) +public class UpdateContentGroupMixin { + + @JsonCreator + public UpdateContentGroupMixin ( + @JsonProperty("id") String id, + @JsonProperty("firstName") String firstName, + @JsonProperty("lastName") String lastName, + @JsonProperty("headline") String headline, + @JsonProperty("industry") String industry, + @JsonProperty("publicProfileUrl") String publicProfileUrl, + @JsonProperty("siteStandardProfileRequest") @JsonDeserialize(using=RequestUrlDeserializer.class) String standardProfileUrl, + @JsonProperty("pictureUrl") String profilePictureUrl) {} + + @JsonProperty("memberGroups") + @JsonDeserialize(using=MemberGroupsListDeserializer.class) + List memberGroups; + + private static class MemberGroupsListDeserializer extends JsonDeserializer> { + @SuppressWarnings("unchecked") + @Override + public List deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException { + ObjectMapper mapper = new ObjectMapper(); + mapper.setDeserializationConfig(ctxt.getConfig()); + jp.setCodec(mapper); + if(jp.hasCurrentToken()) { + JsonNode dataNode = jp.readValueAsTree().get("values"); + return (List) mapper.readValue(dataNode, new TypeReference>() {}); + } + + return null; + } + } + +} diff --git a/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/impl/UpdateContentMixin.java b/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/impl/UpdateContentMixin.java new file mode 100644 index 00000000..2185b670 --- /dev/null +++ b/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/impl/UpdateContentMixin.java @@ -0,0 +1,37 @@ +/* + * Copyright 2011 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * 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.springframework.social.linkedin.api.impl; + +import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonIgnoreProperties; +import org.codehaus.jackson.annotate.JsonProperty; +import org.codehaus.jackson.map.annotate.JsonDeserialize; + +@JsonIgnoreProperties(ignoreUnknown = true) +public class UpdateContentMixin { + + @JsonCreator + public UpdateContentMixin( + @JsonProperty("id") String id, + @JsonProperty("firstName") String firstName, + @JsonProperty("lastName") String lastName, + @JsonProperty("headline") String headline, + @JsonProperty("industry") String industry, + @JsonProperty("publicProfileUrl") String publicProfileUrl, + @JsonProperty("siteStandardProfileRequest") @JsonDeserialize(using=RequestUrlDeserializer.class) String standardProfileUrl, + @JsonProperty("pictureUrl") String profilePictureUrl) {} + +} diff --git a/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/impl/UpdateContentPersonActivityMixin.java b/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/impl/UpdateContentPersonActivityMixin.java new file mode 100644 index 00000000..2b9d9bf3 --- /dev/null +++ b/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/impl/UpdateContentPersonActivityMixin.java @@ -0,0 +1,68 @@ +/* + * Copyright 2011 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * 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.springframework.social.linkedin.api.impl; + +import java.io.IOException; +import java.util.List; + +import org.codehaus.jackson.JsonNode; +import org.codehaus.jackson.JsonParser; +import org.codehaus.jackson.JsonProcessingException; +import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonIgnoreProperties; +import org.codehaus.jackson.annotate.JsonProperty; +import org.codehaus.jackson.map.DeserializationContext; +import org.codehaus.jackson.map.JsonDeserializer; +import org.codehaus.jackson.map.ObjectMapper; +import org.codehaus.jackson.map.annotate.JsonDeserialize; +import org.codehaus.jackson.type.TypeReference; +import org.springframework.social.linkedin.api.PersonActivity; + +@JsonIgnoreProperties(ignoreUnknown = true) +public class UpdateContentPersonActivityMixin { + + @JsonCreator + public UpdateContentPersonActivityMixin ( + @JsonProperty("id") String id, + @JsonProperty("firstName") String firstName, + @JsonProperty("lastName") String lastName, + @JsonProperty("headline") String headline, + @JsonProperty("industry") String industry, + @JsonProperty("publicProfileUrl") String publicProfileUrl, + @JsonProperty("siteStandardProfileRequest") @JsonDeserialize(using=RequestUrlDeserializer.class) String standardProfileUrl, + @JsonProperty("pictureUrl") String profilePictureUrl) {} + + @JsonProperty("personActivities") + @JsonDeserialize(using=PersonActivitiesListDeserializer.class) + List personActivities; + + private static class PersonActivitiesListDeserializer extends JsonDeserializer> { + @SuppressWarnings("unchecked") + @Override + public List deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException { + ObjectMapper mapper = new ObjectMapper(); + mapper.setDeserializationConfig(ctxt.getConfig()); + jp.setCodec(mapper); + if(jp.hasCurrentToken()) { + JsonNode dataNode = jp.readValueAsTree().get("values"); + return (List) mapper.readValue(dataNode, new TypeReference>() {}); + } + + return null; + } + } + +} diff --git a/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/impl/UpdateContentRecommendationMixin.java b/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/impl/UpdateContentRecommendationMixin.java new file mode 100644 index 00000000..18d05125 --- /dev/null +++ b/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/impl/UpdateContentRecommendationMixin.java @@ -0,0 +1,69 @@ +/* + * Copyright 2011 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * 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.springframework.social.linkedin.api.impl; + +import java.io.IOException; +import java.util.List; + +import org.codehaus.jackson.JsonNode; +import org.codehaus.jackson.JsonParser; +import org.codehaus.jackson.JsonProcessingException; +import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonIgnoreProperties; +import org.codehaus.jackson.annotate.JsonProperty; +import org.codehaus.jackson.map.DeserializationContext; +import org.codehaus.jackson.map.JsonDeserializer; +import org.codehaus.jackson.map.ObjectMapper; +import org.codehaus.jackson.map.annotate.JsonDeserialize; +import org.codehaus.jackson.type.TypeReference; +import org.springframework.social.linkedin.api.Recommendation; + +@JsonIgnoreProperties(ignoreUnknown = true) +public class UpdateContentRecommendationMixin { + + @JsonCreator + public UpdateContentRecommendationMixin ( + @JsonProperty("id") String id, + @JsonProperty("firstName") String firstName, + @JsonProperty("lastName") String lastName, + @JsonProperty("headline") String headline, + @JsonProperty("industry") String industry, + @JsonProperty("publicProfileUrl") String publicProfileUrl, + @JsonProperty("siteStandardProfileRequest") @JsonDeserialize(using=RequestUrlDeserializer.class) String standardProfileUrl, + @JsonProperty("pictureUrl") String profilePictureUrl) {} + + @JsonProperty("recommendationsReceived") + + @JsonDeserialize(using=RecommendationsListDeserializer.class) + List recommendations; + + private static class RecommendationsListDeserializer extends JsonDeserializer> { + @SuppressWarnings("unchecked") + @Override + public List deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException { + ObjectMapper mapper = new ObjectMapper(); + mapper.setDeserializationConfig(ctxt.getConfig()); + jp.setCodec(mapper); + if(jp.hasCurrentToken()) { + JsonNode dataNode = jp.readValueAsTree().get("values"); + return (List) mapper.readValue(dataNode, new TypeReference>() {}); + } + + return null; + } + } + +} diff --git a/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/impl/UpdateContentStatusMixin.java b/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/impl/UpdateContentStatusMixin.java new file mode 100644 index 00000000..9de8069f --- /dev/null +++ b/spring-social-linkedin/src/main/java/org/springframework/social/linkedin/api/impl/UpdateContentStatusMixin.java @@ -0,0 +1,40 @@ +/* + * Copyright 2011 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * 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.springframework.social.linkedin.api.impl; + +import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonIgnoreProperties; +import org.codehaus.jackson.annotate.JsonProperty; +import org.codehaus.jackson.map.annotate.JsonDeserialize; + +@JsonIgnoreProperties(ignoreUnknown = true) +public class UpdateContentStatusMixin { + + @JsonCreator + public UpdateContentStatusMixin ( + @JsonProperty("id") String id, + @JsonProperty("firstName") String firstName, + @JsonProperty("lastName") String lastName, + @JsonProperty("headline") String headline, + @JsonProperty("industry") String industry, + @JsonProperty("publicProfileUrl") String publicProfileUrl, + @JsonProperty("siteStandardProfileRequest") @JsonDeserialize(using=RequestUrlDeserializer.class) String standardProfileUrl, + @JsonProperty("pictureUrl") String profilePictureUrl) {} + + @JsonProperty("currentStatus") + String currentStatus; + +}