/** * $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: *

*

 * Connection con = new XMPPConnection("jabber.org");
 * con.login("john", "doe");
 * Bookmarks bookmarks = new Bookmarks();
 * 

* // 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); *

*

* LastActivity activity = LastActivity.getLastActivity(con, "xray@jabber.org"); *

* * @author Derek DeMoro */ public class Bookmarks implements PrivateData { private List bookmarkedURLS; private List bookmarkedConferences; /** * Required Empty Constructor to use Bookmarks. */ public Bookmarks() { bookmarkedURLS = new ArrayList(); bookmarkedConferences = new ArrayList(); } /** * 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 getBookmarkedURLS() { return bookmarkedURLS; } /** * Returns a Collection of all Bookmarked Conference for this user. * * @return a collection of all Bookmarked Conferences. */ public List 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(""); final Iterator urls = getBookmarkedURLS().iterator(); while (urls.hasNext()) { BookmarkedURL urlStorage = urls.next(); if(urlStorage.isShared()) { continue; } buf.append(""); } // Add Conference additions final Iterator conferences = getBookmarkedConferences().iterator(); while (conferences.hasNext()) { BookmarkedConference conference = conferences.next(); if(conference.isShared()) { continue; } buf.append(""); if (conference.getNickname() != null) { buf.append("").append(conference.getNickname()).append(""); } if (conference.getPassword() != null) { buf.append("").append(conference.getPassword()).append(""); } buf.append(""); } buf.append(""); 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; } }