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
+            }
+        };
+    }
+
+}