Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- added new unified bookmark api to /xml/bookmarks/
the get_bookmarks api currently supports: .xml: posts, xbel, rss, flexigrid .json: posts, flexigrid .html: work in progress - YaCy-UI: support for new bookmark api git-svn-id: https://svn.berlios.de/svnroot/repos/yacy/trunk@5467 6c8d7289-2bf4-0310-a012-ef5d649a1542
- Loading branch information
apfelmaennchen
committed
Jan 11, 2009
1 parent
c1330f5
commit cc207a9
Showing
5 changed files
with
402 additions
and
64 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,275 @@ | ||
// /xml/bookmarks/get_bookmarks.java | ||
// ------------------------------- | ||
// (C) 2009 Stefan Förster (apfelmaennchen) | ||
// part of yacy | ||
// | ||
// This program is free software; you can redistribute it and/or modify | ||
// it under the terms of the GNU General Public License as published by | ||
// the Free Software Foundation; either version 2 of the License, or | ||
// (at your option) any later version. | ||
// | ||
// This program is distributed in the hope that it will be useful, | ||
// but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
// GNU General Public License for more details. | ||
// | ||
// You should have received a copy of the GNU General Public License | ||
// along with this program; if not, write to the Free Software | ||
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
|
||
package xml.bookmarks; | ||
|
||
import java.util.Date; | ||
import java.util.Iterator; | ||
|
||
import de.anomic.data.bookmarksDB; | ||
import de.anomic.data.userDB; | ||
import de.anomic.htmlFilter.htmlFilterCharacterCoding; | ||
import de.anomic.http.httpRequestHeader; | ||
import de.anomic.plasma.plasmaSwitchboard; | ||
import de.anomic.server.serverDate; | ||
import de.anomic.server.serverObjects; | ||
import de.anomic.server.serverSwitch; | ||
|
||
public class get_bookmarks { | ||
|
||
private static final serverObjects prop = new serverObjects(); | ||
private static plasmaSwitchboard sb = null; | ||
private static userDB.Entry user = null; | ||
private static boolean isAdmin = false; | ||
|
||
private static int R = 1; // TODO: solve the recursion problem an remove global variable | ||
|
||
final static int SORT_ALPHA = 1; | ||
final static int SORT_SIZE = 2; | ||
final static int SHOW_ALL = -1; | ||
final static int MAXRESULTS = 10000; | ||
|
||
// file types and display types | ||
final static int XML = 0; // .xml | ||
final static int XHTML = 0; // .html (.xml) | ||
final static int JSON = 0; // .json | ||
final static int FLEXIGRID = 1; // .json .xml | ||
final static int XBEL = 2; // .xml | ||
final static int RSS = 3; // .xml (.rss) | ||
final static int RDF = 4; // .xml | ||
|
||
public static serverObjects respond(final httpRequestHeader header, final serverObjects post, final serverSwitch<?> env) { | ||
|
||
prop.clear(); | ||
sb = (plasmaSwitchboard) env; | ||
user = sb.userDB.getUser(header); | ||
isAdmin = (sb.verifyAuthentication(header, true) || user != null && user.hasRight(userDB.Entry.BOOKMARK_RIGHT)); | ||
|
||
// set user name | ||
final String username; | ||
if(user != null) username=user.getUserName(); | ||
else if(isAdmin) username="admin"; | ||
else username = "unknown"; | ||
prop.putHTML("display_user", username); | ||
|
||
// set peer address | ||
prop.put("display_address", sb.webIndex.seedDB.mySeed().getPublicAddress()); | ||
prop.put("display_peer", sb.webIndex.seedDB.mySeed().getName()); | ||
|
||
int rp = MAXRESULTS; // items per page | ||
int page = 1; // page | ||
int display = 0; // default for JSON, XML or XHTML | ||
// String sortorder = "asc"; | ||
// String sortname = "date"; | ||
String qtype = ""; | ||
String query = ""; | ||
|
||
// check for GET parameters | ||
if (post != null){ | ||
if (post.containsKey("rp")) rp = Integer.parseInt(post.get("rp")); | ||
if (post.containsKey("page")) page = Integer.parseInt(post.get("page")); | ||
if (post.containsKey("query")) query = post.get("query"); | ||
if (post.containsKey("qtype")) qtype = post.get("qtype"); | ||
// if (post.containsKey("sortorder")) sortorder = post.get("sortorder"); | ||
if (post.containsKey("display")) { | ||
if (post.get("display").equals("flexigrid") || post.get("display").equals("1")) { | ||
display = FLEXIGRID; | ||
} | ||
else if (post.get("display").equals("xbel") || post.get("display").equals("2")) { | ||
display = XBEL; | ||
} | ||
else if (post.get("display").equals("rss") || post.get("display").equals("3")) { | ||
display = RSS; | ||
} | ||
} | ||
prop.put("display", display); | ||
} | ||
|
||
int count = 0; | ||
int total = 0; | ||
int start = 0; | ||
|
||
final Iterator<String> it; | ||
bookmarksDB.Bookmark bookmark; | ||
|
||
switch (display) { | ||
case XBEL: | ||
String root = "/"; | ||
if (qtype.equals("tags") && !query.equals("")) { | ||
prop.putHTML("display_folder", "1"); | ||
prop.putHTML("display_folder_foldername", query); | ||
prop.putHTML("display_folder_folderhash", bookmarksDB.tagHash(query)); | ||
it = sb.bookmarksDB.getBookmarksIterator(query, isAdmin); | ||
count = print_XBEL(it, count); | ||
prop.put("display_xbel", count); | ||
break; | ||
} else if (qtype.equals("folders") && !query.equals("")) { | ||
if (query.startsWith("/")) { root = query; } | ||
else { root = "/" + query; } | ||
} | ||
prop.putHTML("display_folder", "0"); | ||
R = root.replaceAll("[^/]","").length() - 1; | ||
count = recurseFolders(sb.bookmarksDB.getFolderList(root, isAdmin),root,0,true,""); | ||
prop.put("display_xbel", count); | ||
break; | ||
|
||
default: | ||
// default covers all non XBEL formats | ||
|
||
// set bookmark iterator according to query | ||
if (qtype.equals("tags") && !query.equals("")) { | ||
it = sb.bookmarksDB.getBookmarksIterator(query, isAdmin); | ||
} else { | ||
it = sb.bookmarksDB.getBookmarksIterator(isAdmin); | ||
} | ||
|
||
if (rp < MAXRESULTS) { | ||
//skip the first entries (display next page) | ||
if (page > 1) { | ||
start = ((page-1)*rp)+1; | ||
} | ||
count = 0; | ||
while(count < start && it.hasNext()){ | ||
it.next(); | ||
count++; | ||
} | ||
total += count; | ||
} | ||
count = 0; | ||
while(count < rp && it.hasNext()){ | ||
bookmark = sb.bookmarksDB.getBookmark(it.next()); | ||
if(bookmark!=null) { | ||
prop.put("display_bookmarks_"+count+"_id",count); | ||
prop.put("display_bookmarks_"+count+"_link",bookmark.getUrl()); | ||
prop.put("display_bookmarks_"+count+"_date", serverDate.formatISO8601(new Date(bookmark.getTimeStamp()))); | ||
prop.put("display_bookmarks_"+count+"_rfc822date", serverDate.formatRFC1123(new Date(bookmark.getTimeStamp()))); | ||
prop.put("display_bookmarks_"+count+"_public", (bookmark.getPublic() ? "0" : "1")); | ||
prop.put("display_bookmarks_"+count+"_hash", bookmark.getUrlHash()); | ||
prop.put("display_bookmarks_"+count+"_comma", ","); | ||
|
||
// offer both HTML encoded | ||
prop.putHTML("display_bookmarks_"+count+"_title-enc", bookmark.getTitle()); | ||
prop.putHTML("display_bookmarks_"+count+"_desc-enc", bookmark.getDescription()); | ||
prop.putHTML("display_bookmarks_"+count+"_tags-enc", bookmark.getTagsString().replaceAll(",", ", ")); | ||
prop.putHTML("display_bookmarks_"+count+"_folders-enc", (bookmark.getFoldersString())); | ||
|
||
// and plain text (potentially unsecure) | ||
prop.put("display_bookmarks_"+count+"_title", bookmark.getTitle()); | ||
prop.put("display_bookmarks_"+count+"_desc", bookmark.getDescription()); | ||
prop.put("display_bookmarks_"+count+"_tags", bookmark.getTagsString()); | ||
prop.put("display_bookmarks_"+count+"_folders", (bookmark.getFoldersString())); | ||
|
||
count++; | ||
} | ||
} | ||
// eliminate the trailing comma for Json output | ||
rp--; | ||
prop.put("display_bookmarks_"+rp+"_comma", ""); | ||
prop.put("display_bookmarks", count); | ||
|
||
while(it.hasNext()){ | ||
it.next(); | ||
count++; | ||
} | ||
total += count; | ||
prop.put("display_page", page); | ||
prop.put("display_total", total); | ||
break; | ||
} // end switch | ||
|
||
// return rewrite properties | ||
return prop; | ||
} | ||
|
||
private static int recurseFolders(final Iterator<String> it, String root, int count, final boolean next, final String prev){ | ||
String fn=""; | ||
|
||
if(next) fn = it.next(); | ||
else fn = prev; | ||
|
||
if(fn.equals("\uffff")) { | ||
int i = prev.replaceAll("[^/]","").length() - R; | ||
while(i>0){ | ||
prop.put("display_xbel_"+count+"_elements", "</folder>"); | ||
count++; | ||
i--; | ||
} | ||
return count; | ||
} | ||
|
||
if(fn.startsWith(root)){ | ||
prop.put("display_xbel_"+count+"_elements", "<folder id=\""+bookmarksDB.tagHash(fn)+"\">"); | ||
count++; | ||
|
||
final String title = fn; // just to make sure fn stays untouched | ||
prop.put("display_xbel_"+count+"_elements", "<title>" + htmlFilterCharacterCoding.unicode2xml(title.replaceAll("(/.[^/]*)*/", ""), true) + "</title>"); | ||
count++; | ||
final Iterator<String> bit=sb.bookmarksDB.getBookmarksIterator(fn, isAdmin); | ||
count = print_XBEL(bit, count); | ||
if(it.hasNext()){ | ||
count = recurseFolders(it, fn, count, true, fn); | ||
} | ||
} else { | ||
prop.put("display_xbel_"+count+"_elements", "</folder>"); | ||
count++; | ||
root = root.replaceAll("(/.[^/]*$)", ""); | ||
if(root.equals("")) root = "/"; | ||
count = recurseFolders(it, root, count, false, fn); | ||
} | ||
return count; | ||
} | ||
|
||
private static int print_XBEL(final Iterator<String> bit, int count) { | ||
bookmarksDB.Bookmark bookmark; | ||
Date date; | ||
while(bit.hasNext()){ | ||
bookmark=sb.bookmarksDB.getBookmark(bit.next()); | ||
date=new Date(bookmark.getTimeStamp()); | ||
prop.put("display_xbel_"+count+"_elements", "<bookmark id=\"" + bookmark.getUrlHash() | ||
+ "\" href=\"" + htmlFilterCharacterCoding.unicode2xml(bookmark.getUrl(), true) | ||
+ "\" added=\"" + htmlFilterCharacterCoding.unicode2xml(serverDate.formatISO8601(date), true)+"\">"); | ||
count++; | ||
prop.put("display_xbel_"+count+"_elements", "<title>"); | ||
count++; | ||
prop.putXML("display_xbel_"+count+"_elements", bookmark.getTitle()); | ||
count++; | ||
prop.put("display_xbel_"+count+"_elements", "</title>"); | ||
count++; | ||
prop.put("display_xbel_"+count+"_elements", "<info>"); | ||
count++; | ||
prop.put("display_xbel_"+count+"_elements", "<metadata owner=\"Mozilla\" ShortcutURL=\"" | ||
+ htmlFilterCharacterCoding.unicode2xml(bookmark.getTagsString().replaceAll("/.*,", "").toLowerCase(), true) | ||
+ "\"/>"); | ||
count++; | ||
prop.put("display_xbel_"+count+"_elements", "<metadata owner=\"YaCy\" public=\""+Boolean.toString(bookmark.getPublic())+"\"/>"); | ||
count++; | ||
prop.put("display_xbel_"+count+"_elements", "</info>"); | ||
count++; | ||
prop.put("display_xbel_"+count+"_elements", "<desc>"); | ||
count++; | ||
prop.putXML("display_xbel_"+count+"_elements", bookmark.getDescription()); | ||
count++; | ||
prop.put("display_xbel_"+count+"_elements", "</desc>"); | ||
count++; | ||
prop.put("display_xbel_"+count+"_elements", "</bookmark>"); | ||
count++; | ||
} | ||
return count; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
#(display)# | ||
{ | ||
page: #[page]#, | ||
total: #[total]#, | ||
posts: [ | ||
#{bookmarks}# | ||
{bookmark:["#[hash]#",#(public)#"public"::"private"#(/public)#,"#[title]#","#[link]#","#[tags]#","#[folders]#","#[date]#"]}#[comma]# | ||
#{/bookmarks}# | ||
] | ||
} | ||
:: | ||
{ | ||
page: #[page]#, | ||
total: #[total]#, | ||
rows: [ | ||
#{bookmarks}# | ||
{id:"#[id]#",cell:[ | ||
"#[hash]#", | ||
#(public)#"<img src='img-2/world2.png' alt='public' title='public bookmark'/>"::"<img src='img-2/lock.png' alt='private' title='private bookmark'/>"#(/public)#, | ||
"<h3 class='linktitle'>#[title-enc]#</h3><p class='desc'>#[desc-enc]#</p><p class='url'><a href='#[link]#'>#[link]#</a>", | ||
"<p class='tags'>#[tags-enc]#</p>", | ||
"<p class='folders'>#[folders-enc]#</p>", | ||
"<p class='date'>#[rfc822date]#</p>"]}#[comma]# | ||
#{/bookmarks}# | ||
] | ||
} | ||
#(/display)# |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,52 @@ | ||
<?xml version="1.0" encoding="UTF-8"?> | ||
#(display)# | ||
<!-- DOCTYPE YaCy Bookmarks http://www.yacy.net --> | ||
<posts> | ||
#{bookmarks}# | ||
<post href="#[link]#" description="#[title]#" extended="#[desc]#" hash="#[hash]#" tag="#[tags]#" time="#[date]#" #(public)#private="false"::private="true"#(/public)#/> | ||
#{/bookmarks}# | ||
</posts> | ||
:: | ||
<!-- DOCTYPE flexigrid http://www.flexigrid.info/ --> | ||
<rows> | ||
<page>#[page]#</page> | ||
<total>#[total]#</total> | ||
#{bookmarks}#<row id='#[id]#'> | ||
<cell><![CDATA[#[hash]#]]></cell> | ||
#(public)#<cell><![CDATA[<img src='img-2/world2.png' alt='public' title='public bookmark'/>]]></cell>:: | ||
<cell><![CDATA[<img src='img-2/lock.png' alt='private' title='private bookmark'/>]]></cell>#(/public)# | ||
<cell><![CDATA[<h3 class='linktitle'>#[title-enc]#</h3><p class='desc'>#[desc-enc]#</p><p class='url'><a href='#[link]#'>#[link]#</a>]]></cell> | ||
<cell><![CDATA[<p class='tags'>#[tags-enc]#</p>]]></cell> | ||
<cell><![CDATA[<p class='folders'>#[folders-enc]#</p>]]></cell> | ||
<cell><![CDATA[<p class='date'>#[rfc822date]#</p>]]></cell> | ||
</row>#{/bookmarks}# | ||
</rows> | ||
:: | ||
<!DOCTYPE xbel PUBLIC "+//IDN python.org//DTD XML Bookmark Exchange Language 1.0//EN//XML" "http://pyxml.sourceforge.net/topics/dtds/xbel-1.0.dtd"> | ||
<xbel> | ||
#(folder)#:: | ||
<folder id="#[folderhash]#"> | ||
<title>#[foldername]#</title> | ||
#(/folder)# | ||
#{xbel}# | ||
#[elements]# | ||
#{/xbel}# | ||
#(folder)#::</folder>#(/folder)# | ||
</xbel> | ||
:: | ||
<rss version="2.0"> | ||
<channel> | ||
<title><![CDATA[YaCy '#[peer]#': Bookmarks]]></title> | ||
<link>http://#[address]#/xml/bookmarks/get_bookmarks.xml</link> | ||
<description><![CDATA[#[user]#'s Bookmark-Feed]]></description> | ||
</channel> | ||
#{bookmarks}#<item> | ||
<title><![CDATA[#[title]#]]></title> | ||
<link>#[link]#</link> | ||
<pubDate>#[rfc822date]#</pubDate> | ||
<guid>#[hash]#</guid> | ||
<description><![CDATA[<p>#[desc]#</p>]]></description> | ||
<category><![CDATA[#[tags]#]]></category> | ||
</item>#{/bookmarks}# | ||
</rss> | ||
#(/display)# |
Oops, something went wrong.