update to ymarks

- get_xbel.xml is almost working
- startet ymark api documentation info.html

git-svn-id: https://svn.berlios.de/svnroot/repos/yacy/trunk@7313 6c8d7289-2bf4-0310-a012-ef5d649a1542
pull/1/head
apfelmaennchen 15 years ago
parent 808edffaf6
commit cdd65aca71

@ -85,7 +85,7 @@ public class get_treeview {
final String url = new String(bmk_row.get(YMarkTables.BOOKMARK.URL.key()));
final String title = new String(bmk_row.get(YMarkTables.BOOKMARK.TITLE.key(), YMarkTables.BOOKMARK.TITLE.deflt()));
// TODO: get rid of bmtype
// TODO: get_treeview - get rid of bmtype
if (post.containsKey("bmtype")) {
if (post.get("bmtype").equals("title")) {
prop.put("folders_"+count+"_foldername", title);

@ -4,8 +4,8 @@ import java.util.Iterator;
import net.yacy.cora.protocol.RequestHeader;
import net.yacy.document.parser.html.CharacterCoding;
import net.yacy.kelondro.blob.Tables;
import net.yacy.kelondro.index.RowSpaceExceededException;
import net.yacy.kelondro.logging.Log;
import de.anomic.data.BookmarkHelper;
import de.anomic.data.YMarkIndex;
import de.anomic.data.YMarkTables;
import de.anomic.data.userDB;
@ -17,17 +17,19 @@ public class get_xbel {
public static final String ROOT = "root";
public static final String SOURCE = "source";
static Switchboard sb;
static serverObjects prop;
static String bmk_user;
public static serverObjects respond(final RequestHeader header, final serverObjects post, final serverSwitch env) {
final Switchboard sb = (Switchboard) env;
sb = (Switchboard) env;
prop = new serverObjects();
final userDB.Entry user = sb.userDB.getUser(header);
final boolean isAdmin = (sb.verifyAuthentication(header, true));
final boolean isAuthUser = user!= null && user.hasRight(userDB.Entry.BOOKMARK_RIGHT);
if(isAdmin || isAuthUser) {
final String bmk_user = (isAuthUser ? user.getUserName() : YMarkTables.USER_ADMIN);
bmk_user = (isAuthUser ? user.getUserName() : YMarkTables.USER_ADMIN);
String root = YMarkTables.FOLDERS_ROOT;
String[] foldername = null;
@ -39,42 +41,95 @@ public class get_xbel {
} else if (post.get(ROOT).startsWith(YMarkTables.FOLDERS_ROOT)) {
root = post.get(ROOT);
} else {
root = YMarkTables.FOLDERS_ROOT + post.get(ROOT);
root = "";
// root = YMarkTables.FOLDERS_ROOT + post.get(ROOT);
}
}
}
Iterator<String> it = null;
Tables.Row bmk_row = null;
int count = 0;
int n = YMarkIndex.getFolderDepth(root);
// <![CDATA[
// ]]>
// loop through folderList
try {
it = sb.tables.bookmarks.folders.getFolders(bmk_user, root);
} catch (IOException e) {
Log.logException(e);
}
int n = YMarkIndex.getFolderDepth(root);;
while (it.hasNext()) {
while (it.hasNext()) {
String folder = it.next();
foldername = folder.split(YMarkTables.FOLDERS_SEPARATOR);
if (foldername.length == n+1) {
prop.put("xbel_"+count+"_elements", "<folder id=\""+new String(YMarkTables.getKeyId(foldername[n]))+"\">");
Log.logInfo(YMarkTables.BOOKMARKS_LOG, "folder: "+folder+" getFolderDepth(folder): "+YMarkIndex.getFolderDepth(folder)+" n: "+n);
if (count > 0 && YMarkIndex.getFolderDepth(folder) <= n) {
prop.put("xbel_"+count+"_elements", "</folder>");
count++;
}
if (YMarkIndex.getFolderDepth(folder) >= n) {
n = YMarkIndex.getFolderDepth(folder);
prop.put("xbel_"+count+"_elements", "<folder id=\"f:"+new String(YMarkTables.getKeyId(foldername[n]))+"\">");
count++;
prop.put("xbel_"+count+"_elements", "<title>" + CharacterCoding.unicode2xml(foldername[n], true) + "</title>");
count++;
// print bookmars
try {
count = putBookmarks(folder, count);
} catch (IOException e) {
Log.logException(e);
continue;
} catch (RowSpaceExceededException e) {
Log.logException(e);
continue;
}
}
}
while(n >= YMarkIndex.getFolderDepth(root)) {
prop.put("xbel_"+count+"_elements", "</folder>");
count++;
n--;
}
prop.put("xbel", count);
} else {
prop.put(YMarkTables.USER_AUTHENTICATE,YMarkTables.USER_AUTHENTICATE_MSG);
}
// return rewrite properties
return prop;
}
public static int putBookmarks(final String folder, int count) throws IOException, RowSpaceExceededException {
final Iterator<String> bit = sb.tables.bookmarks.folders.getBookmarks(bmk_user, folder).iterator();
Tables.Row bmk_row = null;
String urlHash;
while(bit.hasNext()){
urlHash = new String(bit.next());
bmk_row = sb.tables.select(YMarkTables.TABLES.BOOKMARKS.tablename(bmk_user), urlHash.getBytes());
if(bmk_row != null) {
prop.put("xbel_"+count+"_elements", "<bookmark id=\"b:" + urlHash
+ "\" href=\"" + CharacterCoding.unicode2xml(bmk_row.get(YMarkTables.BOOKMARK.URL.key(), YMarkTables.BOOKMARK.URL.deflt()), true)
+ "\" added=\"" + CharacterCoding.unicode2xml(YMarkTables.getISO8601(bmk_row.get(YMarkTables.BOOKMARK.DATE_ADDED.key())), true)
+ "\" modified=\"" + CharacterCoding.unicode2xml(YMarkTables.getISO8601(bmk_row.get(YMarkTables.BOOKMARK.DATE_MODIFIED.key())), true)
+ "\" visited=\"" + CharacterCoding.unicode2xml(YMarkTables.getISO8601(bmk_row.get(YMarkTables.BOOKMARK.DATE_VISITED.key())), true)
+"\">");
count++;
prop.put("xbel_"+count+"_elements", "<title>"
+ CharacterCoding.unicode2xml(bmk_row.get(YMarkTables.BOOKMARK.TITLE.key(), YMarkTables.BOOKMARK.TITLE.deflt()), true)
+ "</title>");
count++;
prop.put("xbel_"+count+"_elements", "<info>");
count++;
prop.put("xbel_"+count+"_elements", "<metadata owner=\"YaCy\""
+ " tags=\"" + bmk_row.get(YMarkTables.BOOKMARK.TAGS.key(), YMarkTables.BOOKMARK.TAGS.deflt()) +"\""
+ " public=\"" + bmk_row.get(YMarkTables.BOOKMARK.PUBLIC.key(), YMarkTables.BOOKMARK.PUBLIC.deflt()) +"\""
+ "/>");
count++;
prop.put("xbel_"+count+"_elements", "</info>");
count++;
prop.put("xbel_"+count+"_elements", "<desc>"
+ CharacterCoding.unicode2xml(bmk_row.get(YMarkTables.BOOKMARK.DESC.key(), YMarkTables.BOOKMARK.DESC.deflt()), true)
+ "</desc>");
count++;
prop.put("xbel_"+count+"_elements", "</bookmark>");
count++;
}
}
return count;
}
}

@ -3,6 +3,8 @@ import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import org.xml.sax.SAXException;
import net.yacy.cora.protocol.RequestHeader;
import net.yacy.kelondro.index.RowSpaceExceededException;
import net.yacy.kelondro.logging.Log;
@ -23,56 +25,66 @@ public class import_ymark {
final userDB.Entry user = sb.userDB.getUser(header);
final boolean isAdmin = (sb.verifyAuthentication(header, true));
final boolean isAuthUser = user!= null && user.hasRight(userDB.Entry.BOOKMARK_RIGHT);
Thread t;
HashMap<String,String> bmk;
ByteArrayInputStream byteIn = null;
if(isAdmin || isAuthUser) {
final String bmk_user = (isAuthUser ? user.getUserName() : YMarkTables.USER_ADMIN);
if(post.containsKey("htmlfile")){
ByteArrayInputStream byteIn = null;
if(post.containsKey("bmkfile") && post.containsKey("importer")){
try {
byteIn = new ByteArrayInputStream(post.get("htmlfile$file").getBytes("UTF-8"));
byteIn = new ByteArrayInputStream(post.get("bmkfile$file").getBytes("UTF-8"));
} catch (UnsupportedEncodingException e) {
//TODO: display an error message
Log.logException(e);
prop.put("result", "0");
return prop;
}
if(byteIn !=null) {
if(post.get("importer").equals("html") && byteIn != null) {
final YMarksHTMLImporter htmlImporter = new YMarksHTMLImporter(byteIn, 100);
Thread t = new Thread(htmlImporter, "YMarks - HTML Importer");
t = new Thread(htmlImporter, "YMarks - HTML Importer");
t.start();
HashMap<String,String> bmk;
while ((bmk = htmlImporter.take()) != YMarkTables.POISON) {
try {
sb.tables.bookmarks.addBookmark(bmk_user, bmk, true);
} catch (IOException e) {
Log.logWarning(YMarkTables.BOOKMARKS_LOG.toString(), "IOException for URL: "+bmk.get(YMarkTables.BOOKMARK.URL.key()));
Log.logWarning(YMarkTables.BOOKMARKS_LOG.toString(), "HTML Importer - IOException for URL: "+bmk.get(YMarkTables.BOOKMARK.URL.key()));
continue;
} catch (RowSpaceExceededException e) {
//TODO: display an error message
Log.logException(e);
prop.put("result", "0");
return prop;
}
}
}
prop.put("result", "1");
}
if(post.containsKey("xbelfile")){
try {
final ByteArrayInputStream byteIn = new ByteArrayInputStream(post.get("xbelfile$file").getBytes("UTF-8"));
if(byteIn != null) {
final YMarksXBELImporter xbelImporter = new YMarksXBELImporter(byteIn, 100);
Thread t = new Thread(xbelImporter, "YMarks - HTML Importer");
t.start();
HashMap<String,String> bmk;
while ((bmk = xbelImporter.take()) != YMarkTables.POISON) {
try {
sb.tables.bookmarks.addBookmark(bmk_user, bmk, true);
} catch (RowSpaceExceededException e) {
Log.logException(e);
}
}
prop.put("result", "1");
} else if(post.get("importer").equals("xbel") && byteIn != null) {
final YMarksXBELImporter xbelImporter;
try {
xbelImporter = new YMarksXBELImporter(byteIn, 100);
} catch (SAXException e) {
//TODO: display an error message
Log.logException(e);
prop.put("result", "0");
return prop;
}
} catch (UnsupportedEncodingException e) {
Log.logException(e);
} catch (IOException e) {
Log.logException(e);
}
prop.put("result", "1");
t = new Thread(xbelImporter, "YMarks - XBEL Importer");
t.start();
while ((bmk = xbelImporter.take()) != YMarkTables.POISON) {
try {
sb.tables.bookmarks.addBookmark(bmk_user, bmk, true);
} catch (IOException e) {
Log.logWarning(YMarkTables.BOOKMARKS_LOG.toString(), "XBEL Importer - IOException for URL: "+bmk.get(YMarkTables.BOOKMARK.URL.key()));
continue;
} catch (RowSpaceExceededException e) {
//TODO: display an error message
Log.logException(e);
prop.put("result", "0");
return prop;
}
}
prop.put("result", "1");
}
}
} else {
prop.put(YMarkTables.USER_AUTHENTICATE,YMarkTables.USER_AUTHENTICATE_MSG);

@ -0,0 +1,57 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>YaCy - YMark API Info</title>
</head>
<body>
<h3>YaCy - YMark API Info</h3>
<ul>
<li>add_ymark.xml
<ul>
<li><i>url: the bookmark url</i></li>
<li><i>title:</i></li>
<li><i>desc:</i></li>
<li><i>tags:</i></li>
<li><i>folders:</i></li>
<li><i>public:</i></li>
</ul>
</li>
<li>delete_ymark.xml
<ul>
<li><i>id:</i></li>
<li><i>url:</i></li>
</ul>
</li>
<li>get_ymark.xml
<ul>
<li><i>id:</i></li>
<li><i>url:</i></li>
<li><i>tags:</i></li>
<li><i>folders:</i></li>
</ul>
</li>
<li>get_treeview.[xml | json]
<ul>
<li><i>root:</i></li>
<li><i>bmtype:</i></li>
</ul>
</li>
<li>get_xbel</li>
<li>import_ymark.xml
<ul>
<li><i>bmfile:</i> the bookmark file you want to import
<ul>
<li>method="post"</li>
<li>enctype="multipart/form-data"</li>
<li>charset="UTF-8"
<br/>for special characters to display correctly, it is important that the file is utf-8 encoded
</li>
</ul>
</li>
<li><i>importer:</i> html | xbel | surrogates</li>
</ul>
</li>
</ul>
</body>
</html>

@ -6,57 +6,22 @@
<body>
<form action="/api/ymarks/import_ymark.xml" method="post" enctype="multipart/form-data">
<fieldset>
<legend>Import HTML Bookmarks</legend>
<legend>Import Bookmarks</legend>
<dl>
<dt>
<label for="file">File:</label>
<label for="importer">Importer:</label>
</dt>
<dd>
<input type="file" name="htmlfile" id="htmlfile" />
</dd>
<dt>
<label for="tags">Default Tags:</label>
</dt>
<dd>
<input type="text" name="tags" id="tags" value="imported" />
</dd>
<dt>
<label for="public">import as Public:</label>
</dt>
<dd>
<select name="public" id="public">
<option value="public">yes</option>
<option value="private">no</option>
<select name="importer" id="importer">
<option value="xbel">XBEL Importer</option>
<option value="html">Netscape HTML Importer</option>
</select>
</dd>
</dl>
<input type="submit" name="importbookmarks" value="import" />
</fieldset>
</form>
<form action="/api/ymarks/import_ymark.xml" method="post" enctype="multipart/form-data">
<fieldset>
<legend>Import XBEL Bookmarks</legend>
<dl>
<dt>
<label for="file">File:</label>
</dt>
<dd>
<input type="file" name="xbelfile" id="xbelfile" />
</dd>
<dt>
<label for="tags">Default Tags:</label>
</dt>
<dd>
<input type="text" name="tags" id="tags" value="imported" />
</dd>
<dt>
<label for="public">import as Public:</label>
</dt>
<dd>
<select name="public" id="public">
<option value="public">yes</option>
<option value="private">no</option>
</select>
<input type="file" name="bmkfile" id="bmkfile" />
</dd>
</dl>
<input type="submit" name="importbookmarks" value="import" />

@ -61,9 +61,9 @@ public class YMarkIndex {
}
public static int getFolderDepth(String folder) {
final int depth = folder.split(YMarkTables.FOLDERS_SEPARATOR).length;
if (depth == 0)
return 1;
final int depth = folder.split(YMarkTables.FOLDERS_SEPARATOR).length -1;
if (depth < 0)
return 0;
else
return depth;
}

@ -17,6 +17,7 @@ import net.yacy.kelondro.data.meta.DigestURI;
import net.yacy.kelondro.data.word.Word;
import net.yacy.kelondro.index.RowSpaceExceededException;
import net.yacy.kelondro.logging.Log;
import net.yacy.kelondro.util.DateFormatter;
public class YMarkTables {
@ -151,6 +152,15 @@ public class YMarkTables {
return dateformat.parse(date.toString());
}
public static String getISO8601(final byte[] date) {
if(date != null) {
final String s = new String(date);
if(!s.isEmpty())
return DateFormatter.formatISO8601(new Date(Long.parseLong(s)));
}
return "";
}
public final static byte[] getBookmarkId(String url) throws MalformedURLException {
return (new DigestURI(url, null)).hash();
}

@ -48,7 +48,7 @@ public class YMarksXBELImporter extends DefaultHandler implements Runnable {
private final SAXParser saxParser;
public YMarksXBELImporter (final InputStream input, int queueSize) throws IOException {
public YMarksXBELImporter (final InputStream input, int queueSize) throws SAXException {
this.bmk = null;
this.buffer = new StringBuilder();
this.folder = new StringBuilder(YMarkTables.FOLDER_BUFFER_SIZE);
@ -60,10 +60,7 @@ public class YMarksXBELImporter extends DefaultHandler implements Runnable {
this.saxParser = factory.newSAXParser();
} catch (ParserConfigurationException e) {
Log.logException(e);
throw new IOException(e.getMessage());
} catch (SAXException e) {
Log.logException(e);
throw new IOException(e.getMessage());
throw new SAXException (e.getMessage());
}
}
@ -136,6 +133,7 @@ public class YMarksXBELImporter extends DefaultHandler implements Runnable {
this.parse_value = true;
*/
} else if (XBEL.ALIAS.tag().equals(tag)) {
// TODO: handle xbel aliases
/*
this.alias_ref = atts.getValue(uri, "ref");
this.inner_state = XBEL.ALIAS;
@ -192,6 +190,7 @@ public class YMarksXBELImporter extends DefaultHandler implements Runnable {
this.bmk.put(YMarkTables.BOOKMARK.TITLE.key(), this.buffer.toString());
break;
case METADATA:
// TODO: handle xbel bookmark metadata
// this.meta_data = this.buffer.toString();
break;
default:
@ -207,7 +206,8 @@ public class YMarksXBELImporter extends DefaultHandler implements Runnable {
this.folder.append(this.buffer);
break;
case METADATA:
// this.meta_data = this.buffer.toString();
// TODO: handle xbel folder metadata
// this.meta_data = this.buffer.toString();
break;
default:
break;

Loading…
Cancel
Save