You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ni...@apache.org on 2013/09/01 09:48:19 UTC
[2/4] CAMEL-6676 Added camel-facebook component with thanks for Dhiraj
http://git-wip-us.apache.org/repos/asf/camel/blob/1c293408/components/camel-facebook/src/main/java/org/apache/camel/component/facebook/data/FacebookMethodsType.java
----------------------------------------------------------------------
diff --git a/components/camel-facebook/src/main/java/org/apache/camel/component/facebook/data/FacebookMethodsType.java b/components/camel-facebook/src/main/java/org/apache/camel/component/facebook/data/FacebookMethodsType.java
new file mode 100644
index 0000000..02ef2fd
--- /dev/null
+++ b/components/camel-facebook/src/main/java/org/apache/camel/component/facebook/data/FacebookMethodsType.java
@@ -0,0 +1,572 @@
+/**
+ * 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.facebook.data;
+
+import java.lang.reflect.Method;
+import java.net.URL;
+import java.util.*;
+import org.apache.camel.component.facebook.FacebookConstants;
+
+import facebook4j.*;
+import facebook4j.internal.org.json.JSONArray;
+
+/**
+ * Enum for Facebook4J *Method interfaces.
+ * The methods are ordered by the number and nature of arguments.
+ */
+public enum FacebookMethodsType {
+
+ // AccountMethods
+ GET_ACCOUNTS(ResponseList.class, "getAccounts"),
+ GET_ACCOUNTS_WITH_OPTIONS(ResponseList.class, "getAccounts", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GET_ACCOUNTS_WITH_ID(ResponseList.class, "getAccounts", String.class, "userId"),
+ GET_ACCOUNTS_WITH_ID_OPTIONS(ResponseList.class, "getAccounts", String.class, "userId", Reading.class, FacebookConstants.READING_PPROPERTY),
+
+ // ActivityMethods
+ GETACTIVITIES(ResponseList.class, "getActivities"),
+ GETACTIVITIES_WITH_OPTIONS(ResponseList.class, "getActivities", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETACTIVITIES_WITH_ID(ResponseList.class, "getActivities", String.class, "userId"),
+ GETACTIVITIES_WITH_ID_OPTIONS(ResponseList.class, "getActivities", String.class, "userId", Reading.class, FacebookConstants.READING_PPROPERTY),
+
+ // AlbumMethods
+ ADDALBUMPHOTO(String.class, "addAlbumPhoto", String.class, "albumId", Media.class, "source"),
+ ADDALBUMPHOTO_WITH_MEDIA(String.class, "addAlbumPhoto", String.class, "albumId", Media.class, "source", String.class, "message"),
+ COMMENTALBUM(String.class, "commentAlbum", String.class, "albumId", String.class, "message"),
+ CREATEALBUM(String.class, "createAlbum", AlbumCreate.class, "albumCreate"),
+ CREATEALBUM_WITH_ID(String.class, "createAlbum", String.class, "userId", AlbumCreate.class, "albumCreate"),
+ GETALBUM(Album.class, "getAlbum", String.class, "albumId"),
+ GETALBUM_WITH_OPTIONS(Album.class, "getAlbum", String.class, "albumId", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETALBUMCOMMENTS(ResponseList.class, "getAlbumComments", String.class, "albumId"),
+ GETALBUMCOMMENTS_WITH_OPTIONS(ResponseList.class, "getAlbumComments", String.class, "albumId", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETALBUMCOVERPHOTO(URL.class, "getAlbumCoverPhoto", String.class, "albumId"),
+ GETALBUMLIKES(ResponseList.class, "getAlbumLikes", String.class, "albumId"),
+ GETALBUMLIKES_WITH_OPTIONS(ResponseList.class, "getAlbumLikes", String.class, "albumId", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETALBUMPHOTOS(ResponseList.class, "getAlbumPhotos", String.class, "albumId"),
+ GETALBUMPHOTOS_WITH_OPTIONS(ResponseList.class, "getAlbumPhotos", String.class, "albumId", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETALBUMS(ResponseList.class, "getAlbums"),
+ GETALBUMS_WITH_OPTIONS(ResponseList.class, "getAlbums", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETALBUMS_WITH_ID(ResponseList.class, "getAlbums", String.class, "userId"),
+ GETALBUMS_WITH_ID_OPTIONS(ResponseList.class, "getAlbums", String.class, "userId", Reading.class, FacebookConstants.READING_PPROPERTY),
+ LIKEALBUM(boolean.class, "likeAlbum", String.class, "albumId"),
+ UNLIKEALBUM(boolean.class, "unlikeAlbum", String.class, "albumId"),
+
+ // CheckinMethods
+ CHECKIN(String.class, "checkin", CheckinCreate.class, "checkinCreate"),
+ CHECKIN_WITH_ID(String.class, "checkin", String.class, "userId", CheckinCreate.class, "checkinCreate"),
+ COMMENTCHECKIN(String.class, "commentCheckin", String.class, "checkinId", String.class, "message"),
+ GETCHECKIN(Checkin.class, "getCheckin", String.class, "checkinId"),
+ GETCHECKIN_WITH_OPTIONS(Checkin.class, "getCheckin", String.class, "checkinId", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETCHECKINCOMMENTS(ResponseList.class, "getCheckinComments", String.class, "checkinId"),
+ GETCHECKINCOMMENTS_WITH_OPTIONS(ResponseList.class, "getCheckinComments", String.class, "checkinId", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETCHECKINLIKES(ResponseList.class, "getCheckinLikes", String.class, "checkinId"),
+ GETCHECKINLIKES_WITH_OPTIONS(ResponseList.class, "getCheckinLikes", String.class, "checkinId", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETCHECKINS(ResponseList.class, "getCheckins"),
+ GETCHECKINS_WITH_OPTIONS(ResponseList.class, "getCheckins", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETCHECKINS_WITH_ID(ResponseList.class, "getCheckins", String.class, "userId"),
+ GETCHECKINS_WITH_ID_OPTIONS(ResponseList.class, "getCheckins", String.class, "userId", Reading.class, FacebookConstants.READING_PPROPERTY),
+ LIKECHECKIN(boolean.class, "likeCheckin", String.class, "checkinId"),
+ UNLIKECHECKIN(boolean.class, "unlikeCheckin", String.class, "checkinId"),
+
+ // CommentMethods
+ DELETECOMMENT(boolean.class, "deleteComment", String.class, "commentId"),
+ GETCOMMENT(Comment.class, "getComment", String.class, "commentId"),
+ GETCOMMENTLIKES(ResponseList.class, "getCommentLikes", String.class, "commentId"),
+ GETCOMMENTLIKES_WITH_OPTIONS(ResponseList.class, "getCommentLikes", String.class, "commentId", Reading.class, FacebookConstants.READING_PPROPERTY),
+ LIKECOMMENT(boolean.class, "likeComment", String.class, "commentId"),
+ UNLIKECOMMENT(Boolean.class, "unlikeComment", String.class, "commentId"),
+
+ // DomainMethods
+ GETDOMAIN(Domain.class, "getDomain", String.class, "domainId"),
+ GETDOMAINBYNAME(Domain.class, "getDomainByName", String.class, "domainName"),
+ GETDOMAINSBYNAME_WITH_DOMAINS(List.class, "getDomainsByName", new String[0].getClass(), "domainNames"),
+
+ // EventMethods
+ CREATEEVENT(String.class, "createEvent", EventUpdate.class, "eventUpdate"),
+ CREATEEVENT_WITH_ID(String.class, "createEvent", String.class, "userId", EventUpdate.class, "eventUpdate"),
+ DELETEEVENT(Boolean.class, "deleteEvent", String.class, "eventId"),
+ DELETEEVENTPICTURE(Boolean.class, "deleteEventPicture", String.class, "eventId"),
+ EDITEVENT(Boolean.class, "editEvent", String.class, "eventId", EventUpdate.class, "eventUpdate"),
+ GETEVENT(Event.class, "getEvent", String.class, "eventId"),
+ GETEVENT_WITH_OPTIONS(Event.class, "getEvent", String.class, "eventId", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETEVENTFEED(ResponseList.class, "getEventFeed", String.class, "eventId"),
+ GETEVENTFEED_WITH_OPTIONS(ResponseList.class, "getEventFeed", String.class, "eventId", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETEVENTPHOTOS(ResponseList.class, "getEventPhotos", String.class, "eventId"),
+ GETEVENTPHOTOS_WITH_OPTIONS(ResponseList.class, "getEventPhotos", String.class, "eventId", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETEVENTPICTUREURL(URL.class, "getEventPictureURL", String.class, "eventId"),
+ GETEVENTPICTUREURL_WITH_PICTURESIZE(URL.class, "getEventPictureURL", String.class, "eventId", PictureSize.class, "size"),
+ GETEVENTS(ResponseList.class, "getEvents"),
+ GETEVENTS_WITH_OPTIONS(ResponseList.class, "getEvents", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETEVENTS_WITH_ID(ResponseList.class, "getEvents", String.class, "userId"),
+ GETEVENTS_WITH_ID_OPTIONS(ResponseList.class, "getEvents", String.class, "userId", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETEVENTVIDEOS(ResponseList.class, "getEventVideos", String.class, "eventId"),
+ GETEVENTVIDEOS_WITH_OPTIONS(ResponseList.class, "getEventVideos", String.class, "eventId", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETRSVPSTATUSASINVITED(ResponseList.class, "getRSVPStatusAsInvited", String.class, "eventId"),
+ GETRSVPSTATUSASINVITED_WITH_ID(ResponseList.class, "getRSVPStatusAsInvited", String.class, "eventId", String.class, "userId"),
+ GETRSVPSTATUSASNOREPLY(ResponseList.class, "getRSVPStatusAsNoreply", String.class, "eventId"),
+ GETRSVPSTATUSASNOREPLY_WITH_ID(ResponseList.class, "getRSVPStatusAsNoreply", String.class, "eventId", String.class, "userId"),
+ GETRSVPSTATUSINATTENDING(ResponseList.class, "getRSVPStatusInAttending", String.class, "eventId"),
+ GETRSVPSTATUSINATTENDING_WITH_ID(ResponseList.class, "getRSVPStatusInAttending", String.class, "eventId", String.class, "userId"),
+ GETRSVPSTATUSINDECLINED(ResponseList.class, "getRSVPStatusInDeclined", String.class, "eventId"),
+ GETRSVPSTATUSINDECLINED_WITH_ID(ResponseList.class, "getRSVPStatusInDeclined", String.class, "eventId", String.class, "userId"),
+ GETRSVPSTATUSINMAYBE(ResponseList.class, "getRSVPStatusInMaybe", String.class, "eventId"),
+ GETRSVPSTATUSINMAYBE_WITH_ID(ResponseList.class, "getRSVPStatusInMaybe", String.class, "eventId", String.class, "userId"),
+ INVITETOEVENT(Boolean.class, "inviteToEvent", String.class, "eventId", String.class, "userId"),
+ INVITETOEVENT_WITH_IDS(Boolean.class, "inviteToEvent", String.class, "eventId", new String[0].getClass(), "userIds"),
+ POSTEVENTFEED_WITH_POSTUPDATE(String.class, "postEventFeed", String.class, "eventId", PostUpdate.class, "postUpdate"),
+ POSTEVENTLINK_WITH_LINK(String.class, "postEventLink", String.class, "eventId", URL.class , "link"),
+ POSTEVENTLINK_WITH_LINK_MSG(String.class, "postEventLink", String.class, "eventId", URL.class , "link", String.class, "message"),
+ POSTEVENTPHOTO_WITH_MEDIA(String.class, "postEventPhoto", String.class, "eventId", Media.class, "source"),
+ POSTEVENTPHOTO_WITH_MEDIA_MSG(String.class, "postEventPhoto", String.class, "eventId", Media.class, "source", String.class, "message"),
+ POSTEVENTSTATUSMESSAGE_WITH_MSG(String.class, "postEventStatusMessage", String.class, "eventId", String.class, "message"),
+ POSTEVENTVIDEO_WITH_MEDIA(String.class, "postEventVideo", String.class, "eventId", Media.class, "source"),
+ POSTEVENTVIDEO_WITH_MEDIA_TITLE_DESC(String.class, "postEventVideo", String.class, "eventId", Media.class, "source", String.class, "title", String.class, "description"),
+ RSVPEVENTASATTENDING(Boolean.class, "rsvpEventAsAttending", String.class, "eventId"),
+ RSVPEVENTASDECLINED(Boolean.class, "rsvpEventAsDeclined", String.class, "eventId"),
+ RSVPEVENTASMAYBE(Boolean.class, "rsvpEventAsMaybe", String.class, "eventId"),
+ UNINVITEFROMEVENT(Boolean.class, "uninviteFromEvent", String.class, "eventId", String.class, "userId"),
+ UPDATEEVENTPICTURE(Boolean.class, "updateEventPicture", String.class, "eventId", Media.class, "source"),
+
+ // FamilyMethods
+ GETFAMILY(ResponseList.class, "getFamily"),
+ GETFAMILY_WITH_OPTIONS(ResponseList.class, "getFamily", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETFAMILY_WITH_ID(ResponseList.class, "getFamily", String.class, "userId"),
+ GETFAMILY_WITH_ID_OPTIONS(ResponseList.class, "getFamily", String.class, "userId", Reading.class, FacebookConstants.READING_PPROPERTY),
+
+ // FavouriteMethods
+ GETBOOKS(ResponseList.class, "getBooks"),
+ GETBOOKS_WITH_OPTIONS(ResponseList.class, "getBooks", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETBOOKS_WITH_ID(ResponseList.class, "getBooks", String.class, "userId"),
+ GETBOOKS_WITH_ID_OPTIONS(ResponseList.class, "getBooks", String.class, "userId", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETGAMES(ResponseList.class, "getGames"),
+ GETGAMES_WITH_OPTIONS(ResponseList.class, "getGames", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETGAMES_WITH_ID(ResponseList.class, "getGames", String.class, "userId"),
+ GETGAMES_WITH_ID_OPTIONS(ResponseList.class, "getGames", String.class, "userId", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETINTERESTS(ResponseList.class, "getInterests"),
+ GETINTERESTS_WITH_OPTIONS(ResponseList.class, "getInterests", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETINTERESTS_WITH_ID(ResponseList.class, "getInterests", String.class, "userId"),
+ GETINTERESTS_WITH_ID_OPTIONS(ResponseList.class, "getInterests", String.class, "userId", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETMOVIES(ResponseList.class, "getMovies"),
+ GETMOVIES_WITH_OPTIONS(ResponseList.class, "getMovies", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETMOVIES_WITH_ID(ResponseList.class, "getMovies", String.class, "userId"),
+ GETMOVIES_WITH_ID_OPTIONS(ResponseList.class, "getMovies", String.class, "userId", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETMUSIC(ResponseList.class, "getMusic"),
+ GETMUSIC_WITH_OPTIONS(ResponseList.class, "getMusic", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETMUSIC_WITH_ID(ResponseList.class, "getMusic", String.class, "userId"),
+ GETMUSIC_WITH_ID_OPTIONS(ResponseList.class, "getMusic", String.class, "userId", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETTELEVISION(ResponseList.class, "getTelevision"),
+ GETTELEVISION_WITH_OPTIONS(ResponseList.class, "getTelevision", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETTELEVISION_WITH_ID(ResponseList.class, "getTelevision", String.class, "userId"),
+ GETTELEVISION_WITH_ID_OPTIONS(ResponseList.class, "getTelevision", String.class, "userId", Reading.class, FacebookConstants.READING_PPROPERTY),
+
+ // FQLMethods
+ EXECUTEFQL(JSONArray.class, "executeFQL", String.class, "query"),
+ EXECUTEFQL_WITH_LOCALE(JSONArray.class, "executeFQL", String.class, "query", Locale.class, " locale"),
+ EXECUTEMULTIFQL(Map.class, "executeMultiFQL", Map.class, "queries"),
+ EXECUTEMULTIFQL_WITH_LOCALE(Map.class, "executeMultiFQL", Map.class, "queries", Locale.class, "locale"),
+
+ // FriendMethods
+ ADDFRIENDLISTMEMBER(Boolean.class, "addFriendlistMember", String.class, "friendlistId", String.class, "userId"),
+ CREATEFRIENDLIST(String.class, "createFriendlist", String.class, "friendlistName"),
+ CREATEFRIENDLIST_WITH_ID(String.class, "createFriendlist", String.class, "userId", String.class, "friendlistName"),
+ DELETEFRIENDLIST(Boolean.class, "deleteFriendlist", String.class, "friendlistId"),
+ GETBELONGSFRIEND(ResponseList.class, "getBelongsFriend", String.class, "friendId"),
+ GETBELONGSFRIEND_WITH_OPTIONS(ResponseList.class, "getBelongsFriend", String.class, "friendId", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETBELONGSFRIEND_WITH_ID(ResponseList.class, "getBelongsFriend", String.class, "userId", String.class, "friendId"),
+ GETBELONGSFRIEND_WITH_ID_OPTIONS(ResponseList.class, "getBelongsFriend", String.class, "userId", String.class, "friendId", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETFRIENDLIST(Friendlist.class, "getFriendlist", String.class, "friendlistId"),
+ GETFRIENDLIST_WITH_OPTIONS(Friendlist.class, "getFriendlist", String.class, "friendlistId", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETFRIENDLISTMEMBERS(ResponseList.class, "getFriendlistMembers", String.class, "friendlistId"),
+ GETFRIENDLISTS(ResponseList.class, "getFriendlists"),
+ GETFRIENDLISTS_WITH_OPTIONS(ResponseList.class, "getFriendlists", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETFRIENDLISTS_WITH_ID(ResponseList.class, "getFriendlists", String.class, "userId"),
+ GETFRIENDLISTS_WITH_ID_OPTIONS(ResponseList.class, "getFriendlists", String.class, "userId", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETFRIENDREQUESTS(ResponseList.class, "getFriendRequests"),
+ GETFRIENDREQUESTS_WITH_OPTIONS(ResponseList.class, "getFriendRequests", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETFRIENDREQUESTS_WITH_ID(ResponseList.class, "getFriendRequests", String.class, "userId"),
+ GETFRIENDREQUESTS_WITH_ID_OPTIONS(ResponseList.class, "getFriendRequests", String.class, "userId", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETFRIENDS(ResponseList.class, "getFriends"),
+ GETFRIENDS_WITH_OPTIONS(ResponseList.class, "getFriends", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETFRIENDS_WITH_ID(ResponseList.class, "getFriends", String.class, "userId"),
+ GETFRIENDS_WITH_ID_OPTIONS(ResponseList.class, "getFriends", String.class, "userId", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETMUTUALFRIENDS(ResponseList.class, "getMutualFriends", String.class, "friendUserId"),
+ GETMUTUALFRIENDS_WITH_OPTIONS(ResponseList.class, "getMutualFriends", String.class, "friendUserId", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETMUTUALFRIENDS_WITH_ID(ResponseList.class, "getMutualFriends", String.class, "userId1", String.class, "userId2"),
+ GETMUTUALFRIENDS_WITH_ID_OPTIONS(ResponseList.class, "getMutualFriends", String.class, "userId1", String.class, "userId2", Reading.class, FacebookConstants.READING_PPROPERTY),
+ REMOVEFRIENDLISTMEMBER(Boolean.class, "removeFriendlistMember", String.class, "friendlistId", String.class, "userId"),
+
+ // GameMethods
+ DELETEACHIEVEMENT(Boolean.class, "deleteAchievement", URL.class, "achievementURL"),
+ DELETEACHIEVEMENT_WITH_ID(Boolean.class, "deleteAchievement", String.class, "userId", URL.class , "achievementURL"),
+ DELETESCORE(Boolean.class, "deleteScore"),
+ DELETESCORE_WITH_ID(Boolean.class, "deleteScore", String.class, "userId"),
+ GETACHIEVEMENTS(ResponseList.class, "getAchievements"),
+ GETACHIEVEMENTS_WITH_OPTIONS(ResponseList.class, "getAchievements", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETACHIEVEMENTS_WITH_ID(ResponseList.class, "getAchievements", String.class, "userId"),
+ GETACHIEVEMENTS_WITH_ID_OPTIONS(ResponseList.class, "getAchievements", String.class, "userId", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETSCORES(ResponseList.class, "getScores"),
+ GETSCORES_WITH_OPTIONS(ResponseList.class, "getScores", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETSCORES_WITH_ID(ResponseList.class, "getScores", String.class, "userId"),
+ GETSCORES_WITH_ID_OPTIONS(ResponseList.class, "getScores", String.class, "userId", Reading.class, FacebookConstants.READING_PPROPERTY),
+ POSTACHIEVEMENT(String.class, "postAchievement", URL.class, "achievementURL"),
+ POSTACHIEVEMENT_WITH_ID(String.class, "postAchievement", String.class, "userId", URL.class, "achievementURL"),
+ POSTSCORE(Boolean.class, "postScore", int.class, "scoreValue"),
+ POSTSCORE_WITH_ID(Boolean.class, "postScore", String.class, "userId", int.class, "scoreValue"),
+
+ // GroupMethods
+ GETGROUP(Group.class, "getGroup", String.class, "groupId"),
+ GETGROUP_WITH_OPTIONS(Group.class, "getGroup", String.class, "groupId", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETGROUPDOCS(ResponseList.class, "getGroupDocs", String.class, "groupId"),
+ GETGROUPDOCS_WITH_OPTIONS(ResponseList.class, "getGroupDocs", String.class, "groupId", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETGROUPFEED(ResponseList.class, "getGroupFeed", String.class, "groupId"),
+ GETGROUPFEED_WITH_OPTIONS(ResponseList.class, "getGroupFeed", String.class, "groupId", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETGROUPMEMBERS(ResponseList.class, "getGroupMembers", String.class, "groupId"),
+ GETGROUPMEMBERS_WITH_OPTIONS(ResponseList.class, "getGroupMembers", String.class, "groupId", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETGROUPPICTUREURL(URL.class, "getGroupPictureURL", String.class, "groupId"),
+ GETGROUPS(ResponseList.class, "getGroups"),
+ GETGROUPS_WITH_OPTIONS(ResponseList.class, "getGroups", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETGROUPS_WITH_ID(ResponseList.class, "getGroups", String.class, "userId"),
+ GETGROUPS_WITH_ID_OPTIONS(ResponseList.class, "getGroups", String.class, "userId", Reading.class, FacebookConstants.READING_PPROPERTY),
+ POSTGROUPFEED_WITH_POSTUPDATE(String.class, "postGroupFeed", String.class, "groupId", PostUpdate.class, "postUpdate"),
+ POSTGROUPLINK_WITH_LINK(String.class, "postGroupLink", String.class, "groupId", URL.class, "link"),
+ POSTGROUPLINK_WITH_LINK_MSG(String.class, "postGroupLink", String.class, "groupId", URL.class, "link", String.class, "message"),
+ POSTGROUPSTATUSMESSAGE(String.class, "postGroupStatusMessage", String.class, "groupId", String.class, "message"),
+
+ // InsightMethods
+ GETINSIGHTS(ResponseList.class, "getInsights", String.class, "objectId", String.class, "metric"),
+ GETINSIGHTS_WITH_OPTIONS(ResponseList.class, "getInsights", String.class, "objectId", String.class, "metric", Reading.class, FacebookConstants.READING_PPROPERTY),
+
+ // LikeMethods
+ GETUSERLIKES(ResponseList.class, "getUserLikes"),
+ GETUSERLIKES_WITH_OPTIONS(ResponseList.class, "getUserLikes", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETUSERLIKES_WITH_ID(ResponseList.class, "getUserLikes", String.class, "userId"),
+ GETUSERLIKES_WITH_ID_OPTIONS(ResponseList.class, "getUserLikes", String.class, "userId", Reading.class, FacebookConstants.READING_PPROPERTY),
+
+ // LinkMethods
+ COMMENTLINK(String.class, "commentLink", String.class, "linkId", String.class, "message"),
+ GETLINK(Link.class, "getLink", String.class, "linkId"),
+ GETLINK_WITH_OPTIONS(Link.class, "getLink", String.class, "linkId", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETLINKCOMMENTS(ResponseList.class, "getLinkComments", String.class, "linkId"),
+ GETLINKCOMMENTS_WITH_OPTIONS(ResponseList.class, "getLinkComments", String.class, "linkId", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETLINKLIKES(ResponseList.class, "getLinkLikes", String.class, "linkId"),
+ GETLINKLIKES_WITH_OPTIONS(ResponseList.class, "getLinkLikes", String.class, "linkId", Reading.class, FacebookConstants.READING_PPROPERTY),
+ LIKELINK(Boolean.class, "likeLink", String.class, "linkId"),
+ UNLIKELINK(Boolean.class, "unlikeLink", String.class, "linkId"),
+
+ // LocationMethods
+ GETLOCATIONS(ResponseList.class, "getLocations"),
+ GETLOCATIONS_WITH_OPTIONS(ResponseList.class, "getLocations", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETLOCATIONS_WITH_ID(ResponseList.class, "getLocations", String.class, "userId"),
+ GETLOCATIONS_WITH_ID_OPTIONS(ResponseList.class, "getLocations", String.class, "userId", Reading.class, FacebookConstants.READING_PPROPERTY),
+
+ // MessageMethods
+ GETINBOX(InboxResponseList.class, "getInbox"),
+ GETINBOX_WITH_OPTIONS(InboxResponseList.class, "getInbox", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETINBOX_WITH_ID(InboxResponseList.class, "getInbox", String.class, "userId"),
+ GETINBOX_WITH_ID_OPTIONS(InboxResponseList.class, "getInbox", String.class, "userId", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETMESSAGE(Message.class, "getMessage", String.class, "messageId"),
+ GETMESSAGE_WITH_OPTIONS(Message.class, "getMessage", String.class, "messageId", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETOUTBOX(ResponseList.class, "getOutbox"),
+ GETOUTBOX_WITH_OPTIONS(ResponseList.class, "getOutbox", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETOUTBOX_WITH_ID(ResponseList.class, "getOutbox", String.class, "userId"),
+ GETOUTBOX_WITH_ID_OPTIONS(ResponseList.class, "getOutbox", String.class, "userId", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETUPDATES(ResponseList.class, "getUpdates"),
+ GETUPDATES_WITH_OPTIONS(ResponseList.class, "getUpdates", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETUPDATES_WITH_ID(ResponseList.class, "getUpdates", String.class, "userId"),
+ GETUPDATES_WITH_ID_OPTIONS(ResponseList.class, "getUpdates", String.class, "userId", Reading.class, FacebookConstants.READING_PPROPERTY),
+
+ // NoteMethods
+ COMMENTNOTE(String.class, "commentNote", String.class, "noteId", String.class, "message"),
+ CREATENOTE(String.class, "createNote", String.class, "subject", String.class, "message"),
+ CREATENOTE_WITH_ID_MSG(String.class, "createNote", String.class, "userId", String.class, "subject", String.class, "message"),
+ GETNOTE(Note.class, "getNote", String.class, "noteId"),
+ GETNOTE_WITH_OPTIONS(Note.class, "getNote", String.class, "noteId", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETNOTECOMMENTS(ResponseList.class, "getNoteComments", String.class, "noteId"),
+ GETNOTECOMMENTS_WITH_OPTIONS(ResponseList.class, "getNoteComments", String.class, "noteId", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETNOTELIKES(ResponseList.class, "getNoteLikes", String.class, "noteId"),
+ GETNOTELIKES_WITH_OPTIONS(ResponseList.class, "getNoteLikes", String.class, "noteId", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETNOTES(ResponseList.class, "getNotes"),
+ GETNOTES_WITH_OPTIONS(ResponseList.class, "getNotes", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETNOTES_WITH_ID(ResponseList.class, "getNotes", String.class, "userId"),
+ GETNOTES_WITH_ID_OPTIONS(ResponseList.class, "getNotes", String.class, "userId", Reading.class, FacebookConstants.READING_PPROPERTY),
+ LIKENOTE(Boolean.class, "likeNote", String.class, "noteId"),
+ UNLIKENOTE(Boolean.class, "unlikeNote", String.class, "noteId"),
+
+ // NotificationMethods
+ GETNOTIFICATIONS(ResponseList.class, "getNotifications"),
+ GETNOTIFICATIONS_WITH_INCLUDEREAD(ResponseList.class, "getNotifications", boolean.class, "includeRead"),
+ GETNOTIFICATIONS_WITH_OPTIONS(ResponseList.class, "getNotifications", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETNOTIFICATIONS_WITH_OPTIONS_INCLUDEREAD(ResponseList.class, "getNotifications", Reading.class, FacebookConstants.READING_PPROPERTY, boolean.class, "includeRead"),
+ GETNOTIFICATIONS_WITH_ID(ResponseList.class, "getNotifications", String.class, "userId"),
+ GETNOTIFICATIONS_WITH_ID_INCLUDEREAD(ResponseList.class, "getNotifications", String.class, "userId", boolean.class, "includeRead"),
+ GETNOTIFICATIONS_WITH_ID_OPTIONS(ResponseList.class, "getNotifications", String.class, "userId", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETNOTIFICATIONS_WITH_ID_OPTIONS_INCLUDEREAD(ResponseList.class, "getNotifications", String.class, "userId", Reading.class, FacebookConstants.READING_PPROPERTY, boolean.class, "includeRead"),
+ MARKNOTIFICATIONASREAD(Boolean.class, "markNotificationAsRead", String.class, "notificationId"),
+
+ // PermissionMethods
+ GETPERMISSIONS(List.class, "getPermissions"),
+ GETPERMISSIONS_WITH_ID(List.class, "getPermissions", String.class, "userId"),
+ REVOKEPERMISSION(Boolean.class, "revokePermission", String.class, "permissionName"),
+ REVOKEPERMISSION_WITH_ID(Boolean.class, "revokePermission", String.class, "userId", String.class, "permissionName"),
+
+ // PhotoMethods
+ ADDTAGTOPHOTO(Boolean.class, "addTagToPhoto", String.class, "photoId", String.class, "toUserId"),
+ ADDTAGTOPHOTO_WITH_IDS(Boolean.class, "addTagToPhoto", String.class, "photoId", List.class, "toUserIds"),
+ ADDTAGTOPHOTO_WITH_TAGUPDATE(Boolean.class, "addTagToPhoto", String.class, "photoId", TagUpdate.class, "tagUpdate"),
+ COMMENTPHOTO(String.class, "commentPhoto", String.class, "photoId", String.class, "message"),
+ DELETEPHOTO(Boolean.class, "deletePhoto", String.class, "photoId"),
+ GETPHOTO(Photo.class, "getPhoto", String.class, "photoId"),
+ GETPHOTO_WITH_OPTIONS(Photo.class, "getPhoto", String.class, "photoId", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETPHOTOCOMMENTS(ResponseList.class, "getPhotoComments", String.class, "photoId"),
+ GETPHOTOCOMMENTS_WITH_OPTIONS(ResponseList.class, "getPhotoComments", String.class, "photoId", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETPHOTOLIKES(ResponseList.class, "getPhotoLikes", String.class, "photoId"),
+ GETPHOTOLIKES_WITH_OPTIONS(ResponseList.class, "getPhotoLikes", String.class, "photoId", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETPHOTOS(ResponseList.class, "getPhotos"),
+ GETPHOTOS_WITH_OPTIONS(ResponseList.class, "getPhotos", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETPHOTOS_WITH_ID(ResponseList.class, "getPhotos", String.class, "userId"),
+ GETPHOTOS_WITH_ID_OPTIONS(ResponseList.class, "getPhotos", String.class, "userId", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETPHOTOURL(URL.class, "getPhotoURL", String.class, "photoId"),
+ GETTAGSONPHOTO(ResponseList.class, "getTagsOnPhoto", String.class, "photoId"),
+ GETTAGSONPHOTO_WITH_OPTIONS(ResponseList.class, "getTagsOnPhoto", String.class, "photoId", Reading.class, FacebookConstants.READING_PPROPERTY),
+ LIKEPHOTO(Boolean.class, "likePhoto", String.class, "photoId"),
+ POSTPHOTO(String.class, "postPhoto", Media.class, "source"),
+ POSTPHOTO_WITH_MSG(String.class, "postPhoto", Media.class, "source", String.class, "message", String.class, "place", boolean.class, "noStory"),
+ POSTPHOTO_WITH_MEDIA(String.class, "postPhoto", String.class, "userId", Media.class, "source"),
+ POSTPHOTO_WITH_MEDIA_MSG(String.class, "postPhoto", String.class, "userId", Media.class, "source", String.class, "message", String.class, "place", boolean.class, "noStory"),
+ UNLIKEPHOTO(Boolean.class, "unlikePhoto", String.class, "photoId"),
+ UPDATETAGONPHOTO(Boolean.class, "updateTagOnPhoto", String.class, "photoId", String.class, "toUserId"),
+ UPDATETAGONPHOTO_WITH_TAGUPDATE(Boolean.class, "updateTagOnPhoto", String.class, "photoId", TagUpdate.class, "tagUpdate"),
+
+ // PokeMethods
+ GETPOKES(ResponseList.class, "getPokes"),
+ GETPOKES_WITH_OPTIONS(ResponseList.class, "getPokes", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETPOKES_WITH_ID(ResponseList.class, "getPokes", String.class, "userId"),
+ GETPOKES_WITH_ID_OPTIONS(ResponseList.class, "getPokes", String.class, "userId", Reading.class, FacebookConstants.READING_PPROPERTY),
+
+ // PostMethods
+ COMMENTPOST(String.class, "commentPost", String.class, "postId", String.class, "message"),
+ DELETEPOST(Boolean.class, "deletePost", String.class, "postId"),
+ GETFEED(ResponseList.class, "getFeed"),
+ GETFEED_WITH_OPTIONS(ResponseList.class, "getFeed", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETFEED_WITH_ID(ResponseList.class, "getFeed", String.class, "userId"),
+ GETFEED_WITH_ID_OPTIONS(ResponseList.class, "getFeed", String.class, "userId", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETHOME(ResponseList.class, "getHome"),
+ GETHOME_WITH_OPTIONS(ResponseList.class, "getHome", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETLINKS(ResponseList.class, "getLinks"),
+ GETLINKS_WITH_OPTIONS(ResponseList.class, "getLinks", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETLINKS_WITH_ID(ResponseList.class, "getLinks", String.class, "userId"),
+ GETLINKS_WITH_ID_OPTIONS(ResponseList.class, "getLinks", String.class, "userId", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETPOST(Post.class, "getPost", String.class, "postId"),
+ GETPOST_WITH_OPTIONS(Post.class, "getPost", String.class, "postId", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETPOSTCOMMENTS(ResponseList.class, "getPostComments", String.class, "postId"),
+ GETPOSTCOMMENTS_WITH_OPTIONS(ResponseList.class, "getPostComments", String.class, "postId", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETPOSTLIKES(ResponseList.class, "getPostLikes", String.class, "postId"),
+ GETPOSTLIKES_WITH_OPTIONS(ResponseList.class, "getPostLikes", String.class, "postId", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETPOSTS(ResponseList.class, "getPosts"),
+ GETPOSTS_WITH_OPTIONS(ResponseList.class, "getPosts", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETPOSTS_WITH_ID(ResponseList.class, "getPosts", String.class, "userId"),
+ GETPOSTS_WITH_ID_OPTIONS(ResponseList.class, "getPosts", String.class, "userId", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETSTATUSES(ResponseList.class, "getStatuses"),
+ GETSTATUSES_WITH_OPTIONS(ResponseList.class, "getStatuses", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETSTATUSES_WITH_ID(ResponseList.class, "getStatuses", String.class, "userId"),
+ GETSTATUSES_WITH_ID_OPTIONS(ResponseList.class, "getStatuses", String.class, "userId", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETTAGGED(ResponseList.class, "getTagged"),
+ GETTAGGED_WITH_OPTIONS(ResponseList.class, "getTagged", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETTAGGED_WITH_ID(ResponseList.class, "getTagged", String.class, "userId"),
+ GETTAGGED_WITH_ID_OPTIONS(ResponseList.class, "getTagged", String.class, "userId", Reading.class, FacebookConstants.READING_PPROPERTY),
+ LIKEPOST(Boolean.class, "likePost", String.class, "postId"),
+ POSTFEED(String.class, "postFeed", PostUpdate.class, "postUpdate"),
+ POSTFEED_WITH_POSTUPDATE(String.class, "postFeed", String.class, "userId", PostUpdate.class, "postUpdate"),
+ POSTLINK(String.class, "postLink", URL.class, "link"),
+ POSTLINK_WITH_MSG(String.class, "postLink", URL.class, "link", String.class, "message"),
+ POSTLINK_WITH_ID(String.class, "postLink", String.class, "userId", URL.class, "link"),
+ POSTLINK_WITH_ID_MSG(String.class, "postLink", String.class, "userId", URL.class, "link", String.class, "message"),
+ POSTSTATUSMESSAGE(String.class, "postStatusMessage", String.class, "message"),
+ POSTSTATUSMESSAGE_WITH_ID(String.class, "postStatusMessage", String.class, "userId", String.class, "message"),
+ UNLIKEPOST(Boolean.class, "unlikePost", String.class, "postId"),
+
+ // QuestionMethods
+ ADDQUESTIONOPTION(String.class, "addQuestionOption", String.class, "questionId", String.class, "optionDescription"),
+ CREATEQUESTION(String.class, "createQuestion", String.class, "question"),
+ CREATEQUESTION_WITH_OPTIONS(String.class, "createQuestion", String.class, "question", List.class, "options", boolean.class, "allowNewOptions"),
+ CREATEQUESTION_WITH_ID(String.class, "createQuestion", String.class, "userId", String.class, "question"),
+ CREATEQUESTION_WITH_ID_OPTIONS(String.class, "createQuestion", String.class, "userId", String.class, "question", List.class, "options", boolean.class, "allowNewOptions"),
+ DELETEQUESTION(Boolean.class, "deleteQuestion", String.class, "questionId"),
+ GETQUESTION(Question.class, "getQuestion", String.class, "questionId"),
+ GETQUESTION_WITH_OPTIONS(Question.class, "getQuestion", String.class, "questionId", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETQUESTIONOPTIONS(ResponseList.class, "getQuestionOptions", String.class, "questionId"),
+ GETQUESTIONOPTIONS_WITH_OPTIONS(ResponseList.class, "getQuestionOptions", String.class, "questionId", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETQUESTIONOPTIONVOTES(ResponseList.class, "getQuestionOptionVotes", String.class, "questionId"),
+ GETQUESTIONS(ResponseList.class, "getQuestions"),
+ GETQUESTIONS_WITH_OPTIONS(ResponseList.class, "getQuestions", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETQUESTIONS_WITH_ID(ResponseList.class, "getQuestions", String.class, "userId"),
+ GETQUESTIONS_WITH_ID_OPTIONS(ResponseList.class, "getQuestions", String.class, "userId", Reading.class, FacebookConstants.READING_PPROPERTY),
+
+ // SubscribeMethods
+ GETSUBSCRIBEDTO(ResponseList.class, "getSubscribedto"),
+ GETSUBSCRIBEDTO_WITH_OPTIONS(ResponseList.class, "getSubscribedto", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETSUBSCRIBEDTO_WITH_ID(ResponseList.class, "getSubscribedto", String.class, "userId"),
+ GETSUBSCRIBEDTO_WITH_ID_OPTIONS(ResponseList.class, "getSubscribedto", String.class, "userId", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETSUBSCRIBERS(ResponseList.class, "getSubscribers"),
+ GETSUBSCRIBERS_WITH_OPTIONS(ResponseList.class, "getSubscribers", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETSUBSCRIBERS_WITH_ID(ResponseList.class, "getSubscribers", String.class, "userId"),
+ GETSUBSCRIBERS_WITH_ID_OPTIONS(ResponseList.class, "getSubscribers", String.class, "userId", Reading.class, FacebookConstants.READING_PPROPERTY),
+
+ // TestUserMethods
+ CREATETESTUSER(TestUser.class, "createTestUser", String.class, "appId"),
+ CREATETESTUSER_WITH_NAME(TestUser.class, "createTestUser", String.class, "appId", String.class, "name", String.class, "userLocale", String.class, "permissions"),
+ DELETETESTUSER(Boolean.class, "deleteTestUser", String.class, "testUserId"),
+ GETTESTUSERS(List.class, "getTestUsers", String.class, "appId"),
+ MAKEFRIENDTESTUSER(Boolean.class, "makeFriendTestUser", TestUser.class, "testUser1", TestUser.class, "testUser2"),
+
+ // UserMethods
+ GETME(User.class, "getMe"),
+ GETME_WITH_OPTIONS(User.class, "getMe", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETPICTUREURL(URL.class, "getPictureURL"),
+ GETPICTUREURL_WITH_PICTURESIZE(URL.class, "getPictureURL", PictureSize.class, "size"),
+ GETPICTUREURL_WITH_ID(URL.class, "getPictureURL", String.class, "userId"),
+ GETPICTUREURL_WITH_ID_PICTURESIZE(URL.class, "getPictureURL", String.class, "userId", PictureSize.class, "size"),
+ GETUSER(User.class, "getUser", String.class, "userId"),
+ GETUSER_WITH_OPTIONS(User.class, "getUser", String.class, "userId", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETUSERS(List.class, "getUsers", new String[0].getClass(), "ids"),
+
+ // VideoMethods
+ COMMENTVIDEO(String.class, "commentVideo", String.class, "videoId", String.class, "message"),
+ GETVIDEO(Video.class, "getVideo", String.class, "videoId"),
+ GETVIDEO_WITH_OPTIONS(Video.class, "getVideo", String.class, "videoId", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETVIDEOCOMMENTS(ResponseList.class, "getVideoComments", String.class, "videoId"),
+ GETVIDEOCOMMENTS_WITH_OPTIONS(ResponseList.class, "getVideoComments", String.class, "videoId", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETVIDEOCOVER(URL.class, "getVideoCover", String.class, "videoId"),
+ GETVIDEOLIKES(ResponseList.class, "getVideoLikes", String.class, "videoId"),
+ GETVIDEOLIKES_WITH_OPTIONS(ResponseList.class, "getVideoLikes", String.class, "videoId", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETVIDEOS(ResponseList.class, "getVideos"),
+ GETVIDEOS_WITH_OPTIONS(ResponseList.class, "getVideos", Reading.class, FacebookConstants.READING_PPROPERTY),
+ GETVIDEOS_WITH_ID(ResponseList.class, "getVideos", String.class, "userId"),
+ GETVIDEOS_WITH_ID_OPTIONS(ResponseList.class, "getVideos", String.class, "userId", Reading.class, FacebookConstants.READING_PPROPERTY),
+ LIKEVIDEO(Boolean.class, "likeVideo", String.class, "videoId"),
+ POSTVIDEO(String.class, "postVideo", Media.class, "source"),
+ POSTVIDEO_WITH_TITLE(String.class, "postVideo", Media.class, "source", String.class, "title", String.class, "description"),
+ POSTVIDEO_WITH_ID(String.class, "postVideo", String.class, "userId", Media.class, "source"),
+ POSTVIDEO_WITH_ID_MEDIA(String.class, "postVideo", String.class, "userId", Media.class, "source", String.class, "title", String.class, "description"),
+ UNLIKEVIDEO(Boolean.class, "unlikeVideo", String.class, "videoId"),
+
+ // SearchMethods get the highest priority with higher ordinal values
+ SEARCH(ResponseList.class, "search", String.class, "query"),
+ SEARCH_WITH_OPTIONS(ResponseList.class, "search", String.class, "query", Reading.class, FacebookConstants.READING_PPROPERTY),
+ SEARCHCHECKINS(ResponseList.class, "searchCheckins"),
+ SEARCHCHECKINS_WITH_OPTIONS(ResponseList.class, "searchCheckins", Reading.class, FacebookConstants.READING_PPROPERTY),
+ SEARCHEVENTS(ResponseList.class, "searchEvents", String.class, "query"),
+ SEARCHEVENTS_WITH_OPTIONS(ResponseList.class, "searchEvents", String.class, "query", Reading.class, FacebookConstants.READING_PPROPERTY),
+ SEARCHGROUPS(ResponseList.class, "searchGroups", String.class, "query"),
+ SEARCHGROUPS_WITH_OPTIONS(ResponseList.class, "searchGroups", String.class, "query", Reading.class, FacebookConstants.READING_PPROPERTY),
+ SEARCHLOCATIONS(ResponseList.class, "searchLocations", GeoLocation.class, "center", int.class, "distance"),
+ SEARCHLOCATIONS_WITH_OPTIONS(ResponseList.class, "searchLocations", GeoLocation.class, "center", int.class, "distance", Reading.class, FacebookConstants.READING_PPROPERTY),
+ SEARCHLOCATIONS_WITH_ID(ResponseList.class, "searchLocations", String.class, "placeId"),
+ SEARCHLOCATIONS_WITH_ID_OPTIONS(ResponseList.class, "searchLocations", String.class, "placeId", Reading.class, FacebookConstants.READING_PPROPERTY),
+ SEARCHPLACES(ResponseList.class, "searchPlaces", String.class, "query"),
+ SEARCHPLACES_WITH_OPTIONS(ResponseList.class, "searchPlaces", String.class, "query", Reading.class, FacebookConstants.READING_PPROPERTY),
+ SEARCHPLACES_WITH_CENTER(ResponseList.class, "searchPlaces", String.class, "query", GeoLocation.class, "center", int.class, "distance"),
+ SEARCHPLACES_WITH_CENTER_OPTIONS(ResponseList.class, "searchPlaces", String.class, "query", GeoLocation.class, "center", int.class, "distance", Reading.class, FacebookConstants.READING_PPROPERTY),
+ SEARCHPOSTS(ResponseList.class, "searchPosts", String.class, "query"),
+ SEARCHPOSTS_WITH_OPTIONS(ResponseList.class, "searchPosts", String.class, "query", Reading.class, FacebookConstants.READING_PPROPERTY),
+ SEARCHUSERS(ResponseList.class, "searchUsers", String.class, "query"),
+ SEARCHUSERS_WITH_OPTIONS(ResponseList.class, "searchUsers", String.class, "query", Reading.class, FacebookConstants.READING_PPROPERTY);
+
+ // name, result class, ordered argument names and classes, and Method to invoke
+ private final String name;
+ private final Class resultType;
+ private final List<String> argNames;
+ private final List<Class> argTypes;
+ private final Method method;
+
+ private FacebookMethodsType(Class resultType, String name, Object... args) throws IllegalArgumentException {
+ this.name = name;
+ this.resultType = resultType;
+
+ if (args.length % 2 != 0) {
+ throw new IllegalArgumentException("Invalid parameter list, "
+ + "must be of the form 'Class arg1, String arg1Name, Class arg2, String arg2Name...");
+ }
+ int nArgs = args.length / 2;
+ this.argNames = new ArrayList<String>(nArgs);
+ this.argTypes = new ArrayList<Class>(nArgs);
+ for (int i = 0; i < nArgs; i++) {
+ this.argTypes.add((Class) args[i * 2]);
+ this.argNames.add((String) args[i * 2 + 1]);
+ }
+
+ // find method in Facebook type
+ try {
+ this.method = Facebook.class.getMethod(name, argTypes.toArray(new Class[nArgs]));
+ } catch (NoSuchMethodException e) {
+ throw new IllegalArgumentException(
+ String.format("Missing method %s %s", name, argTypes.toString().replace('[', '(').replace(']', ')')),
+ e);
+ }
+ }
+
+ /**
+ * Find method type by name and argument types.
+ * @param name method name
+ * @param args ordered argument types
+ * @return matching method, null if not found
+ */
+ public static FacebookMethodsType findMethod(String name, Class... args) {
+ for (FacebookMethodsType method : values()) {
+ if (method.name.equals(name)) {
+ if ((method.argTypes.isEmpty() && (args == null || args.length == 0))
+ || Arrays.equals(method.argTypes.toArray(), args)) {
+ return method;
+ }
+ }
+ }
+
+ return null;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public Class getResultType() {
+ return resultType;
+ }
+
+ public List<String> getArgNames() {
+ return Collections.unmodifiableList(argNames);
+ }
+
+ public List<Class> getArgTypes() {
+ return Collections.unmodifiableList(argTypes);
+ }
+
+ public Method getMethod() {
+ return method;
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder builder = new StringBuilder();
+ builder.append("{")
+ .append("name=").append(name)
+ .append(", resultType=").append(resultType)
+ .append(", argNames=").append(argNames)
+ .append(", argTypes=").append(argTypes)
+ .append("}");
+ return builder.toString();
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/camel/blob/1c293408/components/camel-facebook/src/main/java/org/apache/camel/component/facebook/data/FacebookMethodsTypeHelper.java
----------------------------------------------------------------------
diff --git a/components/camel-facebook/src/main/java/org/apache/camel/component/facebook/data/FacebookMethodsTypeHelper.java b/components/camel-facebook/src/main/java/org/apache/camel/component/facebook/data/FacebookMethodsTypeHelper.java
new file mode 100644
index 0000000..1e78dac
--- /dev/null
+++ b/components/camel-facebook/src/main/java/org/apache/camel/component/facebook/data/FacebookMethodsTypeHelper.java
@@ -0,0 +1,366 @@
+/**
+ * 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.facebook.data;
+
+import java.lang.reflect.Array;
+import java.util.*;
+import org.apache.camel.RuntimeCamelException;
+import org.apache.camel.component.facebook.FacebookConstants;
+import org.apache.camel.component.facebook.config.FacebookNameStyle;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import facebook4j.Facebook;
+import facebook4j.FacebookException;
+
+
+/**
+ * Helper class for working with {@link FacebookMethodsType}.
+ */
+public final class FacebookMethodsTypeHelper {
+
+ private static final Logger LOG = LoggerFactory.getLogger(FacebookMethodsTypeHelper.class);
+
+ // maps method name to FacebookMethodsType
+ private static final Map<String, List<FacebookMethodsType>> METHOD_MAP =
+ new HashMap<String, List<FacebookMethodsType>>();
+
+ // maps method name to method arguments of the form Class type1, String name1, Class type2, String name2,...
+ private static final Map<String, List<Object>> ARGUMENTS_MAP =
+ new HashMap<String, List<Object>>();
+
+ // maps argument name to argument type
+ private static final Map<String, Class> VALID_ARGUMENTS =
+ new HashMap<String, Class>();
+
+ static {
+ final FacebookMethodsType[] methods = FacebookMethodsType.values();
+ // load lookup maps for FacebookMethodsType
+ for (FacebookMethodsType method : methods) {
+
+ // map method name to Enum
+ final String name = method.getName();
+ List<FacebookMethodsType> overloads = METHOD_MAP.get(name);
+ if (overloads == null) {
+ overloads = new ArrayList<FacebookMethodsType>();
+ METHOD_MAP.put(method.getName(), overloads);
+ }
+ overloads.add(method);
+
+ // add arguments for this method
+ List<Object> arguments = ARGUMENTS_MAP.get(name);
+ if (arguments == null) {
+ arguments = new ArrayList<Object>();
+ ARGUMENTS_MAP.put(name, arguments);
+ }
+
+ // process all arguments for this method
+ final int nArgs = method.getArgNames().size();
+ final String[] argNames = method.getArgNames().toArray(new String[nArgs]);
+ final Class[] argTypes = method.getArgTypes().toArray(new Class[nArgs]);
+ for (int i = 0; i < nArgs; i++) {
+ final String argName = argNames[i];
+ final Class argType = argTypes[i];
+ if (!arguments.contains(argName)) {
+ arguments.add(argType);
+ arguments.add(argName);
+ }
+
+ // also collect argument names for all methods, also detect clashes here
+ final Class previousType = VALID_ARGUMENTS.get(argName);
+ if (previousType != null && previousType != argType) {
+ throw new ExceptionInInitializerError(String.format(
+ "Argument %s has ambiguous types (%s, %s) across methods!",
+ name, previousType, argType));
+ } else if (previousType == null) {
+ VALID_ARGUMENTS.put(argName, argType);
+ }
+ }
+
+ }
+
+ // add endpoint parameter inBody for producers
+ VALID_ARGUMENTS.put(FacebookConstants.IN_BODY_PROPERTY, String.class);
+
+ LOG.debug("Found {} unique method names in {} methods", METHOD_MAP.size(), methods.length);
+
+ }
+
+ private FacebookMethodsTypeHelper() {
+ }
+
+ /**
+ * Gets methods that match the given name and arguments.<p/>
+ * Note that the args list is a required subset of arguments for returned methods.
+ * @param name case sensitive full method name to lookup
+ * @param argNames unordered required argument names
+ * @return non-null unmodifiable list of methods that take all of the given arguments, empty if there is no match
+ */
+ public static List<FacebookMethodsType> getCandidateMethods(String name, String... argNames) {
+ final List<FacebookMethodsType> methods = METHOD_MAP.get(name);
+ if (methods == null) {
+ LOG.debug("No matching method for method {}", name);
+ return Collections.emptyList();
+ }
+ int nArgs = argNames != null ? argNames.length : 0;
+ if (nArgs == 0) {
+ LOG.debug("Found {} methods for method {}", methods.size(), name);
+ return Collections.unmodifiableList(methods);
+ } else {
+ final List<FacebookMethodsType> filteredSet = filterMethods(methods, MatchType.SUBSET, argNames);
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("Found {} filtered methods for {}",
+ filteredSet.size(), name + Arrays.toString(argNames).replace('[', '(').replace(']', ')'));
+ }
+ return filteredSet;
+ }
+ }
+
+ /**
+ * Filters a list of methods to those that take the given set of arguments.
+ *
+ * @param methods list of methods to filter
+ * @param matchType whether the arguments are an exact match, a subset or a super set of method args
+ * @param argNames argument names to filter the list
+ * @return methods with arguments that satisfy the match type.<p/>
+ * For SUPER_SET match, if methods with exact match are found, methods that take a subset are ignored
+ */
+ public static List<FacebookMethodsType> filterMethods(List<FacebookMethodsType> methods, MatchType matchType,
+ String... argNames) {
+ List<String> argsList = Arrays.asList(argNames);
+ // list of methods that have all args in the given names
+ final List<FacebookMethodsType> result = new ArrayList<FacebookMethodsType>();
+ final List<FacebookMethodsType> extraArgs = new ArrayList<FacebookMethodsType>();
+
+ for (FacebookMethodsType method : methods) {
+ final List<String> methodArgs = method.getArgNames();
+ switch (matchType) {
+ case EXACT:
+ // method must take all args, and no more
+ if (methodArgs.containsAll(argsList) && argsList.containsAll(methodArgs)) {
+ result.add(method);
+ }
+ break;
+ case SUBSET:
+ // all args are required, method may take more
+ if (methodArgs.containsAll(argsList)) {
+ result.add(method);
+ }
+ break;
+ default:
+ case SUPER_SET:
+ // all method args must be present
+ if (argsList.containsAll(methodArgs)) {
+ if (methodArgs.containsAll(argsList)) {
+ // prefer exact match to avoid unused args
+ result.add(method);
+ } else {
+ // method takes a subset, unused args
+ extraArgs.add(method);
+ }
+ }
+ break;
+ }
+ }
+
+ return Collections.unmodifiableList(result.isEmpty() ? extraArgs : result);
+ }
+
+ /**
+ * Gets argument types and names for all overloaded methods with the given name.
+ * @param name method name, must be a long form (i.e. get*, or search*)
+ * @return list of arguments of the form Class type1, String name1, Class type2, String name2,...
+ */
+ public static List<Object> getArguments(String name) throws IllegalArgumentException {
+ final List<Object> arguments = ARGUMENTS_MAP.get(name);
+ if (arguments == null) {
+ throw new IllegalArgumentException(name);
+ }
+ return Collections.unmodifiableList(arguments);
+ }
+
+ /**
+ * Gets argument types and names for all overloaded methods with the given short form name.
+ * @param name method name, may be a short form
+ * @param style name style
+ * @return list of arguments of the form Class type1, String name1, Class type2, String name2,...
+ */
+ public static List<Object> getArgumentsForNameStyle(String name, FacebookNameStyle style) throws IllegalArgumentException {
+ if (style == null) {
+ throw new IllegalArgumentException("Parameters style cannot be null");
+ }
+ switch (style) {
+ case EXACT:
+ return getArguments(name);
+ case GET:
+ return getArguments(convertToGetMethod(name));
+ case SEARCH:
+ return getArguments(convertToSearchMethod(name));
+ case GET_AND_SEARCH:
+ default:
+ final List<Object> arguments = new ArrayList<Object>();
+ arguments.addAll(getArguments(convertToGetMethod(name)));
+ arguments.addAll(getArguments(convertToSearchMethod(name)));
+ return Collections.unmodifiableList(arguments);
+ }
+ }
+
+ /**
+ * Get missing properties.
+ * @param methodName method name
+ * @param nameStyle method name style
+ * @param argNames available arguments
+ * @return Set of missing argument names
+ */
+ public static Set<String> getMissingProperties(String methodName, FacebookNameStyle nameStyle, Set<String> argNames) {
+ final List<Object> argsWithTypes = getArgumentsForNameStyle(methodName, nameStyle);
+ final Set<String> missingArgs = new HashSet<String>();
+
+ for (int i = 1; i < argsWithTypes.size(); i += 2) {
+ final String name = (String) argsWithTypes.get(i);
+ if (!argNames.contains(name)) {
+ missingArgs.add(name);
+ }
+ }
+
+ return missingArgs;
+ }
+
+ /**
+ * Get argument types and names used by all methods.
+ * @return map with argument names as keys, and types as values
+ */
+ public static Map<String, Class> allArguments() {
+ return Collections.unmodifiableMap(VALID_ARGUMENTS);
+ }
+
+ /**
+ * Get the type for the given argument name.
+ * @param argName argument name
+ * @return argument type
+ */
+ public static Class getType(String argName) throws IllegalArgumentException {
+ final Class type = VALID_ARGUMENTS.get(argName);
+ if (type == null) {
+ throw new IllegalArgumentException(argName);
+ }
+ return type;
+ }
+
+ public static String convertToGetMethod(String name) throws IllegalArgumentException {
+ if (name == null || name.isEmpty()) {
+ throw new IllegalArgumentException("Name cannot be null or empty");
+ }
+ return "get" + Character.toUpperCase(name.charAt(0)) + name.substring(1);
+ }
+
+ public static String convertToSearchMethod(String name) throws IllegalArgumentException {
+ if (name == null || name.isEmpty()) {
+ throw new IllegalArgumentException("Name cannot be null or empty");
+ }
+ return "search" + Character.toUpperCase(name.charAt(0)) + name.substring(1);
+ }
+
+ public static FacebookMethodsType getHighestPriorityMethod(List<FacebookMethodsType> filteredMethods) {
+ FacebookMethodsType highest = null;
+ for (FacebookMethodsType method : filteredMethods) {
+ if (highest == null || method.ordinal() > highest.ordinal()) {
+ highest = method;
+ }
+ }
+ return highest;
+ }
+
+ /**
+ * Invokes given method with argument values from given properties.
+ *
+ * @param facebook Facebook4J target object for invoke
+ * @param method method to invoke
+ * @param properties Map of arguments
+ * @return result of method invocation
+ * @throws RuntimeCamelException on errors
+ */
+ @SuppressWarnings("unchecked")
+ public static Object invokeMethod(Facebook facebook, FacebookMethodsType method, Map<String, Object> properties)
+ throws RuntimeCamelException {
+
+ LOG.debug("Invoking {} with arguments {}", method.getName(), properties);
+
+ final List<String> argNames = method.getArgNames();
+ final Object[] values = new Object[argNames.size()];
+ final List<Class> argTypes = method.getArgTypes();
+ final Class[] types = argTypes.toArray(new Class[argTypes.size()]);
+ int index = 0;
+ for (String name : argNames) {
+ Object value = properties.get(name);
+
+ // is the parameter an array type?
+ if (value != null && types[index].isArray()) {
+ Class type = types[index];
+
+ if (value instanceof Collection) {
+ // convert collection to array
+ Collection collection = (Collection) value;
+ Object array = Array.newInstance(type.getComponentType(), collection.size());
+ if (array instanceof Object[]) {
+ collection.toArray((Object[]) array);
+ } else {
+ int i = 0;
+ for (Object el : collection) {
+ Array.set(array, i++, el);
+ }
+ }
+ value = array;
+ } else if (value.getClass().isArray()
+ && type.getComponentType().isAssignableFrom(value.getClass().getComponentType())) {
+ // convert derived array to super array
+ final int size = Array.getLength(value);
+ Object array = Array.newInstance(type.getComponentType(), size);
+ for (int i = 0; i < size; i++) {
+ Array.set(array, i, Array.get(value, i));
+ }
+ value = array;
+ } else {
+ throw new IllegalArgumentException(
+ String.format("Cannot convert %s to %s", value.getClass(), type));
+ }
+ }
+
+ values[index++] = value;
+ }
+
+ try {
+ return method.getMethod().invoke(facebook, values);
+ } catch (Throwable e) {
+ // skip wrapper exception to simplify stack
+ String msg;
+ if (e.getCause() != null && e.getCause() instanceof FacebookException) {
+ e = e.getCause();
+ msg = ((FacebookException)e).getErrorMessage();
+ } else {
+ msg = e.getMessage();
+ }
+ throw new RuntimeCamelException(
+ String.format("Error invoking %s with %s: %s", method.getName(), properties, msg), e);
+ }
+ }
+
+ public static enum MatchType {
+ EXACT, SUBSET, SUPER_SET
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/camel/blob/1c293408/components/camel-facebook/src/main/java/org/apache/camel/component/facebook/data/FacebookPropertiesHelper.java
----------------------------------------------------------------------
diff --git a/components/camel-facebook/src/main/java/org/apache/camel/component/facebook/data/FacebookPropertiesHelper.java b/components/camel-facebook/src/main/java/org/apache/camel/component/facebook/data/FacebookPropertiesHelper.java
new file mode 100644
index 0000000..5a61d2c
--- /dev/null
+++ b/components/camel-facebook/src/main/java/org/apache/camel/component/facebook/data/FacebookPropertiesHelper.java
@@ -0,0 +1,132 @@
+/**
+ * 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.facebook.data;
+
+import java.lang.reflect.Field;
+import java.util.*;
+import org.apache.camel.Exchange;
+import org.apache.camel.component.facebook.FacebookConstants;
+import org.apache.camel.component.facebook.config.FacebookConfiguration;
+import org.apache.camel.component.facebook.config.FacebookEndpointConfiguration;
+import org.apache.camel.util.IntrospectionSupport;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import facebook4j.Reading;
+
+/**
+ * Helper class to work with Facebook component properties.
+ */
+public final class FacebookPropertiesHelper {
+
+ // set of field names which are specific to Facebook4J api, to be excluded from method argument considerations
+ private static final Set<String> COMPONENT_CONFIG_FIELDS = new HashSet<String>();
+
+ private static final Logger LOG = LoggerFactory.getLogger(FacebookPropertiesHelper.class);
+
+ private static final Set<String> ENDPOINT_CONFIG_FIELDS = new HashSet<String>();
+
+ static {
+ for (Field field : FacebookConfiguration.class.getDeclaredFields()) {
+ COMPONENT_CONFIG_FIELDS.add(field.getName());
+ }
+ for (Field field : FacebookEndpointConfiguration.class.getDeclaredFields()) {
+ ENDPOINT_CONFIG_FIELDS.add(field.getName());
+ }
+ }
+
+ private FacebookPropertiesHelper() {
+ // utility
+ }
+
+ /**
+ * Apply properties for {@link Reading} type to the supplied {@link FacebookEndpointConfiguration}.
+ * @param configuration endpoint configuration to update
+ * @param options properties to apply to the reading field in configuration
+ */
+ public static void configureReadingProperties(FacebookEndpointConfiguration configuration,
+ Map<String, Object> options) {
+ final Map<String, Object> readingProperties = IntrospectionSupport.extractProperties(
+ options, FacebookConstants.READING_PREFIX);
+ if (!readingProperties.isEmpty()) {
+ try {
+
+ // add to an existing reading reference?
+ // NOTE Reading class does not support overwriting properties!!!
+ Reading reading = configuration.getReading();
+ if (reading == null) {
+ reading = new Reading();
+ } else {
+ reading = ReadingBuilder.copy(reading, false);
+ }
+ // set properties
+ ReadingBuilder.setProperties(reading,
+ readingProperties);
+
+ // update reading in configuration
+ configuration.setReading(reading);
+
+ } catch (Exception e) {
+ throw new IllegalArgumentException(readingProperties.toString(), e);
+ }
+
+ // add any unknown properties back to options to throw an error later
+ for (Map.Entry<String, Object> entry : readingProperties.entrySet()) {
+ options.put(FacebookConstants.READING_PREFIX + entry.getKey(), entry.getValue());
+ }
+ }
+ }
+
+ /**
+ * Gets exchange header properties that start with {@link FacebookConstants}.FACEBOOK_PROPERTY_PREFIX.
+ *
+ * @param exchange Camel exchange
+ * @param properties map to collect properties with required prefix
+ */
+ public static Map<String, Object> getExchangeProperties(Exchange exchange, Map<String, Object> properties) {
+ int nProperties = 0;
+ for (Map.Entry<String, Object> entry : exchange.getIn().getHeaders().entrySet()) {
+ if (entry.getKey().startsWith(FacebookConstants.FACEBOOK_PROPERTY_PREFIX)) {
+ properties.put(entry.getKey().substring(FacebookConstants.FACEBOOK_PROPERTY_PREFIX.length()),
+ entry.getValue());
+ nProperties++;
+ }
+ }
+ LOG.debug("Found {} properties in exchange", nProperties);
+ return properties;
+ }
+
+ public static void getEndpointProperties(FacebookEndpointConfiguration configuration,
+ Map<String, Object> properties) {
+ if (IntrospectionSupport.getProperties(configuration, properties, null, false)) {
+ final Set<String> names = properties.keySet();
+ // remove component config properties so we only have endpoint properties
+ names.removeAll(COMPONENT_CONFIG_FIELDS);
+ }
+ if (LOG.isDebugEnabled()) {
+ final Set<String> names = properties.keySet();
+ LOG.debug("Found endpoint properties {}", names.retainAll(ENDPOINT_CONFIG_FIELDS));
+ }
+ }
+
+ public static Set<String> getEndpointPropertyNames(FacebookEndpointConfiguration configuration) {
+ Map<String, Object> properties = new HashMap<String, Object>();
+ getEndpointProperties(configuration, properties);
+ return Collections.unmodifiableSet(properties.keySet());
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/camel/blob/1c293408/components/camel-facebook/src/main/java/org/apache/camel/component/facebook/data/ReadingBuilder.java
----------------------------------------------------------------------
diff --git a/components/camel-facebook/src/main/java/org/apache/camel/component/facebook/data/ReadingBuilder.java b/components/camel-facebook/src/main/java/org/apache/camel/component/facebook/data/ReadingBuilder.java
new file mode 100644
index 0000000..1e44887
--- /dev/null
+++ b/components/camel-facebook/src/main/java/org/apache/camel/component/facebook/data/ReadingBuilder.java
@@ -0,0 +1,121 @@
+/**
+ * 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.facebook.data;
+
+import java.lang.reflect.Field;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.LinkedHashMap;
+import java.util.Locale;
+import java.util.Map;
+import org.apache.camel.component.facebook.FacebookConstants;
+
+import facebook4j.Reading;
+
+/**
+ * Builds {@link facebook4j.Reading} instances.
+ */
+public class ReadingBuilder {
+
+
+ public static Reading copy(Reading reading, boolean skipSinceUtil) throws NoSuchFieldException, IllegalAccessException {
+ // use private field access to make a copy
+ Field field = Reading.class.getDeclaredField("parameterMap");
+ field.setAccessible(true);
+ final LinkedHashMap<String, String> source = (LinkedHashMap<String, String>) field.get(reading);
+ // create another reading, and add all fields from source
+ Reading copy = new Reading();
+ final LinkedHashMap copyMap = new LinkedHashMap();
+ copyMap.putAll(source);
+ if (skipSinceUtil) {
+ copyMap.remove("since");
+ copyMap.remove("until");
+ }
+ field.set(copy, copyMap);
+ field.setAccessible(false);
+ return copy;
+ }
+
+ /**
+ * Sets Reading properties.
+ * @param reading Reading object to populate
+ * @param readingProperties Map to extract properties
+ */
+ public static void setProperties(Reading reading, Map<String, Object> readingProperties) {
+
+ final String fields = (String) readingProperties.remove("fields");
+ if (fields != null) {
+ reading.fields(fields.toString().split(","));
+ }
+ final Object limit = readingProperties.remove("limit");
+ if (limit != null) {
+ reading.limit(Integer.parseInt(limit.toString()));
+ }
+ final Object offset = readingProperties.remove("offset");
+ if (offset != null) {
+ reading.offset(Integer.parseInt(offset.toString()));
+ }
+ final SimpleDateFormat dateFormat = new SimpleDateFormat(FacebookConstants.FACEBOOK_DATE_FORMAT);
+ final Object until = readingProperties.remove("until");
+ if (until != null) {
+ try {
+ reading.until(dateFormat.parse(until.toString()));
+ } catch (ParseException e) {
+ throw new RuntimeException("Error parsing property 'until' :" + e.getMessage(), e);
+ }
+ }
+ final Object since = readingProperties.remove("since");
+ if (since != null) {
+ try {
+ reading.since(dateFormat.parse(since.toString()));
+ } catch (ParseException e) {
+ throw new RuntimeException("Error parsing property 'since' :" + e.getMessage(), e);
+ }
+ }
+ final Object metadata = readingProperties.remove("metadata");
+ if (metadata != null && Boolean.parseBoolean(metadata.toString())) {
+ reading.metadata();
+ }
+ final Object locale = readingProperties.remove("locale");
+ if (locale != null) {
+ String[] args = locale.toString().split(",");
+ switch (args.length) {
+ case 1:
+ reading.locale(new Locale(args[0]));
+ break;
+ case 2:
+ reading.locale(new Locale(args[0], args[1]));
+ break;
+ case 3:
+ reading.locale(new Locale(args[0], args[1], args[2]));
+ break;
+ default:
+ throw new IllegalArgumentException(String.format("Invalid value for property 'locale' %s, "
+ + "must be of the form [language][,country][,variant]", locale.toString()));
+ }
+ }
+ final Object with = readingProperties.remove("with");
+ if (with != null && Boolean.parseBoolean(with.toString())) {
+ reading.withLocation();
+ }
+ final Object filter = readingProperties.remove("filter");
+ if (filter != null) {
+ reading.filter(filter.toString());
+ }
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/camel/blob/1c293408/components/camel-facebook/src/main/resources/META-INF/services/org/apache/camel/component/facebook
----------------------------------------------------------------------
diff --git a/components/camel-facebook/src/main/resources/META-INF/services/org/apache/camel/component/facebook b/components/camel-facebook/src/main/resources/META-INF/services/org/apache/camel/component/facebook
new file mode 100644
index 0000000..bad2fa3
--- /dev/null
+++ b/components/camel-facebook/src/main/resources/META-INF/services/org/apache/camel/component/facebook
@@ -0,0 +1 @@
+class=org.apache.camel.component.facebook.FacebookComponent
http://git-wip-us.apache.org/repos/asf/camel/blob/1c293408/components/camel-facebook/src/test/java/org/apache/camel/component/facebook/CamelFacebookTestSupport.java
----------------------------------------------------------------------
diff --git a/components/camel-facebook/src/test/java/org/apache/camel/component/facebook/CamelFacebookTestSupport.java b/components/camel-facebook/src/test/java/org/apache/camel/component/facebook/CamelFacebookTestSupport.java
new file mode 100644
index 0000000..1dc0f17
--- /dev/null
+++ b/components/camel-facebook/src/test/java/org/apache/camel/component/facebook/CamelFacebookTestSupport.java
@@ -0,0 +1,81 @@
+/**
+ * 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.facebook;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
+import org.apache.camel.component.facebook.config.FacebookConfiguration;
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.apache.camel.util.IntrospectionSupport;
+
+public class CamelFacebookTestSupport extends CamelTestSupport {
+
+ private final Properties properties;
+ private FacebookConfiguration configuration;
+
+ public CamelFacebookTestSupport() throws Exception {
+ URL url = getClass().getResource("/test-options.properties");
+
+ InputStream inStream;
+ try {
+ inStream = url.openStream();
+ } catch (IOException e) {
+ e.printStackTrace();
+ throw new IllegalAccessError("test-options.properties could not be found");
+ }
+
+ properties = new Properties();
+ try {
+ properties.load(inStream);
+ } catch (IOException e) {
+ e.printStackTrace();
+ throw new IllegalAccessError("test-options.properties could not be found");
+ }
+
+ Map<String, Object> options = new HashMap<String, Object>();
+ for (Map.Entry<Object, Object> entry : properties.entrySet()) {
+ options.put(entry.getKey().toString(), entry.getValue());
+ }
+
+ configuration = new FacebookConfiguration();
+ IntrospectionSupport.setProperties(configuration, options);
+ }
+
+ public FacebookConfiguration getConfiguration() {
+ return configuration;
+ }
+
+ public String getOauthParams() {
+ return "oAuthAppId=" + properties.get("oAuthAppId") + "&oAuthAppSecret=" + properties.get("oAuthAppSecret") +
+ (properties.get("oAuthAccessToken") != null ?
+ ("&oAuthAccessToken=" + properties.get("oAuthAccessToken")) : "");
+ }
+
+ protected String getShortName(String name) {
+ if (name.startsWith("get")) {
+ name = Character.toLowerCase(name.charAt(3)) + name.substring(4);
+ } else if (name.startsWith("search") && !"search".equals(name)) {
+ name = Character.toLowerCase(name.charAt(6)) + name.substring(7);
+ }
+ return name;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/camel/blob/1c293408/components/camel-facebook/src/test/java/org/apache/camel/component/facebook/FacebookComponentConsumerTest.java
----------------------------------------------------------------------
diff --git a/components/camel-facebook/src/test/java/org/apache/camel/component/facebook/FacebookComponentConsumerTest.java b/components/camel-facebook/src/test/java/org/apache/camel/component/facebook/FacebookComponentConsumerTest.java
new file mode 100644
index 0000000..80476fc
--- /dev/null
+++ b/components/camel-facebook/src/test/java/org/apache/camel/component/facebook/FacebookComponentConsumerTest.java
@@ -0,0 +1,90 @@
+/**
+ * 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.facebook;
+
+import java.lang.reflect.Method;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.concurrent.TimeUnit;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.junit.Test;
+
+import facebook4j.api.SearchMethods;
+
+public class FacebookComponentConsumerTest extends CamelFacebookTestSupport {
+
+ private final Set<String> searchNames = new HashSet<String>();
+ private List<String> excludedNames;
+
+ public FacebookComponentConsumerTest() throws Exception {
+ // find search methods for consumer tests
+ for (Method method : SearchMethods.class.getDeclaredMethods()) {
+ String name = getShortName(method.getName());
+ if (!"locations".equals(name) && !"checkins".equals(name)) {
+ searchNames.add(name);
+ }
+ }
+
+ excludedNames = Arrays.asList("places", "users", "search");
+ }
+
+ @Test
+ public void testConsumers() throws InterruptedException {
+ for (String name : searchNames) {
+ MockEndpoint mock;
+ if (!excludedNames.contains(name)) {
+ mock = getMockEndpoint("mock:consumeResult" + name);
+ mock.expectedMinimumMessageCount(1);
+ }
+
+ mock = getMockEndpoint("mock:consumeQueryResult" + name);
+ mock.expectedMinimumMessageCount(1);
+ }
+
+ assertMockEndpointsSatisfied();
+ }
+
+ @Override
+ protected RouteBuilder createRouteBuilder() throws Exception {
+ return new RouteBuilder() {
+ public void configure() {
+
+ // start with a 7 day window for the first delayed poll
+ String since = new SimpleDateFormat(FacebookConstants.FACEBOOK_DATE_FORMAT).format(
+ new Date(System.currentTimeMillis() - TimeUnit.MILLISECONDS.convert(7, TimeUnit.DAYS)));
+
+ for (String name : searchNames) {
+ if (!excludedNames.contains(name)) {
+ // consumer.sendEmptyMessageWhenIdle is true since user may not have some items like events
+ from("facebook://" + name + "?reading.limit=10&reading.locale=en.US&reading.since="
+ + since + "&consumer.initialDelay=1000&consumer.sendEmptyMessageWhenIdle=true&"
+ + getOauthParams())
+ .to("mock:consumeResult" + name);
+ }
+
+ from("facebook://" + name + "?query=cheese&reading.limit=10&reading.locale=en.US&reading.since="
+ + since + "&consumer.initialDelay=1000&" + getOauthParams())
+ .to("mock:consumeQueryResult" + name);
+ }
+
+ // TODO add tests for the rest of the supported methods
+ }
+ };
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/camel/blob/1c293408/components/camel-facebook/src/test/java/org/apache/camel/component/facebook/FacebookComponentProducerTest.java
----------------------------------------------------------------------
diff --git a/components/camel-facebook/src/test/java/org/apache/camel/component/facebook/FacebookComponentProducerTest.java b/components/camel-facebook/src/test/java/org/apache/camel/component/facebook/FacebookComponentProducerTest.java
new file mode 100644
index 0000000..bc8b65b
--- /dev/null
+++ b/components/camel-facebook/src/test/java/org/apache/camel/component/facebook/FacebookComponentProducerTest.java
@@ -0,0 +1,127 @@
+/**
+ * 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.facebook;
+
+import java.lang.reflect.Method;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.junit.Test;
+
+import facebook4j.Facebook;
+
+public class FacebookComponentProducerTest extends CamelFacebookTestSupport {
+
+ private final Set<String> noArgNames = new HashSet<String>();
+
+ private final List<String> idExcludes;
+ private final List<String> readingExcludes;
+
+ public FacebookComponentProducerTest() throws Exception {
+ for (Class clazz : Facebook.class.getInterfaces()) {
+ final String clazzName = clazz.getSimpleName();
+ if (clazzName.endsWith("Methods") && !clazzName.equals("GameMethods")) {
+ for (Method method : clazz.getDeclaredMethods()) {
+ // find all the no-arg methods
+ if (method.getParameterTypes().length == 0) {
+ noArgNames.add(getShortName(method.getName()));
+ }
+ }
+ }
+ }
+
+ idExcludes = Arrays.asList("me", "home", "searchCheckins");
+ readingExcludes = Arrays.asList("pictureURL", "permissions");
+ }
+
+ @Test
+ public void testProducers() throws Exception {
+ for (String name : noArgNames) {
+ MockEndpoint mock = getMockEndpoint("mock:result" + name);
+ mock.expectedMinimumMessageCount(1);
+ template().sendBody("direct://test" + name, null);
+
+ // with user id
+ if (!idExcludes.contains(name)) {
+ mock = getMockEndpoint("mock:resultId" + name);
+ mock.expectedMinimumMessageCount(1);
+ template().sendBody("direct://testId" + name, null);
+ }
+
+ // with reading
+ if (!readingExcludes.contains(name)) {
+ mock = getMockEndpoint("mock:resultReading" + name);
+ mock.expectedMinimumMessageCount(1);
+ template().sendBody("direct://testReading" + name, null);
+ }
+
+ // with user id and reading
+ if (!(idExcludes.contains(name) || readingExcludes.contains(name))) {
+ mock = getMockEndpoint("mock:resultIdReading" + name);
+ mock.expectedMinimumMessageCount(1);
+ template().sendBody("direct://testIdReading" + name, null);
+ }
+ }
+
+ assertMockEndpointsSatisfied();
+ }
+
+ @Override
+ protected RouteBuilder createRouteBuilder() throws Exception {
+ return new RouteBuilder() {
+ public void configure() {
+
+ //---------------
+ // producer tests
+ //---------------
+ // generate test routes for all methods with no args
+ for (String name : noArgNames) {
+ from("direct://test" + name)
+ .to("facebook://" + name + "?" + getOauthParams())
+ .to("mock:result" + name);
+
+ // with user id
+ if (!idExcludes.contains(name)) {
+ from("direct://testId" + name)
+ .to("facebook://" + name + "?userId=me&" + getOauthParams())
+ .to("mock:resultId" + name);
+ }
+
+ // reading options
+ if (!readingExcludes.contains(name)) {
+ from("direct://testReading" + name)
+ .to("facebook://" + name + "?reading.limit=10&reading.locale=en,US&" + getOauthParams())
+ .to("mock:resultReading" + name);
+ }
+
+ // with id and reading options
+ if (!(idExcludes.contains(name) || readingExcludes.contains(name))) {
+ from("direct://testIdReading" + name)
+ .to("facebook://" + name + "?userId=me&reading.limit=10&reading.locale=en,US&" + getOauthParams())
+ .to("mock:resultIdReading" + name);
+ }
+ }
+
+ // TODO add tests for the rest of the supported methods
+ }
+ };
+ }
+
+}