/**
* $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 java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.jivesoftware.smackx.packet.PrivateData;
import org.jivesoftware.smackx.provider.PrivateDataProvider;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
/**
* 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 {
/**
* The IQ Provider for BookmarkStorage.
*
* @author Derek DeMoro
*/
public static class Provider implements PrivateDataProvider {
/**
* Empty Constructor for PrivateDataProvider.
*/
public Provider() {
super();
}
@Override
public PrivateData parsePrivateData(XmlPullParser parser)
throws Exception {
final Bookmarks storage = new Bookmarks();
boolean done = false;
while (!done) {
final 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 BookmarkedConference getConferenceStorage(
XmlPullParser parser) throws Exception {
final String name = parser.getAttributeValue("", "name");
final String autojoin = parser.getAttributeValue("", "autojoin");
final String jid = parser.getAttributeValue("", "jid");
final BookmarkedConference conf = new BookmarkedConference(jid);
conf.setName(name);
conf.setAutoJoin(Boolean.valueOf(autojoin).booleanValue());
// Check for nickname
boolean done = false;
while (!done) {
final 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;
}
private static BookmarkedURL getURLStorage(XmlPullParser parser)
throws IOException, XmlPullParserException {
final String name = parser.getAttributeValue("", "name");
final String url = parser.getAttributeValue("", "url");
final String rssString = parser.getAttributeValue("", "rss");
final boolean rss = rssString != null && "true".equals(rssString);
final BookmarkedURL urlStore = new BookmarkedURL(url, name, rss);
boolean done = false;
while (!done) {
final 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 final List<BookmarkedURL> bookmarkedURLS;
private final List<BookmarkedConference> bookmarkedConferences;
/**
* Required Empty Constructor to use Bookmarks.
*/
public Bookmarks() {
bookmarkedURLS = new ArrayList<BookmarkedURL>();
bookmarkedConferences = new ArrayList<BookmarkedConference>();
}
/**
* Add a BookmarkedConference to bookmarks.
*
* @param bookmarkedConference
* the conference to remove.
*/
public void addBookmarkedConference(
BookmarkedConference bookmarkedConference) {
bookmarkedConferences.add(bookmarkedConference);
}
/**
* Adds a BookmarkedURL.
*
* @param bookmarkedURL
* the bookmarked bookmarkedURL.
*/
public void addBookmarkedURL(BookmarkedURL bookmarkedURL) {
bookmarkedURLS.add(bookmarkedURL);
}
/**
* Removes all BookmarkedConferences from Bookmarks.
*/
public void clearBookmarkedConferences() {
bookmarkedConferences.clear();
}
/**
* Removes all BookmarkedURLs from user's bookmarks.
*/
public void clearBookmarkedURLS() {
bookmarkedURLS.clear();
}
/**
* Returns a Collection of all Bookmarked Conference for this user.
*
* @return a collection of all Bookmarked Conferences.
*/
public List<BookmarkedConference> getBookmarkedConferences() {
return bookmarkedConferences;
}
/**
* Returns a Collection of all Bookmarked URLs for this user.
*
* @return a collection of all Bookmarked URLs.
*/
public List<BookmarkedURL> getBookmarkedURLS() {
return bookmarkedURLS;
}
/**
* Returns the root element name.
*
* @return the element name.
*/
@Override
public String getElementName() {
return "storage";
}
/**
* Returns the root element XML namespace.
*
* @return the namespace.
*/
@Override
public String getNamespace() {
return "storage:bookmarks";
}
/**
* Removes a BookmarkedConference.
*
* @param bookmarkedConference
* the BookmarkedConference to remove.
*/
public void removeBookmarkedConference(
BookmarkedConference bookmarkedConference) {
bookmarkedConferences.remove(bookmarkedConference);
}
/**
* Removes a bookmarked bookmarkedURL.
*
* @param bookmarkedURL
* the bookmarked bookmarkedURL to remove.
*/
public void removeBookmarkedURL(BookmarkedURL bookmarkedURL) {
bookmarkedURLS.remove(bookmarkedURL);
}
/**
* Returns the XML reppresentation of the PrivateData.
*
* @return the private data as XML.
*/
@Override
public String toXML() {
final StringBuilder buf = new StringBuilder();
buf.append("<storage xmlns=\"storage:bookmarks\">");
final Iterator<BookmarkedURL> urls = getBookmarkedURLS().iterator();
while (urls.hasNext()) {
final 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()) {
final 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();
}
}