Author: apfelmaennchen
Date: 2008-03-09 13:52:42 +0100 (Sun, 09 Mar 2008)
New Revision: 4533

Added:
   trunk/htroot/yacy/ui/result.java
   trunk/htroot/yacy/ui/ritem.java
   trunk/htroot/yacy/ui/ymarks.java
Log:
for testing puposes - new user interface based on jQuery and Ajax

Added: trunk/htroot/yacy/ui/result.java
===================================================================
--- trunk/htroot/yacy/ui/result.java    2008-03-09 12:51:13 UTC (rev 4532)
+++ trunk/htroot/yacy/ui/result.java    2008-03-09 12:52:42 UTC (rev 4533)
@@ -0,0 +1,323 @@
+// ysearchitem.java
+// (C) 2004-2008 by Michael Peter Christen; [EMAIL PROTECTED], Frankfurt a. 
M., Germany
+// first published 2004 on http://yacy.net
+//
+// This is a part of YaCy, a peer-to-peer based web search engine
+//
+// $LastChangedDate: 2006-04-02 22:40:07 +0200 (So, 02 Apr 2006) $
+// $LastChangedRevision: 1986 $
+// $LastChangedBy: orbiter $
+//
+// LICENSE
+// 
+// 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+import java.util.TreeSet;
+
+import de.anomic.http.httpHeader;
+import de.anomic.kelondro.kelondroBitfield;
+import de.anomic.kelondro.kelondroMSetTools;
+import de.anomic.plasma.plasmaCondenser;
+import de.anomic.plasma.plasmaSearchEvent;
+import de.anomic.plasma.plasmaSearchQuery;
+import de.anomic.plasma.plasmaSearchRankingProfile;
+import de.anomic.plasma.plasmaSwitchboard;
+import de.anomic.server.serverCore;
+import de.anomic.server.serverObjects;
+import de.anomic.server.serverSwitch;
+import de.anomic.server.logging.serverLog;
+import de.anomic.tools.yFormatter;
+import de.anomic.yacy.yacyCore;
+import de.anomic.yacy.yacyURL;
+
+public class result {
+
+    public static serverObjects respond(httpHeader header, serverObjects post, 
serverSwitch env) {
+        final plasmaSwitchboard sb = (plasmaSwitchboard) env;
+        sb.localSearchLastAccess = System.currentTimeMillis();
+        
+        boolean searchAllowed = sb.getConfigBool("publicSearchpage", true) || 
sb.verifyAuthentication(header, false);
+        boolean authenticated = sb.adminAuthenticated(header) >= 2;
+        int display = (post == null) ? 0 : post.getInt("display", 0);
+        if ((display == 1) && (!authenticated)) display = 0;
+        int input = (post == null) ? 2 : post.getInt("input", 2);
+        String promoteSearchPageGreeting = 
env.getConfig("promoteSearchPageGreeting", "");
+        if (env.getConfigBool("promoteSearchPageGreeting.useNetworkName", 
false)) promoteSearchPageGreeting = env.getConfig("network.unit.description", 
"");
+        if (promoteSearchPageGreeting.length() == 0) promoteSearchPageGreeting 
= "P2P WEB SEARCH";
+
+        // get query
+        String querystring = (post == null) ? "" : post.get("search", 
"").trim();
+        final serverObjects prop = new serverObjects();
+        
+        boolean rss = (post == null) ? false : post.get("rss", 
"false").equals("true");
+        if ((post == null) || (env == null) || (querystring.length() == 0) || 
(!searchAllowed)) {
+            // we create empty entries for template strings
+            prop.put("searchagain", "0");
+            prop.put("input", input);
+            prop.put("display", display);
+            prop.put("input_input", input);
+            prop.put("input_display", display);
+            prop.put("promoteSearchPageGreeting", promoteSearchPageGreeting);
+            prop.put("input_former", "");
+            prop.put("former", "");
+            prop.put("input_count", "10");
+            prop.put("input_offset", "0");
+            prop.put("input_resource", "global");
+            prop.put("input_urlmaskfilter", ".*");
+            prop.put("input_prefermaskfilter", "");
+            prop.put("input_indexof", "off");
+            prop.put("input_constraint", "");
+            prop.put("input_cat", "href");
+            prop.put("input_depth", "0");
+            prop.put("input_contentdom", "text");
+            prop.put("input_contentdomCheckText", "1");
+            prop.put("input_contentdomCheckAudio", "0");
+            prop.put("input_contentdomCheckVideo", "0");
+            prop.put("input_contentdomCheckImage", "0");
+            prop.put("input_contentdomCheckApp", "0");
+            prop.put("excluded", "0");
+            prop.put("results", "");
+            prop.put("resultTable", "0");
+            prop.put("num-results", searchAllowed ? "0" : "4");
+            
+            return prop;
+        }
+
+        // collect search attributes
+        int maxDistance = Integer.MAX_VALUE;
+        
+        if ((querystring.length() > 2) && (querystring.charAt(0) == '"') && 
(querystring.charAt(querystring.length() - 1) == '"')) {
+            querystring = querystring.substring(1, querystring.length() - 
1).trim();
+            maxDistance = 1;
+        }
+        if (sb.facilityDB != null) try { sb.facilityDB.update("zeitgeist", 
querystring, post); } catch (Exception e) {}
+
+        int itemsPerPage = post.getInt("count", 10);
+        int offset = post.getInt("offset", 0);
+        boolean global = (post == null) ? true : post.get("resource", 
"global").equals("global");
+        final boolean indexof = post.get("indexof","").equals("on"); 
+        String urlmask = "";
+        if (post.containsKey("urlmask") && post.get("urlmask").equals("no")) {
+            urlmask = ".*";
+        } else {
+            urlmask = (post.containsKey("urlmaskfilter")) ? (String) 
post.get("urlmaskfilter") : ".*";
+        }
+        String prefermask = post.get("prefermaskfilter", "");
+        if ((prefermask.length() > 0) && (prefermask.indexOf(".*") < 0)) 
prefermask = ".*" + prefermask + ".*";
+
+        kelondroBitfield constraint = ((post.containsKey("constraint")) && 
(post.get("constraint", "").length() > 0)) ? new kelondroBitfield(4, 
post.get("constraint", "______")) : null;
+        if (indexof) {
+            constraint = new kelondroBitfield(4);
+            constraint.set(plasmaCondenser.flag_cat_indexof, true);
+        }
+        
+        // SEARCH
+        //final boolean indexDistributeGranted = 
sb.getConfig(plasmaSwitchboard.INDEX_DIST_ALLOW, "true").equals("true");
+        //final boolean indexReceiveGranted = 
sb.getConfig("allowReceiveIndex", "true").equals("true");
+        //final boolean offline = yacyCore.seedDB.mySeed().isVirgin();
+        final boolean clustersearch = sb.isRobinsonMode() &&
+                                                                       
(sb.getConfig("cluster.mode", "").equals("privatecluster") ||
+                                                                        
sb.getConfig("cluster.mode", "").equals("publiccluster"));
+        //if (offline || !indexDistributeGranted || !indexReceiveGranted) { 
global = false; }
+        if (clustersearch) global = true; // switches search on, but search 
target is limited to cluster nodes
+        
+        // find search domain
+        int contentdomCode = 
plasmaSearchQuery.contentdomParser(post.get("contentdom", "text"));
+        
+        // patch until better search profiles are available
+        if ((contentdomCode != plasmaSearchQuery.CONTENTDOM_TEXT) && 
(itemsPerPage <= 32)) itemsPerPage = 32;
+        
+        if (post.get("cat", "href").equals("href")) {
+
+            final TreeSet<String>[] query = 
plasmaSearchQuery.cleanQuery(querystring); // converts also umlaute
+            boolean near = (query[0].contains("near")) && 
(querystring.indexOf("NEAR") >= 0);
+            if (near) {
+               query[0].remove("near");
+            }
+            plasmaSearchRankingProfile ranking = sb.getRanking();
+            if (near) {
+               ranking.coeff_worddistance = 
plasmaSearchRankingProfile.COEFF_MAX;
+            }
+               
+            // filter out stopwords
+            final TreeSet<String> filtered = 
kelondroMSetTools.joinConstructive(query[0], plasmaSwitchboard.stopwords);
+            if (filtered.size() > 0) {
+                kelondroMSetTools.excludeDestructive(query[0], 
plasmaSwitchboard.stopwords);
+            }
+
+            // prepare search properties
+            final boolean yacyonline = ((yacyCore.seedDB != null) && 
(yacyCore.seedDB.mySeed() != null) && 
(yacyCore.seedDB.mySeed().getPublicAddress() != null));
+            final boolean globalsearch = (global) && (yacyonline) && 
(sb.getConfigBool(plasmaSwitchboard.INDEX_RECEIVE_ALLOW, false));
+        
+            // do the search
+            String client = (String) 
header.get(httpHeader.CONNECTION_PROP_CLIENTIP); // the search client who 
initiated the search
+            TreeSet<String> queryHashes = 
plasmaCondenser.words2hashes(query[0]);
+            plasmaSearchQuery theQuery = new plasmaSearchQuery(
+                               querystring,
+                               queryHashes,
+                               plasmaCondenser.words2hashes(query[1]),
+                               ranking,
+                    maxDistance,
+                    prefermask,
+                    contentdomCode,
+                    true,
+                    itemsPerPage,
+                    offset,
+                    urlmask,
+                    (clustersearch && globalsearch) ? 
plasmaSearchQuery.SEARCHDOM_CLUSTERALL :
+                    ((globalsearch) ? plasmaSearchQuery.SEARCHDOM_GLOBALDHT : 
plasmaSearchQuery.SEARCHDOM_LOCAL),
+                    "",
+                    20,
+                    constraint,
+                    true,
+                    client);
+
+            
+            // tell all threads to do nothing for a specific time
+            sb.intermissionAllThreads(3000);
+        
+            // filter out words that appear in bluelist
+            theQuery.filterOut(plasmaSwitchboard.blueList);
+            
+            // log
+            serverLog.logInfo("LOCAL_SEARCH", "INIT WORD SEARCH: " + 
theQuery.queryString + ":" + theQuery.queryHashes + " - " + 
theQuery.neededResults() + " links to be computed, " + 
theQuery.displayResults() + " lines to be displayed");
+            long timestamp = System.currentTimeMillis();
+
+            // create a new search event
+            if (plasmaSearchEvent.getEvent(theQuery.id(false)) == null) {
+                theQuery.setOffset(0); // in case that this is a new search, 
always start without a offset 
+                offset = 0;
+            }
+            plasmaSearchEvent theSearch = plasmaSearchEvent.getEvent(theQuery, 
ranking, sb.wordIndex, (sb.isRobinsonMode()) ? sb.clusterhashes : null, false);
+            
+            // generate result object
+            serverLog.logFine("LOCAL_SEARCH", "SEARCH TIME AFTER ORDERING OF 
SEARCH RESULTS: " + ((System.currentTimeMillis() - timestamp) / 1000) + " 
seconds");
+            serverLog.logFine("LOCAL_SEARCH", "SEARCH TIME AFTER RESULT 
PREPARATION: " + ((System.currentTimeMillis() - timestamp) / 1000) + " 
seconds");
+                
+            // calc some more cross-reference
+            serverLog.logFine("LOCAL_SEARCH", "SEARCH TIME AFTER XREF 
PREPARATION: " + ((System.currentTimeMillis() - timestamp) / 1000) + " 
seconds");
+
+            // log
+            serverLog.logInfo("LOCAL_SEARCH", "EXIT WORD SEARCH: " + 
theQuery.queryString + " - " +
+                    (theSearch.getRankingResult().getLocalResourceSize() + 
theSearch.getRankingResult().getRemoteResourceSize()) + " links found, " +
+                    ((System.currentTimeMillis() - timestamp) / 1000) + " 
seconds");
+
+            // prepare search statistics
+            theQuery.resultcount = 
theSearch.getRankingResult().getLocalResourceSize() + 
theSearch.getRankingResult().getRemoteResourceSize();
+            theQuery.searchtime = System.currentTimeMillis() - timestamp;
+            theQuery.urlretrievaltime = theSearch.getURLRetrievalTime();
+            theQuery.snippetcomputationtime = 
theSearch.getSnippetComputationTime();
+            sb.localSearches.add(theQuery);
+            TreeSet<Long> handles = sb.localSearchTracker.get(client);
+            if (handles == null) handles = new TreeSet<Long>();
+            handles.add(theQuery.handle);
+            sb.localSearchTracker.put(client, handles);
+            
+            int totalcount = 
theSearch.getRankingResult().getLocalResourceSize() + 
theSearch.getRankingResult().getRemoteResourceSize();
+            prop.put("num-results_offset", offset);
+            prop.put("num-results_itemscount", "0");
+            prop.put("num-results_itemsPerPage", itemsPerPage);
+            prop.put("num-results_totalcount", yFormatter.number(totalcount, 
!rss));
+            prop.put("num-results_globalresults", (globalsearch) ? "1" : "0");
+            prop.put("num-results_globalresults_localResourceSize", 
yFormatter.number(theSearch.getRankingResult().getLocalResourceSize(), !rss));
+            prop.put("num-results_globalresults_remoteResourceSize", 
yFormatter.number(theSearch.getRankingResult().getRemoteResourceSize(), !rss));
+            prop.put("num-results_globalresults_remoteIndexCount", 
yFormatter.number(theSearch.getRankingResult().getRemoteIndexCount(), !rss));
+            prop.put("num-results_globalresults_remotePeerCount", 
yFormatter.number(theSearch.getRankingResult().getRemotePeerCount(), !rss));
+        
+            // generate the search result lines; they will be produced by 
another servlet
+            for (int i = 0; i < theQuery.displayResults(); i++) {
+                prop.put("results_" + i + "_item", offset + i);
+                prop.put("results_" + i + "_eventID", theQuery.id(false));
+            }
+            prop.put("results", theQuery.displayResults());
+            prop.put("resultTable", (contentdomCode <= 1) ? "0" : "1");
+            prop.put("eventID", theQuery.id(false)); // for bottomline
+            
+            // process result of search
+            if (filtered.size() > 0) {
+                prop.put("excluded", "1");
+                prop.putHTML("excluded_stopwords", filtered.toString());
+            } else {
+                prop.put("excluded", "0");
+            }
+
+            if (prop == null || prop.size() == 0) {
+                if (post.get("search", "").length() < 3) {
+                    prop.put("num-results", "2"); // no results - at least 3 
chars
+                } else {
+                    prop.put("num-results", "1"); // no results
+                }
+            } else {
+                prop.put("num-results", "3");
+            }
+
+            prop.put("input_cat", "href");
+            prop.put("input_depth", "0");
+
+            // adding some additional properties needed for the rss feed
+            String hostName = (String) header.get("Host", "localhost");
+            if (hostName.indexOf(":") == -1) hostName += ":" + 
serverCore.getPortNr(env.getConfig("port", "8080"));
+            prop.put("searchBaseURL", "http://"; + hostName + 
"/yacysearch.html");
+            prop.put("rssYacyImageURL", "http://"; + hostName + 
"/env/grafics/yacy.gif");
+        }
+        
+        prop.put("searchagain", global ? "1" : "0");
+        prop.put("input", input);
+        prop.put("display", display);
+        prop.put("input_input", input);
+        prop.put("input_display", display);
+        prop.put("promoteSearchPageGreeting", promoteSearchPageGreeting);
+        prop.putHTML("input_former", querystring);
+        //prop.put("former", post.get("search", ""));
+        prop.put("input_count", itemsPerPage);
+        prop.put("input_offset", offset);
+        prop.put("input_resource", global ? "global" : "local");
+        prop.putHTML("input_urlmaskfilter", urlmask);
+        prop.putHTML("input_prefermaskfilter", prefermask);
+        prop.put("input_indexof", (indexof) ? "on" : "off");
+        prop.put("input_constraint", (constraint == null) ? "" : 
constraint.exportB64());
+        prop.put("input_contentdom", post.get("contentdom", "text"));
+        prop.put("input_contentdomCheckText", (contentdomCode == 
plasmaSearchQuery.CONTENTDOM_TEXT) ? "1" : "0");
+        prop.put("input_contentdomCheckAudio", (contentdomCode == 
plasmaSearchQuery.CONTENTDOM_AUDIO) ? "1" : "0");
+        prop.put("input_contentdomCheckVideo", (contentdomCode == 
plasmaSearchQuery.CONTENTDOM_VIDEO) ? "1" : "0");
+        prop.put("input_contentdomCheckImage", (contentdomCode == 
plasmaSearchQuery.CONTENTDOM_IMAGE) ? "1" : "0");
+        prop.put("input_contentdomCheckApp", (contentdomCode == 
plasmaSearchQuery.CONTENTDOM_APP) ? "1" : "0");
+        
+        // for RSS: don't HTML encode some elements
+        prop.putHTML("rss_query", querystring, true);
+        prop.put("rss_queryenc", yacyURL.escape(querystring.replace(' ', 
'+')));
+
+        sb.localSearchLastAccess = System.currentTimeMillis();      
+
+        // return rewrite properties
+        return prop;
+    }
+/*
+    private static String navhidden(int page, int display, plasmaSearchQuery 
theQuery) {
+        return
+        "<input type=\"hidden\" name=\"display\" value=\"" + display + "\" />" 
+
+        "<input type=\"hidden\" name=\"search\" value=\"" + 
theQuery.queryString() + "\" />" +
+        "<input type=\"hidden\" name=\"count\" value=\"" + 
theQuery.displayResults() + "\" />" +
+        "<input type=\"hidden\" name=\"offset\" value=\"" + (page * 
theQuery.displayResults()) + "\" />" +
+        "<input type=\"hidden\" name=\"resource\" value=\"" + 
theQuery.searchdom() + "\" />" +
+        "<input type=\"hidden\" name=\"urlmaskfilter\" value=\"" + 
theQuery.urlMask + "\" />" +
+        "<input type=\"hidden\" name=\"prefermaskfilter\" value=\"" + 
theQuery.prefer + "\" />" +
+        "<input type=\"hidden\" name=\"cat\" value=\"href\" />" +
+        "<input type=\"hidden\" name=\"constraint\" value=\"" + 
((theQuery.constraint == null) ? "" : theQuery.constraint.exportB64()) + "\" 
/>" +
+        "<input type=\"hidden\" name=\"contentdom\" value=\"" + 
theQuery.contentdom() + "\" />" +
+        "<input type=\"hidden\" name=\"former\" value=\"" + 
theQuery.queryString() + "\" />";
+    }
+    */
+}

Added: trunk/htroot/yacy/ui/ritem.java
===================================================================
--- trunk/htroot/yacy/ui/ritem.java     2008-03-09 12:51:13 UTC (rev 4532)
+++ trunk/htroot/yacy/ui/ritem.java     2008-03-09 12:52:42 UTC (rev 4533)
@@ -0,0 +1,202 @@
+// ysearchitem.java
+// (C) 2007 by Michael Peter Christen; [EMAIL PROTECTED], Frankfurt a. M., 
Germany
+// first published 28.08.2007 on http://yacy.net
+//
+// This is a part of YaCy, a peer-to-peer based web search engine
+//
+// $LastChangedDate: 2006-04-02 22:40:07 +0200 (So, 02 Apr 2006) $
+// $LastChangedRevision: 1986 $
+// $LastChangedBy: orbiter $
+//
+// LICENSE
+// 
+// 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+import java.io.UnsupportedEncodingException;
+import java.net.MalformedURLException;
+import java.net.URLEncoder;
+import java.util.ArrayList;
+import java.util.TreeSet;
+
+import de.anomic.http.httpHeader;
+import de.anomic.plasma.plasmaSearchEvent;
+import de.anomic.plasma.plasmaSearchQuery;
+import de.anomic.plasma.plasmaSearchRankingProcess;
+import de.anomic.plasma.plasmaSnippetCache;
+import de.anomic.plasma.plasmaSwitchboard;
+import de.anomic.server.serverObjects;
+import de.anomic.server.serverSwitch;
+import de.anomic.tools.nxTools;
+import de.anomic.tools.yFormatter;
+import de.anomic.yacy.yacySeed;
+import de.anomic.yacy.yacyURL;
+
+public class ritem {
+
+    private static boolean col = true;
+    private static final int namelength = 60;
+    private static final int urllength = 120;
+    
+    public static serverObjects respond(httpHeader header, serverObjects post, 
serverSwitch env) {
+        final plasmaSwitchboard sb = (plasmaSwitchboard) env;
+        final serverObjects prop = new serverObjects();
+        
+        String eventID = post.get("eventID", "");
+        boolean rss = post.get("rss", "false").equals("true");
+        int item = post.getInt("item", -1);
+        boolean auth = ((String) 
header.get(httpHeader.CONNECTION_PROP_CLIENTIP, "")).equals("localhost") || 
sb.verifyAuthentication(header, true);
+        
+        // default settings for blank item
+        prop.put("content", "0");
+        prop.put("rss", "0");
+        prop.put("references", "0");
+        prop.put("dynamic", "0");
+        
+        // find search event
+        plasmaSearchEvent theSearch = plasmaSearchEvent.getEvent(eventID);
+        if (theSearch == null) {
+            // the event does not exist, show empty page
+            return prop;
+        }
+        plasmaSearchQuery theQuery = theSearch.getQuery();
+        int offset = theQuery.neededResults() - theQuery.displayResults();
+        
+        // dynamically update count values
+        if (!rss) {
+            prop.put("dynamic_offset", offset + 1);
+            prop.put("dynamic_itemscount", (item < 0) ? 
theQuery.neededResults() : item + 1);
+            prop.put("dynamic_totalcount", 
yFormatter.number(theSearch.getRankingResult().getLocalResourceSize() + 
theSearch.getRankingResult().getRemoteResourceSize(), !rss));
+            prop.put("dynamic_localResourceSize", 
yFormatter.number(theSearch.getRankingResult().getLocalResourceSize(), !rss));
+            prop.put("dynamic_remoteResourceSize", 
yFormatter.number(theSearch.getRankingResult().getRemoteResourceSize(), !rss));
+            prop.put("dynamic_remoteIndexCount", 
yFormatter.number(theSearch.getRankingResult().getRemoteIndexCount(), !rss));
+            prop.put("dynamic_remotePeerCount", 
yFormatter.number(theSearch.getRankingResult().getRemotePeerCount(), !rss));
+            prop.put("dynamic_resnav", "");
+            prop.put("dynamic", "1");
+        }
+
+        if (theQuery.contentdom == plasmaSearchQuery.CONTENTDOM_TEXT) {
+            // text search
+
+            // generate result object
+            plasmaSearchEvent.ResultEntry result = theSearch.oneResult(item);
+            if (result == null) return prop; // no content
+                
+            if (rss) {
+                // text search for rss output
+                prop.put("rss", "1"); // switch on specific content
+                prop.putHTML("rss_title", result.title(), true);
+                prop.putHTML("rss_description", 
result.textSnippet().getLineRaw(), true);
+                prop.putHTML("rss_link", result.urlstring(), true);
+                prop.put("rss_urlhash", result.hash());
+                prop.put("rss_date", 
plasmaSwitchboard.dateString822(result.modified()));
+                return prop;
+            }
+            
+            prop.put("content", theQuery.contentdom + 1); // switch on 
specific content
+            prop.putHTML("content_description", result.title());
+            prop.put("content_url", result.urlstring());
+        
+            int port=result.url().getPort();
+            yacyURL faviconURL;
+            try {
+                faviconURL = new yacyURL(result.url().getProtocol() + "://" + 
result.url().getHost() + ((port != -1) ? (":" + String.valueOf(port)) : "") + 
"/favicon.ico", null);
+            } catch (MalformedURLException e1) {
+                faviconURL = null;
+            }
+        
+            prop.putHTML("content_faviconCode", 
sb.licensedURLs.aquireLicense(faviconURL)); // aquire license for favicon url 
loading
+            prop.put("content_urlhash", result.hash());
+            prop.put("content_urlhexhash", 
yacySeed.b64Hash2hexHash(result.hash()));
+            prop.putHTML("content_urlname", 
nxTools.shortenURLString(result.urlname(), urllength));
+            prop.put("content_date", 
plasmaSwitchboard.dateString(result.modified()));
+            prop.put("content_ybr", 
plasmaSearchRankingProcess.ybr(result.hash()));
+            prop.putNum("content_size", result.filesize());
+        
+            TreeSet<String>[] query = theQuery.queryWords();
+            yacyURL wordURL = null;
+            try {
+                prop.putHTML("content_words", 
URLEncoder.encode(query[0].toString(),"UTF-8"));
+            } catch (UnsupportedEncodingException e) {}
+            prop.putHTML("content_former", theQuery.queryString);
+            prop.put("content_rankingprops", result.word().toPropertyForm() + 
", domLengthEstimated=" + yacyURL.domLengthEstimation(result.hash()) +
+                    ((yacyURL.probablyRootURL(result.hash())) ? ", 
probablyRootURL" : "") + 
+                    (((wordURL = yacyURL.probablyWordURL(result.hash(), 
query[0])) != null) ? ", probablyWordURL=" + wordURL.toNormalform(false, true) 
: ""));
+            plasmaSnippetCache.TextSnippet snippet = result.textSnippet();
+            prop.put("content_snippet", (snippet == null) ? "(snippet not 
found)" : snippet.getLineMarked(theQuery.queryHashes));
+            return prop;
+        }
+        
+        if (theQuery.contentdom == plasmaSearchQuery.CONTENTDOM_IMAGE) {
+            // image search; shows thumbnails
+
+            prop.put("content", theQuery.contentdom + 1); // switch on 
specific content
+            plasmaSnippetCache.MediaSnippet ms = theSearch.oneImage(item);
+            if (ms == null) {
+                prop.put("content_items", "0");
+            } else {
+                prop.putHTML("content_items_0_hrefCache", (auth) ? 
"/ViewImage.png?url=" + ms.href.toNormalform(true, false) : 
ms.href.toNormalform(true, false));
+                prop.putHTML("content_items_0_href", 
ms.href.toNormalform(true, false));
+                prop.put("content_items_0_code", 
sb.licensedURLs.aquireLicense(ms.href));
+                prop.putHTML("content_items_0_name", shorten(ms.name, 
namelength));
+                prop.put("content_items_0_attr", (ms.attr.equals("-1 x -1")) ? 
"" : "(" + ms.attr + ")"); // attributes, here: original size of image
+                prop.put("content_items_0_source", 
ms.source.toNormalform(true, false));
+                prop.put("content_items_0_sourcedom", ms.source.getHost());
+                prop.put("content_items", 1);
+            }
+            return prop;
+        }
+        
+        if ((theQuery.contentdom == plasmaSearchQuery.CONTENTDOM_AUDIO) ||
+            (theQuery.contentdom == plasmaSearchQuery.CONTENTDOM_VIDEO) ||
+            (theQuery.contentdom == plasmaSearchQuery.CONTENTDOM_APP)) {
+            // any other media content
+
+            // generate result object
+            plasmaSearchEvent.ResultEntry result = theSearch.oneResult(item);
+            if (result == null) return prop; // no content
+            
+            prop.put("content", theQuery.contentdom + 1); // switch on 
specific content
+            ArrayList<plasmaSnippetCache.MediaSnippet> media = 
result.mediaSnippets();
+            if (item == 0) col = true;
+            if (media != null) {
+                plasmaSnippetCache.MediaSnippet ms;
+                int c = 0;
+                for (int i = 0; i < media.size(); i++) {
+                    ms = (plasmaSnippetCache.MediaSnippet) media.get(i);
+                    prop.putHTML("content_items_" + i + "_href", 
ms.href.toNormalform(true, false));
+                    prop.putHTML("content_items_" + i + "_hrefshort", 
nxTools.shortenURLString(ms.href.toNormalform(true, false), urllength));
+                    prop.putHTML("content_items_" + i + "_name", 
shorten(ms.name, namelength));
+                    prop.put("content_items_" + i + "_col", (col) ? "0" : "1");
+                    c++;
+                    col = !col;
+                }
+                prop.put("content_items", c);
+            } else {
+                prop.put("content_items", "0");
+            }
+            return prop;
+        }
+
+        return prop;
+    }
+    
+    private static String shorten(String s, int length) {
+        if (s.length() <= length) return s;
+        int p = s.lastIndexOf('.');
+        if (p < 0) return s.substring(0, length - 3) + "...";
+        return s.substring(0, length - (s.length() - p) - 3) + "..." + 
s.substring(p);
+    }
+
+}

Added: trunk/htroot/yacy/ui/ymarks.java
===================================================================
--- trunk/htroot/yacy/ui/ymarks.java    2008-03-09 12:51:13 UTC (rev 4532)
+++ trunk/htroot/yacy/ui/ymarks.java    2008-03-09 12:52:42 UTC (rev 4533)
@@ -0,0 +1,450 @@
+// Bookmarks_p.java 
+// -----------------------
+// part of YACY
+// (C) by Michael Peter Christen; [EMAIL PROTECTED]
+// first published on http://www.anomic.de
+// Frankfurt, Germany, 2004
+//
+// This File is contributed by Alexander Schier
+//
+// $LastChangedDate: 2008-01-22 12:51:43 +0100 (Di, 22 Jan 2008) $
+// $LastChangedRevision: 4374 $
+// $LastChangedBy: low012 $
+//
+// 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+//
+// Using this software in any meaning (reading, learning, copying, compiling,
+// running) means that you agree that the Author(s) is (are) not responsible
+// for cost, loss of data or any harm that may be caused directly or indirectly
+// by usage of this softare or this documentation. The usage of this software
+// is on your own risk. The installation and usage (starting/running) of this
+// software may allow other people or application to access your computer and
+// any attached devices and is highly dependent on the configuration of the
+// software which must be done by the user of the software; the author(s) is
+// (are) also not responsible for proper configuration and usage of the
+// software, even if provoked by documentation provided together with
+// the software.
+//
+// Any changes to this file according to the GPL as documented in the file
+// gpl.txt aside this file in the shipment you received can be done to the
+// lines that follows this copyright notice here, but changes must not be
+// done inside the copyright notive above. A re-distribution must contain
+// the intact and unchanged copyright notice.
+// Contributions and changes to the program code must be marked as such.
+
+// You must compile this file with
+// javac -classpath .:../Classes Blacklist_p.java
+// if the shell's current path is HTROOT
+
+import java.io.File;
+import java.net.MalformedURLException;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Set;
+
+import de.anomic.data.bookmarksDB;
+import de.anomic.data.listManager;
+import de.anomic.data.userDB;
+import de.anomic.data.bookmarksDB.Tag;
+import de.anomic.http.httpHeader;
+import de.anomic.http.httpc;
+import de.anomic.index.indexURLEntry;
+import de.anomic.plasma.plasmaParserDocument;
+import de.anomic.plasma.plasmaSnippetCache;
+import de.anomic.plasma.plasmaSwitchboard;
+import de.anomic.server.serverDate;
+import de.anomic.server.serverObjects;
+import de.anomic.server.serverSwitch;
+import de.anomic.server.logging.serverLog;
+import de.anomic.yacy.yacyCore;
+import de.anomic.yacy.yacyNewsPool;
+import de.anomic.yacy.yacyNewsRecord;
+import de.anomic.yacy.yacyURL;
+
+
+public class ymarks {
+
+       private static serverObjects prop;
+       private static plasmaSwitchboard switchboard;
+       private static userDB.Entry user;
+       private static boolean isAdmin; 
+
+       final static int SORT_ALPHA = 1;
+       final static int SORT_SIZE = 2;
+       final static int SHOW_ALL = -1;
+       final static boolean TAGS = false;
+       final static boolean FOLDERS = true;
+       
+    public static serverObjects respond(httpHeader header, serverObjects post, 
serverSwitch env) {
+
+       int max_count = 1000;
+       int start=0;
+       String tagName = "";
+       String username="";
+       
+       prop = new serverObjects();
+       switchboard = (plasmaSwitchboard) env;
+       user = switchboard.userDB.getUser(header);   
+       isAdmin=(switchboard.verifyAuthentication(header, true) || user!= null 
&& user.hasRight(userDB.Entry.BOOKMARK_RIGHT));
+    
+       // set user name
+       if(user != null) username=user.getUserName();
+       else if(isAdmin) username="admin";
+       prop.put("user", username);
+       
+       //redirect to userpage
+       /*
+       if(username!="" &&(post == null || !post.containsKey("user") && 
!post.containsKey("mode")))
+        prop.put("LOCATION", "/Bookmarks.html?user="+username);
+       */
+    
+       // set peer address
+       final String address = yacyCore.seedDB.mySeed().getPublicAddress();
+       prop.put("address", address);
+    
+       //defaultvalues
+       if(isAdmin) {
+               prop.put("mode", "1");
+                prop.put("admin", "1");
+        } else {
+               prop.put("mode", "0");
+                prop.put("admin", "0");
+        }
+       prop.put("mode_edit", "0");
+       prop.put("mode_title", "");
+       prop.put("mode_description", "");
+       prop.put("mode_url", "");
+       prop.put("mode_tags", "");
+       prop.put("mode_path", "");
+       prop.put("mode_public", "1"); //1=is public
+       prop.put("mode_feed", "0"); //no newsfeed
+       
+       if(post != null){        
+               if(!isAdmin){
+                       if(post.containsKey("login")){
+                               prop.put("AUTHENTICATE","admin log-in");
+                       }
+               }else if(post.containsKey("mode")){
+                       String mode=(String) post.get("mode");            
+                       if(mode.equals("add")){
+                               prop.put("mode", "2");
+                       }else if(mode.equals("importxml")){
+                               prop.put("mode", "3");
+                       }else if(mode.equals("manage")){
+                               prop.put("mode", "4");
+                       }
+               }else if(post.containsKey("add")){ //add an Entry
+                       String url=(String) post.get("url");
+                       String title=(String) post.get("title");
+                       String description=(String) post.get("description");
+                       String tagsString = (String)post.get("tags");
+                       String pathString = (String)post.get("path");
+                       tagsString=tagsString+","+pathString;
+                       if(tagsString.equals("")){
+                               tagsString="unsorted"; //default tag
+                       }
+                       Set<String> 
tags=listManager.string2set(bookmarksDB.cleanTagsString(tagsString)); 
+                       bookmarksDB.Bookmark bookmark = 
switchboard.bookmarksDB.createBookmark(url, username);
+                       if(bookmark != null){
+                               
bookmark.setProperty(bookmarksDB.Bookmark.BOOKMARK_TITLE, title);
+                               
bookmark.setProperty(bookmarksDB.Bookmark.BOOKMARK_DESCRIPTION, description);
+                               if(user!=null){ 
+                                       bookmark.setOwner(user.getUserName());
+                               }
+                               if(((String) 
post.get("public")).equals("public")){
+                                       bookmark.setPublic(true);
+                                       publishNews(url, title, description, 
tagsString);
+                               }else{
+                                       bookmark.setPublic(false);
+                               }
+                               if(post.containsKey("feed") && ((String) 
post.get("feed")).equals("feed")){
+                                       bookmark.setFeed(true);
+                               }else{
+                                       bookmark.setFeed(false);
+                               }
+                               bookmark.setTags(tags, true);
+                               switchboard.bookmarksDB.saveBookmark(bookmark);
+                       }else{
+                               //ERROR
+                       }
+               }else if(post.containsKey("edit")){
+                       String urlHash=(String) post.get("edit");
+                       prop.put("mode", "2");
+                       if (urlHash.length() == 0) {
+                               prop.put("mode_edit", "0"); // create mode
+                               prop.putHTML("mode_title", (String) 
post.get("title"));
+                               prop.putHTML("mode_description", (String) 
post.get("description"));
+                               prop.put("mode_url", (String) post.get("url"));
+                               prop.putHTML("mode_tags", (String) 
post.get("tags"));
+                               prop.putHTML("mode_path", (String) 
post.get("path"));
+                               prop.put("mode_public", "0");
+                               prop.put("mode_feed", "0");
+                       } else {
+                    bookmarksDB.Bookmark bookmark = 
switchboard.bookmarksDB.getBookmark(urlHash);
+                    if (bookmark == null) {
+                        // try to get the bookmark from the LURL database
+                        indexURLEntry urlentry = 
switchboard.wordIndex.loadedURL.load(urlHash, null, 0);
+                        plasmaParserDocument document = null;
+                        if (urlentry != null) {
+                            indexURLEntry.Components comp = urlentry.comp();
+                            document = 
plasmaSnippetCache.retrieveDocument(comp.url(), true, 5000, true);
+                            prop.put("mode_edit", "0"); // create mode
+                            prop.put("mode_url", 
comp.url().toNormalform(false, true));
+                            prop.putHTML("mode_title", comp.dc_title());
+                            prop.putHTML("mode_description", (document == 
null) ? comp.dc_title(): document.dc_title());
+                            prop.putHTML("mode_author", comp.dc_creator());
+                            prop.putHTML("mode_tags", (document == null) ? 
comp.dc_subject() : document.dc_subject(','));
+                            prop.putHTML("mode_path","");
+                            prop.put("mode_public", "0");
+                            prop.put("mode_feed", "0"); //TODO: check if it IS 
a feed
+                        }
+                        if (document != null) document.close();
+                    } else {
+                        // get from the bookmark database
+                        prop.put("mode_edit", "1"); // edit mode
+                        prop.putHTML("mode_title", bookmark.getTitle());
+                        prop.putHTML("mode_description", 
bookmark.getDescription());
+                        prop.put("mode_url", bookmark.getUrl());
+                        prop.putHTML("mode_tags", bookmark.getTagsString());
+                        prop.putHTML("mode_path",bookmark.getFoldersString());
+                        if (bookmark.getPublic()) {
+                            prop.put("mode_public", "1");
+                        } else {
+                            prop.put("mode_public", "0");
+                        }
+                        if (bookmark.getFeed()) {
+                            prop.put("mode_feed", "1");
+                        } else {
+                            prop.put("mode_feed", "0");
+                        }
+                    }
+                }
+               } else if(post.containsKey("htmlfile")){
+                       boolean isPublic=false;
+                       if(((String) post.get("public")).equals("public")){
+                               isPublic=true;
+                       }
+                       String tags=(String) post.get("tags");
+                       if(tags.equals("")){
+                               tags="unsorted";
+                       }
+                       serverLog.logInfo("BOOKMARKS", "I try to import 
bookmarks from HTML-file");
+                       try {
+                               File file=new 
File((String)post.get("htmlfile"));                       
+                               switchboard.bookmarksDB.importFromBookmarks(new 
yacyURL(file) , post.get("htmlfile$file"), tags, isPublic);
+                       } catch (MalformedURLException e) {}
+                       serverLog.logInfo("BOOKMARKS", "success!!");
+               }else if(post.containsKey("xmlfile")){
+                       boolean isPublic=false;
+                       if(((String) post.get("public")).equals("public")){
+                               isPublic=true;
+                       }
+                       
switchboard.bookmarksDB.importFromXML(post.get("xmlfile$file"), isPublic);
+               }else if(post.containsKey("delete")){
+                       String urlHash=(String) post.get("delete");
+                       switchboard.bookmarksDB.removeBookmark(urlHash);
+               }
+               if(post.containsKey("tag")){
+                       tagName=(String) post.get("tag");
+               }
+               if(post.containsKey("start")){
+                       start=Integer.parseInt((String) post.get("start"));
+               }
+               if(post.containsKey("num")){
+                       max_count=Integer.parseInt((String) post.get("num"));
+               }
+       } // END if(post != null)
+       
+       
+       //-----------------------
+       // create tag list
+       //-----------------------
+       printTagList("taglist", tagName, SORT_SIZE, 25, false);
+       printTagList("optlist", tagName, SORT_ALPHA, SHOW_ALL, true);
+               
+       //-----------------------
+       // create bookmark list
+       //-----------------------
+       int count=0;
+        Iterator<String> it = null;            
+               bookmarksDB.Bookmark bookmark;
+               Set<String> tags;
+               Iterator<String> tagsIt;
+               int tagCount;
+               
+               prop.put("num-bookmarks", 
switchboard.bookmarksDB.bookmarksSize());
+               
+               count=0;
+               if(!tagName.equals("")){
+                       prop.put("selected", "");
+                       
it=switchboard.bookmarksDB.getBookmarksIterator(tagName, isAdmin);
+               }else{
+                       prop.put("selected", " selected=\"selected\"");
+                       
it=switchboard.bookmarksDB.getBookmarksIterator(isAdmin);
+               }
+               
+               //skip the first entries (display next page)
+               count=0;
+               while(count < start && it.hasNext()){
+                       it.next();
+                       count++;
+               }
+               
+               count=0;
+               while(count<max_count && it.hasNext()){
+                       
bookmark=switchboard.bookmarksDB.getBookmark((String)it.next());
+                       if(bookmark!=null){
+                               if(bookmark.getFeed() && isAdmin)
+                                       prop.put("bookmarks_"+count+"_link", 
"/FeedReader_p.html?url="+bookmark.getUrl());
+                               else
+                                       
prop.put("bookmarks_"+count+"_link",bookmark.getUrl());
+                               prop.putHTML("bookmarks_"+count+"_title", 
bookmark.getTitle());
+                               prop.putHTML("bookmarks_"+count+"_description", 
bookmark.getDescription());
+                               prop.put("bookmarks_"+count+"_date", 
serverDate.formatISO8601(new Date(bookmark.getTimeStamp())));
+                               prop.put("bookmarks_"+count+"_rfc822date", 
httpc.dateString(new Date(bookmark.getTimeStamp())));
+                               prop.put("bookmarks_"+count+"_public", 
(bookmark.getPublic() ? "1" : "0"));
+            
+                               //List Tags.
+                               tags=bookmark.getTags();
+                               tagsIt=tags.iterator();
+                               tagCount=0;
+                               while (tagsIt.hasNext()) {              
+                                       String tname = tagsIt.next();
+                                       if ((!tname.startsWith("/")) && 
(!tname.equals(""))) {
+                                               
prop.put("bookmarks_"+count+"_tags_"+tagCount+"_tag", tname);
+                                               tagCount++;
+                                       }
+                               }
+                               prop.put("bookmarks_"+count+"_tags", tagCount);
+                               prop.put("bookmarks_"+count+"_hash", 
bookmark.getUrlHash());
+                               count++;
+                       }
+               }
+               prop.putHTML("tag", tagName);
+               prop.put("start", start);
+               if(it.hasNext()){
+                       prop.put("next-page", "1");
+                       prop.put("next-page_start", start+max_count);
+                       prop.putHTML("next-page_tag", tagName);
+                       prop.put("next-page_num", max_count);
+               }
+               if(start >= max_count){
+                       start=start-max_count;
+                       if(start <0){
+                               start=0;
+                       }
+                       prop.put("prev-page", "1");
+                       prop.put("prev-page_start", start);
+                       prop.putHTML("prev-page_tag", tagName);
+                       prop.put("prev-page_num", max_count);
+               }
+               prop.put("bookmarks", count);
+    
+    
+       //-----------------------
+       // create folder list
+       //-----------------------
+               
+               count = 0;
+               count = 
recurseFolders(switchboard.bookmarksDB.getFolderList(isAdmin),"/",0,true,"");
+               prop.put("folderlist", count);
+               
+    
+               return prop;    // return from serverObjects respond()
+    }    
+    
+    private static void printTagList(String id, String tagName, int comp, int 
max, boolean opt){       
+       int count=0;
+        bookmarksDB.Tag tag;
+       Iterator<Tag> it = null;
+       
+        if (tagName.equals("")) {
+               it = switchboard.bookmarksDB.getTagIterator(isAdmin, comp, max);
+        } else {
+               it = switchboard.bookmarksDB.getTagIterator(tagName, isAdmin, 
comp, max);
+        }
+               while(it.hasNext()){
+                       tag=(Tag) it.next();
+                       if ((!tag.getTagName().startsWith("/")) && 
(!tag.getTagName().equals(""))) {
+                               prop.putHTML(id+"_"+count+"_name", 
tag.getFriendlyName());
+                               prop.putHTML(id+"_"+count+"_tag", 
tag.getTagName());
+                               prop.put(id+"_"+count+"_num", tag.size());
+                               if (opt){
+                                       
if(tagName.equals(tag.getFriendlyName())){
+                                               
prop.put(id+"_"+count+"_selected", " selected=\"selected\"");
+                                       } else {
+                                               
prop.put(id+"_"+count+"_selected", "");
+                                       }
+                               } else {
+                                       // font-size is pseudo-rounded to 2 
decimals
+                                       prop.put(id+"_"+count+"_size", 
Math.round((1.1+Math.log(tag.size())/4)*100)/100.);
+                               }
+                               count++;
+                       }
+               }
+               prop.put(id, count);            
+    }
+    
+    private static int recurseFolders(Iterator<String> it, String root, int 
count, boolean next, String prev){
+       String fn="";           
+       bookmarksDB.Bookmark bookmark;
+       
+       if (next) fn = it.next().toString();                    
+       else fn = prev;
+
+       if(fn.equals("\uffff")) {               
+               int i = prev.replaceAll("[^/]","").length();
+               while(i>0){
+                       prop.put("folderlist_"+count+"_folder", "</ul></li>");
+                       count++;
+                       i--;
+               }               
+               return count;
+       }
+   
+       if(fn.startsWith(root)){
+               prop.put("folderlist_"+count+"_folder", 
"<li>"+fn.replaceFirst(root+"/*","")+"<ul class=\"folder\">");
+               count++;    
+               Iterator<String> 
bit=switchboard.bookmarksDB.getBookmarksIterator(fn, isAdmin);
+               while(bit.hasNext()){
+                       
bookmark=switchboard.bookmarksDB.getBookmark((String)bit.next());
+                       prop.put("folderlist_"+count+"_folder", "<li><a 
href=\""+bookmark.getUrl()+"\" title=\""+bookmark.getDescription()+"\">"+ 
bookmark.getTitle()+"</a></li>");
+                       count++;
+               }       
+               if(it.hasNext()){
+                       count = recurseFolders(it, fn, count, true, fn);
+               }
+       } else {                
+               prop.put("folderlist_"+count+"_folder", "</ul></li>");          
        
+               count++;
+               root = root.replaceAll("(/.[^/]*$)", "");               
+               if(root.equals("")) root = "/";                 
+               count = recurseFolders(it, root, count, false, fn);
+       } 
+       return count;
+    }
+
+    private static void publishNews(String url, String title, String 
description, String tagsString) {
+       // create a news message
+       HashMap<String, String> map = new HashMap<String, String>();
+       map.put("url", url.replace(',', '|'));
+       map.put("title", title.replace(',', ' '));
+       map.put("description", description.replace(',', ' '));
+       map.put("tags", tagsString.replace(',', ' '));
+       
yacyCore.newsPool.publishMyNews(yacyNewsRecord.newRecord(yacyNewsPool.CATEGORY_BOOKMARK_ADD,
 map));
+    }
+
+}

_______________________________________________
YaCy-svn mailing list
[email protected]
https://lists.berlios.de/mailman/listinfo/yacy-svn

Antwort per Email an