diff --git a/htroot/api/ymarks/get_treeview.java b/htroot/api/ymarks/get_treeview.java
index 1c36a9f88..de1a27a07 100644
--- a/htroot/api/ymarks/get_treeview.java
+++ b/htroot/api/ymarks/get_treeview.java
@@ -122,10 +122,13 @@ public class get_treeview {
while(it.hasNext()) {
final String key = it.next();
if(key.startsWith("date")) {
- final String date = DateFormatter.formatISO8601(new Date(Long.parseLong(new String(bmk_row.get(key)))));
- prop.put("folders_"+count+"_foldername",""+key+": " + date + "");
- putProp(count, "date");
- count++;
+ final String d = new String(bmk_row.get(key));
+ if(!d.isEmpty()) {
+ final String date = DateFormatter.formatISO8601(new Date(Long.parseLong(d)));
+ prop.put("folders_"+count+"_foldername",""+key+": " + date + "");
+ putProp(count, "date");
+ count++;
+ }
} else {
final String value = new String(bmk_row.get(key));
prop.put("folders_"+count+"_foldername",""+key+": " + value + "");
diff --git a/htroot/api/ymarks/get_xbel.java b/htroot/api/ymarks/get_xbel.java
index ae5405238..54ca1ae1b 100644
--- a/htroot/api/ymarks/get_xbel.java
+++ b/htroot/api/ymarks/get_xbel.java
@@ -1,4 +1,5 @@
import java.io.IOException;
+import java.util.HashSet;
import java.util.Iterator;
import net.yacy.cora.protocol.RequestHeader;
@@ -6,8 +7,8 @@ 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.YMarkIndex;
import de.anomic.data.YMarkTables;
+import de.anomic.data.YMarksXBELImporter;
import de.anomic.data.userDB;
import de.anomic.search.Switchboard;
import de.anomic.server.serverObjects;
@@ -16,24 +17,24 @@ import de.anomic.server.serverSwitch;
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) {
- sb = (Switchboard) env;
- prop = new serverObjects();
- final userDB.Entry user = sb.userDB.getUser(header);
+ final Switchboard sb = (Switchboard) env;
+ final serverObjects prop = new serverObjects();
+ final HashSet alias = new HashSet();
+ final StringBuilder buffer = new StringBuilder(250);
+ 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);
+ final String bmk_user;
if(isAdmin || isAuthUser) {
bmk_user = (isAuthUser ? user.getUserName() : YMarkTables.USER_ADMIN);
String root = YMarkTables.FOLDERS_ROOT;
String[] foldername = null;
-
+
+ // TODO: better handling of query
if (post != null){
if (post.containsKey(ROOT)) {
if (post.get(ROOT).equals(SOURCE) || post.get(ROOT).equals(YMarkTables.FOLDERS_ROOT)) {
@@ -41,38 +42,111 @@ public class get_xbel {
} else if (post.get(ROOT).startsWith(YMarkTables.FOLDERS_ROOT)) {
root = post.get(ROOT);
} else {
- root = "";
- // root = YMarkTables.FOLDERS_ROOT + post.get(ROOT);
+ root = "";
}
}
+ } else {
+ root = "";
}
- Iterator it = null;
- int count = 0;
- int n = YMarkIndex.getFolderDepth(root);
+ final int root_depth = root.split(YMarkTables.FOLDERS_SEPARATOR).length;
+ Iterator fit = null;
+ Iterator bit = null;
+ int count = 0;
+ int n = root_depth;
try {
- it = sb.tables.bookmarks.folders.getFolders(bmk_user, root);
+ fit = sb.tables.bookmarks.folders.getFolders(bmk_user, root);
} catch (IOException e) {
Log.logException(e);
}
- while (it.hasNext()) {
- String folder = it.next();
- foldername = folder.split(YMarkTables.FOLDERS_SEPARATOR);
- Log.logInfo(YMarkTables.BOOKMARKS_LOG, "folder: "+folder+" getFolderDepth(folder): "+YMarkIndex.getFolderDepth(folder)+" n: "+n);
- if (count > 0 && YMarkIndex.getFolderDepth(folder) <= n) {
+ Log.logInfo(YMarkTables.BOOKMARKS_LOG, "root: "+root+" root_deph: "+root_depth);
+
+ while (fit.hasNext()) {
+ String folder = fit.next();
+ foldername = folder.split(YMarkTables.FOLDERS_SEPARATOR);
+ Log.logInfo(YMarkTables.BOOKMARKS_LOG, "folder: "+folder+" n: "+n+" folder_length: "+foldername.length);
+ if (n != root_depth && foldername.length <= n) {
prop.put("xbel_"+count+"_elements", "");
count++;
- }
- if (YMarkIndex.getFolderDepth(folder) >= n) {
- n = YMarkIndex.getFolderDepth(folder);
- prop.put("xbel_"+count+"_elements", "");
- count++;
- prop.put("xbel_"+count+"_elements", "" + CharacterCoding.unicode2xml(foldername[n], true) + "");
- count++;
+ }
+ if (foldername.length >= n) {
+ n = foldername.length;
+ if(n != root_depth) {
+ prop.put("xbel_"+count+"_elements", "");
+ count++;
+ prop.put("xbel_"+count+"_elements", "" + CharacterCoding.unicode2xml(foldername[n-1], true) + "");
+ count++;
+ }
try {
- count = putBookmarks(folder, count);
+ 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());
+ if(alias.contains(urlHash)) {
+ buffer.setLength(0);
+ buffer.append(YMarksXBELImporter.XBEL.ALIAS.startTag(true));
+ buffer.append(" ref=\"b:");
+ buffer.append(urlHash);
+ buffer.append("\"/>");
+ prop.put("xbel_"+count+"_elements", buffer.toString());
+ count++;
+ } else {
+ alias.add(urlHash);
+ bmk_row = sb.tables.select(YMarkTables.TABLES.BOOKMARKS.tablename(bmk_user), urlHash.getBytes());
+ if(bmk_row != null) {
+ buffer.setLength(0);
+
+ buffer.append(YMarksXBELImporter.XBEL.BOOKMARK.startTag(true));
+ buffer.append(" id=\"b:");
+ buffer.append(urlHash);
+
+ buffer.append(YMarkTables.BOOKMARK.URL.xbel());
+ buffer.append(CharacterCoding.unicode2xml(bmk_row.get(YMarkTables.BOOKMARK.URL.key(), YMarkTables.BOOKMARK.URL.deflt()), true));
+
+ buffer.append(YMarkTables.BOOKMARK.DATE_ADDED.xbel());
+ buffer.append(CharacterCoding.unicode2xml(YMarkTables.getISO8601(bmk_row.get(YMarkTables.BOOKMARK.DATE_ADDED.key())), true));
+
+ buffer.append(YMarkTables.BOOKMARK.DATE_MODIFIED.xbel());
+ buffer.append(CharacterCoding.unicode2xml(YMarkTables.getISO8601(bmk_row.get(YMarkTables.BOOKMARK.DATE_MODIFIED.key())), true));
+
+ buffer.append(YMarkTables.BOOKMARK.DATE_VISITED.xbel());
+ buffer.append(CharacterCoding.unicode2xml(YMarkTables.getISO8601(bmk_row.get(YMarkTables.BOOKMARK.DATE_VISITED.key())), true));
+
+ buffer.append(YMarkTables.BOOKMARK.TAGS.xbel());
+ buffer.append(bmk_row.get(YMarkTables.BOOKMARK.TAGS.key(), YMarkTables.BOOKMARK.TAGS.deflt()));
+
+ buffer.append(YMarkTables.BOOKMARK.PUBLIC.xbel());
+ buffer.append(bmk_row.get(YMarkTables.BOOKMARK.PUBLIC.key(), YMarkTables.BOOKMARK.PUBLIC.deflt()));
+
+ buffer.append(YMarkTables.BOOKMARK.VISITS.xbel());
+ buffer.append(bmk_row.get(YMarkTables.BOOKMARK.VISITS.key(), YMarkTables.BOOKMARK.VISITS.deflt()));
+
+ buffer.append("\"\n>");
+ prop.put("xbel_"+count+"_elements", buffer.toString());
+ count++;
+
+ buffer.setLength(0);
+ buffer.append(YMarksXBELImporter.XBEL.TITLE.startTag(false));
+ buffer.append(CharacterCoding.unicode2xml(bmk_row.get(YMarkTables.BOOKMARK.TITLE.key(), YMarkTables.BOOKMARK.TITLE.deflt()), true));
+ buffer.append(YMarksXBELImporter.XBEL.TITLE.endTag(false));
+ prop.put("xbel_"+count+"_elements", buffer.toString());
+ count++;
+
+ buffer.setLength(0);
+ buffer.append(YMarksXBELImporter.XBEL.DESC.startTag(false));
+ buffer.append(CharacterCoding.unicode2xml(bmk_row.get(YMarkTables.BOOKMARK.DESC.key(), YMarkTables.BOOKMARK.DESC.deflt()), true));
+ buffer.append(YMarksXBELImporter.XBEL.DESC.endTag(false));
+ prop.put("xbel_"+count+"_elements", buffer.toString());
+ count++;
+
+ prop.put("xbel_"+count+"_elements", YMarksXBELImporter.XBEL.BOOKMARK.endTag(false));
+ count++;
+ }
+ }
+ }
} catch (IOException e) {
Log.logException(e);
continue;
@@ -82,54 +156,20 @@ public class get_xbel {
}
}
}
- while(n >= YMarkIndex.getFolderDepth(root)) {
- prop.put("xbel_"+count+"_elements", "");
+ while(n > root_depth) {
+ prop.put("xbel_"+count+"_elements", YMarksXBELImporter.XBEL.FOLDER.endTag(false));
count++;
n--;
}
+ prop.put("user", bmk_user.substring(0,1).toUpperCase() + bmk_user.substring(1));
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 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", "");
- count++;
- prop.put("xbel_"+count+"_elements", ""
- + CharacterCoding.unicode2xml(bmk_row.get(YMarkTables.BOOKMARK.TITLE.key(), YMarkTables.BOOKMARK.TITLE.deflt()), true)
- + "");
- count++;
- prop.put("xbel_"+count+"_elements", "");
- count++;
- prop.put("xbel_"+count+"_elements", "");
- count++;
- prop.put("xbel_"+count+"_elements", "");
- count++;
- prop.put("xbel_"+count+"_elements", ""
- + CharacterCoding.unicode2xml(bmk_row.get(YMarkTables.BOOKMARK.DESC.key(), YMarkTables.BOOKMARK.DESC.deflt()), true)
- + "");
- count++;
- prop.put("xbel_"+count+"_elements", "");
- count++;
- }
- }
- return count;
- }
}
+
+
diff --git a/htroot/api/ymarks/get_xbel.xml b/htroot/api/ymarks/get_xbel.xml
index 69b9a7b45..de53be37e 100644
--- a/htroot/api/ymarks/get_xbel.xml
+++ b/htroot/api/ymarks/get_xbel.xml
@@ -1,8 +1,14 @@
-
-#(style)#::#(/style)#
-
- #{xbel}#
- #[elements]#
- #{/xbel}#
+
+]>
+
+#[user]# YaCy Bookmarks
+
+
+
+#{xbel}#
+#[elements]#
+#{/xbel}#
\ No newline at end of file
diff --git a/htroot/api/ymarks/import_ymark.java b/htroot/api/ymarks/import_ymark.java
index 9750bc5e4..f4f6225b1 100644
--- a/htroot/api/ymarks/import_ymark.java
+++ b/htroot/api/ymarks/import_ymark.java
@@ -2,6 +2,7 @@ import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
+import java.util.Iterator;
import org.xml.sax.SAXException;
@@ -82,6 +83,21 @@ public class import_ymark {
prop.put("result", "0");
return prop;
}
+ }
+ // update bookmarks with aliases
+ final Iterator> it = xbelImporter.getAliases().iterator();
+ while (it.hasNext()) {
+ try {
+ sb.tables.bookmarks.addBookmark(bmk_user, it.next(), 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");
}
diff --git a/htroot/api/ymarks/info.html b/htroot/api/ymarks/info.html
index 4b5cf8747..ab21b4e2c 100644
--- a/htroot/api/ymarks/info.html
+++ b/htroot/api/ymarks/info.html
@@ -33,11 +33,16 @@
get_treeview.[xml | json]
- - root:
+ - root: the folder to display
- bmtype:
- get_xbel
+ get_xml
+
+ - root: the root folder to start export from
+ - type: xbel | rss | rdf
+
+
import_ymark.xml
- bmfile: the bookmark file you want to import
diff --git a/htroot/api/ymarks/test_import.html b/htroot/api/ymarks/test_import.html
index c61daa25a..5d3b2bbaa 100644
--- a/htroot/api/ymarks/test_import.html
+++ b/htroot/api/ymarks/test_import.html
@@ -4,7 +4,7 @@
YaCy Bookmarks
-