/** * $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; } }