com.facebook.api.TemplatizedAction Maven / Gradle / Ivy
The newest version!
/*
* Copyright 2007, BigTribe Corporation. All rights reserved.
*
* This software is an unpublished work subject to a confidentiality agreement
* and protected by copyright and trade secret law. Unauthorized copying,
* redistribution or other use of this work is prohibited. All copies must
* retain this copyright notice. Any use or exploitation of this work without
* authorization could subject the perpetrator to criminal and civil liability.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* The information in this software is subject to change without notice
* and should not be construed as a commitment by BigTribe Corporation.
*
* The above copyright notice does not indicate actual or intended publication
* of this source code.
*
* $Id: bigtribetemplates.xml 5524 2006-04-06 09:40:52 -0700 (Thu, 06 Apr 2006) greening $
*/
package com.facebook.api;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.json.JSONException;
import org.json.JSONObject;
/**
* Utility class to assist in creating a templatized action for publishing to the
* minifeed/newsfeed, because the API call Facebook decided to add in order to do
* it is ridiculously complex.
*/
public class TemplatizedAction {
private String titleTemplate;
private String bodyTemplate;
private String bodyGeneral;
private String targetIds;
private JSONObject titleParams;
private JSONObject bodyParams;
private List> pictures;
private TemplatizedAction() {
//empty constructor not allowed, at a minimum the titleTemplate parameter is needed
}
/**
* Constructor
*
* @param titleTemplate the title-template to set.
*/
public TemplatizedAction(String titleTemplate) {
this.setTitleTemplate(titleTemplate);
this.titleParams = new JSONObject();
this.bodyParams = new JSONObject();
this.bodyTemplate = null;
this.bodyGeneral = null;
this.targetIds = null;
this.pictures = new ArrayList>();
}
/**
* Constructor
*
* @param titleTemplate the title template to use
* @param bodyTemplate the body template to use
*/
public TemplatizedAction(String titleTemplate, String bodyTemplate) {
this(titleTemplate);
this.setBodyTemplate(bodyTemplate);
this.bodyGeneral = null;
this.targetIds = null;
}
/**
* Constructor
*
* @param titleTemplate the title template to use
* @param bodyTemplate the body template to use
* @param bodyGeneral the non-templatized body content to use
*/
public TemplatizedAction (String titleTemplate, String bodyTemplate, String bodyGeneral) {
this(titleTemplate, bodyTemplate);
this.setBodyGeneral(bodyGeneral);
this.targetIds = null;
}
/**
* Remove a picture from the list, this can be used to revise the list/free up space for alternate pictures.
*
* @param index the index to remove from.
*/
public void removePicture(int index) {
if ((this.pictures == null) || (index > this.pictures.size())) {
return;
}
this.pictures.remove(index);
}
/**
* Add a picture to be associated with this feed entry, along with a link to be associated with the picture (clicking
* on the picture in the feed will go to the specified link).
*
* Note that only 4 pictures may be present at any given time. Any pictures beyond this are ignored. Use removePicture
* if you need to change something after 4 pictures have been added.
*
* @param imageHref the URL of the image to display in the feed.
* @param linkHref the URL of the link to go to when the image is clicked.
*/
public void addPicture(String imageHref, String linkHref) {
if (linkHref == null) {
this.addPicture(imageHref);
}
try {
addPicture(new URL(imageHref), new URL(linkHref));
}
catch (Exception e) {
System.out.println("Could not add entry for picture!");
e.printStackTrace();
}
}
/**
* Add a picture to be associated with this feed entry, the picture will not have an associated link.
*
* Note that only 4 pictures may be present at any given time. Any pictures beyond this are ignored. Use removePicture
* if you need to change something after 4 pictures have been added.
*
* @param imageHref the URL of the image to display in the feed.
*/
public void addPicture(String imageHref) {
try {
addPicture(new URL(imageHref), null);
}
catch (Exception e) {
System.out.println("Could not add entry for picture!");
e.printStackTrace();
}
}
private void addPicture(URL imageUrl, URL linkUrl) {
if (this.pictures == null) {
this.pictures = new ArrayList>();
}
if (this.pictures.size() < 4) {
this.pictures.add(new Pair(imageUrl, linkUrl));
}
}
/**
* Set the pictures to display all at once, if you feel like building the Collection> on your own. Otherwise
* use the more convenient addPic() method instead.
*
* @param pics the pictures to set.
*/
public void setPictures(List> pics) {
if ((pics == null) || (pics.isEmpty())) {
this.pictures = null;
return;
}
if (pics.size() <= 4) {
this.pictures = pics;
}
if (pics.size() > 4) {
int count = 0;
for (Pair pic : pics) {
this.pictures.add(pic);
count++;
if (count == 4) {
break;
}
}
}
}
/**
* Get the list of pictures.
*
* @return the list of pictures.
*/
public Collection> getPictures() {
if ((this.pictures == null) || (this.pictures.isEmpty())) {
return null;
}
return this.pictures;
}
/**
* Add a parameter value for the title template. It will be used to replace the corresponding token when
* the feed entry is rendered.
*
* @param key the name of the parameter/token.
* @param value the value to set it to.
*/
public void addTitleParam(String key, String value) {
addParam(titleParams, key, value);
}
/**
* Add a parameter value for the body template. It will be used to replace the corresponding token when
* the feed entry is rendered.
*
* @param key the name of the parameter/token.
* @param value the value to set it to.
*/
public void addBodyParam(String key, String value) {
addParam(bodyParams, key, value);
}
private void addParam(JSONObject map, String key, String value) {
if (("actor".equals(key)) || ("target".equals(key))) {
throw new RuntimeException(key + " is a reserved token name, you cannot set it yourself!");
}
try {
map.put(key, value);
}
catch (JSONException e) {
System.out.println("JSONException for key=" + key + ", value=" + value + "!");
e.printStackTrace();
}
}
/**
* Get the title params as a JSON-formatted string.
*
* @return the parameters for the templatized title tokens.
*/
public String getTitleParams() {
return getJsonParams(titleParams);
}
/**
* Get the body params as a JSON-formatted string.
*
* @return the parameters for the templatized body tokens.
*/
public String getBodyParams() {
return getJsonParams(bodyParams);
}
private String getJsonParams(JSONObject params) {
if (params.length() == 0) {
return null;
}
return params.toString();
}
/**
* @return the bodyGeneral
*/
public String getBodyGeneral() {
return bodyGeneral;
}
/**
* Set the general body content for this feed entry. This is optional, non-templatized markup, and is distinct from and unrelated
* to bodyTemplate. A feed entry can have both at once, either or, or neither.
*
* @param bodyGeneral non-templatized markup that will be displayed in this feed entry. When multiple entries are aggregated, only
* the bodyGeneral from (an arbitrarily chosen) one of them will appear in the aggregate entry, meaning that any
* markup specified here must be generic enough that it can make sense in any context.
*/
public void setBodyGeneral(String bodyGeneral) {
if ("".equals(bodyGeneral)) {
bodyGeneral = null;
}
this.bodyGeneral = bodyGeneral;
}
/**
* @return the bodyTemplate
*/
public String getBodyTemplate() {
return bodyTemplate;
}
/**
* Set the body template for this feed entry. The body template is optinal.
*
* @param bodyTemplate templatized markup that will be used to compute the body section of this feed entry. Unlike titleTemplate,
* this markup *is not* required to utilize the "{actor}" token, although you may choose to use any desired tokens
* in this section if you wish.
*/
public void setBodyTemplate(String bodyTemplate) {
if ("".equals(bodyTemplate)) {
bodyTemplate = null;
}
this.bodyTemplate = bodyTemplate;
}
/**
* @return the targetIds
*/
public String getTargetIds() {
if ("".equals(targetIds)) {
targetIds = null;
}
return targetIds;
}
/**
* Set the target ids of friends who are associated with this action. This must be specified if you have used the "{target}" token
* in any of your markup.
*
* This method will clear out any previously added target ids. To append additional target ids to a previous list, use addTargetIds
* instead.
*
* @param targetIds a comma-seperated list of Facebook UID's representing any friends of the current user who are associated with
* the action being published (so if the action is "Bob waves to Sally and Susie", Sally and Susie are the targets).
*/
public void setTargetIds(String targetIds) {
if ("".equals(targetIds)) {
targetIds = null;
}
this.targetIds = targetIds;
}
/**
* Append to the list of friends who are associated with this action.
*
* This method *will not* clear out any previously added target ids.
*
* @param newIds a comma-seperated list of Facebook UID's representing any friends of the current user who are associated with
* the action being published (so if the action is "Bob waves to Sally and Susie", Sally and Susie are the targets).
*/
public void addTargetIds(String newIds) {
if (this.targetIds == null) {
this.targetIds = "";
}
if (! "".equals(this.targetIds)) {
this.targetIds += ",";
}
this.targetIds += newIds;
}
/**
* Set the target ids of friends who are associated with this action. This must be specified if you have used the "{target}" token
* in any of your markup.
*
* This method will clear out any previously added target ids. To append additional target ids to a previous list, use addTargetIds
* instead.
*
* @param facebookIds a list of all the Facebook UID to specify as targets. The elements in the collection may only be of type Integer
* or type String.
*/
public void setTargetIds(Collection