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/04/06 22:38:07 UTC
[15/23] camel git commit: CAMEL-6568: Initial version of LinkedIn
component
http://git-wip-us.apache.org/repos/asf/camel/blob/b490a90c/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
new file mode 100644
index 0000000..f784a45
--- /dev/null
+++ b/components/camel-linkedin/camel-linkedin-api/src/main/resources/linkedin-api-wadl.xml
@@ -0,0 +1,1045 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ 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.
+ -->
+<wadl:application xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:wadl="http://wadl.dev.java.net/2009/02"
+ xmlns:tns="http://camel.apache.org/component/linkedin/api/model"
+ xsi:schemaLocation="http://camel.apache.org/component/linkedin/api/model linkedin-api-schema.xsd
+ http://wadl.dev.java.net/2009/02 http://www.w3.org/Submission/wadl/wadl.xsd">
+
+ <wadl:grammars>
+ <wadl:include href="linkedin-api-schema.xsd"/>
+ </wadl:grammars>
+
+ <wadl:resources base="http://api.linkedin.com/v1/">
+
+ <!-- People -->
+ <wadl:resource path="people" id="People">
+
+ <wadl:resource path="~{fields}">
+ <wadl:doc><![CDATA[https://developer.linkedin.com/documents/profile-api]]></wadl:doc>
+ <wadl:method name="GET" id="getPerson">
+ <wadl:request>
+ <wadl:param href="#fields-selector"/>
+ <wadl:param href="#secure-urls"/>
+ </wadl:request>
+ <wadl:response>
+ <wadl:representation href="#person"/>
+ </wadl:response>
+ </wadl:method>
+
+ </wadl:resource>
+
+ <wadl:resource path="~/connections{fields}">
+ <wadl:doc><![CDATA[https://developer.linkedin.com/documents/connections-api]]></wadl:doc>
+ <wadl:method name="GET" id="getConnections">
+ <wadl:request>
+ <wadl:param href="#fields-selector"/>
+ <wadl:param href="#secure-urls"/>
+ </wadl:request>
+ <wadl:response>
+ <wadl:representation href="#connections"/>
+ </wadl:response>
+ </wadl:method>
+ </wadl:resource>
+
+ <wadl:resource path="~/shares">
+ <wadl:method name="POST" id="share">
+ <wadl:request>
+ <wadl:representation mediaType="application/xml" element="tns:share"/>
+ </wadl:request>
+ <wadl:response>
+ <wadl:representation mediaType="application/xml" element="tns:update"/>
+ </wadl:response>
+ </wadl:method>
+ </wadl:resource>
+
+ <wadl:resource path="~/network">
+ <wadl:doc><![CDATA[https://developer.linkedin.com/documents/get-network-updates-and-statistics-api]]></wadl:doc>
+
+ <wadl:resource path="updates{fields}">
+ <wadl:param href="#scope"/>
+ <wadl:param href="#type"/>
+ <wadl:param href="#count"/>
+ <wadl:param href="#start"/>
+ <wadl:param href="#after"/>
+ <wadl:param href="#before"/>
+ <wadl:param href="#show-hidden-members"/>
+
+ <wadl:method name="GET" id="getNetworkUpdates">
+ <wadl:request>
+ <wadl:param href="#fields-selector"/>
+ <wadl:param href="#secure-urls"/>
+ </wadl:request>
+ <wadl:response>
+ <wadl:representation href="#updates"/>
+ </wadl:response>
+ </wadl:method>
+ </wadl:resource>
+
+ <wadl:resource path="updates/key={update-key}">
+ <wadl:resource path="update-comments{fields}">
+ <wadl:method name="GET" id="getUpdateComments">
+ <wadl:request>
+ <wadl:param href="#update-key"/>
+ <wadl:param href="#fields-selector"/>
+ <wadl:param href="#secure-urls"/>
+ </wadl:request>
+ <wadl:response>
+ <wadl:representation mediaType="application/xml" element="tns:comments"/>
+ </wadl:response>
+ </wadl:method>
+ </wadl:resource>
+
+ <wadl:resource path="update-comments">
+ <wadl:method name="POST" id="addUpdateComment">
+ <wadl:request>
+ <wadl:param href="#update-key"/>
+ <wadl:representation mediaType="application/xml" element="tns:updatecomment"/>
+ </wadl:request>
+ </wadl:method>
+ </wadl:resource>
+
+ <wadl:resource path="likes{fields}">
+ <wadl:method name="GET" id="getUpdateLikes">
+ <wadl:request>
+ <wadl:param href="#update-key"/>
+ <wadl:param href="#fields-selector"/>
+ <wadl:param href="#secure-urls"/>
+ </wadl:request>
+ <wadl:response>
+ <wadl:representation mediaType="application/xml" element="tns:likes"/>
+ </wadl:response>
+ </wadl:method>
+ </wadl:resource>
+
+ <wadl:resource path="is-liked">
+ <wadl:method name="PUT" id="likeUpdate">
+ <wadl:request>
+ <wadl:param href="#update-key"/>
+ <wadl:representation href="#is-liked"/>
+ </wadl:request>
+ </wadl:method>
+ </wadl:resource>
+
+ </wadl:resource>
+
+ <wadl:resource path="network-stats">
+ <wadl:method name="GET" id="getNetworkStats">
+ <wadl:response>
+ <wadl:representation mediaType="application/xml" element="tns:networkstats"/>
+ </wadl:response>
+ </wadl:method>
+ </wadl:resource>
+
+ </wadl:resource>
+
+ <wadl:resource path="~/person-activities">
+ <wadl:method name="POST" id="addActivity">
+ <wadl:request>
+ <wadl:representation mediaType="application/xml" element="tns:activity"/>
+ </wadl:request>
+ </wadl:method>
+ </wadl:resource>
+
+ <wadl:resource path="~/mailbox">
+ <wadl:doc><![CDATA[https://developer.linkedin.com/documents/invitation-api]]></wadl:doc>
+ <wadl:method name="POST" id="addInvite">
+ <wadl:request>
+ <wadl:representation mediaType="application/xml" element="tns:mailboxitem"/>
+ </wadl:request>
+ </wadl:method>
+ </wadl:resource>
+
+ <wadl:resource path="~/group-memberships{fields}">
+ <wadl:param name="membership-state" style="query" type="tns:membershipstate"/>
+ <wadl:param href="#fields-selector"/>
+ <wadl:method name="GET" id="getGroupMemberships">
+ <wadl:request>
+ <wadl:param href="#count"/>
+ <wadl:param href="#start"/>
+ </wadl:request>
+ <wadl:response>
+ <wadl:representation href="#groupmemberships"/>
+ </wadl:response>
+ </wadl:method>
+ </wadl:resource>
+
+ <wadl:resource path="~/group-memberships">
+ <wadl:method name="POST" id="addGroupMembership">
+ <wadl:request>
+ <wadl:representation href="#groupmembership"/>
+ </wadl:request>
+ </wadl:method>
+ </wadl:resource>
+
+ <wadl:resource path="~/group-memberships/{group-id}{fields}">
+ <wadl:method name="GET" id="getGroupMembershipSettings">
+ <wadl:request>
+ <wadl:param href="#group-id"/>
+ <wadl:param href="#fields-selector"/>
+ <wadl:param href="#count"/>
+ <wadl:param href="#start"/>
+ </wadl:request>
+ <wadl:response>
+ <wadl:representation href="#groupmemberships"/>
+ </wadl:response>
+ </wadl:method>
+ </wadl:resource>
+
+ <wadl:resource path="~/group-memberships/{group-id}">
+ <wadl:method name="PUT" id="updateGroupMembership">
+ <wadl:request>
+ <wadl:param href="#group-id"/>
+ <wadl:representation href="#groupmembership"/>
+ </wadl:request>
+ </wadl:method>
+
+ <wadl:method name="DELETE" id="removeGroupMembership">
+ <wadl:request>
+ <wadl:param href="#group-id"/>
+ </wadl:request>
+ </wadl:method>
+
+ <wadl:resource path="posts{fields}">
+ <wadl:method name="GET" id="getPosts">
+ <wadl:request>
+ <wadl:param href="#group-id"/>
+ <wadl:param href="#start"/>
+ <wadl:param href="#count"/>
+ <wadl:param href="#order"/>
+ <wadl:param href="#role"/>
+ <wadl:param href="#category"/>
+ <wadl:param href="#modified-since"/>
+ <wadl:param href="#fields-selector"/>
+ </wadl:request>
+ <wadl:response>
+ <wadl:representation href="#posts"/>
+ </wadl:response>
+ </wadl:method>
+ </wadl:resource>
+
+ </wadl:resource>
+
+ <wadl:resource path="~/job-bookmarks">
+
+ <wadl:method name="GET" id="getJobBookmarks">
+ <wadl:response>
+ <wadl:representation href="#job-bookmarks"/>
+ </wadl:response>
+ </wadl:method>
+
+ <wadl:method name="POST" id="addJobBookmark">
+ <wadl:request>
+ <wadl:representation href="#job-bookmark"/>
+ </wadl:request>
+ </wadl:method>
+
+ <wadl:resource path="{job-id}">
+ <wadl:method name="DELETE" id="removeJobBookmark">
+ <wadl:request>
+ <wadl:param href="#job-id"/>
+ </wadl:request>
+ </wadl:method>
+ </wadl:resource>
+ </wadl:resource>
+
+ <wadl:resource path="~/suggestions">
+
+ <wadl:resource path="groups{fields}">
+ <wadl:method name="GET" id="getSuggestedGroups">
+ <wadl:request>
+ <wadl:param href="#fields-selector"/>
+ </wadl:request>
+ <wadl:response>
+ <wadl:representation href="#groups"/>
+ </wadl:response>
+ </wadl:method>
+ </wadl:resource>
+
+ <wadl:resource path="groups">
+
+ <wadl:resource path="{group-id}">
+ <wadl:method name="DELETE" id="removeGroupSuggestion">
+ <wadl:request>
+ <wadl:param href="#group-id"/>
+ </wadl:request>
+ </wadl:method>
+
+ <wadl:resource path="posts{fields}">
+ <wadl:method name="GET" id="getSuggestedGroupPosts">
+ <wadl:request>
+ <wadl:param href="#group-id"/>
+ <wadl:param href="#start"/>
+ <wadl:param href="#count"/>
+ <wadl:param href="#order"/>
+ <wadl:param href="#role"/>
+ <wadl:param href="#category"/>
+ <wadl:param href="#modified-since"/>
+ <wadl:param href="#fields-selector"/>
+ </wadl:request>
+ <wadl:response>
+ <wadl:representation href="#posts"/>
+ </wadl:response>
+ </wadl:method>
+ </wadl:resource>
+
+ </wadl:resource>
+ </wadl:resource>
+
+ <wadl:resource path="to-follow/companies{fields}">
+ <wadl:method name="GET" id="getSuggestedCompanies">
+ <wadl:request>
+ <wadl:param href="#fields-selector"/>
+ </wadl:request>
+ <wadl:response>
+ <wadl:representation href="#companies"/>
+ </wadl:response>
+ </wadl:method>
+ </wadl:resource>
+
+ <wadl:resource path="job-suggestions{fields}">
+ <wadl:method name="GET" id="getSuggestedJobs">
+ <wadl:request>
+ <wadl:param href="#fields-selector"/>
+ </wadl:request>
+ <wadl:response>
+ <wadl:representation mediaType="application/xml" element="tns:jobsuggestions"/>
+ </wadl:response>
+ </wadl:method>
+ </wadl:resource>
+
+ </wadl:resource>
+
+ <wadl:resource path="~/following/companies{fields}">
+ <wadl:method name="GET" id="getFollowedCompanies">
+ <wadl:request>
+ <wadl:param href="#fields-selector"/>
+ </wadl:request>
+ <wadl:response>
+ <wadl:representation href="#companies"/>
+ </wadl:response>
+ </wadl:method>
+ </wadl:resource>
+
+ <wadl:resource path="~/following/companies">
+ <wadl:method name="POST" id="followCompany">
+ <wadl:request>
+ <wadl:representation href="#company"/>
+ </wadl:request>
+ </wadl:method>
+ </wadl:resource>
+
+ <wadl:resource path="~/following/companies/id={company-id}">
+ <wadl:method name="DELETE" id="stopFollowingCompany">
+ <wadl:request>
+ <wadl:param href="#company-id"/>
+ </wadl:request>
+ </wadl:method>
+ </wadl:resource>
+
+ <wadl:resource path="id={person-id}{fields}">
+ <wadl:method name="GET" id="getPersonById">
+ <wadl:request>
+ <wadl:param href="#person-id"/>
+ <wadl:param href="#fields-selector"/>
+ <wadl:param href="#secure-urls"/>
+ </wadl:request>
+ <wadl:response>
+ <wadl:representation href="#person"/>
+ </wadl:response>
+ </wadl:method>
+ </wadl:resource>
+
+ <wadl:resource path="id={person-id}/connections{fields}">
+ <wadl:method name="GET" id="getConnectionsById">
+ <wadl:request>
+ <wadl:param href="#person-id"/>
+ <wadl:param href="#fields-selector"/>
+ <wadl:param href="#secure-urls"/>
+ </wadl:request>
+ <wadl:response>
+ <wadl:representation href="#connections"/>
+ </wadl:response>
+ </wadl:method>
+ </wadl:resource>
+
+ <wadl:resource path="id={person-id}/network/updates{fields}">
+ <wadl:param href="#scope"/>
+ <wadl:param href="#type"/>
+ <wadl:param href="#count"/>
+ <wadl:param href="#start"/>
+ <wadl:param href="#after"/>
+ <wadl:param href="#before"/>
+ <wadl:param href="#show-hidden-members"/>
+ <wadl:method name="GET" id="getNetworkUpdatesById">
+ <wadl:request>
+ <wadl:param href="#person-id"/>
+ <wadl:param href="#fields-selector"/>
+ <wadl:param href="#secure-urls"/>
+ </wadl:request>
+ <wadl:response>
+ <wadl:representation href="#updates"/>
+ </wadl:response>
+ </wadl:method>
+ </wadl:resource>
+
+ <wadl:resource path="url={public-profile-url}{fields}">
+ <wadl:method name="GET" id="getPersonByUrl">
+ <wadl:request>
+ <wadl:param href="#public-profile-url"/>
+ <wadl:param href="#fields-selector"/>
+ <wadl:param href="#secure-urls"/>
+ </wadl:request>
+ <wadl:response>
+ <wadl:representation href="#person"/>
+ </wadl:response>
+ </wadl:method>
+ </wadl:resource>
+
+ <wadl:resource path="url={public-profile-url}/connections{fields}">
+ <wadl:method name="GET" id="getConnectionsByUrl">
+ <wadl:request>
+ <wadl:param href="#public-profile-url"/>
+ <wadl:param href="#fields-selector"/>
+ <wadl:param href="#secure-urls"/>
+ </wadl:request>
+ <wadl:response>
+ <wadl:representation href="#connections"/>
+ </wadl:response>
+ </wadl:method>
+ </wadl:resource>
+
+ </wadl:resource>
+
+ <!-- Groups Resource -->
+ <wadl:resource path="groups" id="Groups">
+ <wadl:doc><![CDATA[https://developer.linkedin.com/documents/groups-api]]></wadl:doc>
+
+ <wadl:resource path="{group-id}{fields}">
+ <wadl:method name="GET" id="getGroup">
+ <wadl:request>
+ <wadl:param href="#group-id"/>
+ </wadl:request>
+ <wadl:response>
+ <wadl:representation href="#group"/>
+ </wadl:response>
+ </wadl:method>
+ </wadl:resource>
+
+ <wadl:resource path="{group-id}">
+
+ <wadl:resource path="posts{fields}" type="tns:get-posts"/>
+
+ <wadl:resource path="posts">
+ <wadl:method name="POST" id="addPost">
+ <wadl:request>
+ <wadl:param href="#group-id"/>
+ <wadl:representation href="#post"/>
+ </wadl:request>
+ </wadl:method>
+ </wadl:resource>
+ </wadl:resource>
+
+ </wadl:resource>
+
+ <!-- Posts Resource -->
+ <wadl:resource path="posts" id="Posts">
+ <wadl:doc><![CDATA[https://developer.linkedin.com/documents/commenting-reading-comments-and-likes-network-updates]]></wadl:doc>
+
+ <wadl:resource path="{post-id}{fields}">
+ <wadl:method name="GET" id="getPost">
+ <wadl:request>
+ <wadl:param href="#post-id"/>
+ <wadl:param href="#count"/>
+ <wadl:param href="#start"/>
+ <wadl:param href="#fields-selector"/>
+ </wadl:request>
+ <wadl:response>
+ <wadl:representation href="#post"/>
+ </wadl:response>
+ </wadl:method>
+ </wadl:resource>
+
+ <wadl:resource path="{post-id}/relation-to-viewer/is-liked">
+ <wadl:method name="PUT" id="likePost">
+ <wadl:request>
+ <wadl:param href="#post-id"/>
+ <wadl:representation href="#is-liked"/>
+ </wadl:request>
+ </wadl:method>
+ </wadl:resource>
+
+ <wadl:resource path="{post-id}/relation-to-viewer/is-following">
+ <wadl:method name="PUT" id="followPost">
+ <wadl:request>
+ <wadl:param href="#post-id"/>
+ <wadl:representation href="#is-following"/>
+ </wadl:request>
+ </wadl:method>
+ </wadl:resource>
+
+ <wadl:resource path="{post-id}/category/code">
+ <wadl:method name="PUT" id="flagCategory">
+ <wadl:request>
+ <wadl:param href="#post-id"/>
+ <wadl:representation mediaType="application/xml" element="tns:postcategorycode"/>
+ </wadl:request>
+ </wadl:method>
+ </wadl:resource>
+
+ <wadl:resource path="{post-id}">
+ <wadl:method name="DELETE" id="removePost">
+ <wadl:request>
+ <wadl:param href="#post-id"/>
+ </wadl:request>
+ </wadl:method>
+ </wadl:resource>
+
+ <wadl:resource path="{post-id}/comments{fields}">
+ <wadl:method name="GET" id="getPostComments">
+ <wadl:request>
+ <wadl:param href="#post-id"/>
+ <wadl:param href="#count"/>
+ <wadl:param href="#start"/>
+ <wadl:param href="#fields-selector"/>
+ </wadl:request>
+ <wadl:response>
+ <wadl:representation href="#comments"/>
+ </wadl:response>
+ </wadl:method>
+ </wadl:resource>
+
+ <wadl:resource path="{post-id}/comments">
+ <wadl:method name="POST" id="addComment">
+ <wadl:request>
+ <wadl:param href="#post-id"/>
+ <wadl:representation href="#comment"/>
+ </wadl:request>
+ </wadl:method>
+ </wadl:resource>
+
+ </wadl:resource>
+
+ <!-- Comments Resource -->
+ <wadl:resource path="comments" id="Comments">
+ <wadl:doc><![CDATA[https://developer.linkedin.com/documents/commenting-reading-comments-and-likes-network-updates]]></wadl:doc>
+
+ <wadl:resource path="{comment-id}{fields}">
+ <wadl:method name="GET" id="getComment">
+ <wadl:request>
+ <wadl:param href="#comment-id"/>
+ <wadl:param href="#fields-selector"/>
+ </wadl:request>
+ <wadl:response>
+ <wadl:representation href="#comment"/>
+ </wadl:response>
+ </wadl:method>
+ </wadl:resource>
+
+ <wadl:resource path="{comment-id}">
+ <wadl:method name="DELETE" id="removeComment">
+ <wadl:request>
+ <wadl:param href="#comment-id"/>
+ </wadl:request>
+ </wadl:method>
+ </wadl:resource>
+
+ </wadl:resource>
+
+ <!--Companies Resource -->
+ <wadl:resource id="Companies">
+ <wadl:doc><![CDATA[https://developer.linkedin.com/documents/companies]]></wadl:doc>
+
+ <wadl:resource path="companies{fields}">
+ <wadl:method name="GET" id="getCompanies">
+ <wadl:request>
+ <wadl:param href="#fields-selector"/>
+ <wadl:param name="email-domain" style="query"/>
+ <wadl:param name="is-company-admin" style="query" type="xsd:boolean"/>
+ </wadl:request>
+ <wadl:response>
+ <wadl:representation href="#companies"/>
+ </wadl:response>
+ </wadl:method>
+ </wadl:resource>
+
+ <wadl:resource path="companies">
+
+ <wadl:resource path="{company-id}{fields}">
+ <wadl:method name="GET" id="getCompanyById">
+ <wadl:request>
+ <wadl:param href="#company-id"/>
+ <wadl:param href="#fields-selector"/>
+ </wadl:request>
+ <wadl:response>
+ <wadl:representation href="#company"/>
+ </wadl:response>
+ </wadl:method>
+ </wadl:resource>
+
+ <wadl:resource path="universal-name={universal-name}{fields}">
+ <wadl:method name="GET" id="getCompanyByName">
+ <wadl:request>
+ <wadl:param name="universal-name" style="template"/>
+ <wadl:param href="#fields-selector"/>
+ </wadl:request>
+ <wadl:response>
+ <wadl:representation href="#company"/>
+ </wadl:response>
+ </wadl:method>
+ </wadl:resource>
+
+ <wadl:resource path="{company-id}">
+
+ <!-- Company updates -->
+ <wadl:resource path="updates{fields}">
+ <wadl:method name="GET" id="getCompanyUpdates">
+ <wadl:request>
+ <wadl:param href="#company-id"/>
+ <wadl:param href="#fields-selector"/>
+ <wadl:param href="#event-type"/>
+ <wadl:param href="#start"/>
+ <wadl:param href="#count"/>
+ </wadl:request>
+ <wadl:response>
+ <wadl:representation href="#updates"/>
+ </wadl:response>
+ </wadl:method>
+ </wadl:resource>
+
+ <wadl:resource path="updates/key={update-key}">
+ <wadl:resource path="update-comments{fields}">
+ <wadl:method name="GET" id="getCompanyUpdateComments">
+ <wadl:request>
+ <wadl:param href="#company-id"/>
+ <wadl:param href="#update-key"/>
+ <wadl:param href="#fields-selector"/>
+ <wadl:param href="#secure-urls"/>
+ </wadl:request>
+ <wadl:response>
+ <wadl:representation mediaType="application/xml" element="tns:comments"/>
+ </wadl:response>
+ </wadl:method>
+ </wadl:resource>
+
+ <wadl:resource path="update-comments">
+ <wadl:method name="POST" id="addCompanyUpdateComment">
+ <wadl:request>
+ <wadl:param href="#company-id"/>
+ <wadl:param href="#update-key"/>
+ <wadl:representation href="#update-comment"/>
+ </wadl:request>
+ </wadl:method>
+ </wadl:resource>
+
+ <wadl:resource path="update-comments-as-company">
+ <wadl:method name="POST" id="addCompanyUpdateCommentAsCompany">
+ <wadl:request>
+ <wadl:param href="#company-id"/>
+ <wadl:param href="#update-key"/>
+ <wadl:representation href="#update-comment"/>
+ </wadl:request>
+ </wadl:method>
+ </wadl:resource>
+
+ <wadl:resource path="likes{fields}">
+ <wadl:method name="GET" id="getCompanyUpdateLikes">
+ <wadl:request>
+ <wadl:param href="#company-id"/>
+ <wadl:param href="#update-key"/>
+ <wadl:param href="#fields-selector"/>
+ <wadl:param href="#secure-urls"/>
+ </wadl:request>
+ <wadl:response>
+ <wadl:representation mediaType="application/xml" element="tns:likes"/>
+ </wadl:response>
+ </wadl:method>
+ </wadl:resource>
+
+ <wadl:resource path="is-liked">
+ <wadl:method name="PUT" id="likeCompanyUpdate">
+ <wadl:request>
+ <wadl:param href="#company-id"/>
+ <wadl:param href="#update-key"/>
+ <wadl:representation href="#is-liked"/>
+ </wadl:request>
+ </wadl:method>
+ </wadl:resource>
+
+ </wadl:resource>
+
+ <!-- Company shares -->
+ <wadl:resource path="shares">
+ <wadl:doc><![CDATA[https://developer.linkedin.com/documents/share-api]]></wadl:doc>
+ <wadl:method name="POST" id="addShare">
+ <wadl:request>
+ <wadl:param href="#company-id"/>
+ <wadl:representation mediaType="application/xml" element="tns:share"/>
+ </wadl:request>
+ </wadl:method>
+ </wadl:resource>
+
+ <wadl:resource path="is-company-share-enabled">
+ <wadl:method name="GET" id="isShareEnabled">
+ <wadl:request>
+ <wadl:param href="#company-id"/>
+ </wadl:request>
+ <wadl:response>
+ <wadl:representation mediaType="application/xml" element="tns:iscompanyshareenabled"/>
+ </wadl:response>
+ </wadl:method>
+ </wadl:resource>
+
+ <wadl:resource path="relation-to-viewer/is-company-share-enabled">
+ <wadl:method name="GET" id="isViewerShareEnabled">
+ <wadl:request>
+ <wadl:param href="#company-id"/>
+ </wadl:request>
+ <wadl:response>
+ <wadl:representation mediaType="application/xml" element="tns:iscompanyshareenabled"/>
+ </wadl:response>
+ </wadl:method>
+ </wadl:resource>
+
+ <!-- Company Analytics -->
+ <wadl:resource path="historical-follow-statistics">
+ <wadl:method name="GET" id="getHistoricalFollowStatistics">
+ <wadl:request>
+ <wadl:param href="#company-id"/>
+ <wadl:param href="#start-timestamp"/>
+ <wadl:param href="#end-timestamp"/>
+ <wadl:param href="#time-granularity"/>
+ </wadl:request>
+ <wadl:response>
+ <wadl:representation mediaType="application/xml" element="tns:historicalfollowstatistics"/>
+ </wadl:response>
+ </wadl:method>
+ </wadl:resource>
+
+ <wadl:resource path="historical-status-update-statistics">
+ <wadl:method name="GET" id="getHistoricalStatusUpdateStatistics">
+ <wadl:request>
+ <wadl:param href="#company-id"/>
+ <wadl:param href="#start-timestamp"/>
+ <wadl:param href="#end-timestamp"/>
+ <wadl:param href="#time-granularity"/>
+ <wadl:param name="update-key" style="query"/>
+ </wadl:request>
+ <wadl:response>
+ <wadl:representation mediaType="application/xml" element="tns:historicalstatusupdatestatistics"/>
+ </wadl:response>
+ </wadl:method>
+ </wadl:resource>
+
+ <wadl:resource path="company-statistics">
+ <wadl:method name="GET" id="getStatistics">
+ <wadl:request>
+ <wadl:param href="#company-id"/>
+ </wadl:request>
+ <wadl:response>
+ <wadl:representation mediaType="application/xml" element="tns:companystatistics"/>
+ </wadl:response>
+ </wadl:method>
+ </wadl:resource>
+
+ <wadl:resource path="num-followers">
+ <wadl:method name="GET" id="getNumberOfFollowers">
+ <wadl:request>
+ <wadl:param href="#company-id"/>
+ <wadl:param name="geos" style="query" repeating="true"/>
+ <wadl:param name="companySizes" style="query" repeating="true"/>
+ <wadl:param name="jobFunc" style="query" repeating="true"/>
+ <wadl:param name="industries" style="query" repeating="true"/>
+ <wadl:param name="seniorities" style="query" repeating="true"/>
+ </wadl:request>
+ <wadl:response>
+ <wadl:representation mediaType="application/xml" element="tns:numfollowers"/>
+ </wadl:response>
+ </wadl:method>
+ </wadl:resource>
+
+ </wadl:resource>
+
+ </wadl:resource>
+
+ </wadl:resource>
+
+ <!-- Jobs -->
+ <wadl:resource path="jobs" id="Jobs">
+ <wadl:doc><![CDATA[https://developer.linkedin.com/documents/jobs]]></wadl:doc>
+
+ <wadl:method name="POST" id="addJob">
+ <wadl:request>
+ <wadl:representation mediaType="application/xml" element="tns:job"/>
+ </wadl:request>
+ </wadl:method>
+
+ <wadl:resource path="{job-id}${fields}">
+ <wadl:method name="GET" id="getJob">
+ <wadl:request>
+ <wadl:param href="#job-id"/>
+ <wadl:param href="#fields-selector"/>
+ </wadl:request>
+ <wadl:response>
+ <wadl:representation mediaType="application/xml" element="tns:job"/>
+ </wadl:response>
+ </wadl:method>
+ </wadl:resource>
+
+ <wadl:resource path="partner-job-id={partner-job-id}">
+
+ <wadl:method name="PUT" id="editJob">
+ <wadl:request>
+ <wadl:param href="#partner-job-id"/>
+ <wadl:representation mediaType="application/xml" element="tns:job"/>
+ </wadl:request>
+ </wadl:method>
+
+ <wadl:method name="DELETE" id="removeJob">
+ <wadl:request>
+ <wadl:param href="#partner-job-id"/>
+ </wadl:request>
+ </wadl:method>
+
+ </wadl:resource>
+
+ </wadl:resource>
+
+ <!-- Search -->
+ <wadl:resource id="SearchResource">
+
+ <!-- People Search -->
+ <wadl:resource path="people-search{fields}">
+ <wadl:doc><![CDATA[https://developer.linkedin.com/documents/people-search-api]]></wadl:doc>
+ <wadl:method name="GET" id="searchPeople">
+ <wadl:request>
+ <wadl:param href="#fields-selector"/>
+ <wadl:param href="#keywords"/>
+ <wadl:param name="first-name" style="query" type="tns:first-name"/>
+ <wadl:param name="last-name" style="query" type="tns:last-name"/>
+ <wadl:param href="#company-name"/>
+ <wadl:param name="current-company" style="query" type="tns:current-company"/>
+ <wadl:param name="title" style="query" type="tns:title"/>
+ <wadl:param name="current-title" style="query" type="tns:current-title"/>
+ <wadl:param name="school-name" style="query" type="tns:school-name"/>
+ <wadl:param name="current-school" style="query" type="tns:current-school"/>
+ <wadl:param href="#country-code"/>
+ <wadl:param href="#postal-code"/>
+ <wadl:param href="#distance"/>
+ <wadl:param href="#facet"/>
+ <wadl:param href="#facets"/>
+ <wadl:param href="#start"/>
+ <wadl:param href="#count"/>
+ <wadl:param name="sort" style="query"/>
+ </wadl:request>
+ <wadl:response>
+ <wadl:representation mediaType="application/xml" element="tns:peoplesearch"/>
+ </wadl:response>
+ </wadl:method>
+
+ </wadl:resource>
+
+ <!-- Company Search -->
+ <wadl:resource path="company-search{fields}">
+ <wadl:doc><![CDATA[https://developer.linkedin.com/documents/company-search]]></wadl:doc>
+ <wadl:method name="GET" id="searchCompanies">
+ <wadl:request>
+ <wadl:param href="#fields-selector"/>
+ <wadl:param href="#keywords"/>
+ <wadl:param name="hq-only" style="query"/>
+ <wadl:param href="#facet"/>
+ <wadl:param href="#facets"/>
+ <wadl:param href="#start"/>
+ <wadl:param href="#count"/>
+ <wadl:param name="sort" style="query"/>
+ </wadl:request>
+ <wadl:response>
+ <wadl:representation href="#company-search"/>
+ </wadl:response>
+ </wadl:method>
+ </wadl:resource>
+
+ <!-- Job Search -->
+ <wadl:resource path="job-search{fields}">
+ <wadl:doc><![CDATA[https://developer.linkedin.com/documents/job-search-api]]></wadl:doc>
+ <wadl:method name="GET" id="searchJobs">
+ <wadl:request>
+ <wadl:param href="#fields-selector"/>
+ <wadl:param href="#keywords"/>
+ <wadl:param href="#company-name"/>
+ <wadl:param name="job-title" style="query"/>
+ <wadl:param href="#country-code"/>
+ <wadl:param href="#postal-code"/>
+ <wadl:param href="#distance"/>
+ <wadl:param href="#facet"/>
+ <wadl:param href="#facets"/>
+ <wadl:param href="#start"/>
+ <wadl:param href="#count"/>
+ <wadl:param name="sort" style="query"/>
+ </wadl:request>
+ <wadl:response>
+ <wadl:representation href="#job-search"/>
+ </wadl:response>
+ </wadl:method>
+ </wadl:resource>
+
+ </wadl:resource>
+
+ </wadl:resources>
+
+ <!-- id path param -->
+ <wadl:param name="person-id" style="template" required="true" id="person-id"/>
+
+ <!-- field selector suffix -->
+ <wadl:param name="fields" style="template" id="fields-selector"/>
+
+ <!-- return secure urls in profile -->
+ <wadl:param name="secure-urls" style="query" type="xsd:boolean" id="secure-urls"/>
+
+ <!-- public profile url param -->
+ <wadl:param name="public-profile-url" style="template" type="xsd:anyURI" id="public-profile-url"/>
+
+ <!-- group Id param -->
+ <wadl:param name="group-id" style="template" type="xsd:integer" required="true" id="group-id"/>
+
+ <!-- post Id param -->
+ <wadl:param name="post-id" style="template" required="true" id="post-id"/>
+
+ <!-- comment Id param -->
+ <wadl:param name="comment-id" style="template" required="true" id="comment-id"/>
+
+ <!-- company Id param -->
+ <wadl:param name="company-id" style="template" type="xsd:integer" required="true" id="company-id"/>
+
+ <!-- job Id param -->
+ <wadl:param name="job-id" style="template" type="xsd:integer" required="true" id="job-id"/>
+
+ <!-- partner-job Id param -->
+ <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="role" style="query" id="role">
+ <wadl:option value="creator"/>
+ <wadl:option value="commenter"/>
+ <wadl:option value="follower"/>
+ </wadl:param>
+
+ <wadl:param name="category" style="query" id="category">
+ <wadl:option value="discussion"/>
+ </wadl:param>
+
+ <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="keywords" style="query" type="tns:keywords" id="keywords"/>
+
+ <wadl:param name="facet" style="query" id="facet"/>
+
+ <wadl:param name="facets" style="query" id="facets"/>
+
+ <wadl:param name="start" style="query" type="xsd:integer" id="start"/>
+
+ <wadl:param name="count" style="query" type="xsd:integer" id="count"/>
+
+ <wadl:param name="company-name" style="query" type="tns:company-name" id="company-name"/>
+
+ <wadl:param name="country-code" style="query" type="tns:country-code" id="country-code"/>
+
+ <wadl:param name="postal-code" style="query" type="tns:postal-code" id="postal-code"/>
+
+ <wadl:param name="distance" style="query" type="tns:distance" id="distance"/>
+
+ <wadl:param name="after" style="query" type="xsd:integer" id="after"/>
+
+ <wadl:param name="before" style="query" type="xsd:integer" id="before"/>
+
+ <wadl:param name="show-hidden-members" style="query" type="xsd:boolean" id="show-hidden-members"/>
+
+ <!-- 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="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>
+
+ <!-- representation types -->
+ <wadl:representation mediaType="application/xml" element="tns:person" id="person"/>
+
+ <wadl:representation mediaType="application/xml" element="tns:connections" id="connections"/>
+
+ <wadl:representation mediaType="application/xml" element="tns:updates" id="updates"/>
+
+ <wadl:representation mediaType="application/xml" element="tns:groupmembership" id="groupmembership"/>
+ <wadl:representation mediaType="application/xml" element="tns:groupmemberships" id="groupmemberships"/>
+
+ <wadl:representation mediaType="application/xml" element="tns:group" id="group"/>
+ <wadl:representation mediaType="application/xml" element="tns:groups" id="groups"/>
+
+ <wadl:representation mediaType="application/xml" element="tns:post" id="post"/>
+ <wadl:representation mediaType="application/xml" element="tns:posts" id="posts"/>
+
+ <wadl:representation mediaType="application/xml" element="tns:comment" id="comment"/>
+ <wadl:representation mediaType="application/xml" element="tns:comments" id="comments"/>
+
+ <wadl:representation mediaType="application/xml" element="tns:company" id="company"/>
+ <wadl:representation mediaType="application/xml" element="tns:companies" id="companies"/>
+ <wadl:representation mediaType="application/xml" element="tns:companysearch" id="company-search"/>
+
+ <wadl:representation mediaType="application/xml" element="tns:isliked" id="is-liked"/>
+
+ <wadl:representation mediaType="application/xml" element="tns:isfollowing" id="is-following"/>
+
+ <wadl:representation mediaType="application/xml" element="tns:updatecomment" id="update-comment"/>
+
+ <wadl:representation mediaType="application/xml" element="tns:jobbookmark" id="job-bookmark"/>
+ <wadl:representation mediaType="application/xml" element="tns:jobbookmarks" id="job-bookmarks"/>
+ <wadl:representation mediaType="application/xml" element="tns:jobsearch" id="job-search"/>
+
+</wadl:application>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/camel/blob/b490a90c/components/camel-linkedin/camel-linkedin-api/src/main/resources/wadl.xsd
----------------------------------------------------------------------
diff --git a/components/camel-linkedin/camel-linkedin-api/src/main/resources/wadl.xsd b/components/camel-linkedin/camel-linkedin-api/src/main/resources/wadl.xsd
new file mode 100644
index 0000000..1f71474
--- /dev/null
+++ b/components/camel-linkedin/camel-linkedin-api/src/main/resources/wadl.xsd
@@ -0,0 +1,263 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
+ targetNamespace="http://wadl.dev.java.net/2009/02"
+ xmlns:tns="http://wadl.dev.java.net/2009/02"
+ xmlns:xml="http://www.w3.org/XML/1998/namespace"
+ elementFormDefault="qualified">
+
+ <xs:import namespace="http://www.w3.org/XML/1998/namespace"
+ schemaLocation="http://www.w3.org/2001/xml.xsd"/>
+
+ <xs:element name="application">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element ref="tns:doc" minOccurs="0" maxOccurs="unbounded"/>
+ <xs:element ref="tns:grammars" minOccurs="0"/>
+ <xs:element ref="tns:resources" minOccurs="0"
+ maxOccurs="unbounded"/>
+ <xs:choice minOccurs="0" maxOccurs="unbounded">
+ <xs:element ref="tns:resource_type"/>
+ <xs:element ref="tns:method"/>
+ <xs:element ref="tns:representation"/>
+ <xs:element ref="tns:param"/>
+ </xs:choice>
+ <xs:any namespace="##other" processContents="lax" minOccurs="0"
+ maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:element name="doc">
+ <xs:complexType mixed="true">
+ <xs:sequence>
+ <xs:any namespace="##other" processContents="lax" minOccurs="0"
+ maxOccurs="unbounded"/>
+ </xs:sequence>
+ <xs:attribute name="title" type="xs:string"/>
+ <xs:attribute ref="xml:lang"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:element name="grammars">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element ref="tns:doc" minOccurs="0" maxOccurs="unbounded"/>
+ <xs:element minOccurs="0" maxOccurs="unbounded" ref="tns:include"/>
+ <xs:any namespace="##other" processContents="lax" minOccurs="0"
+ maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:element name="resources">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element ref="tns:doc" minOccurs="0" maxOccurs="unbounded"/>
+ <xs:element ref="tns:resource" maxOccurs="unbounded"/>
+ <xs:any namespace="##other" processContents="lax" minOccurs="0"
+ maxOccurs="unbounded"/>
+ </xs:sequence>
+ <xs:attribute name="base" type="xs:anyURI"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:element name="resource">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element ref="tns:doc" minOccurs="0" maxOccurs="unbounded"/>
+ <xs:element ref="tns:param" minOccurs="0" maxOccurs="unbounded"/>
+ <xs:choice minOccurs="0" maxOccurs="unbounded">
+ <xs:element ref="tns:method"/>
+ <xs:element ref="tns:resource"/>
+ </xs:choice>
+ <xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other"
+ processContents="lax"/>
+ </xs:sequence>
+ <xs:attribute name="id" type="xs:ID"/>
+ <xs:attribute name="type" type="tns:resource_type_list"/>
+ <xs:attribute name="queryType" type="xs:string"
+ default="application/x-www-form-urlencoded"/>
+ <xs:attribute name="path" type="xs:string"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:simpleType name="resource_type_list">
+ <xs:list itemType="xs:anyURI"/>
+ </xs:simpleType>
+
+ <xs:element name="resource_type">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element ref="tns:doc" minOccurs="0" maxOccurs="unbounded"/>
+ <xs:element ref="tns:param" minOccurs="0" maxOccurs="unbounded"/>
+ <xs:choice minOccurs="0" maxOccurs="unbounded">
+ <xs:element ref="tns:method"/>
+ <xs:element ref="tns:resource"/>
+ </xs:choice>
+ <xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other"
+ processContents="lax"/>
+ </xs:sequence>
+ <xs:attribute name="id" type="xs:ID"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:element name="method">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element ref="tns:doc" minOccurs="0" maxOccurs="unbounded"/>
+ <xs:element ref="tns:request" minOccurs="0"/>
+ <xs:element ref="tns:response" minOccurs="0"
+ maxOccurs="unbounded"/>
+ <xs:any namespace="##other" processContents="lax" minOccurs="0"
+ maxOccurs="unbounded"/>
+ </xs:sequence>
+ <xs:attribute name="id" type="xs:ID"/>
+ <xs:attribute name="name" type="tns:Method"/>
+ <xs:attribute name="href" type="xs:anyURI"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:simpleType name="Method">
+ <xs:union memberTypes="tns:HTTPMethods xs:NMTOKEN"/>
+ </xs:simpleType>
+
+ <xs:simpleType name="HTTPMethods">
+ <xs:restriction base="xs:NMTOKEN">
+ <xs:enumeration value="GET"/>
+ <xs:enumeration value="POST"/>
+ <xs:enumeration value="PUT"/>
+ <xs:enumeration value="HEAD"/>
+ <xs:enumeration value="DELETE"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:element name="include">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element ref="tns:doc" minOccurs="0" maxOccurs="unbounded"/>
+ </xs:sequence>
+ <xs:attribute name="href" type="xs:anyURI"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:element name="request">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element ref="tns:doc" minOccurs="0" maxOccurs="unbounded"/>
+ <xs:element ref="tns:param" minOccurs="0" maxOccurs="unbounded"/>
+ <xs:element ref="tns:representation" minOccurs="0"
+ maxOccurs="unbounded"/>
+ <xs:any namespace="##other" processContents="lax" minOccurs="0"
+ maxOccurs="unbounded"/>
+ </xs:sequence>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:element name="response">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element ref="tns:doc" minOccurs="0" maxOccurs="unbounded"/>
+ <xs:element ref="tns:param" minOccurs="0" maxOccurs="unbounded"/>
+ <xs:element ref="tns:representation" minOccurs="0"
+ maxOccurs="unbounded"/>
+ <xs:any namespace="##other" processContents="lax" minOccurs="0"
+ maxOccurs="unbounded"/>
+ </xs:sequence>
+ <xs:attribute name="status" type="tns:statusCodeList"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:simpleType name="uriList">
+ <xs:list itemType="xs:anyURI"/>
+ </xs:simpleType>
+
+ <xs:element name="representation">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element ref="tns:doc" minOccurs="0" maxOccurs="unbounded"/>
+ <xs:element ref="tns:param" minOccurs="0" maxOccurs="unbounded"/>
+ <xs:any namespace="##other" processContents="lax" minOccurs="0"
+ maxOccurs="unbounded"/>
+ </xs:sequence>
+ <xs:attribute name="id" type="xs:ID"/>
+ <xs:attribute name="element" type="xs:QName"/>
+ <xs:attribute name="mediaType" type="xs:string"/>
+ <xs:attribute name="href" type="xs:anyURI"/>
+ <xs:attribute name="profile" type="tns:uriList"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:simpleType name="statusCodeList">
+ <xs:list itemType="xs:unsignedInt"/>
+ </xs:simpleType>
+
+ <xs:simpleType name="ParamStyle">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="plain"/>
+ <xs:enumeration value="query"/>
+ <xs:enumeration value="matrix"/>
+ <xs:enumeration value="header"/>
+ <xs:enumeration value="template"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:element name="param">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element ref="tns:doc" minOccurs="0" maxOccurs="unbounded"/>
+ <xs:element ref="tns:option" minOccurs="0" maxOccurs="unbounded"/>
+ <xs:element ref="tns:link" minOccurs="0"/>
+ <xs:any namespace="##other" processContents="lax" minOccurs="0"
+ maxOccurs="unbounded"/>
+ </xs:sequence>
+ <xs:attribute name="href" type="xs:anyURI"/>
+ <xs:attribute name="name" type="xs:NMTOKEN"/>
+ <xs:attribute name="style" type="tns:ParamStyle"/>
+ <xs:attribute name="id" type="xs:ID"/>
+ <xs:attribute name="type" type="xs:QName" default="xs:string"/>
+ <xs:attribute name="default" type="xs:string"/>
+ <xs:attribute name="required" type="xs:boolean" default="false"/>
+ <xs:attribute name="repeating" type="xs:boolean" default="false"/>
+ <xs:attribute name="fixed" type="xs:string"/>
+ <xs:attribute name="path" type="xs:string"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:element name="option">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element ref="tns:doc" minOccurs="0" maxOccurs="unbounded"/>
+ <xs:any namespace="##other" processContents="lax" minOccurs="0"
+ maxOccurs="unbounded"/>
+ </xs:sequence>
+ <xs:attribute name="value" type="xs:string" use="required"/>
+ <xs:attribute name="mediaType" type="xs:string"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:element name="link">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element ref="tns:doc" minOccurs="0" maxOccurs="unbounded"/>
+ <xs:any namespace="##other" processContents="lax" minOccurs="0"
+ maxOccurs="unbounded"/>
+ </xs:sequence>
+ <xs:attribute name="resource_type" type="xs:anyURI"/>
+ <xs:attribute name="rel" type="xs:token"/>
+ <xs:attribute name="rev" type="xs:token"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+
+</xs:schema>
http://git-wip-us.apache.org/repos/asf/camel/blob/b490a90c/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
new file mode 100644
index 0000000..1d4c536
--- /dev/null
+++ b/components/camel-linkedin/camel-linkedin-api/src/test/java/org/apache/camel/component/linkedin/api/AbstractResourceIntegrationTest.java
@@ -0,0 +1,125 @@
+/**
+ * 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.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Properties;
+import javax.ws.rs.WebApplicationException;
+
+import org.apache.camel.component.linkedin.api.model.Error;
+import org.apache.cxf.jaxrs.client.JAXRSClientFactory;
+import org.apache.cxf.jaxrs.client.WebClient;
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Base class for resource tests.
+ */
+public class AbstractResourceIntegrationTest extends Assert {
+
+ protected static final Logger LOG = LoggerFactory.getLogger(PeopleResourceIntegrationTest.class);
+ protected static final String DEFAULT_FIELDS = "";
+
+ protected static LinkedInOAuthRequestFilter requestFilter;
+ private static Properties properties;
+ private static OAuthToken token;
+ private static List<Object> resourceList = new ArrayList<Object>();
+
+ @BeforeClass
+ public static void beforeClass() throws Exception {
+ properties = new Properties();
+ properties.load(PeopleResourceIntegrationTest.class.getResourceAsStream("/test-options.properties"));
+
+ requestFilter = createOAuthHelper();
+ }
+
+ private static LinkedInOAuthRequestFilter createOAuthHelper() throws IOException {
+ final String userName = properties.getProperty("userName");
+ final String userPassword = properties.getProperty("userPassword");
+ final String clientId = properties.getProperty("clientId");
+ final String clientSecret = properties.getProperty("clientSecret");
+ final String redirectUri = properties.getProperty("redirectUri");
+
+ final OAuthScope[] scopes;
+ final String scope = properties.getProperty("scope");
+ if (scope != null) {
+ scopes = OAuthScope.fromValues(scope.split(","));
+ } else {
+ scopes = null;
+ }
+
+ final OAuthSecureStorage secureStorage = new OAuthSecureStorage() {
+ @Override
+ public OAuthToken getOAuthToken() {
+ return token;
+ }
+
+ @Override
+ public void saveOAuthToken(OAuthToken newToken) {
+ token = newToken;
+ }
+ };
+
+ final OAuthParams oAuthParams = new OAuthParams(userName, userPassword, secureStorage,
+ clientId, clientSecret, redirectUri, scopes);
+ return new LinkedInOAuthRequestFilter(oAuthParams, null, false);
+ }
+
+ @AfterClass
+ public static void afterClass() throws Exception {
+ // close all proxies
+ for (Object resource : resourceList) {
+ try {
+ WebClient.client(resource).close();
+ } catch (Exception ignore) {
+ }
+ }
+ if (requestFilter != null) {
+ requestFilter.close();
+ }
+ // TODO save and load token from test-options.properties
+ }
+
+ protected static <T> T getResource(Class<T> resourceClass) {
+ if (requestFilter == null) {
+ throw new IllegalStateException(AbstractResourceIntegrationTest.class.getName() +
+ ".beforeClass must be invoked before getResource");
+ }
+ final T resource = JAXRSClientFactory.create(LinkedInOAuthRequestFilter.BASE_ADDRESS, resourceClass,
+// Arrays.asList(new Object[] { requestFilter, new LinkedInExceptionResponseFilter() } ));
+ Arrays.asList(new Object[]{requestFilter}));
+ resourceList.add(resource);
+ return resource;
+ }
+
+ protected void execute(Runnable runnable) {
+ try {
+ runnable.run();
+ } catch (WebApplicationException e) {
+ final org.apache.camel.component.linkedin.api.model.Error error = e.getResponse().readEntity(Error.class);
+ assertNotNull(error);
+ LOG.error("Error: {}", error.getMessage());
+ throw new LinkedInException(error, e.getResponse());
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/camel/blob/b490a90c/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
new file mode 100644
index 0000000..6256b6a
--- /dev/null
+++ b/components/camel-linkedin/camel-linkedin-api/src/test/java/org/apache/camel/component/linkedin/api/PeopleResourceIntegrationTest.java
@@ -0,0 +1,99 @@
+/**
+ * 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.util.Date;
+
+import org.apache.camel.component.linkedin.api.model.JobSuggestions;
+import org.apache.camel.component.linkedin.api.model.Person;
+import org.junit.BeforeClass;
+import org.junit.Ignore;
+import org.junit.Test;
+
+/**
+ * Integration test for {@link PeopleResource}.
+ */
+public class PeopleResourceIntegrationTest extends AbstractResourceIntegrationTest {
+
+ private static PeopleResource peopleResource;
+
+ @BeforeClass
+ public static void beforeClass() throws Exception {
+ AbstractResourceIntegrationTest.beforeClass();
+
+ final Class<PeopleResource> resourceClass = PeopleResource.class;
+ PeopleResourceIntegrationTest.peopleResource = getResource(resourceClass);
+ }
+
+ @Test
+ public void testGetPerson() throws Exception {
+ execute(new Runnable() {
+ @Override
+ public void run() {
+ final Person person = peopleResource.getPerson(":(id)", true);
+ assertNotNull(person);
+ assertNotNull(person.getId());
+ LOG.debug("getPerson result: " + person);
+ }
+ });
+ }
+
+ @Test(expected = LinkedInException.class)
+ public void testLinkedInError() throws Exception {
+ execute(new Runnable() {
+ @Override
+ public void run() {
+ peopleResource.getPerson("bad_fields_selector", true);
+ }
+ });
+ }
+
+ @Ignore("CXF swallows application exceptions from ClientResponseFilters")
+ @Test(expected = LinkedInException.class)
+ public void testLinkedInException() throws Exception {
+ try {
+ peopleResource.getPerson("bad_fields_selector", true);
+ } catch (LinkedInException e) {
+ assertNotNull(e.getError());
+ LOG.debug("getPerson error: " + e.getMessage());
+ throw e;
+ }
+ }
+
+ @Test
+ public void testOAuthTokenRefresh() throws Exception {
+ peopleResource.getPerson("", false);
+
+ // mark OAuth token as expired
+ final OAuthToken oAuthToken = requestFilter.getOAuthToken();
+ oAuthToken.setExpiryTime(new Date().getTime());
+
+ peopleResource.getPerson("", false);
+ }
+
+ @Test
+ public void testGetSuggestedJobs() throws Exception {
+ execute(new Runnable() {
+ @Override
+ public void run() {
+ final JobSuggestions suggestedJobs = peopleResource.getSuggestedJobs(DEFAULT_FIELDS);
+ assertNotNull(suggestedJobs);
+ LOG.debug("Suggested Jobs " + suggestedJobs.getJobs());
+ }
+ });
+ }
+}
http://git-wip-us.apache.org/repos/asf/camel/blob/b490a90c/components/camel-linkedin/camel-linkedin-api/src/test/java/org/apache/camel/component/linkedin/api/SearchResourceIntegrationTest.java
----------------------------------------------------------------------
diff --git a/components/camel-linkedin/camel-linkedin-api/src/test/java/org/apache/camel/component/linkedin/api/SearchResourceIntegrationTest.java b/components/camel-linkedin/camel-linkedin-api/src/test/java/org/apache/camel/component/linkedin/api/SearchResourceIntegrationTest.java
new file mode 100644
index 0000000..002000b
--- /dev/null
+++ b/components/camel-linkedin/camel-linkedin-api/src/test/java/org/apache/camel/component/linkedin/api/SearchResourceIntegrationTest.java
@@ -0,0 +1,47 @@
+/**
+ * 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 org.apache.camel.component.linkedin.api.model.CompanySearch;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+/**
+ * Integration test for {@link org.apache.camel.component.linkedin.api.SearchResource}
+ */
+public class SearchResourceIntegrationTest extends AbstractResourceIntegrationTest {
+
+ private static SearchResource searchResource;
+
+ @BeforeClass
+ public static void beforeClass() throws Exception {
+ AbstractResourceIntegrationTest.beforeClass();
+ searchResource = getResource(SearchResource.class);
+ }
+
+ @Test
+ public void testSearchCompanies() {
+ execute(new Runnable() {
+ @Override
+ public void run() {
+ final CompanySearch companySearch = searchResource.searchCompanies(DEFAULT_FIELDS, "linkedin", null, null,
+ null, null, null, null);
+ assertNotNull(companySearch);
+ }
+ });
+ }
+}
http://git-wip-us.apache.org/repos/asf/camel/blob/b490a90c/components/camel-linkedin/camel-linkedin-component/pom.xml
----------------------------------------------------------------------
diff --git a/components/camel-linkedin/camel-linkedin-component/pom.xml b/components/camel-linkedin/camel-linkedin-component/pom.xml
new file mode 100644
index 0000000..42311e2
--- /dev/null
+++ b/components/camel-linkedin/camel-linkedin-component/pom.xml
@@ -0,0 +1,280 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ 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.
+ -->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.apache.camel.component.linkedin</groupId>
+ <artifactId>camel-linkedin-parent</artifactId>
+ <version>2.14-SNAPSHOT</version>
+ </parent>
+
+ <artifactId>camel-linkedin</artifactId>
+ <packaging>bundle</packaging>
+ <name>Camel LinkedIn Component</name>
+ <description>Camel Component for LinkedIn</description>
+
+ <properties>
+ <schemeName>linkedin</schemeName>
+ <componentName>LinkedIn</componentName>
+ <componentPackage>org.apache.camel.component.linkedin</componentPackage>
+ <outPackage>org.apache.camel.component.linkedin.internal</outPackage>
+
+ <camel.osgi.export.pkg>${componentPackage}</camel.osgi.export.pkg>
+ <camel.osgi.private.pkg>${outPackage}</camel.osgi.private.pkg>
+ </properties>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-core</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel.component.linkedin</groupId>
+ <artifactId>camel-linkedin-api</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+
+ <!-- Camel annotations in runtime scope to avoid compile errors in IDEs -->
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>spi-annotations</artifactId>
+ <version>${project.version}</version>
+ <scope>provided</scope>
+ </dependency>
+
+ <!-- Component API javadoc in provided scope to read API signatures -->
+ <dependency>
+ <groupId>org.apache.camel.component.linkedin</groupId>
+ <artifactId>camel-linkedin-api</artifactId>
+ <version>${project.version}</version>
+ <classifier>javadoc</classifier>
+ <scope>provided</scope>
+ </dependency>
+
+ <!-- logging -->
+ <dependency>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-api</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-log4j12</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>log4j</groupId>
+ <artifactId>log4j</artifactId>
+ <scope>test</scope>
+ </dependency>
+
+ <!-- testing -->
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test</artifactId>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <plugins>
+
+ <!-- generate Component source and test source -->
+ <plugin>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-api-component-maven-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>generate-test-component-classes</id>
+ <goals>
+ <goal>fromApis</goal>
+ </goals>
+ <configuration>
+ <apis>
+ <api>
+ <apiName>comments</apiName>
+ <proxyClass>org.apache.camel.component.linkedin.api.CommentsResource</proxyClass>
+ <fromJavadoc/>
+ </api>
+ <api>
+ <apiName>companies</apiName>
+ <proxyClass>org.apache.camel.component.linkedin.api.CompaniesResource</proxyClass>
+ <fromJavadoc/>
+ <nullableOptions>
+ <nullableOption>companySizes</nullableOption>
+ <nullableOption>count</nullableOption>
+ <nullableOption>email_domain</nullableOption>
+ <nullableOption>end_timestamp</nullableOption>
+ <nullableOption>event_type</nullableOption>
+ <nullableOption>geos</nullableOption>
+ <nullableOption>industries</nullableOption>
+ <nullableOption>is_company_admin</nullableOption>
+ <nullableOption>jobFunc</nullableOption>
+ <nullableOption>secure_urls</nullableOption>
+ <nullableOption>seniorities</nullableOption>
+ <nullableOption>start</nullableOption>
+ <nullableOption>start_timestamp</nullableOption>
+ <nullableOption>time_granularity</nullableOption>
+ </nullableOptions>
+ </api>
+ <api>
+ <apiName>groups</apiName>
+ <proxyClass>org.apache.camel.component.linkedin.api.GroupsResource</proxyClass>
+ <fromJavadoc/>
+ </api>
+ <api>
+ <apiName>jobs</apiName>
+ <proxyClass>org.apache.camel.component.linkedin.api.JobsResource</proxyClass>
+ <fromJavadoc/>
+ </api>
+ <api>
+ <apiName>people</apiName>
+ <proxyClass>org.apache.camel.component.linkedin.api.PeopleResource</proxyClass>
+ <fromJavadoc/>
+ <nullableOptions>
+ <nullableOption>after</nullableOption>
+ <nullableOption>before</nullableOption>
+ <nullableOption>category</nullableOption>
+ <nullableOption>count</nullableOption>
+ <nullableOption>membership_state</nullableOption>
+ <nullableOption>modified_since</nullableOption>
+ <nullableOption>order</nullableOption>
+ <nullableOption>public_profile_url</nullableOption>
+ <nullableOption>role</nullableOption>
+ <nullableOption>scope</nullableOption>
+ <nullableOption>secure_urls</nullableOption>
+ <nullableOption>show_hidden_members</nullableOption>
+ <nullableOption>start</nullableOption>
+ <nullableOption>type</nullableOption>
+ </nullableOptions>
+ </api>
+ <api>
+ <apiName>posts</apiName>
+ <proxyClass>org.apache.camel.component.linkedin.api.PostsResource</proxyClass>
+ <fromJavadoc/>
+ <nullableOptions>
+ <nullableOption>count</nullableOption>
+ <nullableOption>start</nullableOption>
+ </nullableOptions>
+ </api>
+ <api>
+ <apiName>search</apiName>
+ <proxyClass>org.apache.camel.component.linkedin.api.SearchResource</proxyClass>
+ <fromJavadoc/>
+ <nullableOptions>
+ <nullableOption>company_name</nullableOption>
+ <nullableOption>count</nullableOption>
+ <nullableOption>country_code</nullableOption>
+ <nullableOption>current_company</nullableOption>
+ <nullableOption>current_school</nullableOption>
+ <nullableOption>current_title</nullableOption>
+ <nullableOption>distance</nullableOption>
+ <nullableOption>facet</nullableOption>
+ <nullableOption>facets</nullableOption>
+ <nullableOption>first_name</nullableOption>
+ <nullableOption>hq_only</nullableOption>
+ <nullableOption>job_title</nullableOption>
+ <nullableOption>keywords</nullableOption>
+ <nullableOption>last_name</nullableOption>
+ <nullableOption>postal_code</nullableOption>
+ <nullableOption>school_name</nullableOption>
+ <nullableOption>sort</nullableOption>
+ <nullableOption>start</nullableOption>
+ <nullableOption>title</nullableOption>
+ </nullableOptions>
+ </api>
+ </apis>
+ <aliases>
+ <alias>
+ <methodPattern>(add|get|remove|search)(.+)</methodPattern>
+ <methodAlias>$2</methodAlias>
+ </alias>
+ </aliases>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+
+ <!-- add generated source and test source to build -->
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>build-helper-maven-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>add-generated-sources</id>
+ <goals>
+ <goal>add-source</goal>
+ </goals>
+ <configuration>
+ <sources>
+ <source>${project.build.directory}/generated-sources/camel-component</source>
+ </sources>
+ </configuration>
+ </execution>
+ <execution>
+ <id>add-generated-test-sources</id>
+ <goals>
+ <goal>add-test-source</goal>
+ </goals>
+ <configuration>
+ <sources>
+ <source>${project.build.directory}/generated-test-sources/camel-component</source>
+ </sources>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+
+ </plugins>
+
+ <pluginManagement>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-api-component-maven-plugin</artifactId>
+ <version>${project.version}</version>
+ <configuration>
+ <scheme>${schemeName}</scheme>
+ <componentName>${componentName}</componentName>
+ <componentPackage>${componentPackage}</componentPackage>
+ <outPackage>${outPackage}</outPackage>
+ </configuration>
+ </plugin>
+ </plugins>
+ </pluginManagement>
+
+ </build>
+
+ <reporting>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-api-component-maven-plugin</artifactId>
+ <version>${project.version}</version>
+ <configuration>
+ <scheme>${schemeName}</scheme>
+ <componentName>${componentName}</componentName>
+ <componentPackage>${componentPackage}</componentPackage>
+ <outPackage>${outPackage}</outPackage>
+ </configuration>
+ </plugin>
+ </plugins>
+ </reporting>
+
+</project>
http://git-wip-us.apache.org/repos/asf/camel/blob/b490a90c/components/camel-linkedin/camel-linkedin-component/src/main/java/org/apache/camel/component/linkedin/LinkedInComponent.java
----------------------------------------------------------------------
diff --git a/components/camel-linkedin/camel-linkedin-component/src/main/java/org/apache/camel/component/linkedin/LinkedInComponent.java b/components/camel-linkedin/camel-linkedin-component/src/main/java/org/apache/camel/component/linkedin/LinkedInComponent.java
new file mode 100644
index 0000000..4434f8c
--- /dev/null
+++ b/components/camel-linkedin/camel-linkedin-component/src/main/java/org/apache/camel/component/linkedin/LinkedInComponent.java
@@ -0,0 +1,106 @@
+/**
+ * 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;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.Endpoint;
+import org.apache.camel.component.linkedin.api.LinkedInOAuthRequestFilter;
+import org.apache.camel.component.linkedin.api.OAuthParams;
+import org.apache.camel.component.linkedin.internal.CachingOAuthSecureStorage;
+import org.apache.camel.component.linkedin.internal.LinkedInApiCollection;
+import org.apache.camel.component.linkedin.internal.LinkedInApiName;
+import org.apache.camel.spi.UriEndpoint;
+import org.apache.camel.util.component.AbstractApiComponent;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Represents the component that manages {@link LinkedInEndpoint}.
+ */
+@UriEndpoint(scheme = "linkedin", consumerClass = LinkedInConsumer.class, consumerPrefix = "consumer")
+public class LinkedInComponent extends AbstractApiComponent<LinkedInApiName, LinkedInConfiguration, LinkedInApiCollection> {
+
+ private static final Logger LOG = LoggerFactory.getLogger(LinkedInComponent.class);
+
+ private LinkedInOAuthRequestFilter requestFilter;
+
+ public LinkedInComponent() {
+ super(LinkedInEndpoint.class, LinkedInApiName.class, LinkedInApiCollection.getCollection());
+ }
+
+ public LinkedInComponent(CamelContext context) {
+ super(context, LinkedInEndpoint.class, LinkedInApiName.class, LinkedInApiCollection.getCollection());
+ }
+
+ @Override
+ protected LinkedInApiName getApiName(String apiNameStr) throws IllegalArgumentException {
+ return LinkedInApiName.fromValue(apiNameStr);
+ }
+
+ @Override
+ protected Endpoint createEndpoint(String uri, String methodName, LinkedInApiName apiName,
+ LinkedInConfiguration endpointConfiguration) {
+ return new LinkedInEndpoint(uri, this, apiName, methodName, endpointConfiguration);
+ }
+
+ public synchronized LinkedInOAuthRequestFilter getRequestFilter(LinkedInConfiguration endpointConfiguration) {
+ if (endpointConfiguration.equals(configuration)) {
+ if (requestFilter == null) {
+ requestFilter = createRequestFilter(this.configuration);
+ }
+ return requestFilter;
+ } else {
+ return createRequestFilter(endpointConfiguration);
+ }
+ }
+
+ private static LinkedInOAuthRequestFilter createRequestFilter(LinkedInConfiguration configuration) {
+ // validate configuration
+ configuration.validate();
+
+ return new LinkedInOAuthRequestFilter(getOAuthParams(configuration),
+ configuration.getHttpParams(), configuration.isLazyAuth());
+ }
+
+ private static OAuthParams getOAuthParams(LinkedInConfiguration configuration) {
+ return new OAuthParams(configuration.getUserName(), configuration.getUserPassword(),
+ new CachingOAuthSecureStorage(configuration.getSecureStorage()), configuration.getClientId(), configuration.getClientSecret(),
+ configuration.getRedirectUri(), configuration.getScopes());
+ }
+
+ @Override
+ protected void doStop() throws Exception {
+ if (requestFilter != null) {
+ closeLogException(requestFilter);
+ }
+ }
+
+ protected void closeRequestFilter(LinkedInOAuthRequestFilter requestFilter) {
+ // only close if not a shared filter
+ if (this.requestFilter != requestFilter) {
+ closeLogException(requestFilter);
+ }
+ }
+
+ private void closeLogException(LinkedInOAuthRequestFilter requestFilter) {
+ try {
+ requestFilter.close();
+ } catch (Exception e) {
+ LOG.warn("Error closing OAuth2 request filter: " + e.getMessage(), e);
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/camel/blob/b490a90c/components/camel-linkedin/camel-linkedin-component/src/main/java/org/apache/camel/component/linkedin/LinkedInConfiguration.java
----------------------------------------------------------------------
diff --git a/components/camel-linkedin/camel-linkedin-component/src/main/java/org/apache/camel/component/linkedin/LinkedInConfiguration.java b/components/camel-linkedin/camel-linkedin-component/src/main/java/org/apache/camel/component/linkedin/LinkedInConfiguration.java
new file mode 100644
index 0000000..8dd9fa1
--- /dev/null
+++ b/components/camel-linkedin/camel-linkedin-component/src/main/java/org/apache/camel/component/linkedin/LinkedInConfiguration.java
@@ -0,0 +1,155 @@
+/**
+ * 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;
+
+import java.util.Arrays;
+import java.util.Map;
+
+import org.apache.camel.component.linkedin.api.OAuthScope;
+import org.apache.camel.component.linkedin.api.OAuthSecureStorage;
+import org.apache.camel.spi.UriParams;
+import org.apache.camel.util.ObjectHelper;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
+
+/**
+ * Component configuration for LinkedIn component.
+ */
+@UriParams
+public class LinkedInConfiguration {
+
+ private String userName;
+ private String userPassword;
+
+ private OAuthSecureStorage secureStorage;
+
+ private String clientId;
+ private String clientSecret;
+
+ private OAuthScope[] scopes;
+ private String redirectUri;
+
+
+ private Map<String, Object> httpParams;
+
+ private boolean lazyAuth = true;
+
+ public String getUserName() {
+ return userName;
+ }
+
+ public void setUserName(String userName) {
+ this.userName = userName;
+ }
+
+ public String getUserPassword() {
+ return userPassword;
+ }
+
+ public void setUserPassword(String userPassword) {
+ this.userPassword = userPassword;
+ }
+
+ public OAuthSecureStorage getSecureStorage() {
+ return secureStorage;
+ }
+
+ public void setSecureStorage(OAuthSecureStorage secureStorage) {
+ this.secureStorage = secureStorage;
+ }
+
+ public String getClientId() {
+ return clientId;
+ }
+
+ public void setClientId(String clientId) {
+ this.clientId = clientId;
+ }
+
+ public String getClientSecret() {
+ return clientSecret;
+ }
+
+ public void setClientSecret(String clientSecret) {
+ this.clientSecret = clientSecret;
+ }
+
+ public OAuthScope[] getScopes() {
+ return scopes;
+ }
+
+ public void setScopes(OAuthScope[] scopes) {
+ this.scopes = scopes;
+ }
+
+ public String getRedirectUri() {
+ return redirectUri;
+ }
+
+ public void setRedirectUri(String redirectUri) {
+ this.redirectUri = redirectUri;
+ }
+
+ public Map<String, Object> getHttpParams() {
+ return httpParams;
+ }
+
+ public void setHttpParams(Map<String, Object> httpParams) {
+ this.httpParams = httpParams;
+ }
+
+ public boolean isLazyAuth() {
+ return lazyAuth;
+ }
+
+ public void setLazyAuth(boolean lazyAuth) {
+ this.lazyAuth = lazyAuth;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof LinkedInConfiguration) {
+ final LinkedInConfiguration other = (LinkedInConfiguration) obj;
+ return (userName == null ? other.userName == null : userName.equals(other.userName))
+ && (userPassword == null ? other.userPassword == null : userPassword.equals(other.userPassword))
+ && secureStorage == other.secureStorage
+ && (clientId == null ? other.clientId == null : clientId.equals(other.clientId))
+ && (clientSecret == null ? other.clientSecret == null : clientSecret.equals(other.clientSecret))
+ && (redirectUri == null ? other.redirectUri == null : redirectUri.equals(other.redirectUri))
+ && Arrays.equals(scopes, other.scopes)
+ && (httpParams == null ? other.httpParams == null : httpParams.equals(other.httpParams))
+ && (lazyAuth == other.lazyAuth);
+ }
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ return new HashCodeBuilder().append(userName).append(userPassword).append(secureStorage)
+ .append(clientId).append(clientSecret)
+ .append(redirectUri).append(scopes).append(httpParams).append(lazyAuth).toHashCode();
+ }
+
+ public void validate() throws IllegalArgumentException {
+ ObjectHelper.notEmpty(userName, "userName");
+ if (ObjectHelper.isEmpty(userPassword) && secureStorage == null) {
+ throw new IllegalArgumentException("Property userPassword or secureStorage is required");
+ }
+ ObjectHelper.notEmpty(clientId, "clientId");
+ ObjectHelper.notEmpty(clientSecret, "clientSecret");
+ ObjectHelper.notEmpty(redirectUri, "redirectUri");
+ }
+}