added a ymark table administration: /Table_YMark_p.html

git-svn-id: https://svn.berlios.de/svnroot/repos/yacy/trunk@7316 6c8d7289-2bf4-0310-a012-ef5d649a1542
pull/1/head
apfelmaennchen 15 years ago
parent 25339f93c7
commit 94a9be18a4

@ -0,0 +1,202 @@
<!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>
<title>YaCy '#[clientname]#': Table Viewer</title>
#(showtable)#::
<link rel="alternate" type="application/xml" title="Tables" href="Tables.rss?table=#[table]#" />
#(/showtable)#
#%env/templates/metas.template%#
<script type="text/javascript">
<!--
function setall(name, check){
var selectForm = document.forms.namedItem(name);
var count = selectForm.elements["num"].value;
if (check) for(i = 0; i < count; i++) {
if (selectForm.elements["item_" + i].checked) {
check = false;
break;
}
}
for(i = 0; i < count; i++) {
selectForm.elements["item_" + i].checked = check;
}
}
-->
</script>
<script type="text/javascript" src="/js/sorttable.js"></script>
</head>
<body id="YMark">
#%env/templates/header.template%#
#%env/templates/submenuConfig.template%#
#(showselection)#::
<h2>YMark Table Administration</h2>
<form action="Table_YMark_p.html" method="get">
#(/showselection)#
<div style="width:70%; height:700px; float:left;">
#(showtable)#::
<form action="Table_YMark_p.html" method="post" enctype="multipart/form-data" accept-charset="UTF-8" id="tablelisting">
<fieldset>
<legend><label for="tablelisting">Table Editor: showing table '#[table]#'</label></legend>
<div style="float:left;">
<p>
<input type="hidden" name="table" value="#[table]#" />
<input type="hidden" name="num" value="#[num]#" />
<input type="submit" name="editrow" value="Edit Selected Row" />
<input type="submit" name="addrow" value="Add a new Row" disabled/>
<input type="submit" name="deleterows" value="Delete Selected Rows" />
<input type="submit" name="deletetable" value="Delete Table" />
<input type="submit" name="rebuildindex" value="Rebuild Index" disabled/>
</p>
</div>
<div style="width:750px; height:600px; float:left; overflow:scroll;">
<table class="sortable" border="0" cellpadding="2" cellspacing="1">
<tr class="TableHeader" valign="bottom">
<td><input type="checkbox" name="allswitch" onclick="setall(this.form.name, this.value)" /></td>
<td>PK</td>
#{columns}#
<td>#[header]#</td>
#{/columns}#
</tr>
#{list}#
<tr class="TableCell#(dark)#Light::Dark::Summary#(/dark)#">
<td align="left"><input type="checkbox" name="item_#[count]#" value="mark_#[pk]#" /></td>
<td>#[pk]#</td>
#{columns}#
<td align="left">#[cell]#</td>
#{/columns}#
</tr>
#{/list}#
</table>
</div>
</fieldset>
</form>
#(/showtable)#
#(showedit)#::
<div style="width:800px; height:600px; float:left; overflow:auto;">
<form action="Tables_p.html" method="post" enctype="multipart/form-data" accept-charset="UTF-8">
<fieldset><legend>Row Editor</legend>
<dl>
<dt class="TableCellLight">Primary Key</dt>
<dd>#[pk]#</dd>
#{list}#
<dt class="TableCellLight">#[key]#</dt>
<dd>
<input type="text" name="col_#[key]#" value="#[value]#" size="65"/>
</dd>
#{/list}#
<dt class="TableCellDark"></dt>
<dd>
<input type="hidden" name="table" value="#[table]#" />
<input type="hidden" name="pk" value="#[pk]#" />
<input type="submit" name="commitrow" value="Commit" />
</dd>
</dl>
</fieldset>
</form>
</div>
#(/showedit)#
</div>
#(showselection)#::
<div style="width:320px; float:right;">
<fieldset><legend>Table Selection</legend>
<dl>
<dt>
<label for="table">Select Table:</label>
</dt>
<dd>
<select name="table" onchange='this.form.submit()'>
#{tables}#
<option value="#[name]#" #(selected)#::selected="selected"#(/selected)#>#[name]#</option>
#{/tables}#
</select>
</dd>
<dt>
<label for="count">show max.</label>
</dt>
<dd>
<select name="count" onchange='this.form.submit()'>
<option value="10">10</option>
<option value="100" selected="selected">100</option>
<option value="1000">1000</option>
<option value="all">all</option>
</select>
<b>entries</b>
</dd>
<dt>
<label for="columns">Display columns:</label>
</dt>
<dd>
<select name="columns" multiple onchange='this.form.submit()'>
#{columns}#
<option value="#[col]#">#[col]#</option>
#{/columns}#
</select>
</dd>
</dl>
</fieldset>
<fieldset>
<legend>Search Table</legend>
<dl>
<dt>
<label for="search">search rows for</label>
</dt>
<dd>
<input type="text" name="search" value="#[pattern]#" />
<input type="submit" name="edittable" value="Search" />
</dd>
</dl>
</fieldset>
<fieldset>
<legend>Filter Table</legend>
<dt>
<label for="tags">Tags</label>
</dt>
<dd>
<select name="tags" onchange='this.form.submit()'>
<option value="" selected>select a tag</option>
#{tags}#
<option value="#[tagName]#">#[tagName]#</option>
#{/tags}#
</select>
</dd>
<dt>
<label for="folders">Folders</label>
</dt>
<dd>
<select name="folders" style="width: 200px" onchange='this.form.submit()'>
<option value="" selected>select a folder</option>
#{folders}#
<option value="#[folderName]#">#[folderName]#</option>
#{/folders}#
</select>
</dd>
</fieldset>
<fieldset>
<legend>Import Bookmarks</legend>
<dl>
<dt>
<label for="importer">Importer:</label>
</dt>
<dd>
<select name="importer" id="importer">
<option value="xbel">XBEL Importer</option>
<option value="html">Netscape HTML Importer</option>
</select>
</dd>
<dt>
<label for="file">File:</label>
</dt>
<dd>
<input type="file" name="bmkfile" id="bmkfile" size="10"/>
<input type="submit" name="importbookmarks" value="import" disabled />
</dd>
</dl>
</fieldset>
</form>
</div>
#(/showselection)#
#%env/templates/footer.template%#
</body>
</html>

@ -0,0 +1,255 @@
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;
import net.yacy.cora.protocol.RequestHeader;
import net.yacy.kelondro.blob.Tables;
import net.yacy.kelondro.index.RowSpaceExceededException;
import net.yacy.kelondro.logging.Log;
import de.anomic.data.YMarkTables;
import de.anomic.search.Switchboard;
import de.anomic.server.serverObjects;
import de.anomic.server.serverSwitch;
public class Table_YMark_p {
public static serverObjects respond(final RequestHeader header, final serverObjects post, final serverSwitch env) {
final Switchboard sb = (Switchboard) env;
final serverObjects prop = new serverObjects();
prop.put("showtable", 0);
prop.put("showedit", 0);
prop.put("showselection", 0);
String table = (post == null) ? null : post.get("table", null);
if (table != null && !sb.tables.hasHeap(table)) table = null;
// get the user name for the selected table
String bmk_user = null;
if (table != null)
bmk_user = table.substring(0,table.indexOf('_'));
// show table selection
int count = 0;
Iterator<String> ti = sb.tables.tables();
String tablename;
prop.put("showselection", 1);
while (ti.hasNext()) {
tablename = ti.next();
if(tablename.endsWith(YMarkTables.TABLES.BOOKMARKS.basename())) {
prop.put("showselection_tables_" + count + "_name", tablename);
prop.put("showselection_tables_" + count + "_selected", (table != null && table.equals(tablename)) ? 1 : 0);
count++;
}
}
prop.put("showselection_tables", count);
prop.put("showselection_pattern", "");
if (post == null) return prop; // return rewrite properties
// get available tags and folders
count = 0;
byte[] key;
try {
Iterator<byte[]> iter = sb.tables.keys(YMarkTables.TABLES.TAGS.tablename(bmk_user));
while(iter.hasNext()) {
key = iter.next();
prop.put("showselection_tags_" + count + "_tagHash", new String(key));
prop.put("showselection_tags_" + count + "_tagName", sb.tables.bookmarks.tags.getKeyname(bmk_user, key));
count++;
}
prop.put("showselection_tags", count);
count = 0;
iter = sb.tables.keys(YMarkTables.TABLES.FOLDERS.tablename(bmk_user));
while(iter.hasNext()) {
key = iter.next();
prop.put("showselection_folders_" + count + "_folderHash", new String(key));
prop.put("showselection_folders_" + count + "_folderName", sb.tables.bookmarks.folders.getKeyname(bmk_user, key));
count++;
}
prop.put("showselection_folders", count);
} catch (IOException e) {
Log.logException(e);
} catch (RowSpaceExceededException e) {
Log.logException(e);
}
String counts = post.get("count", null);
int maxcount = (counts == null || counts.equals("all")) ? Integer.MAX_VALUE : Integer.parseInt(counts);
String pattern = post.get("search", "");
Pattern matcher = (pattern.length() == 0 || pattern.equals(".*")) ? null : Pattern.compile(".*" + pattern + ".*");
prop.put("pattern", pattern);
List<String> columns = null;
if (table != null) try {
columns = sb.tables.columns(table);
} catch (IOException e) {
Log.logException(e);
columns = new ArrayList<String>();
}
final Iterator<String> cit = columns.iterator();
count = 0;
while(cit.hasNext()) {
prop.put("showselection_columns_" + count + "_col", cit.next());
count++;
}
prop.put("showselection_columns", count);
// apply deletion requests
if (post.get("deletetable", "").length() > 0) try {
sb.tables.clear(table);
sb.tables.clear(YMarkTables.TABLES.FOLDERS.tablename(bmk_user));
sb.tables.clear(YMarkTables.TABLES.TAGS.tablename(bmk_user));
} catch (IOException e) {
Log.logException(e);
}
if (post.get("deleterows", "").length() > 0) {
for (Map.Entry<String, String> entry: post.entrySet()) {
if (entry.getValue().startsWith("mark_")) try {
sb.tables.bookmarks.deleteBookmark(bmk_user, entry.getValue().substring(5).getBytes());
} catch (IOException e) {
Log.logException(e);
} catch (RowSpaceExceededException e) {
Log.logException(e);
}
}
}
if (post.get("commitrow", "").length() > 0) {
final HashMap<String, String> bmk = new HashMap<String, String>();
for (Map.Entry<String, String> entry: post.entrySet()) {
if (entry.getKey().startsWith("col_")) {
bmk.put(entry.getKey().substring(4), entry.getValue());
}
}
try {
sb.tables.bookmarks.addBookmark(bmk_user, bmk, false);
} catch (IOException e) {
Log.logException(e);
} catch (RowSpaceExceededException e) {
Log.logException(e);
}
}
// generate table
prop.put("showtable", 0);
prop.put("showedit", 0);
if (table != null) {
if (post.containsKey("editrow")) {
// check if we can find a key
String pk = null;
for (Map.Entry<String, String> entry: post.entrySet()) {
if (entry.getValue().startsWith("mark_")) {
pk = entry.getValue().substring(5);
break;
}
}
try {
if (pk != null && sb.tables.has(table, pk.getBytes())) {
setEdit(sb, prop, table, pk, columns);
}
} catch (IOException e) {
Log.logException(e);
} catch (RowSpaceExceededException e) {
Log.logException(e);
}
} else if (post.containsKey("addrow")) try {
// get a new key
String pk = new String(sb.tables.createRow(table));
setEdit(sb, prop, table, pk, columns);
} catch (IOException e) {
Log.logException(e);
} catch (RowSpaceExceededException e) {
Log.logException(e);
} else {
prop.put("showtable", 1);
prop.put("showtable_table", table);
// insert the columns
for (int i = 0; i < columns.size(); i++) {
prop.putHTML("showtable_columns_" + i + "_header", columns.get(i));
}
prop.put("showtable_columns", columns.size());
// insert all rows
try {
maxcount = Math.min(maxcount, sb.tables.size(table));
} catch (IOException e) {
Log.logException(e);
maxcount = 0;
}
count = 0;
try {
Iterator<Tables.Row> mapIterator;
if(post.containsKey("folders") && !post.get("folders").isEmpty()) {
mapIterator = sb.tables.bookmarks.folders.getBookmarks(bmk_user, post.get("folders"));
} else if(post.containsKey("tags") && !post.get("tags").isEmpty()) {
mapIterator = sb.tables.bookmarks.tags.getBookmarks(bmk_user, post.get("tags"));
} else {
final Iterator<Tables.Row> plainIterator = sb.tables.iterator(table, matcher);
mapIterator = sb.tables.orderByPK(plainIterator, maxcount).iterator();
}
Tables.Row row;
boolean dark = true;
byte[] cell;
while (mapIterator.hasNext() && count < maxcount) {
row = mapIterator.next();
if (row == null) continue;
// write table content
prop.put("showtable_list_" + count + "_dark", ((dark) ? 1 : 0) ); dark=!dark;
prop.put("showtable_list_" + count + "_pk", new String(row.getPK()));
prop.put("showtable_list_" + count + "_count", count);
for (int i = 0; i < columns.size(); i++) {
cell = row.get(columns.get(i));
prop.putHTML("showtable_list_" + count + "_columns_" + i + "_cell", cell == null ? "" : new String(cell));
}
prop.put("showtable_list_" + count + "_columns", columns.size());
count++;
}
} catch (IOException e) {
Log.logException(e);
} catch (RowSpaceExceededException e) {
Log.logException(e);
}
prop.put("showtable_list", count);
prop.put("showtable_num", count);
}
}
// adding the peer address
prop.put("address", sb.peers.mySeed().getPublicAddress());
// return rewrite properties
return prop;
}
private static void setEdit(final Switchboard sb, final serverObjects prop, final String table, final String pk, List<String> columns) throws IOException, RowSpaceExceededException {
prop.put("showedit", 1);
prop.put("showedit_table", table);
prop.put("showedit_pk", pk);
Tables.Row row = sb.tables.select(table, pk.getBytes());
if (row == null) return;
int count = 0;
byte[] cell;
for (String col: columns) {
cell = row.get(col);
prop.put("showedit_list_" + count + "_key", col);
prop.put("showedit_list_" + count + "_value", cell == null ? "" : new String(cell));
count++;
}
prop.put("showedit_list", count);
}
}

@ -77,7 +77,7 @@ public class get_treeview {
} }
// loop through bookmarkList // loop through bookmarkList
try { try {
it = sb.tables.bookmarks.folders.getBookmarks(bmk_user, root).iterator(); it = sb.tables.bookmarks.folders.getBookmarkIds(bmk_user, root).iterator();
while (it.hasNext()) { while (it.hasNext()) {
final String urlHash = new String(it.next()); final String urlHash = new String(it.next());
bmk_row = sb.tables.select(YMarkTables.TABLES.BOOKMARKS.tablename(bmk_user), urlHash.getBytes()); bmk_row = sb.tables.select(YMarkTables.TABLES.BOOKMARKS.tablename(bmk_user), urlHash.getBytes());

@ -65,8 +65,7 @@ public class get_xbel {
while (fit.hasNext()) { while (fit.hasNext()) {
String folder = fit.next(); String folder = fit.next();
foldername = folder.split(YMarkTables.FOLDERS_SEPARATOR); 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) { if (n != root_depth && foldername.length <= n) {
prop.put("xbel_"+count+"_elements", "</folder>"); prop.put("xbel_"+count+"_elements", "</folder>");
count++; count++;
@ -80,7 +79,7 @@ public class get_xbel {
count++; count++;
} }
try { try {
bit = sb.tables.bookmarks.folders.getBookmarks(bmk_user, folder).iterator(); bit = sb.tables.bookmarks.folders.getBookmarkIds(bmk_user, folder).iterator();
Tables.Row bmk_row = null; Tables.Row bmk_row = null;
String urlHash; String urlHash;
while(bit.hasNext()){ while(bit.hasNext()){

@ -36,7 +36,7 @@ public class get_ymark {
tags = true; tags = true;
final String[] tagArray = YMarkTables.cleanTagsString(post.get(YMarkTables.BOOKMARK.TAGS.key())).split(YMarkTables.TAGS_SEPARATOR); final String[] tagArray = YMarkTables.cleanTagsString(post.get(YMarkTables.BOOKMARK.TAGS.key())).split(YMarkTables.TAGS_SEPARATOR);
try { try {
bookmarks.addAll(sb.tables.bookmarks.tags.getBookmarks(bmk_user, tagArray)); bookmarks.addAll(sb.tables.bookmarks.tags.getBookmarkIds(bmk_user, tagArray));
} catch (IOException e) { } catch (IOException e) {
Log.logException(e); Log.logException(e);
} catch (RowSpaceExceededException e) { } catch (RowSpaceExceededException e) {
@ -47,9 +47,9 @@ public class get_ymark {
final String[] folderArray = YMarkTables.cleanFoldersString(post.get(YMarkTables.BOOKMARK.FOLDERS.key())).split(YMarkTables.TAGS_SEPARATOR); final String[] folderArray = YMarkTables.cleanFoldersString(post.get(YMarkTables.BOOKMARK.FOLDERS.key())).split(YMarkTables.TAGS_SEPARATOR);
try { try {
if(tags) if(tags)
bookmarks.retainAll(sb.tables.bookmarks.folders.getBookmarks(bmk_user, folderArray)); bookmarks.retainAll(sb.tables.bookmarks.folders.getBookmarkIds(bmk_user, folderArray));
else else
bookmarks.addAll(sb.tables.bookmarks.folders.getBookmarks(bmk_user, folderArray)); bookmarks.addAll(sb.tables.bookmarks.folders.getBookmarkIds(bmk_user, folderArray));
} catch (IOException e) { } catch (IOException e) {
Log.logException(e); Log.logException(e);
} catch (RowSpaceExceededException e) { } catch (RowSpaceExceededException e) {

@ -2,8 +2,6 @@ import java.io.ByteArrayInputStream;
import java.io.IOException; import java.io.IOException;
import java.io.UnsupportedEncodingException; import java.io.UnsupportedEncodingException;
import java.util.HashMap; import java.util.HashMap;
import java.util.Iterator;
import org.xml.sax.SAXException; import org.xml.sax.SAXException;
import net.yacy.cora.protocol.RequestHeader; import net.yacy.cora.protocol.RequestHeader;
@ -62,7 +60,8 @@ public class import_ymark {
} else if(post.get("importer").equals("xbel") && byteIn != null) { } else if(post.get("importer").equals("xbel") && byteIn != null) {
final YMarksXBELImporter xbelImporter; final YMarksXBELImporter xbelImporter;
try { try {
xbelImporter = new YMarksXBELImporter(byteIn, 100); //TODO: make RootFold
xbelImporter = new YMarksXBELImporter(byteIn, 100, YMarkTables.FOLDERS_IMPORTED);
} catch (SAXException e) { } catch (SAXException e) {
//TODO: display an error message //TODO: display an error message
Log.logException(e); Log.logException(e);
@ -83,21 +82,6 @@ public class import_ymark {
prop.put("result", "0"); prop.put("result", "0");
return prop; return prop;
} }
}
// update bookmarks with aliases
final Iterator<HashMap<String,String>> 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"); prop.put("result", "1");
} }

@ -127,7 +127,7 @@ public class YMarkIndex {
} }
} }
public HashSet<String> getBookmarks(final String user, final String keyname) throws IOException, RowSpaceExceededException { public HashSet<String> getBookmarkIds(final String user, final String keyname) throws IOException, RowSpaceExceededException {
final String index_table = user + this.table_basename; final String index_table = user + this.table_basename;
final String cacheKey = index_table+":"+keyname; final String cacheKey = index_table+":"+keyname;
if (this.cache.containsKey(cacheKey)) { if (this.cache.containsKey(cacheKey)) {
@ -143,14 +143,23 @@ public class YMarkIndex {
return new HashSet<String>(); return new HashSet<String>();
} }
public HashSet<String> getBookmarks(final String user, final String[] keyArray) throws IOException, RowSpaceExceededException { public Iterator<Tables.Row> getBookmarks(final String user, final String keyname) throws IOException, RowSpaceExceededException {
final Iterator<String> bit = getBookmarkIds(user, keyname).iterator();
final HashSet<Tables.Row> bookmarks = new HashSet<Tables.Row>();
while(bit.hasNext()) {
bookmarks.add(this.worktables.select(YMarkTables.TABLES.BOOKMARKS.tablename(user), bit.next().getBytes()));
}
return bookmarks.iterator();
}
public HashSet<String> getBookmarkIds(final String user, final String[] keyArray) throws IOException, RowSpaceExceededException {
final HashSet<String> urlSet = new HashSet<String>(); final HashSet<String> urlSet = new HashSet<String>();
urlSet.addAll(getBookmarks(user, keyArray[0])); urlSet.addAll(getBookmarkIds(user, keyArray[0]));
if (urlSet.isEmpty()) if (urlSet.isEmpty())
return urlSet; return urlSet;
if (keyArray.length > 1) { if (keyArray.length > 1) {
for (final String keyname : keyArray) { for (final String keyname : keyArray) {
urlSet.retainAll(getBookmarks(user, keyname)); urlSet.retainAll(getBookmarkIds(user, keyname));
if (urlSet.isEmpty()) if (urlSet.isEmpty())
return urlSet; return urlSet;
} }

@ -33,8 +33,8 @@ public class YMarkTables {
public String basename() { public String basename() {
return this.basename; return this.basename;
} }
public String tablename(String user) { public String tablename(String bmk_user) {
return user+this.basename; return bmk_user+this.basename;
} }
} }
@ -129,7 +129,7 @@ public class YMarkTables {
public final static String FOLDERS_SEPARATOR = "/"; public final static String FOLDERS_SEPARATOR = "/";
public final static String FOLDERS_ROOT = "/"; public final static String FOLDERS_ROOT = "/";
public final static String FOLDERS_UNSORTED = "/unsorted"; public final static String FOLDERS_UNSORTED = "/unsorted";
public final static String FOLDERS_IMPORTED = ""; public final static String FOLDERS_IMPORTED = "/imported";
public static final int FOLDER_BUFFER_SIZE = 100; public static final int FOLDER_BUFFER_SIZE = 100;
public final static String BOOKMARKS_LOG = "BOOKMARKS"; public final static String BOOKMARKS_LOG = "BOOKMARKS";
@ -150,11 +150,11 @@ public class YMarkTables {
} }
public static Date parseISO8601(final String s) throws ParseException { public static Date parseISO8601(final String s) throws ParseException {
StringBuilder date = new StringBuilder(s); if(s == null || s.isEmpty()) {
SimpleDateFormat dateformat;
if(s == null || s.isEmpty()) {
throw new ParseException("parseISO8601 - empty string, nothing to parse", 0); throw new ParseException("parseISO8601 - empty string, nothing to parse", 0);
} }
SimpleDateFormat dateformat;
StringBuilder date = new StringBuilder(s);
if(s.length()==10) if(s.length()==10)
dateformat = new SimpleDateFormat("yyyy-MM-dd"); dateformat = new SimpleDateFormat("yyyy-MM-dd");
else { else {

@ -74,17 +74,23 @@ public class YMarksXBELImporter extends DefaultHandler implements Runnable {
private final InputSource input; private final InputSource input;
private final ArrayBlockingQueue<HashMap<String,String>> bookmarks; private final ArrayBlockingQueue<HashMap<String,String>> bookmarks;
private final XMLReader xmlReader; private final XMLReader xmlReader;
private final String RootFolder;
public YMarksXBELImporter (final InputStream input, int queueSize) throws SAXException { public YMarksXBELImporter (final InputStream input, int queueSize, String root) throws SAXException {
this.bmk = null; this.bmk = null;
this.buffer = new StringBuilder(); this.RootFolder = root;
this.buffer = new StringBuilder();
this.foldersString = new StringBuilder(YMarkTables.FOLDER_BUFFER_SIZE); this.foldersString = new StringBuilder(YMarkTables.FOLDER_BUFFER_SIZE);
this.folder = new StringBuilder(YMarkTables.FOLDER_BUFFER_SIZE); this.folder = new StringBuilder(YMarkTables.FOLDER_BUFFER_SIZE);
this.folder.append(YMarkTables.FOLDERS_IMPORTED);
this.bmkRef = new HashMap<String,HashMap<String,String>>(); this.folder.append(this.RootFolder);
this.input = new InputSource(input);
this.bmkRef = new HashMap<String,HashMap<String,String>>();
this.aliasRef = new HashSet<HashMap<String,String>>(); this.aliasRef = new HashSet<HashMap<String,String>>();
this.bookmarks = new ArrayBlockingQueue<HashMap<String,String>>(queueSize); this.bookmarks = new ArrayBlockingQueue<HashMap<String,String>>(queueSize);
this.input = new InputSource(input);
this.xmlReader = XMLReaderFactory.createXMLReader(); this.xmlReader = XMLReaderFactory.createXMLReader();
this.xmlReader.setContentHandler(this); this.xmlReader.setContentHandler(this);
this.xmlReader.setFeature("http://xml.org/sax/features/namespace-prefixes", false); this.xmlReader.setFeature("http://xml.org/sax/features/namespace-prefixes", false);
@ -103,6 +109,7 @@ public class YMarksXBELImporter extends DefaultHandler implements Runnable {
Log.logException(e); Log.logException(e);
} finally { } finally {
try { try {
Log.logInfo(YMarkTables.BOOKMARKS_LOG, "XBEL Importer inserted poison pill in queue");
this.bookmarks.put(YMarkTables.POISON); this.bookmarks.put(YMarkTables.POISON);
} catch (InterruptedException e1) { } catch (InterruptedException e1) {
Log.logException(e1); Log.logException(e1);
@ -111,8 +118,11 @@ public class YMarksXBELImporter extends DefaultHandler implements Runnable {
} }
public void endDocument() throws SAXException { public void endDocument() throws SAXException {
// no need to keep the bookmark references any longer // put alias references in the bookmark queue to ensure that folders get updated
// this.bmkRef.clear(); // we do that at endDocument to ensure all referenced bookmarks already exist
this.bookmarks.addAll(this.aliasRef);
this.aliasRef.clear();
this.bmkRef.clear();
} }
public void startElement(final String uri, final String name, String tag, final Attributes atts) throws SAXException { public void startElement(final String uri, final String name, String tag, final Attributes atts) throws SAXException {
@ -140,7 +150,6 @@ public class YMarksXBELImporter extends DefaultHandler implements Runnable {
date = String.valueOf(System.currentTimeMillis()); date = String.valueOf(System.currentTimeMillis());
} }
this.bmk.put(YMarkTables.BOOKMARK.DATE_MODIFIED.key(), date); this.bmk.put(YMarkTables.BOOKMARK.DATE_MODIFIED.key(), date);
UpdateBmkRef(atts.getValue(uri, "id"), true); UpdateBmkRef(atts.getValue(uri, "id"), true);
outer_state = XBEL.BOOKMARK; outer_state = XBEL.BOOKMARK;
inner_state = XBEL.NOTHING; inner_state = XBEL.NOTHING;
@ -162,7 +171,6 @@ public class YMarksXBELImporter extends DefaultHandler implements Runnable {
atts.getValue(uri, "owner"); atts.getValue(uri, "owner");
*/ */
} else if (XBEL.ALIAS.tag().equals(tag)) { } else if (XBEL.ALIAS.tag().equals(tag)) {
Log.logInfo(YMarkTables.BOOKMARKS_LOG, "ALIAS: "+this.ref.get(YMarkTables.BOOKMARK.URL.key()));
final String r = atts.getValue(uri, "ref"); final String r = atts.getValue(uri, "ref");
UpdateBmkRef(r, false); UpdateBmkRef(r, false);
this.aliasRef.add(this.bmkRef.get(r)); this.aliasRef.add(this.bmkRef.get(r));
@ -192,8 +200,8 @@ public class YMarksXBELImporter extends DefaultHandler implements Runnable {
} else if (XBEL.FOLDER.tag().equals(tag)) { } else if (XBEL.FOLDER.tag().equals(tag)) {
// go up one folder // go up one folder
//TODO: get rid of .toString.equals() //TODO: get rid of .toString.equals()
if(!this.folder.toString().equals(YMarkTables.FOLDERS_IMPORTED)) { if(!this.folder.toString().equals(this.RootFolder)) {
folder.setLength(folder.lastIndexOf(YMarkTables.FOLDERS_SEPARATOR)); folder.setLength(folder.lastIndexOf(YMarkTables.FOLDERS_SEPARATOR));
} }
this.outer_state = XBEL.FOLDER; this.outer_state = XBEL.FOLDER;
} else if (XBEL.INFO.tag().equals(tag)) { } else if (XBEL.INFO.tag().equals(tag)) {
@ -205,7 +213,7 @@ public class YMarksXBELImporter extends DefaultHandler implements Runnable {
public void characters(final char ch[], final int start, final int length) { public void characters(final char ch[], final int start, final int length) {
if (parse_value) { if (parse_value) {
buffer.append(ch, start, length); buffer.append(ch, start, length);
switch(outer_state) { switch(outer_state) {
case BOOKMARK: case BOOKMARK:
switch(inner_state) { switch(inner_state) {
@ -254,10 +262,6 @@ public class YMarksXBELImporter extends DefaultHandler implements Runnable {
} }
} }
public HashSet<HashMap<String,String>> getAliases() {
return this.aliasRef;
}
private void UpdateBmkRef(final String id, final boolean url) { private void UpdateBmkRef(final String id, final boolean url) {
this.foldersString.setLength(0); this.foldersString.setLength(0);

Loading…
Cancel
Save