import java.io.IOException; import java.net.MalformedURLException; import java.util.Date; import java.util.EnumMap; import java.util.Iterator; import java.util.TreeMap; import net.yacy.cora.date.ISO8601Formatter; import net.yacy.cora.document.UTF8; import net.yacy.cora.protocol.RequestHeader; import net.yacy.cora.util.SpaceExceededException; import net.yacy.data.UserDB; import net.yacy.data.ymark.YMarkAutoTagger; import net.yacy.data.ymark.YMarkCrawlStart; import net.yacy.data.ymark.YMarkEntry; import net.yacy.data.ymark.YMarkMetadata; import net.yacy.data.ymark.YMarkTables; import net.yacy.data.ymark.YMarkTag; import net.yacy.data.ymark.YMarkUtil; import net.yacy.document.Document; import net.yacy.document.Parser.Failure; import net.yacy.kelondro.blob.Tables; import net.yacy.kelondro.data.meta.DigestURI; import net.yacy.kelondro.logging.Log; import net.yacy.search.Switchboard; import net.yacy.server.serverObjects; import net.yacy.server.serverSwitch; public class get_treeview { public static final String ROOT = "root"; public static final String SOURCE = "source"; static serverObjects prop; public static serverObjects respond(final RequestHeader header, final serverObjects post, final serverSwitch env) { final Switchboard sb = (Switchboard) env; prop = new serverObjects(); final UserDB.Entry user = sb.userDB.getUser(header); final boolean isAdmin = (sb.verifyAuthentication(header)); final boolean isAuthUser = user!= null && user.hasRight(UserDB.AccessRight.BOOKMARK_RIGHT); if(isAdmin || isAuthUser) { final String bmk_user = (isAuthUser ? user.getUserName() : YMarkTables.USER_ADMIN); String root = YMarkTables.FOLDERS_ROOT; String[] foldername = null; boolean isFolder = true; boolean isBookmark = false; boolean isMetadata = false; boolean isURLdb = false; boolean isCrawlStart = false; boolean isAutoTagger = false; boolean displayBmk = false; if (post != null){ if(post.containsKey("display") && post.get("display").equals("bmk")) { displayBmk = true; } if (post.containsKey(ROOT)) { if (post.get(ROOT).equals(SOURCE) || post.get(ROOT).equals(YMarkTables.FOLDERS_ROOT)) { root = ""; } else if (post.get(ROOT).startsWith(YMarkTables.FOLDERS_ROOT)) { root = post.get(ROOT); } else if (post.get(ROOT).startsWith("b:")) { isBookmark = true; isFolder = false; } else if (post.get(ROOT).startsWith("m:")) { isMetadata = true; isFolder = false; } else if (post.get(ROOT).startsWith("u:")) { isURLdb = true; isFolder = false; } else if (post.get(ROOT).startsWith("w:")) { isAutoTagger = true; isFolder = false; } else if (post.get(ROOT).startsWith("c:")) { isCrawlStart = true; isFolder = false; } } } Iterator it = null; Iterator bit = null; Tables.Row bmk_row = null; int count = 0; if(isFolder) { // loop through folderList try { // it = sb.tables.bookmarks.folders.getFolders(bmk_user, root); it = sb.tables.bookmarks.getFolders(bmk_user, root).iterator(); } catch (final IOException e) { Log.logException(e); } int n = root.split(YMarkUtil.FOLDERS_SEPARATOR).length; if (n == 0) n = 1; while (it.hasNext()) { final String folder = it.next(); foldername = folder.split(YMarkUtil.FOLDERS_SEPARATOR); if (foldername.length == n+1) { prop.put("folders_"+count+"_foldername", foldername[n]); prop.put("folders_"+count+"_expanded", "false"); if(foldername[n].equals("IOExceptions")) prop.put("folders_"+count+"_type", "err"); else if(foldername[n].equals("unsorted")) prop.put("folders_"+count+"_type", "question"); else if(foldername[n].equals("Crawl Start")) prop.put("folders_"+count+"_type", "crawl"); else prop.put("folders_"+count+"_type", "folder"); prop.put("folders_"+count+"_hash", folder); //TODO: switch from pathString to folderHash prop.put("folders_"+count+"_url", ""); //TODO: insert folder url prop.put("folders_"+count+"_hasChildren", "true"); //TODO: determine if folder has children prop.put("folders_"+count+"_comma", ","); count++; } } if(displayBmk && !root.isEmpty()) { bit = sb.tables.bookmarks.getBookmarksByFolder(bmk_user, root); while (bit.hasNext()) { bmk_row = bit.next(); if(bmk_row != null) { final String url = UTF8.String(bmk_row.get(YMarkEntry.BOOKMARK.URL.key())); final String title = bmk_row.get(YMarkEntry.BOOKMARK.TITLE.key(), YMarkEntry.BOOKMARK.TITLE.deflt()); // TODO: get_treeview - get rid of bmtype if (post.containsKey("bmtype")) { if (post.get("bmtype").equals("title")) { prop.putJSON("folders_"+count+"_foldername", title); } else if (post.get("bmtype").equals("href")) { prop.putJSON("folders_"+count+"_foldername", ""+title+""); } } else { prop.putJSON("folders_"+count+"_foldername", url); } prop.put("folders_"+count+"_expanded", "false"); prop.put("folders_"+count+"_url", url); prop.put("folders_"+count+"_type", "file"); prop.put("folders_"+count+"_hash", "b:"+new String(bmk_row.getPK())); prop.put("folders_"+count+"_hasChildren", "true"); prop.put("folders_"+count+"_comma", ","); count++; } } } count--; prop.put("folders_"+count+"_comma", ""); count++; prop.put("folders", count); } else if(displayBmk && isBookmark) { try { final String urlHash = post.get(ROOT).substring(2); String url = ""; bmk_row = sb.tables.select(YMarkTables.TABLES.BOOKMARKS.tablename(bmk_user), urlHash.getBytes()); if(bmk_row != null) { it = bmk_row.keySet().iterator(); while(it.hasNext()) { final String key = it.next(); if(key.startsWith("date")) { final String d = UTF8.String(bmk_row.get(key)); if(!d.isEmpty()) { final String date = ISO8601Formatter.FORMATTER.format(new Date(Long.parseLong(d))); prop.put("folders_"+count+"_foldername",""+key+": " + date + ""); putProp(count, "date"); count++; } } else { final String value = UTF8.String(bmk_row.get(key)); if (key.equals("url")) url = value; prop.put("folders_"+count+"_foldername",""+key+": " + value + ""); if(YMarkEntry.BOOKMARK.contains(key)) putProp(count, YMarkEntry.BOOKMARK.get(key).type()); else putProp(count, "meta"); count++; } } prop.put("folders_"+count+"_foldername","MetaData"); putProp(count, "meta"); prop.put("folders_"+count+"_hash", "m:"+url); prop.put("folders_"+count+"_hasChildren", "true"); count++; prop.put("folders_"+count+"_foldername","URLdb"); putProp(count, "meta"); prop.put("folders_"+count+"_hash", "u:"+url); prop.put("folders_"+count+"_hasChildren", "true"); count++; prop.put("folders_"+count+"_foldername","CrawlStart"); putProp(count, "meta"); prop.put("folders_"+count+"_hash", "c:"+url); prop.put("folders_"+count+"_hasChildren", "true"); count++; prop.put("folders_"+count+"_foldername","AutoTagger"); putProp(count, "meta"); prop.put("folders_"+count+"_hash", "w:"+url); prop.put("folders_"+count+"_hasChildren", "true"); prop.put("folders_"+count+"_comma", ""); count++; prop.put("folders", count); } } catch (final IOException e) { Log.logException(e); } catch (final SpaceExceededException e) { Log.logException(e); } } else if (isAutoTagger || isMetadata || isURLdb || isCrawlStart) { try { final YMarkMetadata meta = new YMarkMetadata(new DigestURI(post.get(ROOT).substring(2)), sb.index); final Document document = meta.loadDocument(sb.loader); final TreeMap tags = sb.tables.bookmarks.getTags(bmk_user); if(isAutoTagger) { prop.put("folders_"+count+"_foldername","meta-"+YMarkMetadata.METADATA.KEYWORDS.name().toLowerCase()+": " + meta.loadMetadata().get(YMarkMetadata.METADATA.KEYWORDS) + ""); putProp(count, "meta"); count++; prop.put("folders_"+count+"_foldername","with preference: "+YMarkAutoTagger.autoTag(document, 4, tags)+""); putProp(count, "meta"); count++; prop.put("folders_"+count+"_foldername","without preference: "+YMarkAutoTagger.autoTag(document, 4, new TreeMap())+""); putProp(count, "meta"); count++; prop.put("folders", count); } else if(isMetadata) { count = putMeta(count, meta.loadMetadata()); } else if(isURLdb) { count = putMeta(count, meta.getMetadata()); } else if(isCrawlStart) { Log.logInfo("YMark", "I am looking for CrawlStart: "+post.get(ROOT).substring(2)); final YMarkCrawlStart crawlStart = new YMarkCrawlStart(sb.tables, post.get(ROOT).substring(2)); final Iterator iter = crawlStart.keySet().iterator(); String key; while(iter.hasNext()) { key = iter.next(); prop.put("folders_"+count+"_foldername",""+key.toLowerCase()+": " + crawlStart.get(key) + ""); putProp(count, "meta"); count++; } prop.put("folders", count); } } catch (final MalformedURLException e) { Log.logException(e); } catch (final IOException e) { Log.logException(e); } catch (final Failure e) { Log.logException(e); } } } else { prop.put(serverObjects.ACTION_AUTHENTICATE, YMarkTables.USER_AUTHENTICATE_MSG); } // return rewrite properties return prop; } public static void putProp(final int count, final String type) { prop.put("folders_"+count+"_expanded", "false"); prop.put("folders_"+count+"_url", ""); prop.put("folders_"+count+"_type", type); prop.put("folders_"+count+"_hash", ""); prop.put("folders_"+count+"_hasChildren", "false"); prop.put("folders_"+count+"_comma", ","); } public static int putMeta(int count, final EnumMap metadata) { final Iterator iter = metadata.keySet().iterator(); while (iter.hasNext()) { final YMarkMetadata.METADATA key = iter.next(); final String value = metadata.get(key); prop.put("folders_"+count+"_foldername",""+key.toString().toLowerCase()+": " + value + ""); putProp(count, "meta"); count++; } prop.put("folders", count); return count; } }