You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by dh...@apache.org on 2015/03/10 20:00:42 UTC
camel git commit: CAMEL-8469: Added custom ParamConverterProvider to
handle Enum query params in LinkedIn component, also moved enum params to xsd
Repository: camel
Updated Branches:
refs/heads/master 0b567c303 -> 379195278
CAMEL-8469: Added custom ParamConverterProvider to handle Enum query params in LinkedIn component, also moved enum params to xsd
Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/37919527
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/37919527
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/37919527
Branch: refs/heads/master
Commit: 379195278a2b92455a4bbe6178763a8d32f67fb3
Parents: 0b567c3
Author: Dhiraj Bokde <dh...@yahoo.com>
Authored: Tue Mar 10 11:55:31 2015 -0700
Committer: Dhiraj Bokde <dh...@yahoo.com>
Committed: Tue Mar 10 11:55:31 2015 -0700
----------------------------------------------------------------------
.../api/EnumQueryParamConverterProvider.java | 73 ++++++++++++++++++++
.../src/main/resources/linkedin-api-schema.xjb | 35 +++++++++-
.../src/main/resources/linkedin-api-schema.xsd | 36 ++++++++++
.../src/main/resources/linkedin-api-wadl.xml | 48 +++----------
.../api/AbstractResourceIntegrationTest.java | 2 +-
.../api/PeopleResourceIntegrationTest.java | 25 +++++++
.../component/linkedin/LinkedInEndpoint.java | 3 +-
.../CompaniesResourceIntegrationTest.java | 10 +--
8 files changed, 184 insertions(+), 48 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/camel/blob/37919527/components/camel-linkedin/camel-linkedin-api/src/main/java/org/apache/camel/component/linkedin/api/EnumQueryParamConverterProvider.java
----------------------------------------------------------------------
diff --git a/components/camel-linkedin/camel-linkedin-api/src/main/java/org/apache/camel/component/linkedin/api/EnumQueryParamConverterProvider.java b/components/camel-linkedin/camel-linkedin-api/src/main/java/org/apache/camel/component/linkedin/api/EnumQueryParamConverterProvider.java
new file mode 100644
index 0000000..8d3cee3
--- /dev/null
+++ b/components/camel-linkedin/camel-linkedin-api/src/main/java/org/apache/camel/component/linkedin/api/EnumQueryParamConverterProvider.java
@@ -0,0 +1,73 @@
+/**
+ * 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 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.apache.camel.component.linkedin.api;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.lang.reflect.Type;
+import javax.ws.rs.ext.ParamConverter;
+import javax.ws.rs.ext.ParamConverterProvider;
+import javax.ws.rs.ext.Provider;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Converter provider for Enum Query params.
+ */
+@Provider
+public class EnumQueryParamConverterProvider<T extends Enum<T>> implements ParamConverterProvider {
+ private static final Logger LOG = LoggerFactory.getLogger(EnumQueryParamConverterProvider.class);
+
+ @Override
+ public <T> ParamConverter<T> getConverter(Class<T> rawType, Type genericType, Annotation[] annotations) {
+ if (rawType.isEnum()) {
+ try {
+ final Method valueMethod = rawType.getMethod("value", null);
+ final Method fromValueMethod = rawType.getMethod("fromValue", String.class);
+
+ return new ParamConverter<T>() {
+ @Override
+ public T fromString(String value) {
+ try {
+ return (T) fromValueMethod.invoke(null, value);
+ } catch (IllegalAccessException e) {
+ throw new IllegalArgumentException(e);
+ } catch (InvocationTargetException e) {
+ throw new IllegalArgumentException(e);
+ }
+ }
+
+ @Override
+ public String toString(T value) {
+ try {
+ return (String) valueMethod.invoke(value);
+ } catch (IllegalAccessException e) {
+ throw new IllegalArgumentException(e);
+ } catch (InvocationTargetException e) {
+ throw new IllegalArgumentException(e);
+ }
+ }
+ };
+ } catch (NoSuchMethodException e) {
+ LOG.debug("Enumeration {} does not follow JAXB convention for conversion", rawType.getName());
+ }
+ }
+ return null;
+ }
+}
http://git-wip-us.apache.org/repos/asf/camel/blob/37919527/components/camel-linkedin/camel-linkedin-api/src/main/resources/linkedin-api-schema.xjb
----------------------------------------------------------------------
diff --git a/components/camel-linkedin/camel-linkedin-api/src/main/resources/linkedin-api-schema.xjb b/components/camel-linkedin/camel-linkedin-api/src/main/resources/linkedin-api-schema.xjb
index 778a4f5..48ed025 100644
--- a/components/camel-linkedin/camel-linkedin-api/src/main/resources/linkedin-api-schema.xjb
+++ b/components/camel-linkedin/camel-linkedin-api/src/main/resources/linkedin-api-schema.xjb
@@ -37,6 +37,33 @@
<package name="org.apache.camel.component.linkedin.api.model" />
</schemaBindings>
+ <bindings node="//xs:element[@name='order']/xs:simpleType">
+ <typesafeEnumClass name="Order">
+ <typesafeEnumMember name="RECENCY" value="recency"/>
+ <typesafeEnumMember name="POPULARITY" value="popularity"/>
+ </typesafeEnumClass>
+ </bindings>
+ <bindings node="//xs:element[@name='post-role']/xs:simpleType">
+ <typesafeEnumClass name="PostRole">
+ <typesafeEnumMember name="CREATOR" value="creator"/>
+ <typesafeEnumMember name="COMMENTER" value="commenter"/>
+ <typesafeEnumMember name="FOLLOWER" value="follower"/>
+ </typesafeEnumClass>
+ </bindings>
+ <bindings node="//xs:element[@name='event-type']/xs:simpleType">
+ <typesafeEnumClass name="EventType">
+ <typesafeEnumMember name="JOB_POSTING" value="job-posting"/>
+ <typesafeEnumMember name="NEW_PRODUCT" value="new-product"/>
+ <typesafeEnumMember name="STATUS_UPDATE" value="status-update"/>
+ </typesafeEnumClass>
+ </bindings>
+ <bindings node="//xs:element[@name='time-granularity']/xs:simpleType">
+ <typesafeEnumClass name="TimeGranularity">
+ <typesafeEnumMember name="DAY" value="day"/>
+ <typesafeEnumMember name="MONTH" value="month"/>
+ </typesafeEnumClass>
+ </bindings>
+
<bindings node="//xs:element[@name='content-type']/xs:simpleType">
<typesafeEnumClass name="NetworkUpdateContentType">
<typesafeEnumMember name="LINKED_IN_HTML" value="linkedin-html"/>
@@ -52,19 +79,23 @@
<typesafeEnumMember name="ANSWER_UPDATE" value="ANSW"/>
<typesafeEnumMember name="APPLICATION_CONNECTION_UPDATE" value="APPM"/>
<typesafeEnumMember name="APPLICATION_TO_MEMBER_UPDATE" value="APPS"/>
+ <typesafeEnumMember name="COMPANY_UPDATED" value="CMPY"/>
<typesafeEnumMember name="CONNECTION_ADDED_CONNECTIONS" value="CONN"/>
<typesafeEnumMember name="NEW_CONNECTIONS" value="NCON"/>
<typesafeEnumMember name="CONTACT_JOINED" value="CCEM"/>
<typesafeEnumMember name="JOB_POSTED" value="JOBP"/>
<typesafeEnumMember name="CONNECTION_JOINED_GROUP" value="JGRP"/>
+ <typesafeEnumMember name="MEMBER_STARTS_FOLLOWING_COMPANY" value="MSFC"/>
+ <typesafeEnumMember name="PEOPLE_FOLLOW_UPDATE" value="PFOL"/>
<typesafeEnumMember name="CONNECTION_UPDATED_PICTURE" value="PICU"/>
<typesafeEnumMember name="CONNECTION_RECOMMENDED" value="PREC"/>
+ <typesafeEnumMember name="CONNECTION_PROFILE_UPDATE" value="PRFU"/>
<typesafeEnumMember name="CONNECTION_UPDATED_PROFILE" value="PROF"/>
<typesafeEnumMember name="QUESTION_UPDATED" value="QSTN"/>
<typesafeEnumMember name="STATUS_UPDATED" value="STAT"/>
- <typesafeEnumMember name="SHARED_ITEM" value="SHAR"/>
+ <typesafeEnumMember name="RECOMMENDATIONS_UPDATE" value="SVPR"/>
<typesafeEnumMember name="EXTENDED_PROFILE_UPDATED" value="PRFX"/>
- <typesafeEnumMember name="COMPANY_UPDATED" value="CMPY"/>
+ <typesafeEnumMember name="SHARED_ITEM" value="SHAR"/>
<typesafeEnumMember name="VIRAL_UPDATE" value="VIRL"/>
</typesafeEnumClass>
</bindings>
http://git-wip-us.apache.org/repos/asf/camel/blob/37919527/components/camel-linkedin/camel-linkedin-api/src/main/resources/linkedin-api-schema.xsd
----------------------------------------------------------------------
diff --git a/components/camel-linkedin/camel-linkedin-api/src/main/resources/linkedin-api-schema.xsd b/components/camel-linkedin/camel-linkedin-api/src/main/resources/linkedin-api-schema.xsd
index ed19f73..a5796f9 100644
--- a/components/camel-linkedin/camel-linkedin-api/src/main/resources/linkedin-api-schema.xsd
+++ b/components/camel-linkedin/camel-linkedin-api/src/main/resources/linkedin-api-schema.xsd
@@ -2252,4 +2252,40 @@
</xs:sequence>
</xs:complexType>
</xs:element>
+
+ <xs:element name="order">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="recency"/>
+ <xs:enumeration value="popularity"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ <xs:element name="post-role">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="creator"/>
+ <xs:enumeration value="commenter"/>
+ <xs:enumeration value="follower"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ <xs:element name="event-type">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="job-posting"/>
+ <xs:enumeration value="new-product"/>
+ <xs:enumeration value="status-update"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ <xs:element name="time-granularity">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="day"/>
+ <xs:enumeration value="month"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+
</xs:schema>
http://git-wip-us.apache.org/repos/asf/camel/blob/37919527/components/camel-linkedin/camel-linkedin-api/src/main/resources/linkedin-api-wadl.xml
----------------------------------------------------------------------
diff --git a/components/camel-linkedin/camel-linkedin-api/src/main/resources/linkedin-api-wadl.xml b/components/camel-linkedin/camel-linkedin-api/src/main/resources/linkedin-api-wadl.xml
index cb0c390..c08df21 100644
--- a/components/camel-linkedin/camel-linkedin-api/src/main/resources/linkedin-api-wadl.xml
+++ b/components/camel-linkedin/camel-linkedin-api/src/main/resources/linkedin-api-wadl.xml
@@ -167,7 +167,7 @@
</wadl:resource>
<wadl:resource path="~/group-memberships{fields}">
- <wadl:param name="membership-state" style="query" type="tns:membershipstate"/>
+ <wadl:param name="membership-state" style="query" type="tns:membershipstatecode"/>
<wadl:param href="#fields-selector"/>
<wadl:method name="GET" id="getGroupMemberships">
<wadl:request>
@@ -221,7 +221,7 @@
<wadl:param href="#start"/>
<wadl:param href="#count"/>
<wadl:param href="#order"/>
- <wadl:param href="#role"/>
+ <wadl:param href="#post-role"/>
<wadl:param href="#category"/>
<wadl:param href="#modified-since"/>
<wadl:param href="#fields-selector"/>
@@ -286,7 +286,7 @@
<wadl:param href="#start"/>
<wadl:param href="#count"/>
<wadl:param href="#order"/>
- <wadl:param href="#role"/>
+ <wadl:param href="#post-role"/>
<wadl:param href="#category"/>
<wadl:param href="#modified-since"/>
<wadl:param href="#fields-selector"/>
@@ -927,40 +927,17 @@
<wadl:param name="partner-job-id" style="template" type="xsd:integer" required="true" id="partner-job-id"/>
<!-- posts params -->
- <wadl:param name="order" style="query" id="order">
- <wadl:option value="recency"/>
- <wadl:option value="popularity"/>
- </wadl:param>
+ <wadl:param name="order" style="query" id="order" type="tns:order"/>
- <wadl:param name="role" style="query" id="role">
- <wadl:option value="creator"/>
- <wadl:option value="commenter"/>
- <wadl:option value="follower"/>
- </wadl:param>
+ <wadl:param name="role" style="query" id="post-role" type="tns:post-role"/>
- <wadl:param name="category" style="query" id="category">
- <wadl:option value="discussion"/>
- </wadl:param>
+ <wadl:param name="category" style="query" id="category" type="tns:postcategorycode"/>
<wadl:param name="modified-since" style="query" id="modified-since" type="xsd:integer"/>
<wadl:param name="scope" style="query" type="tns:scope" id="scope"/>
- <wadl:param name="type" style="query" id="type">
- <wadl:option value="APPS"/>
- <wadl:option value="CMPY"/>
- <wadl:option value="CONN"/>
- <wadl:option value="JOBS"/>
- <wadl:option value="JGRP"/>
- <wadl:option value="PICT"/>
- <wadl:option value="PFOL"/>
- <wadl:option value="PRFX"/>
- <wadl:option value="RECU"/>
- <wadl:option value="PRFU"/>
- <wadl:option value="SHAR"/>
- <wadl:option value="STAT"/>
- <wadl:option value="VIRL"/>
- </wadl:param>
+ <wadl:param name="type" style="query" id="type" type="tns:networkupdatereturntype"/>
<wadl:param name="keywords" style="query" type="tns:keywords" id="keywords"/>
@@ -989,18 +966,11 @@
<!-- update-key path param -->
<wadl:param name="update-key" style="template" id="update-key"/>
- <wadl:param name="event-type" style="query" id="event-type">
- <wadl:option value="job-posting"/>
- <wadl:option value="new-product"/>
- <wadl:option value="status-update"/>
- </wadl:param>
+ <wadl:param name="event-type" style="query" id="event-type" type="tns:eventtype"/>
<wadl:param name="start-timestamp" style="query" type="xsd:integer" id="start-timestamp"/>
<wadl:param name="end-timestamp" style="query" type="xsd:integer" id="end-timestamp"/>
- <wadl:param name="time-granularity" style="query" id="time-granularity">
- <wadl:option value="day"/>
- <wadl:option value="month"/>
- </wadl:param>
+ <wadl:param name="time-granularity" style="query" id="time-granularity" type="tns:time-granularity"/>
<!-- representation types -->
<wadl:representation mediaType="application/xml" element="tns:person" id="person"/>
http://git-wip-us.apache.org/repos/asf/camel/blob/37919527/components/camel-linkedin/camel-linkedin-api/src/test/java/org/apache/camel/component/linkedin/api/AbstractResourceIntegrationTest.java
----------------------------------------------------------------------
diff --git a/components/camel-linkedin/camel-linkedin-api/src/test/java/org/apache/camel/component/linkedin/api/AbstractResourceIntegrationTest.java b/components/camel-linkedin/camel-linkedin-api/src/test/java/org/apache/camel/component/linkedin/api/AbstractResourceIntegrationTest.java
index 55405a2..49b2921 100644
--- a/components/camel-linkedin/camel-linkedin-api/src/test/java/org/apache/camel/component/linkedin/api/AbstractResourceIntegrationTest.java
+++ b/components/camel-linkedin/camel-linkedin-api/src/test/java/org/apache/camel/component/linkedin/api/AbstractResourceIntegrationTest.java
@@ -107,7 +107,7 @@ public abstract class AbstractResourceIntegrationTest extends Assert {
}
final T resource = JAXRSClientFactory.create(LinkedInOAuthRequestFilter.BASE_ADDRESS, resourceClass,
// Arrays.asList(new Object[] { requestFilter, new LinkedInExceptionResponseFilter() } ));
- Arrays.asList(new Object[]{requestFilter}));
+ Arrays.asList(new Object[]{requestFilter, new EnumQueryParamConverterProvider()}));
resourceList.add(resource);
return resource;
}
http://git-wip-us.apache.org/repos/asf/camel/blob/37919527/components/camel-linkedin/camel-linkedin-api/src/test/java/org/apache/camel/component/linkedin/api/PeopleResourceIntegrationTest.java
----------------------------------------------------------------------
diff --git a/components/camel-linkedin/camel-linkedin-api/src/test/java/org/apache/camel/component/linkedin/api/PeopleResourceIntegrationTest.java b/components/camel-linkedin/camel-linkedin-api/src/test/java/org/apache/camel/component/linkedin/api/PeopleResourceIntegrationTest.java
index 6256b6a..88c2a1a 100644
--- a/components/camel-linkedin/camel-linkedin-api/src/test/java/org/apache/camel/component/linkedin/api/PeopleResourceIntegrationTest.java
+++ b/components/camel-linkedin/camel-linkedin-api/src/test/java/org/apache/camel/component/linkedin/api/PeopleResourceIntegrationTest.java
@@ -18,8 +18,14 @@ package org.apache.camel.component.linkedin.api;
import java.util.Date;
+import org.apache.camel.component.linkedin.api.model.GroupMemberships;
import org.apache.camel.component.linkedin.api.model.JobSuggestions;
+import org.apache.camel.component.linkedin.api.model.MembershipStateCode;
+import org.apache.camel.component.linkedin.api.model.Order;
import org.apache.camel.component.linkedin.api.model.Person;
+import org.apache.camel.component.linkedin.api.model.PostCategoryCode;
+import org.apache.camel.component.linkedin.api.model.PostRole;
+import org.apache.camel.component.linkedin.api.model.Posts;
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;
@@ -52,6 +58,25 @@ public class PeopleResourceIntegrationTest extends AbstractResourceIntegrationTe
});
}
+ @Test
+ public void testGetPosts() throws Exception {
+ execute(new Runnable() {
+ @Override
+ public void run() {
+ final GroupMemberships groupMemberships = peopleResource.getGroupMemberships(MembershipStateCode.MEMBER,
+ "", null, null);
+ assertNotNull(groupMemberships);
+ assertNotNull(groupMemberships.getGroupMembershipList());
+ assertFalse(groupMemberships.getGroupMembershipList().isEmpty());
+ final Posts posts = peopleResource.getPosts(Long.parseLong(
+ groupMemberships.getGroupMembershipList().get(0).getGroup().getId()), null, null,
+ Order.RECENCY, PostRole.FOLLOWER, PostCategoryCode.DISCUSSION, null, ":(id)");
+ assertNotNull(posts);
+ LOG.debug("getPosts result: " + posts);
+ }
+ });
+ }
+
@Test(expected = LinkedInException.class)
public void testLinkedInError() throws Exception {
execute(new Runnable() {
http://git-wip-us.apache.org/repos/asf/camel/blob/37919527/components/camel-linkedin/camel-linkedin-component/src/main/java/org/apache/camel/component/linkedin/LinkedInEndpoint.java
----------------------------------------------------------------------
diff --git a/components/camel-linkedin/camel-linkedin-component/src/main/java/org/apache/camel/component/linkedin/LinkedInEndpoint.java b/components/camel-linkedin/camel-linkedin-component/src/main/java/org/apache/camel/component/linkedin/LinkedInEndpoint.java
index b0e7a75..990fd04 100644
--- a/components/camel-linkedin/camel-linkedin-component/src/main/java/org/apache/camel/component/linkedin/LinkedInEndpoint.java
+++ b/components/camel-linkedin/camel-linkedin-component/src/main/java/org/apache/camel/component/linkedin/LinkedInEndpoint.java
@@ -24,6 +24,7 @@ import org.apache.camel.Processor;
import org.apache.camel.Producer;
import org.apache.camel.component.linkedin.api.CommentsResource;
import org.apache.camel.component.linkedin.api.CompaniesResource;
+import org.apache.camel.component.linkedin.api.EnumQueryParamConverterProvider;
import org.apache.camel.component.linkedin.api.GroupsResource;
import org.apache.camel.component.linkedin.api.JobsResource;
import org.apache.camel.component.linkedin.api.LinkedInOAuthRequestFilter;
@@ -125,7 +126,7 @@ public class LinkedInEndpoint extends AbstractApiEndpoint<LinkedInApiName, Linke
// create endpoint proxy
resourceProxy = JAXRSClientFactory.create(LinkedInOAuthRequestFilter.BASE_ADDRESS, proxyClass,
- Arrays.asList(new Object[]{requestFilter}));
+ Arrays.asList(new Object[]{requestFilter, new EnumQueryParamConverterProvider()}));
}
@Override
http://git-wip-us.apache.org/repos/asf/camel/blob/37919527/components/camel-linkedin/camel-linkedin-component/src/test/java/org/apache/camel/component/linkedin/CompaniesResourceIntegrationTest.java
----------------------------------------------------------------------
diff --git a/components/camel-linkedin/camel-linkedin-component/src/test/java/org/apache/camel/component/linkedin/CompaniesResourceIntegrationTest.java b/components/camel-linkedin/camel-linkedin-component/src/test/java/org/apache/camel/component/linkedin/CompaniesResourceIntegrationTest.java
index 785f563..438f1ac 100644
--- a/components/camel-linkedin/camel-linkedin-component/src/test/java/org/apache/camel/component/linkedin/CompaniesResourceIntegrationTest.java
+++ b/components/camel-linkedin/camel-linkedin-component/src/test/java/org/apache/camel/component/linkedin/CompaniesResourceIntegrationTest.java
@@ -24,6 +24,7 @@ import java.util.HashMap;
import java.util.Map;
import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.linkedin.api.model.EventType;
import org.apache.camel.component.linkedin.internal.CompaniesResourceApiMethod;
import org.apache.camel.component.linkedin.internal.LinkedInApiCollection;
@@ -160,12 +161,11 @@ public class CompaniesResourceIntegrationTest extends AbstractLinkedInTestSuppor
public void testGetCompanyUpdates() throws Exception {
final Map<String, Object> headers = new HashMap<String, Object>();
headers.put("CamelLinkedIn.company_id", TEST_COMPANY_ID);
- // use defaults
-/*
// parameter type is String
- headers.put("CamelLinkedIn.fields", null);
- // parameter type is org.apache.camel.component.linkedin.api.Eventtype
- headers.put("CamelLinkedIn.event_type", null);
+// headers.put("CamelLinkedIn.fields", null);
+ // parameter type is org.apache.camel.component.linkedin.api.model.Eventtype
+ headers.put("CamelLinkedIn.event_type", EventType.STATUS_UPDATE);
+/*
// parameter type is Long
headers.put("CamelLinkedIn.start", null);
// parameter type is Long