diff options
Diffstat (limited to 'src/org/jivesoftware/smackx/bookmark/Bookmarks.java')
-rw-r--r-- | src/org/jivesoftware/smackx/bookmark/Bookmarks.java | 310 |
1 files changed, 310 insertions, 0 deletions
diff --git a/src/org/jivesoftware/smackx/bookmark/Bookmarks.java b/src/org/jivesoftware/smackx/bookmark/Bookmarks.java new file mode 100644 index 0000000..100fa46 --- /dev/null +++ b/src/org/jivesoftware/smackx/bookmark/Bookmarks.java @@ -0,0 +1,310 @@ +/** + * $Revision$ + * $Date$ + * + * Copyright 2003-2007 Jive Software. + * + * All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jivesoftware.smackx.bookmark; + +import org.jivesoftware.smackx.packet.PrivateData; +import org.jivesoftware.smackx.provider.PrivateDataProvider; +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserException; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +/** + * Bookmarks is used for storing and retrieving URLS and Conference rooms. + * Bookmark Storage (JEP-0048) defined a protocol for the storage of bookmarks to conference rooms and other entities + * in a Jabber user's account. + * See the following code sample for saving Bookmarks: + * <p/> + * <pre> + * Connection con = new XMPPConnection("jabber.org"); + * con.login("john", "doe"); + * Bookmarks bookmarks = new Bookmarks(); + * <p/> + * // Bookmark a URL + * BookmarkedURL url = new BookmarkedURL(); + * url.setName("Google"); + * url.setURL("http://www.jivesoftware.com"); + * bookmarks.addURL(url); + * // Bookmark a Conference room. + * BookmarkedConference conference = new BookmarkedConference(); + * conference.setName("My Favorite Room"); + * conference.setAutoJoin("true"); + * conference.setJID("dev@conference.jivesoftware.com"); + * bookmarks.addConference(conference); + * // Save Bookmarks using PrivateDataManager. + * PrivateDataManager manager = new PrivateDataManager(con); + * manager.setPrivateData(bookmarks); + * <p/> + * <p/> + * LastActivity activity = LastActivity.getLastActivity(con, "xray@jabber.org"); + * </pre> + * + * @author Derek DeMoro + */ +public class Bookmarks implements PrivateData { + + private List<BookmarkedURL> bookmarkedURLS; + private List<BookmarkedConference> bookmarkedConferences; + + /** + * Required Empty Constructor to use Bookmarks. + */ + public Bookmarks() { + bookmarkedURLS = new ArrayList<BookmarkedURL>(); + bookmarkedConferences = new ArrayList<BookmarkedConference>(); + } + + /** + * Adds a BookmarkedURL. + * + * @param bookmarkedURL the bookmarked bookmarkedURL. + */ + public void addBookmarkedURL(BookmarkedURL bookmarkedURL) { + bookmarkedURLS.add(bookmarkedURL); + } + + /** + * Removes a bookmarked bookmarkedURL. + * + * @param bookmarkedURL the bookmarked bookmarkedURL to remove. + */ + public void removeBookmarkedURL(BookmarkedURL bookmarkedURL) { + bookmarkedURLS.remove(bookmarkedURL); + } + + /** + * Removes all BookmarkedURLs from user's bookmarks. + */ + public void clearBookmarkedURLS() { + bookmarkedURLS.clear(); + } + + /** + * Add a BookmarkedConference to bookmarks. + * + * @param bookmarkedConference the conference to remove. + */ + public void addBookmarkedConference(BookmarkedConference bookmarkedConference) { + bookmarkedConferences.add(bookmarkedConference); + } + + /** + * Removes a BookmarkedConference. + * + * @param bookmarkedConference the BookmarkedConference to remove. + */ + public void removeBookmarkedConference(BookmarkedConference bookmarkedConference) { + bookmarkedConferences.remove(bookmarkedConference); + } + + /** + * Removes all BookmarkedConferences from Bookmarks. + */ + public void clearBookmarkedConferences() { + bookmarkedConferences.clear(); + } + + /** + * Returns a Collection of all Bookmarked URLs for this user. + * + * @return a collection of all Bookmarked URLs. + */ + public List<BookmarkedURL> getBookmarkedURLS() { + return bookmarkedURLS; + } + + /** + * Returns a Collection of all Bookmarked Conference for this user. + * + * @return a collection of all Bookmarked Conferences. + */ + public List<BookmarkedConference> getBookmarkedConferences() { + return bookmarkedConferences; + } + + + /** + * Returns the root element name. + * + * @return the element name. + */ + public String getElementName() { + return "storage"; + } + + /** + * Returns the root element XML namespace. + * + * @return the namespace. + */ + public String getNamespace() { + return "storage:bookmarks"; + } + + /** + * Returns the XML reppresentation of the PrivateData. + * + * @return the private data as XML. + */ + public String toXML() { + StringBuilder buf = new StringBuilder(); + buf.append("<storage xmlns=\"storage:bookmarks\">"); + + final Iterator<BookmarkedURL> urls = getBookmarkedURLS().iterator(); + while (urls.hasNext()) { + BookmarkedURL urlStorage = urls.next(); + if(urlStorage.isShared()) { + continue; + } + buf.append("<url name=\"").append(urlStorage.getName()). + append("\" url=\"").append(urlStorage.getURL()).append("\""); + if(urlStorage.isRss()) { + buf.append(" rss=\"").append(true).append("\""); + } + buf.append(" />"); + } + + // Add Conference additions + final Iterator<BookmarkedConference> conferences = getBookmarkedConferences().iterator(); + while (conferences.hasNext()) { + BookmarkedConference conference = conferences.next(); + if(conference.isShared()) { + continue; + } + buf.append("<conference "); + buf.append("name=\"").append(conference.getName()).append("\" "); + buf.append("autojoin=\"").append(conference.isAutoJoin()).append("\" "); + buf.append("jid=\"").append(conference.getJid()).append("\" "); + buf.append(">"); + + if (conference.getNickname() != null) { + buf.append("<nick>").append(conference.getNickname()).append("</nick>"); + } + + + if (conference.getPassword() != null) { + buf.append("<password>").append(conference.getPassword()).append("</password>"); + } + buf.append("</conference>"); + } + + + buf.append("</storage>"); + return buf.toString(); + } + + /** + * The IQ Provider for BookmarkStorage. + * + * @author Derek DeMoro + */ + public static class Provider implements PrivateDataProvider { + + /** + * Empty Constructor for PrivateDataProvider. + */ + public Provider() { + super(); + } + + public PrivateData parsePrivateData(XmlPullParser parser) throws Exception { + Bookmarks storage = new Bookmarks(); + + boolean done = false; + while (!done) { + int eventType = parser.next(); + if (eventType == XmlPullParser.START_TAG && "url".equals(parser.getName())) { + final BookmarkedURL urlStorage = getURLStorage(parser); + if (urlStorage != null) { + storage.addBookmarkedURL(urlStorage); + } + } + else if (eventType == XmlPullParser.START_TAG && + "conference".equals(parser.getName())) + { + final BookmarkedConference conference = getConferenceStorage(parser); + storage.addBookmarkedConference(conference); + } + else if (eventType == XmlPullParser.END_TAG && "storage".equals(parser.getName())) + { + done = true; + } + } + + + return storage; + } + } + + private static BookmarkedURL getURLStorage(XmlPullParser parser) throws IOException, XmlPullParserException { + String name = parser.getAttributeValue("", "name"); + String url = parser.getAttributeValue("", "url"); + String rssString = parser.getAttributeValue("", "rss"); + boolean rss = rssString != null && "true".equals(rssString); + + BookmarkedURL urlStore = new BookmarkedURL(url, name, rss); + boolean done = false; + while (!done) { + int eventType = parser.next(); + if(eventType == XmlPullParser.START_TAG + && "shared_bookmark".equals(parser.getName())) { + urlStore.setShared(true); + } + else if (eventType == XmlPullParser.END_TAG && "url".equals(parser.getName())) { + done = true; + } + } + return urlStore; + } + + private static BookmarkedConference getConferenceStorage(XmlPullParser parser) throws Exception { + String name = parser.getAttributeValue("", "name"); + String autojoin = parser.getAttributeValue("", "autojoin"); + String jid = parser.getAttributeValue("", "jid"); + + BookmarkedConference conf = new BookmarkedConference(jid); + conf.setName(name); + conf.setAutoJoin(Boolean.valueOf(autojoin).booleanValue()); + + // Check for nickname + boolean done = false; + while (!done) { + int eventType = parser.next(); + if (eventType == XmlPullParser.START_TAG && "nick".equals(parser.getName())) { + conf.setNickname(parser.nextText()); + } + else if (eventType == XmlPullParser.START_TAG && "password".equals(parser.getName())) { + conf.setPassword(parser.nextText()); + } + else if(eventType == XmlPullParser.START_TAG + && "shared_bookmark".equals(parser.getName())) { + conf.setShared(true); + } + else if (eventType == XmlPullParser.END_TAG && "conference".equals(parser.getName())) { + done = true; + } + } + + + return conf; + } +} |