Package com.denormans.facebookgwt.samples.client.graph

Source Code of com.denormans.facebookgwt.samples.client.graph.FBGraphObjectDescribers$ShareDescriber

/*
* Copyright (C) 2010 deNormans
* http://www.denormans.com/
* All rights reserved.
*
* This software is the confidential and proprietary information of deNormans ("Confidential Information"). You
* shall not disclose such Confidential Information and shall use it only in accordance with the terms of the license
* agreement you entered into with deNormans.
*
* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
* DENORMANS OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

package com.denormans.facebookgwt.samples.client.graph;

import com.denormans.facebookgwt.api.client.FBGWT;
import com.denormans.facebookgwt.api.client.common.FBJSObject;
import com.denormans.facebookgwt.api.client.graph.model.Account;
import com.denormans.facebookgwt.api.client.graph.model.Activity;
import com.denormans.facebookgwt.api.client.graph.model.Address;
import com.denormans.facebookgwt.api.client.graph.model.Application;
import com.denormans.facebookgwt.api.client.graph.model.Attachment;
import com.denormans.facebookgwt.api.client.graph.model.Book;
import com.denormans.facebookgwt.api.client.graph.model.CheckIn;
import com.denormans.facebookgwt.api.client.graph.model.Comment;
import com.denormans.facebookgwt.api.client.graph.model.Company;
import com.denormans.facebookgwt.api.client.graph.model.Education;
import com.denormans.facebookgwt.api.client.graph.model.EducationYear;
import com.denormans.facebookgwt.api.client.graph.model.Event;
import com.denormans.facebookgwt.api.client.graph.model.FBGraphObject;
import com.denormans.facebookgwt.api.client.graph.model.FriendList;
import com.denormans.facebookgwt.api.client.graph.model.Game;
import com.denormans.facebookgwt.api.client.graph.model.Group;
import com.denormans.facebookgwt.api.client.graph.model.Image;
import com.denormans.facebookgwt.api.client.graph.model.InsightData;
import com.denormans.facebookgwt.api.client.graph.model.Insights;
import com.denormans.facebookgwt.api.client.graph.model.Interest;
import com.denormans.facebookgwt.api.client.graph.model.Language;
import com.denormans.facebookgwt.api.client.graph.model.Link;
import com.denormans.facebookgwt.api.client.graph.model.Location;
import com.denormans.facebookgwt.api.client.graph.model.Message;
import com.denormans.facebookgwt.api.client.graph.model.MessageThread;
import com.denormans.facebookgwt.api.client.graph.model.Movie;
import com.denormans.facebookgwt.api.client.graph.model.Music;
import com.denormans.facebookgwt.api.client.graph.model.Note;
import com.denormans.facebookgwt.api.client.graph.model.Page;
import com.denormans.facebookgwt.api.client.graph.model.Photo;
import com.denormans.facebookgwt.api.client.graph.model.PhotoAlbum;
import com.denormans.facebookgwt.api.client.graph.model.PhotoTag;
import com.denormans.facebookgwt.api.client.graph.model.Place;
import com.denormans.facebookgwt.api.client.graph.model.Post;
import com.denormans.facebookgwt.api.client.graph.model.PostAction;
import com.denormans.facebookgwt.api.client.graph.model.Postable;
import com.denormans.facebookgwt.api.client.graph.model.School;
import com.denormans.facebookgwt.api.client.graph.model.Share;
import com.denormans.facebookgwt.api.client.graph.model.SimpleGraphObject;
import com.denormans.facebookgwt.api.client.graph.model.StatusMessage;
import com.denormans.facebookgwt.api.client.graph.model.Subscription;
import com.denormans.facebookgwt.api.client.graph.model.TelevisionShow;
import com.denormans.facebookgwt.api.client.graph.model.User;
import com.denormans.facebookgwt.api.client.graph.model.Video;
import com.denormans.facebookgwt.api.client.graph.model.Work;
import com.denormans.facebookgwt.api.client.graph.model.WorkPosition;
import com.denormans.facebookgwt.api.client.graph.options.FeedPostOptions;
import com.denormans.facebookgwt.api.shared.graph.ObjectType;
import com.denormans.facebookgwt.samples.client.describe.AbstractObjectDescriber;
import com.denormans.facebookgwt.samples.client.describe.ObjectDescriber;
import com.denormans.facebookgwt.samples.client.describe.ObjectDescription;
import com.denormans.facebookgwt.samples.client.showcase.AbstractAction;
import com.denormans.facebookgwt.samples.client.showcase.AbstractParameterizedAction;

import com.google.gwt.i18n.client.TimeZone;
import com.google.gwt.user.client.rpc.AsyncCallback;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class FBGraphObjectDescribers {
  private Map<ObjectType, ObjectDescriber<? extends FBGraphObject>> objectDescribers = new HashMap<ObjectType, ObjectDescriber<? extends FBGraphObject>>();

  private ObjectDescriber<Address> addressDescriber;
  private ObjectDescriber<Education> educationDescriber;
  private ObjectDescriber<Image> imageDescriber;
  private ObjectDescriber<InsightData> insightDataDescriber;
  private ObjectDescriber<PhotoTag> photoTagDescriber;
  private ObjectDescriber<PostAction> postActionDescriber;
  private ObjectDescriber<Work> workDescriber;

  public FBGraphObjectDescribers() {
    registerDescribers();
  }

  private void registerDescribers() {
    objectDescribers.put(ObjectType.Application, new ApplicationDescriber());
    objectDescribers.put(ObjectType.Attachment, new AttachmentDescriber());
    objectDescribers.put(ObjectType.CheckIn, new CheckInDescriber());
    objectDescribers.put(ObjectType.Comment, new CommentDescriber());
    objectDescribers.put(ObjectType.Event, new EventDescriber());
    objectDescribers.put(ObjectType.FriendList, new FriendListDescriber());
    objectDescribers.put(ObjectType.Game, new GameDescriber());
    objectDescribers.put(ObjectType.Group, new GroupDescriber());
    objectDescribers.put(ObjectType.Insights, new InsightsDescriber());
    objectDescribers.put(ObjectType.Link, new LinkDescriber());
    objectDescribers.put(ObjectType.Message, new MessageDescriber());
    objectDescribers.put(ObjectType.MessageThread, new MessageThreadDescriber());
    objectDescribers.put(ObjectType.Movie, new MovieDescriber());
    objectDescribers.put(ObjectType.Music, new MusicDescriber());
    objectDescribers.put(ObjectType.Note, new NoteDescriber());
    objectDescribers.put(ObjectType.Page, new PageDescriber());
    objectDescribers.put(ObjectType.Photo, new PhotoDescriber());
    objectDescribers.put(ObjectType.PhotoAlbum, new PhotoAlbumDescriber());
    objectDescribers.put(ObjectType.Place, new PlaceDescriber());
    objectDescribers.put(ObjectType.Post, new PostDescriber());
    objectDescribers.put(ObjectType.Share, new ShareDescriber());
    objectDescribers.put(ObjectType.StatusMessage, new StatusMessageDescriber());
    objectDescribers.put(ObjectType.Subscription, new SubscriptionDescriber());
    objectDescribers.put(ObjectType.TelevisionShow, new TelevisionShowDescriber());
    objectDescribers.put(ObjectType.User, new UserDescriber());
    objectDescribers.put(ObjectType.Video, new VideoDescriber());

    objectDescribers.put(ObjectType.Account, new SimpleGraphObjectDescriber<Account>(ObjectType.Account));
    objectDescribers.put(ObjectType.Activity, new SimpleGraphObjectDescriber<Activity>(ObjectType.Activity));
    objectDescribers.put(ObjectType.Book, new SimpleGraphObjectDescriber<Book>(ObjectType.Book));
    objectDescribers.put(ObjectType.Company, new SimpleGraphObjectDescriber<Company>(ObjectType.Company));
    objectDescribers.put(ObjectType.EducationYear, new SimpleGraphObjectDescriber<EducationYear>(ObjectType.EducationYear));
    objectDescribers.put(ObjectType.Interest, new SimpleGraphObjectDescriber<Interest>(ObjectType.Interest));
    objectDescribers.put(ObjectType.Language, new SimpleGraphObjectDescriber<Location>(ObjectType.Language));
    objectDescribers.put(ObjectType.Location, new SimpleGraphObjectDescriber<Location>(ObjectType.Location));
    objectDescribers.put(ObjectType.School, new SimpleGraphObjectDescriber<School>(ObjectType.School));
    objectDescribers.put(ObjectType.WorkPosition, new SimpleGraphObjectDescriber<WorkPosition>(ObjectType.WorkPosition));

    addressDescriber = new AddressDescriber();
    educationDescriber = new EducationDescriber();
    imageDescriber = new ImageDescriber();
    insightDataDescriber = new InsightDataDescriber();
    photoTagDescriber = new PhotoTagDescriber();
    postActionDescriber = new PostActionDescriber();
    workDescriber = new WorkDescriber();
  }

  private ObjectDescriber<Account> getAccountDescriber() {
    return getObjectDescriber(ObjectType.Account);
  }

  private ObjectDescriber<Activity> getActivityDescriber() {
    return getObjectDescriber(ObjectType.Activity);
  }

  private ObjectDescriber<Address> getAddressDescriber() {
    return addressDescriber;
  }

  public ObjectDescriber<Application> getApplicationDescriber() {
    return getObjectDescriber(ObjectType.Application);
  }

  private ObjectDescriber<Attachment> getAttachmentDescriber() {
    return getObjectDescriber(ObjectType.Attachment);
  }

  private ObjectDescriber<Book> getBookDescriber() {
    return getObjectDescriber(ObjectType.Book);
  }

  private ObjectDescriber<CheckIn> getCheckInDescriber() {
    return getObjectDescriber(ObjectType.CheckIn);
  }

  private ObjectDescriber<Comment> getCommentDescriber() {
    return getObjectDescriber(ObjectType.Comment);
  }

  private ObjectDescriber<Company> getCompanyDescriber() {
    return getObjectDescriber(ObjectType.Company);
  }

  private ObjectDescriber<Education> getEducationDescriber() {
    return educationDescriber;
  }

  private ObjectDescriber<EducationYear> getEducationYearDescriber() {
    return getObjectDescriber(ObjectType.EducationYear);
  }

  private ObjectDescriber<Event> getEventDescriber() {
    return getObjectDescriber(ObjectType.Event);
  }

  private ObjectDescriber<FriendList> getFriendListDescriber() {
    return getObjectDescriber(ObjectType.FriendList);
  }

  private ObjectDescriber<Group> getGroupDescriber() {
    return getObjectDescriber(ObjectType.Group);
  }

  private ObjectDescriber<Image> getImageDescriber() {
    return imageDescriber;
  }

  private ObjectDescriber<InsightData> getInsightDataDescriber() {
    return insightDataDescriber;
  }

  private ObjectDescriber<Insights> getInsightsDescriber() {
    return getObjectDescriber(ObjectType.Insights);
  }

  private ObjectDescriber<Interest> getInterestDescriber() {
    return getObjectDescriber(ObjectType.Interest);
  }

  private ObjectDescriber<Language> getLanguageDescriber() {
    return getObjectDescriber(ObjectType.Language);
  }

  private ObjectDescriber<Location> getLocationDescriber() {
    return getObjectDescriber(ObjectType.Location);
  }

  private ObjectDescriber<Link> getLinkDescriber() {
    return getObjectDescriber(ObjectType.Link);
  }

  private ObjectDescriber<Movie> getMovieDescriber() {
    return getObjectDescriber(ObjectType.Movie);
  }

  private ObjectDescriber<Music> getMusicDescriber() {
    return getObjectDescriber(ObjectType.Music);
  }

  private ObjectDescriber<Message> getMessageDescriber() {
    return getObjectDescriber(ObjectType.Message);
  }

  private ObjectDescriber<MessageThread> getMessageThreadDescriber() {
    return getObjectDescriber(ObjectType.MessageThread);
  }

  private ObjectDescriber<Note> getNoteDescriber() {
    return getObjectDescriber(ObjectType.Note);
  }

  private ObjectDescriber<Page> getPageDescriber() {
    return getObjectDescriber(ObjectType.Page);
  }

  private ObjectDescriber<Photo> getPhotoDescriber() {
    return getObjectDescriber(ObjectType.Photo);
  }

  private ObjectDescriber<PhotoAlbum> getPhotoAlbumDescriber() {
    return getObjectDescriber(ObjectType.PhotoAlbum);
  }

  private ObjectDescriber<PhotoTag> getPhotoTagDescriber() {
    return photoTagDescriber;
  }

  public ObjectDescriber<Post> getPostDescriber() {
    return getObjectDescriber(ObjectType.Post);
  }

  public ObjectDescriber<Place> getPlaceDescriber() {
    return getObjectDescriber(ObjectType.Place);
  }

  public ObjectDescriber<PostAction> getPostActionDescriber() {
    return postActionDescriber;
  }

  private ObjectDescriber<School> getSchoolDescriber() {
    return getObjectDescriber(ObjectType.School);
  }

  private ObjectDescriber<Share> getShareDescriber() {
    return getObjectDescriber(ObjectType.Share);
  }

  private ObjectDescriber<StatusMessage> getStatusMessageDescriber() {
    return getObjectDescriber(ObjectType.StatusMessage);
  }

  private ObjectDescriber<Subscription> getSubscriptionDescriber() {
    return getObjectDescriber(ObjectType.Subscription);
  }

  private ObjectDescriber<TelevisionShow> getTelevisionShowDescriber() {
    return getObjectDescriber(ObjectType.TelevisionShow);
  }

  public ObjectDescriber<User> getUserDescriber() {
    return getObjectDescriber(ObjectType.User);
  }

  private ObjectDescriber<Video> getVideoDescriber() {
    return getObjectDescriber(ObjectType.Video);
  }

  private ObjectDescriber<Work> getWorkDescriber() {
    return workDescriber;
  }

  private ObjectDescriber<WorkPosition> getWorkPositionDescriber() {
    return getObjectDescriber(ObjectType.WorkPosition);
  }

  @SuppressWarnings({"unchecked"})
  public <T extends FBGraphObject> ObjectDescriber<T> getObjectDescriber(final ObjectType objectType) {
    return (ObjectDescriber<T>)objectDescribers.get(objectType);
  }

  private static class SimpleGraphObjectDescriber<T extends SimpleGraphObject> extends FBGraphObjectDescriber<T> {
    public SimpleGraphObjectDescriber(final ObjectType objectType) {
      super(objectType);
    }

    @Override
    protected ObjectDescription<T> describeObject(final T obj) {
      return super.describeObject(obj).addValue("Username", obj.getUsername()).addValue("Description", obj.getDescription()).addValue("Picture URL", obj.getPictureURL()).addValue("Page URL", obj.getPageURL()).
          addValue("Website", obj.getWebsite()).addValue("Category", obj.getCategory()).addValue("Biography", obj.getBiography()).addValue("Hometown", obj.getHometown()).addValue("Current Location", obj.getCurrentLocation()).
          addValue("Awards", obj.getAwards()).addValue("# Likes", obj.getNumLikes()).addValue("Is Community Page?", obj.isCommunityPage()).addValue("Can Post?", obj.canPost());
    }
  }

  private abstract class PostableObjectDescriber<T extends Postable> extends AbstractGraphObjectDescriber<T> {
    private ObjectType objectType;

    public PostableObjectDescriber(final ObjectType objectType) {
      this.objectType = objectType;
    }

    @Override
    protected ObjectType getObjectType() {
      return objectType;
    }

    @Override
    protected ObjectDescription<T> describeObject(final T obj) {
      return super.describeObject(obj).addValue("From", getUserDescriber().describe(obj.getFrom())).addValue("Comments", getCommentDescriber().describeList(obj.getComments())).addValue("# Likes", obj.getNumLikes()).
          addValue("Likes", getUserDescriber().describeList(obj.getLikes())).
          addAction("Delete", new AbstractAction<T, Boolean>() {
            @Override
            public void execute(final T obj, final String param, final AsyncCallback<Boolean> callback) {
              FBGWT.Graph.Postable.delete(obj.getFullPostableID(), null, callback);
            }
          }).
          addAction("Comments", new AbstractAction<T, List<ObjectDescription<Comment>>>() {
            @Override
            public void execute(final T obj, final String param, final AsyncCallback<List<ObjectDescription<Comment>>> callback) {
              FBGWT.Graph.Postable.retrieveComments(obj.getID(), null, new ListTransformingCallback<Comment>(getCommentDescriber(), callback));
            }
          }).
          addAction("Post Comment", new AbstractParameterizedAction<T, ObjectDescription<Comment>>() {
            @Override
            public void execute(final T obj, final String param, final AsyncCallback<ObjectDescription<Comment>> callback) {
              FBGWT.Graph.Postable.postComment(obj.getID(), FeedPostOptions.createFeedPostOptions().setMessage(param), new ObjectTransformingCallback<Comment>(getCommentDescriber(), callback));
            }
          }).
          addAction("Likes", new AbstractAction<T, List<ObjectDescription<User>>>() {
            @Override
            public void execute(final T obj, final String param, final AsyncCallback<List<ObjectDescription<User>>> callback) {
              FBGWT.Graph.Postable.retrieveLikedByUsers(obj.getID(), null, new ListTransformingCallback<User>(getUserDescriber(), callback));
            }
          }).
          addAction("Like", new AbstractAction<T, Boolean>() {
            @Override
            public void execute(final T obj, final String param, final AsyncCallback<Boolean> callback) {
              FBGWT.Graph.Postable.like(obj.getFullPostableID(), callback);
            }
          }).
          addAction("Unlike", new AbstractAction<T, Boolean>() {
            @Override
            public void execute(final T obj, final String param, final AsyncCallback<Boolean> callback) {
              FBGWT.Graph.Postable.unlike(obj.getFullPostableID(), callback);
            }
          });
    }
  }

  private static abstract class FBGraphObjectDescriber<T extends FBGraphObject> extends AbstractGraphObjectDescriber<T> {
    private ObjectType objectType;

    public FBGraphObjectDescriber(final ObjectType objectType) {
      this.objectType = objectType;
    }

    @Override
    protected ObjectType getObjectType() {
      return objectType;
    }

    @Override
    protected ObjectDescription<T> describeObject(final T obj) {
      return super.describeObject(obj).addValue("Name", obj.getName());
    }
  }

  private static abstract class AbstractGraphObjectDescriber<T extends FBGraphObject> extends AbstractObjectDescriber<T> {
    @Override
    public String getObjectTypeName(final T obj) {
      return getObjectType().name();
    }

    @Override
    protected ObjectDescription<T> describeObject(final T obj) {
      return new GraphObjectDescription<T>(obj, this, getObjectType()).addValue("ID", obj.getID()).
          addAction("Get " + getObjectTypeName(obj), new AbstractAction<T, ObjectDescription<T>>() {
            @Override
            public void execute(final T obj, final String param, final AsyncCallback<ObjectDescription<T>> callback) {
              retrieveItem(obj.getID(), new ObjectTransformingCallback<T>(AbstractGraphObjectDescriber.this, callback));
            }
          });
    }

    protected abstract ObjectType getObjectType();

    protected void retrieveItem(final String itemID, final AsyncCallback<T> callback) {
      FBGWT.Graph.retrieveItem(itemID, null, callback);
    }

    /**
     * HACK: This is needed because of issue http://bugs.developers.facebook.net/show_bug.cgi?id=10714
     *
     * <tt>/likes/</tt> and <tt>delete</tt> need an ID that looks like USERID_ITEMID
     *
     * @param obj The object
     * @param user The object's user
     *
     * @return The full ID for use with like and delete
     */
    protected String getFullID(final T obj, final User user) {
      String id = obj.getID();
      if (user != null && !id.contains(user.getID())) {
        id = user.getID() + "_" + id;
      }
      return id;
    }
  }

  private static class ObjectTransformingCallback<T extends FBJSObject> implements AsyncCallback<T> {
    private final ObjectDescriber<T> describer;
    private final AsyncCallback<ObjectDescription<T>> callback;

    public ObjectTransformingCallback(final ObjectDescriber<T> describer, final AsyncCallback<ObjectDescription<T>> callback) {
      this.describer = describer;
      this.callback = callback;
    }

    @Override
    public void onFailure(final Throwable caught) {
      callback.onFailure(caught);
    }

    @Override
    public void onSuccess(final T result) {
      callback.onSuccess(describer.describe(result));
    }
  }

  private static class ListTransformingCallback<T extends FBJSObject> implements AsyncCallback<List<T>> {
    private final ObjectDescriber<T> describer;
    private final AsyncCallback<List<ObjectDescription<T>>> callback;

    private ListTransformingCallback(final ObjectDescriber<T> describer, final AsyncCallback<List<ObjectDescription<T>>> callback) {
      this.describer = describer;
      this.callback = callback;
    }

    @Override
    public void onFailure(final Throwable caught) {
      callback.onFailure(caught);
    }

    @Override
    public void onSuccess(final List<T> result) {
      callback.onSuccess(describer.describeList(result));
    }
  }

  private class ApplicationDescriber extends FBGraphObjectDescriber<Application> {
    public ApplicationDescriber() {
      super(ObjectType.Application);
    }

    @Override
    protected ObjectDescription<Application> describeObject(final Application obj) {
      // todo: describe application actions
      return super.describeObject(obj).addValue("Description", obj.getDescription()).addValue("Category", obj.getCategory()).addValue("Page URL", obj.getPageURL());
    }
  }

  private class AttachmentDescriber extends FBGraphObjectDescriber<Attachment> {
    public AttachmentDescriber() {
      super(ObjectType.Attachment);
    }

    @Override
    protected ObjectDescription<Attachment> describeObject(final Attachment obj) {
      // todo: describe attachment
      return super.describeObject(obj);
    }
  }

  private class CheckInDescriber extends PostableObjectDescriber<CheckIn> {
    public CheckInDescriber() {
      super(ObjectType.CheckIn);
    }

    @Override
    protected ObjectDescription<CheckIn> describeObject(final CheckIn obj) {
      // todo: describe check-in
      return super.describeObject(obj).addValue("Message", obj.getMessage()).addValue("Place", getPlaceDescriber().describe(obj.getPlace())).addValue("User Tags", getUserDescriber().describeList(obj.getUserTags())).addValue("Application", getApplicationDescriber().describe(obj.getApplication())).
          addValue("Created Time", obj.getCreatedTime());
    }
  }

  private class CommentDescriber extends FBGraphObjectDescriber<Comment> {
    public CommentDescriber() {
      super(ObjectType.Comment);
    }

    @Override
    protected ObjectDescription<Comment> describeObject(final Comment obj) {
      return super.describeObject(obj).addValue("Message", obj.getMessage()).addValue("From", getUserDescriber().describe(obj.getFrom())).addValue("# Likes", obj.getNumLikes()).addValue("Created Time", obj.getCreatedTime()).
          addAction("Delete", new AbstractAction<Comment, Boolean>() {
            @Override
            public void execute(final Comment obj, final String param, final AsyncCallback<Boolean> callback) {
              FBGWT.Graph.Postable.delete(obj.getID(), null, callback);
            }
          }).
          addAction("Likes", new AbstractAction<Comment, List<ObjectDescription<User>>>() {
            @Override
            public void execute(final Comment obj, final String param, final AsyncCallback<List<ObjectDescription<User>>> callback) {
              FBGWT.Graph.Comment.retrieveLikedByUsers(obj.getID(), null, new ListTransformingCallback<User>(getUserDescriber(), callback));
            }
          }).
          addAction("Like", new AbstractAction<Comment, Boolean>() {
            @Override
            public void execute(final Comment obj, final String param, final AsyncCallback<Boolean> callback) {
              FBGWT.Graph.Comment.like(obj.getFullPostableID(), callback);
            }
          }).
          addAction("Unlike", new AbstractAction<Comment, Boolean>() {
            @Override
            public void execute(final Comment obj, final String param, final AsyncCallback<Boolean> callback) {
              FBGWT.Graph.Comment.unlike(obj.getFullPostableID(), callback);
            }
          });
    }
  }

  private class EventDescriber extends FBGraphObjectDescriber<Event> {
    public EventDescriber() {
      super(ObjectType.Event);
    }

    @Override
    protected ObjectDescription<Event> describeObject(final Event obj) {
      // todo: describe event
      return super.describeObject(obj).addValue("Owner", getUserDescriber().describe(obj.getOwner())).addValue("Description", obj.getDescription()).addValue("Start Time", obj.getStartTime()).addValue("End Time", obj.getEndTime()).
          addValue("Location", obj.getLocation()).addValue("Venue", getAddressDescriber().describe(obj.getVenue())).addValue("Privacy", obj.getPrivacy()).addValue("RSVP Status", obj.getRSVPStatus()).
          addValue("Updated Time", obj.getUpdatedTime());
    }
  }

  private class FriendListDescriber extends FBGraphObjectDescriber<FriendList> {
    public FriendListDescriber() {
      super(ObjectType.FriendList);
    }

    @Override
    protected ObjectDescription<FriendList> describeObject(final FriendList obj) {
      return super.describeObject(obj).
          addAction("Delete", new AbstractAction<FriendList, Boolean>() {
            @Override
            public void execute(final FriendList obj, final String param, final AsyncCallback<Boolean> callback) {
              FBGWT.Graph.FriendList.delete(obj.getID(), null, callback);
            }
          }).
          addAction("Members", new AbstractAction<FriendList, List<ObjectDescription<User>>>() {
            @Override
            public void execute(final FriendList obj, final String param, final AsyncCallback<List<ObjectDescription<User>>> callback) {
              FBGWT.Graph.FriendList.retrieveMembers(obj.getID(), null, new ListTransformingCallback<User>(getUserDescriber(), callback));
            }
          }).
          addAction("Add Member", new AbstractParameterizedAction<FriendList, Boolean>() {
            @Override
            public void execute(final FriendList obj, final String param, final AsyncCallback<Boolean> callback) {
              FBGWT.Graph.FriendList.addMember(obj.getID(), param, callback);
            }
          }).
          addAction("Remove Member", new AbstractParameterizedAction<FriendList, Boolean>() {
            @Override
            public void execute(final FriendList obj, final String param, final AsyncCallback<Boolean> callback) {
              FBGWT.Graph.FriendList.removeMember(obj.getID(), param, callback);
            }
          });
    }
  }

  private static class GameDescriber extends SimpleGraphObjectDescriber<Game> {
    public GameDescriber() {
      super(ObjectType.Game);
    }

    @Override
    protected ObjectDescription<Game> describeObject(final Game obj) {
      return super.describeObject(obj).addValue("Mission", obj.getMission()).addValue("Founded", obj.getFounded()).addValue("Company Overview", obj.getCompanyOverview()).addValue("Products", obj.getProducts());
    }
  }

  private class GroupDescriber extends FBGraphObjectDescriber<Group> {
    public GroupDescriber() {
      super(ObjectType.Group);
    }

    @Override
    protected ObjectDescription<Group> describeObject(final Group obj) {
      // todo: describe group actions
      return super.describeObject(obj).addValue("Version", obj.getVersion()).addValue("Description", obj.getDescription()).addValue("Icon URL", obj.getIconURL()).addValue("Page URL", obj.getPageURL()).
          addValue("Owner", getUserDescriber().describe(obj.getOwner())).addValue("Privacy", obj.getPrivacy()).addValue("Updated Time", obj.getUpdatedTime());
    }
  }

  private class InsightsDescriber extends FBGraphObjectDescriber<Insights> {
    public InsightsDescriber() {
      super(ObjectType.Insights);
    }

    @Override
    protected ObjectDescription<Insights> describeObject(final Insights obj) {
      // todo: describe insights
      return super.describeObject(obj).addValue("Period", obj.getPeriod()).addValue("Values", getInsightDataDescriber().describeList(obj.getValues()));
    }
  }

  private class LinkDescriber extends FBGraphObjectDescriber<Link> {
    public LinkDescriber() {
      super(ObjectType.Link);
    }

    @Override
    protected ObjectDescription<Link> describeObject(final Link obj) {
      // todo: describe link
      return super.describeObject(obj).addValue("URL", obj.getURL()).addValue("Caption", obj.getCaption()).addValue("Description", obj.getDescription()).addValue("Icon URL", obj.getIconURL()).addValue("Thumbnail URL", obj.getThumbnailURL()).
          addValue("Message", obj.getMessage()).addValue("Created Time", obj.getCreatedTime());
    }
  }

  private class MessageDescriber extends FBGraphObjectDescriber<Message> {
    public MessageDescriber() {
      super(ObjectType.Message);
    }

    @Override
    protected ObjectDescription<Message> describeObject(final Message obj) {
      // todo: describe message
      return super.describeObject(obj).addValue("To Users", getUserDescriber().describeList(obj.getToUsers())).addValue("Message", obj.getMessage()).addValue("Created Time", obj.getCreatedTime());
    }
  }

  private class MessageThreadDescriber extends FBGraphObjectDescriber<MessageThread> {
    public MessageThreadDescriber() {
      super(ObjectType.MessageThread);
    }

    @Override
    protected ObjectDescription<MessageThread> describeObject(final MessageThread obj) {
      // todo: describe message thread actions
      return super.describeObject(obj).addValue("Snippet", obj.getSnippet()).addValue("Message Count", obj.getMessageCount()).addValue("Unread Count", obj.getUnreadCount()).addValue("Tags", obj.getTags()).addValue("Updated Time", obj.getUpdatedTime());
    }
  }

  private static class MovieDescriber extends SimpleGraphObjectDescriber<Movie> {
    public MovieDescriber() {
      super(ObjectType.Movie);
    }

    @Override
    protected ObjectDescription<Movie> describeObject(final Movie obj) {
      return super.describeObject(obj).addValue("Directed By", obj.getDirectedBy()).addValue("Screenplay By", obj.getScreenplayBy()).addValue("Plot Outline", obj.getPlotOutline()).addValue("Starring", obj.getStarring()).addValue("Studio", obj.getStudio());
    }
  }

  private static class MusicDescriber extends SimpleGraphObjectDescriber<Music> {
    public MusicDescriber() {
      super(ObjectType.Music);
    }

    @Override
    protected ObjectDescription<Music> describeObject(final Music obj) {
      return super.describeObject(obj).addValue("Genre", obj.getGenre()).addValue("Band Members", obj.getBandMembers()).addValue("Record Label", obj.getRecordLabel());
    }
  }

  private class NoteDescriber extends PostableObjectDescriber<Note> {
    public NoteDescriber() {
      super(ObjectType.Note);
    }

    @Override
    protected ObjectDescription<Note> describeObject(final Note obj) {
      // todo: describe note
      return super.describeObject(obj).addValue("Subject", obj.getSubject()).addValue("Message", obj.getMessage()).addValue("Icon URL", obj.getIconURL()).addValue("Created Time", obj.getCreatedTime()).addValue("Updated Time", obj.getUpdatedTime());
    }
  }

  private class PageDescriber extends SimpleGraphObjectDescriber<Page> {
    public PageDescriber() {
      super(ObjectType.Page);
    }

    @Override
    protected ObjectDescription<Page> describeObject(final Page obj) {
      // todo: describe page
      return super.describeObject(obj);
    }
  }

  private class PhotoDescriber extends PostableObjectDescriber<Photo> {
    public PhotoDescriber() {
      super(ObjectType.Photo);
    }

    @Override
    protected ObjectDescription<Photo> describeObject(final Photo obj) {
      // todo: describe photo actions
      return super.describeObject(obj).addValue("Name", obj.getName()).addValue("Page URL", obj.getPageURL()).addValue("Icon URL", obj.getIconURL()).addValue("Tags", getPhotoTagDescriber().describeList(obj.getTags())).
          addValue("Full Size Image", getImageDescriber().describe(obj.getFullSizeImage())).addValue("Images", getImageDescriber().describeList(obj.getImages())).addValue("Album Position", obj.getAlbumPosition()).
          addValue("Created Time", obj.getCreatedTime()).addValue("Updated Time", obj.getUpdatedTime());
    }
  }

  private class PhotoAlbumDescriber extends FBGraphObjectDescriber<PhotoAlbum> {
    public PhotoAlbumDescriber() {
      super(ObjectType.PhotoAlbum);
    }

    @Override
    protected ObjectDescription<PhotoAlbum> describeObject(final PhotoAlbum obj) {
      return super.describeObject(obj).addValue("From", getUserDescriber().describe(obj.getFrom())).addValue("Description", obj.getDescription()).addValue("Location", obj.getLocation()).addValue("Page URL", obj.getPageURL()).
          addValue("# Photos", obj.getNumPhotos()).addValue("Type", obj.getType()).addValue("Privacy", obj.getPrivacy()).addValue("Created Time", obj.getCreatedTime()).addValue("Updated Time", obj.getUpdatedTime()).
          addAction("Photos", new AbstractAction<PhotoAlbum, List<ObjectDescription<Photo>>>() {
            @Override
            public void execute(final PhotoAlbum obj, final String param, final AsyncCallback<List<ObjectDescription<Photo>>> callback) {
              FBGWT.Graph.PhotoAlbum.retrievePhotos(obj.getID(), null, new ListTransformingCallback<Photo>(getPhotoDescriber(), callback));
            }
          }).
          addAction("Comments", new AbstractAction<PhotoAlbum, List<ObjectDescription<Comment>>>() {
            @Override
            public void execute(final PhotoAlbum obj, final String param, final AsyncCallback<List<ObjectDescription<Comment>>> callback) {
              FBGWT.Graph.PhotoAlbum.retrieveComments(obj.getID(), null, new ListTransformingCallback<Comment>(getCommentDescriber(), callback));
            }
          });
    }
  }

  private class PlaceDescriber extends SimpleGraphObjectDescriber<Place> {
    public PlaceDescriber() {
      super(ObjectType.Place);
    }

    @Override
    protected ObjectDescription<Place> describeObject(final Place obj) {
      // todo: describe place
      return super.describeObject(obj).addValue("Location", getAddressDescriber().describe(obj.getLocation()));
    }
  }

  private class PostDescriber extends PostableObjectDescriber<Post> {
    public PostDescriber() {
      super(ObjectType.Post);
    }

    @Override
    protected ObjectDescription<Post> describeObject(final Post obj) {
      // todo: describe post
      return super.describeObject(obj).addValue("Mentioned Users", getUserDescriber().describeList(obj.getMentionedUsers())).addValue("Message", obj.getMessage()).addValue("Picture URL", obj.getPictureURL()).
          addValue("Link URL", obj.getLinkURL()).addValue("Caption", obj.getCaption()).addValue("Description", obj.getDescription()).addValue("Source URL", obj.getSourceURL()).addValue("Icon URL", obj.getIconURL()).
          addValue("Application Attribution", obj.getApplicationAttribution()).addValue("Actions", getPostActionDescriber().describeList(obj.getActions())).addValue("Target Restrictions", obj.getTargetRestrictions()).
          addValue("Created Time", obj.getCreatedTime()).addValue("Updated Time", obj.getUpdatedTime()).
          addAction("Delete", new AbstractAction<Post, Boolean>() {
            @Override
            public void execute(final Post obj, final String param, final AsyncCallback<Boolean> callback) {
              FBGWT.Graph.deleteItem(obj.getID(), null, callback);
            }
          });
    }
  }

  private class ShareDescriber extends FBGraphObjectDescriber<Share> {
    public ShareDescriber() {
      super(ObjectType.Share);
    }

    @Override
    protected ObjectDescription<Share> describeObject(final Share obj) {
      // todo: describe share
      return super.describeObject(obj);
    }
  }

  private class StatusMessageDescriber extends PostableObjectDescriber<StatusMessage> {
    public StatusMessageDescriber() {
      super(ObjectType.StatusMessage);
    }

    @Override
    protected ObjectDescription<StatusMessage> describeObject(final StatusMessage obj) {
      return super.describeObject(obj).addValue("Message", obj.getMessage()).addValue("Updated Time", obj.getUpdatedTime());

    }
  }

  private class SubscriptionDescriber extends FBGraphObjectDescriber<Subscription> {
    public SubscriptionDescriber() {
      super(ObjectType.Subscription);
    }

    @Override
    protected ObjectDescription<Subscription> describeObject(final Subscription obj) {
      // todo: describe subscription actions
      return super.describeObject(obj).addValue("Object Type", obj.getObjectType()).addValue("Fields", obj.getFields()).addValue("Callback URL", obj.getCallbackURL()).addValue("Is Active?", obj.isActive());
    }
  }

  private static class TelevisionShowDescriber extends SimpleGraphObjectDescriber<TelevisionShow> {
    public TelevisionShowDescriber() {
      super(ObjectType.TelevisionShow);
    }

    @Override
    protected ObjectDescription<TelevisionShow> describeObject(final TelevisionShow obj) {
      return super.describeObject(obj).addValue("Starring", obj.getStarring()).addValue("Written By", obj.getWrittenBy()).addValue("Plot Outline", obj.getPlotOutline()).addValue("Network", obj.getNetwork()).
          addValue("Season", obj.getSeason()).addValue("Schedule", obj.getSchedule());
    }
  }

  private class UserDescriber extends FBGraphObjectDescriber<User> {
    public UserDescriber() {
      super(ObjectType.User);
    }

    @Override
    protected ObjectDescription<User> describeObject(final User obj) {
      // todo: describe user content actions
      final ObjectDescriber<User> describer = this;
      TimeZone timeZone = obj.getTimeZone();
      return super.describeObject(obj).addValue("Name", obj.getName()).addValue("First Name", obj.getFirstName()).addValue("Last Name", obj.getLastName()).addValue("Link", obj.getLink()).addValue("About", obj.getAbout()).
          addValue("Birthday", obj.getBirthday()). addValue("Work", getWorkDescriber().describeList(obj.getWork())).addValue("Education", getEducationDescriber().describeList(obj.getEducation())).addValue("Email", obj.getEmail()).
          addValue("Website", obj.getWebsite()). addValue("Location", getLocationDescriber().describe(obj.getLocation())).addValue("Biography", obj.getBiography()).addValue("Quotes", obj.getQuotes()).addValue("Gender", obj.getGender()).
          addValue("Interested in", obj.getInterestedIn()).addValue("Seeking", obj.getSeeking()).addValue("Religion", obj.getReligion()).addValue("Political Affiliation", obj.getPoliticalAffiliation()).
          addValue("Verified", obj.isVerified()).addValue("Significant Other", describe(obj.getSignificantOther())).addValue("Time Zone", timeZone != null ? timeZone.getID() : null).addValue("Third-Party ID", obj.getThirdPartyID()).
          addValue("Locale", obj.getLocale()).addValue("Address", getAddressDescriber().describe(obj.getAddress())).addValue("Mobile Phone", obj.getMobilePhone()).addValue("Relationship Status", obj.getRelationshipStatus()).
          addValue("Languages", getLanguageDescriber().describeList(obj.getLanguages())).addValue("Updated Time", obj.getUpdatedTime()).
          addAction("Home Feed", new AbstractAction<User, List<ObjectDescription<Post>>>() {
            @Override
            public void execute(final User obj, final String param, final AsyncCallback<List<ObjectDescription<Post>>> callback) {
              FBGWT.Graph.User.retrieveHomeFeed(obj.getID(), null, new ListTransformingCallback<Post>(getPostDescriber(), callback));
            }
          }).
              addAction("Wall Feed", new AbstractAction<User, List<ObjectDescription<Post>>>() {
                @Override
                public void execute(final User obj, final String param, final AsyncCallback<List<ObjectDescription<Post>>> callback) {
                  FBGWT.Graph.User.retrieveWallFeed(obj.getID(), null, new ListTransformingCallback<Post>(getPostDescriber(), callback));
                }
              }).
              addAction("Post to Wall", new AbstractParameterizedAction<User, ObjectDescription<Post>>() {
                @Override
                public void execute(final User obj, final String param, final AsyncCallback<ObjectDescription<Post>> callback) {
                  FeedPostOptions postOptions = FeedPostOptions.createFeedPostOptions().setMessage(param);
                  FBGWT.Graph.User.postToWall(obj.getID(), postOptions, new ObjectTransformingCallback<Post>(getPostDescriber(), callback));
                }
              }).
              addAction("Tagged In", new AbstractAction<User, List<ObjectDescription<Post>>>() {
                @Override
                public void execute(final User obj, final String param, final AsyncCallback<List<ObjectDescription<Post>>> callback) {
                  FBGWT.Graph.User.retrieveTaggedIn(obj.getID(), null, new ListTransformingCallback<Post>(getPostDescriber(), callback));
                }
              }).
              addAction("Posts", new AbstractAction<User, List<ObjectDescription<Post>>>() {
                @Override
                public void execute(final User obj, final String param, final AsyncCallback<List<ObjectDescription<Post>>> callback) {
                  FBGWT.Graph.User.retrievePosts(obj.getID(), null, new ListTransformingCallback<Post>(getPostDescriber(), callback));
                }
              }).
              addAction("Friends", new AbstractAction<User, List<ObjectDescription<User>>>() {
                @Override
                public void execute(final User obj, final String param, final AsyncCallback<List<ObjectDescription<User>>> callback) {
                  FBGWT.Graph.User.retrieveFriends(obj.getID(), null, new ListTransformingCallback<User>(describer, callback));
                }
              }).
              addAction("Activities", new AbstractAction<User, List<ObjectDescription<Activity>>>() {
                @Override
                public void execute(final User obj, final String param, final AsyncCallback<List<ObjectDescription<Activity>>> callback) {
                  FBGWT.Graph.User.retrieveActivities(obj.getID(), null, new ListTransformingCallback<Activity>(getActivityDescriber(), callback));
                }
              }).
              addAction("Interests", new AbstractAction<User, List<ObjectDescription<Interest>>>() {
                @Override
                public void execute(final User obj, final String param, final AsyncCallback<List<ObjectDescription<Interest>>> callback) {
                  FBGWT.Graph.User.retrieveInterests(obj.getID(), null, new ListTransformingCallback<Interest>(getInterestDescriber(), callback));
                }
              }).
              addAction("Music", new AbstractAction<User, List<ObjectDescription<Music>>>() {
                @Override
                public void execute(final User obj, final String param, final AsyncCallback<List<ObjectDescription<Music>>> callback) {
                  FBGWT.Graph.User.retrieveMusic(obj.getID(), null, new ListTransformingCallback<Music>(getMusicDescriber(), callback));
                }
              }).
              addAction("Books", new AbstractAction<User, List<ObjectDescription<Book>>>() {
                @Override
                public void execute(final User obj, final String param, final AsyncCallback<List<ObjectDescription<Book>>> callback) {
                  FBGWT.Graph.User.retrieveBooks(obj.getID(), null, new ListTransformingCallback<Book>(getBookDescriber(), callback));
                }
              }).
              addAction("Movies", new AbstractAction<User, List<ObjectDescription<Movie>>>() {
                @Override
                public void execute(final User obj, final String param, final AsyncCallback<List<ObjectDescription<Movie>>> callback) {
                  FBGWT.Graph.User.retrieveMovies(obj.getID(), null, new ListTransformingCallback<Movie>(getMovieDescriber(), callback));
                }
              }).
              addAction("Television Shows", new AbstractAction<User, List<ObjectDescription<TelevisionShow>>>() {
                @Override
                public void execute(final User obj, final String param, final AsyncCallback<List<ObjectDescription<TelevisionShow>>> callback) {
                  FBGWT.Graph.User.retrieveTelevisionShows(obj.getID(), null, new ListTransformingCallback<TelevisionShow>(getTelevisionShowDescriber(), callback));
                }
              }).
              addAction("Liked Pages", new AbstractAction<User, List<ObjectDescription<Page>>>() {
                @Override
                public void execute(final User obj, final String param, final AsyncCallback<List<ObjectDescription<Page>>> callback) {
                  FBGWT.Graph.User.retrieveLikedPages(obj.getID(), null, new ListTransformingCallback<Page>(getPageDescriber(), callback));
                }
              }).
              addAction("Photos", new AbstractAction<User, List<ObjectDescription<Photo>>>() {
                @Override
                public void execute(final User obj, final String param, final AsyncCallback<List<ObjectDescription<Photo>>> callback) {
                  FBGWT.Graph.User.retrievePhotos(obj.getID(), null, new ListTransformingCallback<Photo>(getPhotoDescriber(), callback));
                }
              }).
              addAction("Photo Albums", new AbstractAction<User, List<ObjectDescription<PhotoAlbum>>>() {
                @Override
                public void execute(final User obj, final String param, final AsyncCallback<List<ObjectDescription<PhotoAlbum>>> callback) {
                  FBGWT.Graph.User.retrievePhotoAlbums(obj.getID(), null, new ListTransformingCallback<PhotoAlbum>(getPhotoAlbumDescriber(), callback));
                }
              }).
              addAction("Videos", new AbstractAction<User, List<ObjectDescription<Video>>>() {
                @Override
                public void execute(final User obj, final String param, final AsyncCallback<List<ObjectDescription<Video>>> callback) {
                  FBGWT.Graph.User.retrieveVideos(obj.getID(), null, new ListTransformingCallback<Video>(getVideoDescriber(), callback));
                }
              }).
              addAction("Groups", new AbstractAction<User, List<ObjectDescription<Group>>>() {
                @Override
                public void execute(final User obj, final String param, final AsyncCallback<List<ObjectDescription<Group>>> callback) {
                  FBGWT.Graph.User.retrieveGroups(obj.getID(), null, new ListTransformingCallback<Group>(getGroupDescriber(), callback));
                }
              }).
              addAction("Status Messages", new AbstractAction<User, List<ObjectDescription<StatusMessage>>>() {
                @Override
                public void execute(final User obj, final String param, final AsyncCallback<List<ObjectDescription<StatusMessage>>> callback) {
                  FBGWT.Graph.User.retrieveStatusMessages(obj.getID(), null, new ListTransformingCallback<StatusMessage>(getStatusMessageDescriber(), callback));
                }
              }).
              addAction("Links", new AbstractAction<User, List<ObjectDescription<Link>>>() {
                @Override
                public void execute(final User obj, final String param, final AsyncCallback<List<ObjectDescription<Link>>> callback) {
                  FBGWT.Graph.User.retrieveLinks(obj.getID(), null, new ListTransformingCallback<Link>(getLinkDescriber(), callback));
                }
              }).
              addAction("Notes", new AbstractAction<User, List<ObjectDescription<Note>>>() {
                @Override
                public void execute(final User obj, final String param, final AsyncCallback<List<ObjectDescription<Note>>> callback) {
                  FBGWT.Graph.User.retrieveNotes(obj.getID(), null, new ListTransformingCallback<Note>(getNoteDescriber(), callback));
                }
              }).
              addAction("Events", new AbstractAction<User, List<ObjectDescription<Event>>>() {
                @Override
                public void execute(final User obj, final String param, final AsyncCallback<List<ObjectDescription<Event>>> callback) {
                  FBGWT.Graph.User.retrieveEvents(obj.getID(), null, new ListTransformingCallback<Event>(getEventDescriber(), callback));
                }
              }).
              addAction("Message Threads", new AbstractAction<User, List<ObjectDescription<MessageThread>>>() {
                @Override
                public void execute(final User obj, final String param, final AsyncCallback<List<ObjectDescription<MessageThread>>> callback) {
                  FBGWT.Graph.User.retrieveMessageThreads(obj.getID(), null, new ListTransformingCallback<MessageThread>(getMessageThreadDescriber(), callback));
                }
              }).
              addAction("Inbox", new AbstractAction<User, List<ObjectDescription<Note>>>() {
                @Override
                public void execute(final User obj, final String param, final AsyncCallback<List<ObjectDescription<Note>>> callback) {
                  FBGWT.Graph.User.retrieveInbox(obj.getID(), null, new ListTransformingCallback<Note>(getNoteDescriber(), callback));
                }
              }).
              addAction("Outbox", new AbstractAction<User, List<ObjectDescription<Note>>>() {
                @Override
                public void execute(final User obj, final String param, final AsyncCallback<List<ObjectDescription<Note>>> callback) {
                  FBGWT.Graph.User.retrieveOutbox(obj.getID(), null, new ListTransformingCallback<Note>(getNoteDescriber(), callback));
                }
              }).
              addAction("Updates", new AbstractAction<User, List<ObjectDescription<Note>>>() {
                @Override
                public void execute(final User obj, final String param, final AsyncCallback<List<ObjectDescription<Note>>> callback) {
                  FBGWT.Graph.User.retrieveUpdates(obj.getID(), null, new ListTransformingCallback<Note>(getNoteDescriber(), callback));
                }
              }).
              addAction("Accounts", new AbstractAction<User, List<ObjectDescription<Account>>>() {
                @Override
                public void execute(final User obj, final String param, final AsyncCallback<List<ObjectDescription<Account>>> callback) {
                  FBGWT.Graph.User.retrieveAccounts(obj.getID(), null, new ListTransformingCallback<Account>(getAccountDescriber(), callback));
                }
              }).
              addAction("Check-ins", new AbstractAction<User, List<ObjectDescription<CheckIn>>>() {
                @Override
                public void execute(final User obj, final String param, final AsyncCallback<List<ObjectDescription<CheckIn>>> callback) {
                  FBGWT.Graph.User.retrieveCheckIns(obj.getID(), null, new ListTransformingCallback<CheckIn>(getCheckInDescriber(), callback));
                }
              }).
              addAction("Friend Lists", new AbstractAction<User, List<ObjectDescription<FriendList>>>() {
                @Override
                public void execute(final User obj, final String param, final AsyncCallback<List<ObjectDescription<FriendList>>> callback) {
                  FBGWT.Graph.User.retrieveFriendLists(obj.getID(), null, new ListTransformingCallback<FriendList>(getFriendListDescriber(), callback));
                }
              }).
              addAction("Create Friend List", new AbstractParameterizedAction<User, ObjectDescription<FriendList>>() {
                @Override
                public void execute(final User obj, final String param, final AsyncCallback<ObjectDescription<FriendList>> callback) {
                  FBGWT.Graph.User.createFriendList(obj.getID(), param, new ObjectTransformingCallback<FriendList>(getFriendListDescriber(), callback));
                }
              });
    }
  }

  private class VideoDescriber extends PostableObjectDescriber<Video> {
    public VideoDescriber() {
      super(ObjectType.Video);
    }

    @Override
    protected ObjectDescription<Video> describeObject(final Video obj) {
      return super.describeObject(obj).addValue("Tags", getUserDescriber().describeList(obj.getTags())).addValue("Embed HTML URL", obj.getEmbedHTMLURL()).addValue("Icon URL", obj.getIconURL()).
          addValue("Source URL", obj.getSourceURL()).addValue("Created Time", obj.getCreatedTime()).addValue("Updated Time", obj.getUpdatedTime());
    }
  }

  // non graph objects
  private class AddressDescriber extends AbstractObjectDescriber<Address> {
    @Override
    public String getObjectTypeName(final Address obj) {
      return "Address";
    }

    @Override
    protected ObjectDescription<Address> describeObject(final Address obj) {
      return new ObjectDescription<Address>(obj, this).addValue("Street", obj.getStreet()).addValue("City", obj.getCity()).addValue("State", obj.getState()).addValue("Country", obj.getCountry()).addValue("Postal Code", obj.getPostalCode()).
          addValue("Has Latitude/Longitude?", obj.hasLatitudeAndLongitude()).addValue("Latitude", obj.getLatitude()).addValue("Longitude", obj.getLongitude());
    }
  }

  private class EducationDescriber extends AbstractObjectDescriber<Education> {
    @Override
    public String getObjectTypeName(final Education obj) {
      return "Education";
    }

    @Override
    public ObjectDescription<Education> describeObject(final Education obj) {
      return new ObjectDescription<Education>(obj, this).addValue("School", getSchoolDescriber().describe(obj.getSchool())).addValue("Year", getEducationYearDescriber().describe(obj.getYear())).addValue("Type", obj.getType());
    }
  }

  private class ImageDescriber extends AbstractObjectDescriber<Image> {
    @Override
    public String getObjectTypeName(final Image obj) {
      return "Image";
    }

    @Override
    public ObjectDescription<Image> describeObject(final Image obj) {
      return new ObjectDescription<Image>(obj, this).addValue("Photo URL", obj.getImageURL()).addValue("Height", obj.getHeight()).addValue("Width", obj.getWidth());
    }
  }

  private class InsightDataDescriber extends AbstractObjectDescriber<InsightData> {
    @Override
    public String getObjectTypeName(final InsightData obj) {
      return "Insight Data";
    }

    @Override
    public ObjectDescription<InsightData> describeObject(final InsightData obj) {
      return new ObjectDescription<InsightData>(obj, this).addValue("Value", obj.getValue()).addValue("End Time", obj.getEndTime());
    }
  }

  private class PhotoTagDescriber extends AbstractObjectDescriber<PhotoTag> {
    @Override
    public String getObjectTypeName(final PhotoTag obj) {
      return "Photo Tag";
    }

    @Override
    public ObjectDescription<PhotoTag> describeObject(final PhotoTag obj) {
      return new ObjectDescription<PhotoTag>(obj, this).addValue("Tagged User", getUserDescriber().describe(obj.getTaggedUser())).addValue("X", obj.getX()).addValue("Y", obj.getY());
    }
  }

  private class PostActionDescriber extends AbstractObjectDescriber<PostAction> {
    @Override
    public String getObjectTypeName(final PostAction obj) {
      return "Post Action";
    }

    @Override
    public ObjectDescription<PostAction> describeObject(final PostAction obj) {
      return new ObjectDescription<PostAction>(obj, this).addValue("Name", obj.getName()).addValue("URL", obj.getURL());
    }
  }

  private class WorkDescriber extends AbstractObjectDescriber<Work> {
    @Override
    public String getObjectTypeName(final Work obj) {
      return "Work";
    }

    @Override
    public ObjectDescription<Work> describeObject(final Work obj) {
      return new ObjectDescription<Work>(obj, this).addValue("Employer", getCompanyDescriber().describe(obj.getEmployer())).addValue("Location", getLocationDescriber().describe(obj.getLocation())).
          addValue("Position", getWorkPositionDescriber().describe(obj.getPosition())).addValue("Start Date", obj.getStartDate()).addValue("End Date", obj.getEndDate());
    }
  }
}
TOP

Related Classes of com.denormans.facebookgwt.samples.client.graph.FBGraphObjectDescribers$ShareDescriber

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.