mirror of
https://codeberg.org/Mercury-IM/Smack
synced 2024-11-19 13:02:05 +01:00
215 lines
8.3 KiB
Java
215 lines
8.3 KiB
Java
|
/**
|
||
|
* $RCSfile: $
|
||
|
* $Revision: $
|
||
|
* $Date: $
|
||
|
*
|
||
|
* Copyright (C) 2006 Jive Software. All rights reserved.
|
||
|
* This software is the proprietary information of Jive Software. Use is subject to license terms.
|
||
|
*/
|
||
|
package org.jivesoftware.smackx.bookmark;
|
||
|
|
||
|
import org.jivesoftware.smack.XMPPConnection;
|
||
|
import org.jivesoftware.smack.XMPPException;
|
||
|
import org.jivesoftware.smackx.PrivateDataManager;
|
||
|
|
||
|
import java.util.*;
|
||
|
|
||
|
/**
|
||
|
* Provides methods to manage bookmarks in accordance with JEP-0048. Methods for managing URLs and
|
||
|
* Conferences are provided.
|
||
|
* </p>
|
||
|
* It should be noted that some extensions have been made to the JEP. There is an attribute on URLs
|
||
|
* that marks a url as a news feed and also a sub-element can be added to either a URL or conference
|
||
|
* indicated that it is shared amongst all users on a server.
|
||
|
*
|
||
|
* @author Alexander Wenckus
|
||
|
*/
|
||
|
public class BookmarkManager {
|
||
|
private static final Map bookmarkManagerMap = new HashMap();
|
||
|
static {
|
||
|
PrivateDataManager.addPrivateDataProvider("storage", "storage:bookmarks",
|
||
|
new Bookmarks.Provider());
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the <i>BookmarkManager</i> for a connection, if it doesn't exist it is created.
|
||
|
*
|
||
|
* @param connection the connection for which the manager is desired.
|
||
|
* @return Returns the <i>BookmarkManager</i> for a connection, if it doesn't
|
||
|
* exist it is created.
|
||
|
* @throws XMPPException Thrown if the connection is null or has not yet been authenticated.
|
||
|
*/
|
||
|
public synchronized static BookmarkManager getBookmarkManager(XMPPConnection connection)
|
||
|
throws XMPPException
|
||
|
{
|
||
|
BookmarkManager manager = (BookmarkManager) bookmarkManagerMap.get(connection);
|
||
|
if(manager == null) {
|
||
|
manager = new BookmarkManager(connection);
|
||
|
bookmarkManagerMap.put(connection, manager);
|
||
|
}
|
||
|
return manager;
|
||
|
}
|
||
|
|
||
|
private PrivateDataManager privateDataManager;
|
||
|
private Bookmarks bookmarks;
|
||
|
private final Object bookmarkLock = new Object();
|
||
|
|
||
|
/**
|
||
|
* Default constructor. Registers the data provider with the private data manager in the
|
||
|
* storage:bookmarks namespace.
|
||
|
*
|
||
|
* @param connection the connection for persisting and retrieving bookmarks.
|
||
|
* @throws XMPPException thrown when the connection is null or has not been authenticated.
|
||
|
*/
|
||
|
private BookmarkManager(XMPPConnection connection) throws XMPPException {
|
||
|
if(connection == null || !connection.isAuthenticated()) {
|
||
|
throw new XMPPException("Invalid connection.");
|
||
|
}
|
||
|
this.privateDataManager = new PrivateDataManager(connection);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns all currently bookmarked conferences.
|
||
|
*
|
||
|
* @return returns all currently bookmarked conferences
|
||
|
* @throws XMPPException thrown when there was an error retrieving the current bookmarks from
|
||
|
* the server.
|
||
|
* @see BookmarkedConference
|
||
|
*/
|
||
|
public Collection getBookmarkedConferences() throws XMPPException {
|
||
|
retrieveBookmarks();
|
||
|
return Collections.unmodifiableCollection(bookmarks.getBookmarkedConferences());
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Adds or updates a conference in the bookmarks.
|
||
|
*
|
||
|
* @param name the name of the conference
|
||
|
* @param jid the jid of the conference
|
||
|
* @param isAutoJoin whether or not to join this conference automatically on login
|
||
|
* @param nickname the nickname to use for the user when joining the conference
|
||
|
* @param password the password to use for the user when joining the conference
|
||
|
* @throws XMPPException thrown when there is an issue retrieving the current bookmarks from
|
||
|
* the server.
|
||
|
*/
|
||
|
public void addBookmarkedConference(String name, String jid, boolean isAutoJoin,
|
||
|
String nickname, String password) throws XMPPException
|
||
|
{
|
||
|
retrieveBookmarks();
|
||
|
BookmarkedConference bookmark
|
||
|
= new BookmarkedConference(name, jid, isAutoJoin, nickname, password);
|
||
|
List conferences = bookmarks.getBookmarkedConferences();
|
||
|
if(conferences.contains(bookmark)) {
|
||
|
BookmarkedConference oldConference = (BookmarkedConference)
|
||
|
conferences.get(conferences.indexOf(bookmark));
|
||
|
if(oldConference.isShared()) {
|
||
|
throw new IllegalArgumentException("Cannot modify shared bookmark");
|
||
|
}
|
||
|
oldConference.setAutoJoin(isAutoJoin);
|
||
|
oldConference.setName(name);
|
||
|
oldConference.setNickname(nickname);
|
||
|
oldConference.setPassword(password);
|
||
|
}
|
||
|
else {
|
||
|
bookmarks.addBookmarkedConference(bookmark);
|
||
|
}
|
||
|
privateDataManager.setPrivateData(bookmarks);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Removes a conference from the bookmarks.
|
||
|
*
|
||
|
* @param jid the jid of the conference to be removed.
|
||
|
* @throws XMPPException thrown when there is a problem with the connection attempting to
|
||
|
* retrieve the bookmarks or persist the bookmarks.
|
||
|
* @throws IllegalArgumentException thrown when the conference being removed is a shared
|
||
|
* conference
|
||
|
*/
|
||
|
public void removeBookmarkedConference(String jid) throws XMPPException {
|
||
|
retrieveBookmarks();
|
||
|
Iterator it = bookmarks.getBookmarkedConferences().iterator();
|
||
|
while(it.hasNext()) {
|
||
|
BookmarkedConference conference = (BookmarkedConference) it.next();
|
||
|
if(conference.getJid().equalsIgnoreCase(jid)) {
|
||
|
if(conference.isShared()) {
|
||
|
throw new IllegalArgumentException("Conference is shared and can't be removed");
|
||
|
}
|
||
|
it.remove();
|
||
|
privateDataManager.setPrivateData(bookmarks);
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns an unmodifiable collection of all bookmarked urls.
|
||
|
*
|
||
|
* @return returns an unmodifiable collection of all bookmarked urls.
|
||
|
* @throws XMPPException thrown when there is a problem retriving bookmarks from the server.
|
||
|
*/
|
||
|
public Collection getBookmarkedURLs() throws XMPPException {
|
||
|
retrieveBookmarks();
|
||
|
return Collections.unmodifiableCollection(bookmarks.getBookmarkedURLS());
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Adds a new url or updates an already existing url in the bookmarks.
|
||
|
*
|
||
|
* @param URL the url of the bookmark
|
||
|
* @param name the name of the bookmark
|
||
|
* @param isRSS whether or not the url is an rss feed
|
||
|
* @throws XMPPException thrown when there is an error retriving or saving bookmarks from or to
|
||
|
* the server
|
||
|
*/
|
||
|
public void addBookmarkedURL(String URL, String name, boolean isRSS) throws XMPPException {
|
||
|
retrieveBookmarks();
|
||
|
BookmarkedURL bookmark = new BookmarkedURL(URL, name, isRSS);
|
||
|
List urls = bookmarks.getBookmarkedURLS();
|
||
|
if(urls.contains(bookmark)) {
|
||
|
BookmarkedURL oldURL = (BookmarkedURL) urls.get(urls.indexOf(bookmark));
|
||
|
if(oldURL.isShared()) {
|
||
|
throw new IllegalArgumentException("Cannot modify shared bookmarks");
|
||
|
}
|
||
|
oldURL.setName(name);
|
||
|
oldURL.setRss(isRSS);
|
||
|
}
|
||
|
else {
|
||
|
bookmarks.addBookmarkedURL(bookmark);
|
||
|
}
|
||
|
privateDataManager.setPrivateData(bookmarks);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Removes a url from the bookmarks.
|
||
|
*
|
||
|
* @param bookmarkURL the url of the bookmark to remove
|
||
|
* @throws XMPPException thrown if there is an error retriving or saving bookmarks from or to
|
||
|
* the server.
|
||
|
*/
|
||
|
public void removeBookmarkedURL(String bookmarkURL) throws XMPPException {
|
||
|
retrieveBookmarks();
|
||
|
Iterator it = bookmarks.getBookmarkedURLS().iterator();
|
||
|
while(it.hasNext()) {
|
||
|
BookmarkedURL bookmark = (BookmarkedURL) it.next();
|
||
|
if(bookmark.getURL().equalsIgnoreCase(bookmarkURL)) {
|
||
|
if(bookmark.isShared()) {
|
||
|
throw new IllegalArgumentException("Cannot delete a shared bookmark.");
|
||
|
}
|
||
|
it.remove();
|
||
|
privateDataManager.setPrivateData(bookmarks);
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private Bookmarks retrieveBookmarks() throws XMPPException {
|
||
|
synchronized(bookmarkLock) {
|
||
|
if(bookmarks == null) {
|
||
|
bookmarks = (Bookmarks) privateDataManager.getPrivateData("storage",
|
||
|
"storage:bookmarks");
|
||
|
}
|
||
|
return bookmarks;
|
||
|
}
|
||
|
}
|
||
|
}
|