package net.gjerull.etherpad.client;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
* A client for talking to Etherpad Lite's HTTP JSON API.
*
* Example:
*
*
* EPLiteClient api = new EPLiteClient("http://etherpad.mysite.com", "FJ7jksalksdfj83jsdflkj");
* Map pad = api.getText("my_pad");
* String pad = pad.get("text").toString();
*
*/
public class EPLiteClient {
private static final String DEFAULT_API_VERSION = "1.2.13";
private static final String DEFAULT_ENCODING = "UTF-8";
private final EPLiteConnection connection;
/**
* Initializes a new net.gjerull.etherpad.client.EPLiteClient object.
* The default Etherpad Lite API version (in DEFAULT_API_VERSION) will be used.
*
* @param url an absolute url, including protocol, to the EPL api
* @param apiKey the API Key
*/
public EPLiteClient(String url, String apiKey) {
this.connection = new EPLiteConnection(url, apiKey, DEFAULT_API_VERSION, DEFAULT_ENCODING);
}
/**
* Initializes a new net.gjerull.etherpad.client.EPLiteClient object.
* The specified Etherpad Lite API version will be used.
*
* @param url an absolute url, including protocol, to the EPL api
* @param apiKey the API Key
* @param apiVersion the API version
*/
public EPLiteClient(String url, String apiKey, String apiVersion, String encoding) {
this.connection = new EPLiteConnection(url, apiKey, apiVersion, encoding);
}
// Groups
// Pads may belong to a group. These pads are not considered "public", and won't be available through the Web UI without a session.
/**
* Creates a new Group. The group id is returned in "groupID" in the Map.
*
* @return Map with groupID
*/
public Map createGroup() {
return this.connection.post("createGroup");
}
/**
* Creates a new Group for groupMapper if one doesn't already exist. Helps you map your application's groups to Etherpad Lite's groups.
* The group id is returned in "groupID" in the Map.
*
* @param groupMapper your group mapper string
* @return Map with groupID
*/
public Map createGroupIfNotExistsFor(String groupMapper) {
Map args = new HashMap<>();
args.put("groupMapper", groupMapper);
return this.connection.post("createGroupIfNotExistsFor", args);
}
/**
* Delete group.
*
* @param groupID string
*/
public void deleteGroup(String groupID) {
Map args = new HashMap<>();
args.put("groupID", groupID);
this.connection.post("deleteGroup", args);
}
/**
* List all the padIDs in a group. They will be in an array inside "padIDs".
*
* @param groupID string
* @return Map
*/
public Map listPads(String groupID) {
Map args = new HashMap<>();
args.put("groupID", groupID);
return this.connection.get("listPads", args);
}
/**
* Create a pad in this group.
*
* @param groupID the group the pad belongs to
* @param padName name of the pad
*/
public Map createGroupPad(String groupID, String padName) {
Map args = new HashMap<>();
args.put("groupID", groupID);
args.put("padName", padName);
return this.connection.post("createGroupPad", args);
}
/**
* Create a pad in this group, with initial text.
*
* @param groupID the group the pad belongs to
* @param padName name of the pad
* @param text Initial text in the pad
*/
public Map createGroupPad(String groupID, String padName, String text) {
Map args = new HashMap<>();
args.put("groupID", groupID);
args.put("padName", padName);
args.put("text", text);
return this.connection.post("createGroupPad", args);
}
/**
* Lists all existing groups. The group ids are returned in "groupIDs".
*
* @return Map with list of groupIDs
*/
public Map listAllGroups() {
return this.connection.get("listAllGroups");
}
// Authors
// These authors are bound to the attributes the users choose (color and name).
// The author id is returned in "authorID".
/**
* Create a new author.
*
* @return Map with authorID
*/
public Map createAuthor() {
return this.connection.get("createAuthor");
}
/**
* Create a new author with the given name. The author id is returned in "authorID".
*
* @param name string
* @return Map with authorID
*/
public Map createAuthor(String name) {
Map args = new HashMap<>();
args.put("name", name);
return this.connection.post("createAuthor", args);
}
/**
* Creates a new Author for authorMapper if one doesn't already exist.
* Helps you map your application's authors to Etherpad Lite's authors.
* The author id is returned in "authorID".
*
* @param authorMapper string
* @return Map with authorID
*/
public Map createAuthorIfNotExistsFor(String authorMapper) {
Map args = new HashMap<>();
args.put("authorMapper", authorMapper);
return this.connection.post("createAuthorIfNotExistsFor", args);
}
/**
* Creates a new Author for authorMapper if one doesn't already exist.
* Helps you map your application's authors to Etherpad Lite's authors.
* The author id is returned in "authorID".
*
* @param authorMapper string
* @param name string
* @return Map with authorID
*/
public Map createAuthorIfNotExistsFor(String authorMapper, String name) {
Map args = new HashMap<>();
args.put("authorMapper", authorMapper);
args.put("name", name);
return this.connection.post("createAuthorIfNotExistsFor", args);
}
/**
* List the ids of pads the author has edited. They will be in an array inside "padIDs".
*
* @param authorId the authors's id string
* @return Map
*/
public Map listPadsOfAuthor(String authorId) {
Map args = new HashMap<>();
args.put("authorID", authorId);
return this.connection.get("listPadsOfAuthor", args);
}
/**
* Returns the Author Name of the author.
*
* @param authorId the author's id string
* @return authorName
*/
public String getAuthorName(String authorId) {
Map args = new HashMap<>();
args.put("authorID", authorId);
return (String) this.connection.getObject("getAuthorName", args);
}
// Sessions
// Sessions can be created between a group and an author. This allows an author to access more than one group. The sessionID will be set as a
// cookie to the client and is valid until a certain date. Only users with a valid session for this group, can access group pads. You can create a
// session after you authenticated the user at your web application, to give them access to the pads. You should save the sessionID of this session
// and delete it after the user logged out.
/**
* Create a new session for the given author in the given group, valid until the given UNIX time.
*
* Example:
*
*
* import java.util.Date;
* ...
* Date now = new Date();
* long in1Hour = (now.getTime() + (60L * 60L * 1000L) / 1000L);
* String sessID1 = api.createSession(groupID, authorID, in1Hour);
*
*
* @param groupID string
* @param authorID string
* @param validUntil long UNIX timestamp in seconds
* @return Map with sessionID
*/
public Map createSession(String groupID, String authorID, long validUntil) {
Map args = new HashMap<>();
args.put("groupID", groupID);
args.put("authorID", authorID);
args.put("validUntil", String.valueOf(validUntil));
return this.connection.post("createSession", args);
}
/**
* Create a new session for the given author in the given group valid for the given number of hours.
*
* Example:
*
*
* // in 2 hours
* String sessID1 = api.createSession(groupID, authorID, 2);
*
*
* @param groupID string
* @param authorID string
* @param sessionDuration int duration of session in hours
* @return Map with sessionID
*/
public Map createSession(String groupID, String authorID, int sessionDuration) {
long inNHours = ((new Date()).getTime() + ((long)sessionDuration * 60L * 60L * 1000L)) / 1000L;
return this.createSession(groupID, authorID, inNHours);
}
/**
* Create a new session for the given author in the given group, valid until the given datetime.
*
* Example:
*
*
* import java.util.Date;
* import java.text.DateFormat;
* import java.text.SimpleDateFormat;
* import java.util.TimeZone;
* ...
* DateFormat dfm = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
* dfm.setTimeZone(TimeZone.getTimeZone("GMT-5"));
* Date longTime = dfm.parse("2056-01-15 20:15:00");
* String sessID = api.createSession(groupID, authorID, longTime);
*
*
* @param groupID string
* @param authorID string
* @param validUntil Date
* @return Map with sessionID
*/
public Map createSession(String groupID, String authorID, Date validUntil) {
long seconds = validUntil.getTime() / 1000L;
return this.createSession(groupID, authorID, seconds);
}
/**
* Delete a session.
*
* @param sessionID string
*/
public void deleteSession(String sessionID) {
Map args = new HashMap<>();
args.put("sessionID", sessionID);
this.connection.post("deleteSession", args);
}
/**
* Returns information about a session: authorID, groupID and validUntil.
*
* @param sessionID string
* @return Map
*/
public Map getSessionInfo(String sessionID) {
Map args = new HashMap<>();
args.put("sessionID", sessionID);
return this.connection.get("getSessionInfo", args);
}
/**
* List all the sessions IDs in a group. Returned as a Map of sessionIDs keys, with values of Maps containing
* groupID, authorID, and validUntil.
*
* @param groupID string
* @return Map
*/
public Map listSessionsOfGroup(String groupID) {
Map args = new HashMap<>();
args.put("groupID", groupID);
return this.connection.get("listSessionsOfGroup", args);
}
/**
* List all the sessions IDs belonging to an author. Returned as a Map of sessionIDs keys, with values of Maps containing
* groupID, authorID, and validUntil.
*
* @param authorID string
* @return Map
*/
public Map listSessionsOfAuthor(String authorID) {
Map args = new HashMap<>();
args.put("authorID", authorID);
return this.connection.get("listSessionsOfAuthor", args);
}
// Pad content
/**
* Returns a Map containing the latest revision of the pad's text.
* The text is stored under "text".
*
* @param padId the pad's id string
* @return a Map with the text content of pad
*/
public Map getText(String padId) {
Map args = new HashMap<>();
args.put("padID", padId);
return this.connection.get("getText", args);
}
/**
* Returns a Map containing the a specific revision of the pad's text.
* The text is stored under "text".
*
* @param padId the pad's id string
* @param rev the revision number
* @return a Map with the text content of pad in given revision
*/
public Map getText(String padId, long rev) {
Map args = new HashMap<>();
args.put("padID", padId);
args.put("rev", rev);
return this.connection.get("getText", args);
}
/**
* Creates a new revision with the given text.
*
* @param padId the pad's id string
* @param text the pad's new text
*/
public void setText(String padId, String text) {
Map args = new HashMap<>();
args.put("padID", padId);
args.put("text", text);
this.connection.post("setText", args);
}
/**
* Creates a new revision with the given text appended to the existing text.
*
* API >= 1.2.13
*
* @param padId the pad's id string
* @param text the pad's new text
*/
public void appendText(String padId, String text) {
Map args = new HashMap<>();
args.put("padID", padId);
args.put("text", text);
this.connection.post("appendText", args);
}
/**
* Returns a Map containing the current revision of the pad's text as HTML.
* The html is stored under "html".
*
* @param padId the pad's id string
* @return a Map with the HTML content of pad
*/
public Map getHTML(String padId) {
Map args = new HashMap<>();
args.put("padID", padId);
return this.connection.get("getHTML", args);
}
/**
* Returns a Map containing the a specific revision of the pad's text as HTML.
* The html is stored under "html".
*
* @param padId the pad's id string
* @param rev the revision number
* @return a Map with the HTML content of pad in given revision
*/
public Map getHTML(String padId, long rev) {
Map args = new HashMap<>();
args.put("padID", padId);
args.put("rev", rev);
return this.connection.get("getHTML", args);
}
/**
* Creates a new revision with the given html.
*
* @param padId the pad's id string
* @param html the pad's new html text
*/
public void setHTML(String padId, String html) {
Map args = new HashMap<>();
args.put("padID", padId);
args.put("html", html);
this.connection.post("setHTML", args);
}
/**
* Returns the attribute pool of a pad
*
* API >= 1.2.8
*
* @param padId the pad's id string
* @return a Map with the attribute pool of a pad
*/
public Map getAttributePool(String padId) {
Map args = new HashMap<>();
args.put("padID", padId);
return this.connection.get("getAttributePool", args);
}
/**
* Get the changeset at the last revision.
*
* API >= 1.2.8
*
* @param padId the pad's id string
* @return the changeset at the last revision.
*/
public String getRevisionChangeset(String padId) {
Map args = new HashMap<>();
args.put("padID", padId);
return (String) this.connection.getObject("getRevisionChangeset", args);
}
/**
* Get the changeset at a given revision.
*
* API >= 1.2.8
*
* @param padId the pad's id string
* @param rev the revision number
* @return the changeset at a given revision.
*/
public String getRevisionChangeset(String padId, long rev) {
Map args = new HashMap<>();
args.put("padID", padId);
args.put("rev", rev);
return (String) this.connection.getObject("getRevisionChangeset", args);
}
/**
* Returns an object of diffs from 2 points in a pad
*
* API >= 1.2.7
*
* @param padId the pad's id string
* @param startRev the start revision number
* @param endRev the end revision number
* @return a Map of diffs from 2 points in a pad
*/
public Map createDiffHTML(String padId, long startRev, long endRev) {
Map args = new HashMap<>();
args.put("padID", padId);
args.put("startRev", startRev);
args.put("endRev", endRev);
return this.connection.get("createDiffHTML", args);
}
// Chat
/**
* Returns the complete chat history of pad
*
* API >= 1.2.7
*
* @param padId the pad's id string
* @return the whole chat histroy
*/
public Map getChatHistory(String padId) {
Map args = new HashMap<>();
args.put("padID", padId);
return this.connection.get("getChatHistory", args);
}
/**
* Returns the chat history of pad with index between start and end
*
* API >= 1.2.7
*
* @param padId the pad's id string
* @param start the start index
* @param end the end index
* @return a part of the chat history, between start and end
*/
public Map getChatHistory(String padId, long start, long end) {
Map args = new HashMap<>();
args.put("padID", padId);
args.put("start", start);
args.put("end", end);
return this.connection.get("getChatHistory", args);
}
/**
* Returns the chatHead (last number of the last chat-message) of the pad
*
* API >= 1.2.7
*
* @param padId the pad's id string
* @return the last number of the last chat-message
*/
public Map getChatHead(String padId) {
Map args = new HashMap<>();
args.put("padID", padId);
return this.connection.get("getChatHead", args);
}
/**
* Creates a chat message, saves it to the database and sends it to all
* connected clients of this pad, using the current time as timestamp.
*
* API >= 1.2.12
*
* @param padId the pad's id string
* @param text the text of this chat entry
* @param authorId the author of this chat entry
*/
public Map appendChatMessage(String padId, String text, String authorId) {
Map args = new HashMap<>();
args.put("padID", padId);
args.put("text", text);
args.put("authorID", authorId);
return this.connection.post("appendChatMessage", args);
}
/**
* Creates a chat message, saves it to the database and sends it to all
* connected clients of this pad.
*
* API >= 1.2.12
*
* @param padId the pad's id string
* @param text the text of this chat entry
* @param authorId the author of this chat entry
* @param time the timestamp of this chat entry
*/
public Map appendChatMessage(String padId, String text, String authorId, long time) {
Map args = new HashMap<>();
args.put("padID", padId);
args.put("text", text);
args.put("authorID", authorId);
args.put("time", time);
return this.connection.post("appendChatMessage", args);
}
// Pads
// Group pads are normal pads, but with the name schema GROUPID$PADNAME. A security manager controls access of them and its
// forbidden for normal pads to include a $ in the name.
/**
* Returns a list of all pads.
*
* @return a Map with list of pad id's
*/
public Map listAllPads() {
return this.connection.get("listAllPads");
}
/**
* Create a new pad.
*
* @param padId the pad's id string
*/
public void createPad(String padId) {
Map args = new HashMap<>();
args.put("padID", padId);
this.connection.post("createPad", args);
}
/**
* Create a new pad with the given initial text.
*
* @param padId the pad's id string
* @param text the initial text string
*/
public void createPad(String padId, String text) {
Map args = new HashMap<>();
args.put("padID", padId);
args.put("text", text);
this.connection.post("createPad", args);
}
/**
* Returns the number of revisions of this pad. The number is in "revisions".
*
* @param padId the pad's id string
* @return a Map with the number of revisions
*/
public Map getRevisionsCount(String padId) {
Map args = new HashMap<>();
args.put("padID", padId);
return this.connection.get("getRevisionsCount", args);
}
/**
* Returns the number of saved revisions of this pad
*
* API >= 1.2.11
*
* @param padId the pad's id string
* @return a Map with number of saved revisions
*/
public Map getSavedRevisionsCount(String padId) {
Map args = new HashMap<>();
args.put("padID", padId);
return this.connection.get("getSavedRevisionsCount", args);
}
/**
* returns the list of saved revisions of this pad
*
* API >= 1.2.11
*
* @param padId the pad's id string
* @return a Map with the list of saved revision numbers
*/
public Map listSavedRevisions(String padId) {
Map args = new HashMap<>();
args.put("padID", padId);
return this.connection.get("listSavedRevisions", args);
}
/**
* Saves the latest revision
*
* API >= 1.2.11
*
* @param padId the pad's id string
*/
public void saveRevision(String padId) {
Map args = new HashMap<>();
args.put("padID", padId);
this.connection.post("saveRevision", args);
}
/**
* Saves the given revision
*
* API >= 1.2.11
*
* @param padId the pad's id string
* @param rev the revision to be saved
*/
public void saveRevision(String padId, long rev) {
Map args = new HashMap<>();
args.put("padID", padId);
args.put("rev", rev);
this.connection.post("saveRevision", args);
}
/**
* Get the number of users currently editing a pad.
*
* @param padId the pad's id string
* @return a Map with the padUsersCount
*/
public Map padUsersCount(String padId) {
Map args = new HashMap<>();
args.put("padID", padId);
return this.connection.get("padUsersCount", args);
}
/**
* Returns the list of users that are currently editing this pad.
* A padUser has the values: "colorId", "name" and "timestamp".
*
* @param padId the pad's id string
* @return a Map with a List of pad user maps
*/
public Map padUsers(String padId) {
Map args = new HashMap<>();
args.put("padID", padId);
return this.connection.get("padUsers", args);
}
/**
* Deletes a pad.
*
* @param padId the pad's id string
*/
public void deletePad(String padId) {
Map args = new HashMap<>();
args.put("padID", padId);
this.connection.post("deletePad", args);
}
/**
* Copies a pad with full history and chat. If the destination exists the copy will fail.
*
* API >= 1.2.8
*
* @param sourcePadId the id of the source pad
* @param destinationPadId the id of the destination pad
*/
public void copyPad(String sourcePadId, String destinationPadId) {
copyPad(sourcePadId, destinationPadId, false);
}
/**
* Copies a pad with full history and chat.
*
* API >= 1.2.8
*
* @param sourcePadId the id of the source pad
* @param destinationPadId the id of the destination pad
* @param force if force is true and the destination pad exists, it will be overwritten.
*/
public void copyPad(String sourcePadId, String destinationPadId, boolean force) {
Map args = new HashMap<>();
args.put("sourceID", sourcePadId);
args.put("destinationID", destinationPadId);
args.put("force", force);
this.connection.post("copyPad", args);
}
/**
* Moves a pad. If the destination exists the copy will fail.
*
* API >= 1.2.8
*
* @param sourcePadId the id of the source pad
* @param destinationPadId the id of the destination pad
*/
public void movePad(String sourcePadId, String destinationPadId) {
copyPad(sourcePadId, destinationPadId, false);
}
/**
* Moves a pad.
*
* API >= 1.2.8
*
* @param sourcePadId the id of the source pad
* @param destinationPadId the id of the destination pad
* @param force if force is true and the destination pad exists, it will be overwritten.
*/
public void movePad(String sourcePadId, String destinationPadId, boolean force) {
Map args = new HashMap<>();
args.put("sourceID", sourcePadId);
args.put("destinationID", destinationPadId);
args.put("force", force);
this.connection.post("movePad", args);
}
/**
* Get the pad's read-only id.
*
* @param padId the pad's id string
* @return a Map with the readOnlyID
*/
public Map getReadOnlyID(String padId) {
Map args = new HashMap<>();
args.put("padID", padId);
return this.connection.get("getReadOnlyID", args);
}
/**
* Get the pad's id from the read only id
*
* API >= 1.2.10
*
* @param readOnlyPadId the pad's read only id string
* @return a Map with the padID
*/
public Map getPadID(String readOnlyPadId) {
Map args = new HashMap<>();
args.put("roID", readOnlyPadId);
return this.connection.get("getPadID", args);
}
/**
* Sets the pad's public status.
* This is only applicable to group pads.
*
* @param padId the pad's id string
* @param publicStatus boolean
*/
public void setPublicStatus(String padId, Boolean publicStatus) {
Map args = new HashMap<>();
args.put("padID", padId);
args.put("publicStatus", publicStatus);
this.connection.post("setPublicStatus", args);
}
/**
* Gets the pad's public status.
*
* @param padId the pad's id string
* @return a Map with the Boolean publicStatus
*/
public Map getPublicStatus(String padId) {
Map args = new HashMap<>();
args.put("padID", padId);
return this.connection.get("getPublicStatus", args);
}
/**
* Sets the pad's password. This is only applicable to group pads.
*
* @param padId the pad's id string
* @param password string
*/
public void setPassword(String padId, String password) {
Map args = new HashMap<>();
args.put("padID", padId);
args.put("password", password);
this.connection.post("setPassword", args);
}
/**
* Checks whether the pad is password-protected or not.
*
* @param padId the pad's id string
* @return a Map with the Boolean passwordProtection
*/
public Map isPasswordProtected(String padId) {
Map args = new HashMap<>();
args.put("padID", padId);
return this.connection.get("isPasswordProtected", args);
}
/**
* List the ids of authors who have edited a pad.
*
* @param padId the pad's id string
* @return a Map with a List of author ids
*/
public Map listAuthorsOfPad(String padId) {
Map args = new HashMap<>();
args.put("padID", padId);
return this.connection.get("listAuthorsOfPad", args);
}
/**
* Get the pad's last edit date.
*
* @param padId the pad's id string
* @return a Map with lastEdited timestamp.
*/
public Map getLastEdited(String padId) {
Map args = new HashMap<>();
args.put("padID", padId);
return this.connection.get("getLastEdited", args);
}
/**
* Sends a custom message of type msg to the pad.
*
* @param padId the pad's id string
* @param msg the message to send
*/
public void sendClientsMessage(String padId, String msg) {
Map args = new HashMap<>();
args.put("padID", padId);
args.put("msg", msg);
this.connection.post("sendClientsMessage", args);
}
/**
* Runs without error if current api token is valid
*
* API >= 1.2
*/
public void checkToken() {
this.connection.get("checkToken");
}
/**
* Returns true if the connection is using SSL/TLS, false if not.
*
* @return boolean
*/
public boolean isSecure() {
return (this.connection.uri.getPort() == 443);
}
}