From 1782ef57e5a4ad1580e14ccdd16deb5cf00d4124 Mon Sep 17 00:00:00 2001 From: orbiter Date: Tue, 26 Jun 2007 14:37:10 +0000 Subject: [PATCH] - added SSI parser and include directive for - added chunked file transfer for non-yacy clients - SSIs are streamed using chunked transfer, partly delivered pages can be seen in browser before transmission is finished - added client-side network unit identification - cleaned up code git-svn-id: https://svn.berlios.de/svnroot/repos/yacy/trunk@3926 6c8d7289-2bf4-0310-a012-ef5d649a1542 --- build.properties | 2 +- doc/build_dependencies.png | Bin 41758 -> 0 bytes htroot/BlacklistCleaner_p.java | 8 +- htroot/ConfigBasic.java | 7 +- htroot/CrawlURLFetchStack_p.java | 143 ++++---- htroot/CrawlURLFetch_p.java | 15 +- htroot/FeedReader_p.html | 16 +- htroot/FeedReader_p.java | 5 +- htroot/Gettext_p.html | 24 -- htroot/Gettext_p.java | 78 ---- htroot/IndexCleaner_p.java | 4 +- htroot/Lab.html | 14 - htroot/Lab.java | 13 - htroot/LogStatistics_p.java | 183 +++++----- htroot/TestApplet.java | 35 +- htroot/User.html | 4 +- htroot/User_p.html | 14 +- htroot/User_p.java | 1 - htroot/Wiki.java | 6 +- htroot/env/page.html | 16 - htroot/env/page.java | 41 --- htroot/ssitest.html | 11 + htroot/ssitest.inc | 7 + source/dbtest.java | 2 +- source/de/anomic/data/bookmarksDB.java | 26 +- .../de/anomic/data/{Diff.java => diff.java} | 26 +- source/de/anomic/data/gettext.java | 333 ------------------ source/de/anomic/data/rssReader.java | 51 ++- source/de/anomic/data/rssReaderItem.java | 62 ---- .../anomic/data/rssReaderItemComparator.java | 36 -- source/de/anomic/data/userDB.java | 6 +- .../htmlFilterContentTransformer.java | 35 +- .../anomic/htmlFilter/htmlFilterWriter.java | 1 - .../anomic/http/httpChunkedOutputStream.java | 50 ++- source/de/anomic/http/httpHeader.java | 4 + source/de/anomic/http/httpSSI.java | 76 ++++ source/de/anomic/http/httpTemplate.java | 4 +- source/de/anomic/http/httpd.java | 4 +- source/de/anomic/http/httpdFileHandler.java | 220 ++++-------- source/de/anomic/icap/icapHeader.java | 6 +- source/de/anomic/index/indexCollectionRI.java | 13 +- source/de/anomic/index/indexURLEntry.java | 3 +- .../anomic/kelondro/kelondroBytesIntMap.java | 4 +- .../kelondro/kelondroCollectionIndex.java | 4 +- source/de/anomic/kelondro/kelondroDyn.java | 2 +- .../de/anomic/kelondro/kelondroDynTree.java | 2 +- .../kelondro/kelondroFlexSplitTable.java | 4 +- .../de/anomic/kelondro/kelondroFlexTable.java | 9 +- .../anomic/kelondro/kelondroIntBytesMap.java | 3 +- .../de/anomic/kelondro/kelondroMapTable.java | 10 +- .../de/anomic/kelondro/kelondroObjects.java | 6 +- .../kelondro/kelondroRowCollection.java | 2 +- .../anomic/kelondro/kelondroSplittedTree.java | 2 +- .../parser/sevenzip/sevenzipParser.java | 2 +- source/de/anomic/plasma/plasmaCrawlLURL.java | 7 +- .../de/anomic/plasma/plasmaCrawlStacker.java | 12 +- source/de/anomic/plasma/plasmaHTCache.java | 2 +- .../de/anomic/plasma/plasmaSwitchboard.java | 10 +- .../anomic/plasma/plasmaSwitchboardQueue.java | 2 +- .../anomic/plasma/plasmaWordConnotation.java | 2 +- source/de/anomic/server/serverByteBuffer.java | 8 +- source/de/anomic/yacy/yacyClient.java | 30 +- source/de/anomic/yacy/yacyCore.java | 7 +- source/de/anomic/yacy/yacyNewsDB.java | 8 +- source/de/anomic/yacy/yacyNewsPool.java | 9 +- source/de/anomic/yacy/yacySeed.java | 3 + yacy.init | 6 - 67 files changed, 589 insertions(+), 1172 deletions(-) delete mode 100644 doc/build_dependencies.png delete mode 100644 htroot/Gettext_p.html delete mode 100644 htroot/Gettext_p.java delete mode 100644 htroot/Lab.html delete mode 100644 htroot/Lab.java delete mode 100644 htroot/env/page.html delete mode 100644 htroot/env/page.java create mode 100644 htroot/ssitest.html create mode 100644 htroot/ssitest.inc rename source/de/anomic/data/{Diff.java => diff.java} (95%) delete mode 100644 source/de/anomic/data/gettext.java delete mode 100644 source/de/anomic/data/rssReaderItem.java delete mode 100644 source/de/anomic/data/rssReaderItemComparator.java create mode 100644 source/de/anomic/http/httpSSI.java diff --git a/build.properties b/build.properties index 21dd093f8..1b5436f4f 100644 --- a/build.properties +++ b/build.properties @@ -3,7 +3,7 @@ javacSource=1.4 javacTarget=1.4 # Release Configuration -releaseVersion=0.532 +releaseVersion=0.533 releaseFile=yacy_v${releaseVersion}_${DSTAMP}_${releaseNr}.tar.gz proReleaseFile=yacy_pro_v${releaseVersion}_${DSTAMP}_${releaseNr}.tar.gz releaseFileParentDir=yacy diff --git a/doc/build_dependencies.png b/doc/build_dependencies.png deleted file mode 100644 index 2ee92ada313ab79688f11934ff216026c27f91b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41758 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

^{$+hZ-YeLKUgB`vFs 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 1 && host.charAt(1) != '.') { r.put(s, new Integer(ERR_SUBDOMAIN_XOR_WILDCARD)); continue; - } else { - r.put(s, new Integer(ERR_HOST_WRONG_CHARS)); - continue; } + r.put(s, new Integer(ERR_HOST_WRONG_CHARS)); + continue; } // in host-part only full sub-domains may be wildcards diff --git a/htroot/ConfigBasic.java b/htroot/ConfigBasic.java index e79a7e312..2809611e1 100644 --- a/htroot/ConfigBasic.java +++ b/htroot/ConfigBasic.java @@ -93,11 +93,12 @@ public class ConfigBasic { if ((post != null)) config.reinitPortForwarding(post, env); // starting a peer ping - boolean doPeerPing = false; + + //boolean doPeerPing = false; if ((yacyCore.seedDB.mySeed.isVirgin()) || (yacyCore.seedDB.mySeed.isJunior())) { serverInstantThread.oneTimeJob(sb.yc, "peerPing", null, 0); - doPeerPing = true; - } + //doPeerPing = true; + } // scan for Upnp routers /* diff --git a/htroot/CrawlURLFetchStack_p.java b/htroot/CrawlURLFetchStack_p.java index 9e612c736..3769b273c 100644 --- a/htroot/CrawlURLFetchStack_p.java +++ b/htroot/CrawlURLFetchStack_p.java @@ -151,80 +151,79 @@ public class CrawlURLFetchStack_p { } catch (IOException e) { e.printStackTrace(); } outw.flush(); return null; - } else { - /* ================================================================= - * 'normal' request - * ================================================================= */ - if (post != null) { - if (post.containsKey("addurls")) { - prop.put("addedUrls", 1); - prop.put("addedUrls_added", addURLs(post, post.getInt("addurls", -1), getURLFetcherStack(env))); - } - else if (post.containsKey("setMaxSize")) { - final int count = post.getInt("maxSize", maxURLsPerFetch); - if (count > 0) { - maxURLsPerFetch = count; - prop.put("set", 1); - prop.put("set_value", maxURLsPerFetch); - } else { - prop.put("set", 2); - prop.put("set_value", count); - } - } - else if (post.containsKey("shiftlcq")) { - final int count = Math.min(post.getInt("shiftloc", 0), sb.noticeURL.stackSize(plasmaCrawlNURL.STACK_TYPE_CORE)); - final int failed = shiftFromNotice(sb.noticeURL, plasmaCrawlNURL.STACK_TYPE_CORE, getURLFetcherStack(env), count); - prop.put("shiftloc", 1); - prop.put("shiftloc_value", count - failed); - prop.put("shiftloc_failed", failed); - } - else if (post.containsKey("shiftrcq")) { - final int count = post.getInt("shiftrem", 0); - final int failed = shiftFromNotice(sb.noticeURL, plasmaCrawlNURL.STACK_TYPE_LIMIT, getURLFetcherStack(env), count); - prop.put("shiftrem", 1); - prop.put("shiftrem_value", count - failed); - prop.put("shiftrem_failed", failed); + } + /* ================================================================= + * 'normal' request + * ================================================================= */ + if (post != null) { + if (post.containsKey("addurls")) { + prop.put("addedUrls", 1); + prop.put("addedUrls_added", addURLs(post, post.getInt("addurls", -1), getURLFetcherStack(env))); + } + else if (post.containsKey("setMaxSize")) { + final int count = post.getInt("maxSize", maxURLsPerFetch); + if (count > 0) { + maxURLsPerFetch = count; + prop.put("set", 1); + prop.put("set_value", maxURLsPerFetch); + } else { + prop.put("set", 2); + prop.put("set_value", count); } - else if (post.containsKey("subupload")) { - if (post.get("upload", "").length() == 0) { - prop.put("uploadError", 1); - } else { - final File file = new File(post.get("upload", "")); - final String content = new String((byte[])post.get("upload$file")); - - final String type = post.get("uploadType", ""); - final boolean blCheck = post.containsKey("blacklistCheck"); - if (type.equals("plain")) { - prop.put("upload_added", addURLs(content.split("\n"), blCheck, getURLFetcherStack(env))); - prop.put("upload_failed", 0); + } + else if (post.containsKey("shiftlcq")) { + final int count = Math.min(post.getInt("shiftloc", 0), sb.noticeURL.stackSize(plasmaCrawlNURL.STACK_TYPE_CORE)); + final int failed = shiftFromNotice(sb.noticeURL, plasmaCrawlNURL.STACK_TYPE_CORE, getURLFetcherStack(env), count); + prop.put("shiftloc", 1); + prop.put("shiftloc_value", count - failed); + prop.put("shiftloc_failed", failed); + } + else if (post.containsKey("shiftrcq")) { + final int count = post.getInt("shiftrem", 0); + final int failed = shiftFromNotice(sb.noticeURL, plasmaCrawlNURL.STACK_TYPE_LIMIT, getURLFetcherStack(env), count); + prop.put("shiftrem", 1); + prop.put("shiftrem_value", count - failed); + prop.put("shiftrem_failed", failed); + } + else if (post.containsKey("subupload")) { + if (post.get("upload", "").length() == 0) { + prop.put("uploadError", 1); + } else { + final File file = new File(post.get("upload", "")); + final String content = new String((byte[])post.get("upload$file")); + + final String type = post.get("uploadType", ""); + final boolean blCheck = post.containsKey("blacklistCheck"); + if (type.equals("plain")) { + prop.put("upload_added", addURLs(content.split("\n"), blCheck, getURLFetcherStack(env))); + prop.put("upload_failed", 0); + prop.put("upload", 1); + } else if (type.equals("html")) { + try { + final htmlFilterContentScraper scraper = new htmlFilterContentScraper(new URL(file)); + final Writer writer = new htmlFilterWriter(null, null, scraper, null, false); + serverFileUtils.write(content, writer); + writer.close(); + + final Iterator it = ((HashMap)scraper.getAnchors()).keySet().iterator(); + int added = 0, failed = 0; + URL url; + while (it.hasNext()) try { + url = new URL((String)it.next()); + if (blCheck && plasmaSwitchboard.urlBlacklist.isListed(plasmaURLPattern.BLACKLIST_CRAWLER, url)) { + failed++; + continue; + } + getURLFetcherStack(env).push(url); + added++; + } catch (MalformedURLException e) { failed++; } prop.put("upload", 1); - } else if (type.equals("html")) { - try { - final htmlFilterContentScraper scraper = new htmlFilterContentScraper(new URL(file)); - final Writer writer = new htmlFilterWriter(null, null, scraper, null, false); - serverFileUtils.write(content, writer); - writer.close(); - - final Iterator it = ((HashMap)scraper.getAnchors()).keySet().iterator(); - int added = 0, failed = 0; - URL url; - while (it.hasNext()) try { - url = new URL((String)it.next()); - if (blCheck && plasmaSwitchboard.urlBlacklist.isListed(plasmaURLPattern.BLACKLIST_CRAWLER, url)) { - failed++; - continue; - } - getURLFetcherStack(env).push(url); - added++; - } catch (MalformedURLException e) { failed++; } - prop.put("upload", 1); - prop.put("upload_added", added); - prop.put("upload_failed", failed); - } catch (Exception e) { - e.printStackTrace(); - prop.put("upload", 2); - prop.put("upload_error", e.getMessage()); - } + prop.put("upload_added", added); + prop.put("upload_failed", failed); + } catch (Exception e) { + e.printStackTrace(); + prop.put("upload", 2); + prop.put("upload_error", e.getMessage()); } } } diff --git a/htroot/CrawlURLFetch_p.java b/htroot/CrawlURLFetch_p.java index c5d510f1c..bd13702d6 100644 --- a/htroot/CrawlURLFetch_p.java +++ b/htroot/CrawlURLFetch_p.java @@ -130,7 +130,6 @@ public class CrawlURLFetch_p { if (fetcher != null) fetcher.interrupt(); fetcher = null; - try { if (post.get("source", "").equals("peer") && post.get("peerhash", "").equals("random")) { fetcher = new URLFetcher( @@ -184,11 +183,7 @@ public class CrawlURLFetch_p { frequency); } } - if (fetcher != null) - fetcher.start(); - } catch (IOException e) { - e.printStackTrace(); - } + if (fetcher != null) fetcher.start(); } else if (post.containsKey("stop")) { if (fetcher != null) { @@ -199,7 +194,6 @@ public class CrawlURLFetch_p { } else if (post.containsKey("restart")) { if (fetcher != null) { - try { fetcher.interrupt(); if (fetcher.url == null) { fetcher = new URLFetcher( @@ -216,9 +210,6 @@ public class CrawlURLFetch_p { fetcher.delay); } fetcher.start(); - } catch (IOException e) { - e.printStackTrace(); - } } else { prop.put("threadError", ERR_THREAD_RESUME); } @@ -397,7 +388,7 @@ public class CrawlURLFetch_p { plasmaCrawlProfile.entry profile, URL url, int count, - long delayMs) throws IOException { + long delayMs) { if (env == null || profile == null || url == null) throw new NullPointerException("env, profile or url must not be null"); this.sb = (plasmaSwitchboard)env; @@ -412,7 +403,7 @@ public class CrawlURLFetch_p { serverSwitch env, plasmaCrawlProfile.entry profile, int count, - long delayMs) throws IOException { + long delayMs) { if (env == null || profile == null) throw new NullPointerException("env or profile must not be null"); this.sb = (plasmaSwitchboard)env; diff --git a/htroot/FeedReader_p.html b/htroot/FeedReader_p.html index 46e25bfa8..f31542047 100644 --- a/htroot/FeedReader_p.html +++ b/htroot/FeedReader_p.html @@ -1,6 +1,11 @@ - + + + + YaCy '#[clientname]#': Feed Reader + #%env/templates/metas.template%# + + +#%env/templates/header.template%# #(page)# please select your feed with ?url=Feedurl&max=5&offset=1 (to be implemented in html ;)) :: @@ -28,4 +33,7 @@ You need to install libx Problem with url #(/error)# test -#(/page)# \ No newline at end of file +#(/page)# +#%env/templates/footer.template%# + + diff --git a/htroot/FeedReader_p.java b/htroot/FeedReader_p.java index 25f57d788..d5191e3a9 100644 --- a/htroot/FeedReader_p.java +++ b/htroot/FeedReader_p.java @@ -28,7 +28,7 @@ import java.net.URL; import java.util.Collection; import java.util.Iterator; -import de.anomic.data.rssReaderItem; +import de.anomic.data.rssReader; import de.anomic.http.httpHeader; import de.anomic.server.serverObjects; import de.anomic.server.serverSwitch; @@ -86,7 +86,6 @@ public class FeedReader_p { } public static servletProperties respond(httpHeader header, serverObjects post, serverSwitch env) { servletProperties prop = new servletProperties(); - prop.put("SUPERTEMPLATE", "/env/page.html"); URL url; prop.put("page", 0); @@ -122,7 +121,7 @@ public class FeedReader_p { Iterator it=feedItems.iterator(); int count=0; while(it.hasNext() && (maxitems==0 || count - - - Gettext Locales - #%env/templates/metas.template%# - - - #%env/templates/header.template%# -

Gettext Locales

-

- Get empty gettext file -

- - old file: - -
-

- #%env/templates/footer.template%# - - -:: -#[gettext]# -#(/mode)# \ No newline at end of file diff --git a/htroot/Gettext_p.java b/htroot/Gettext_p.java deleted file mode 100644 index 1638ccfe1..000000000 --- a/htroot/Gettext_p.java +++ /dev/null @@ -1,78 +0,0 @@ -//Gettext_p.java -//------------ -// part of YACY -// -// (C) 2006 Alexander Schier -// -// last change: $LastChangedDate: $ by $LastChangedBy: $ -// $LastChangedRevision: $ -// -// 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.File; -import java.io.FileNotFoundException; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.Map; - -import de.anomic.data.gettext; -import de.anomic.http.httpHeader; -import de.anomic.server.serverObjects; -import de.anomic.server.serverSwitch; - - - -public class Gettext_p{ - public static serverObjects respond(httpHeader header, serverObjects post, serverSwitch env) { - serverObjects prop = new serverObjects(); - - - if(post != null && post.get("mode").equals("1")){ - prop.put("mode", "1"); - File oldfile=null; - String oldfilename; - if(post.containsKey("oldfile")){ - oldfilename=(String) post.get("oldfile"); - oldfile=new File(env.getRootPath(), oldfilename); - if(!oldfile.exists()) - //TODO: display warning? - oldfile=null; - } - - String htRootPath = env.getConfig("htRootPath", "htroot"); - File sourceDir = new File(env.getRootPath(), htRootPath); - ArrayList list; - try { - list = gettext.createGettextRecursive(sourceDir, "html,template,inc", "locale", oldfile); - } catch (FileNotFoundException e) { - // TODO warn the user - list = gettext.createGettextRecursive(sourceDir, "html,template,inc", "locale", (Map)null); - } - Iterator it=list.iterator(); - String out=""; - while(it.hasNext()){ - out+=(String)it.next()+"\n"; - } - //this does not work - /*httpHeader outheader=new httpHeader(); - outheader.put("Content-Type", "text/plain"); - prop.setOutgoingHeader(outheader);*/ - prop.put("mode_gettext", out); - } - - - return prop; - } -} \ No newline at end of file diff --git a/htroot/IndexCleaner_p.java b/htroot/IndexCleaner_p.java index 8c8a82b19..4ee65f660 100755 --- a/htroot/IndexCleaner_p.java +++ b/htroot/IndexCleaner_p.java @@ -93,9 +93,7 @@ public class IndexCleaner_p { prop.put("LOCATION",""); return prop; } - else { - prop.put("bla", "post==null"); - } + prop.put("bla", "post==null"); if (urldbCleanerThread!=null) { prop.put("urldb", 1); prop.put("urldb_percentUrls", ((double)urldbCleanerThread.totalSearchedUrls/sb.wordIndex.loadedURL.size())*100 + ""); diff --git a/htroot/Lab.html b/htroot/Lab.html deleted file mode 100644 index 5836015e8..000000000 --- a/htroot/Lab.html +++ /dev/null @@ -1,14 +0,0 @@ - -

The YaCy Lab

- -

-This is the place where we try new functions of the YaCy search engine. -All these things here are to be considered as probably unstable, and/or experimental. -You may try out these things but please do not care about bugs.

- - \ No newline at end of file diff --git a/htroot/Lab.java b/htroot/Lab.java deleted file mode 100644 index ff1f786f5..000000000 --- a/htroot/Lab.java +++ /dev/null @@ -1,13 +0,0 @@ -import de.anomic.http.httpHeader; -import de.anomic.server.serverObjects; -import de.anomic.server.serverSwitch; - -public class Lab { - public static serverObjects respond(httpHeader header, serverObjects post, serverSwitch env) { - serverObjects prop = new serverObjects(); - //XXX: Should we use Constants like DEFAULT_PAGE, PAGE_WITHOUT_MENU and so on, - //or is it nice enough to set the real path in the servlets? - prop.put("SUPERTEMPLATE", "/env/page.html"); - return prop; - } -} diff --git a/htroot/LogStatistics_p.java b/htroot/LogStatistics_p.java index 534db7b66..bd680415e 100644 --- a/htroot/LogStatistics_p.java +++ b/htroot/LogStatistics_p.java @@ -84,100 +84,99 @@ public class LogStatistics_p { if (r == null) { prop.put("results", 0); return prop; + } + prop.put("results", 1); + String[] t; + float l; + prop.put(RESULTS + LogParserPLASMA.DHT_DISTANCE_AVERAGE, r.get(LogParserPLASMA.DHT_DISTANCE_AVERAGE)); + prop.put(RESULTS + LogParserPLASMA.DHT_DISTANCE_MAX, r.get(LogParserPLASMA.DHT_DISTANCE_MAX)); + prop.put(RESULTS + LogParserPLASMA.DHT_DISTANCE_MIN, r.get(LogParserPLASMA.DHT_DISTANCE_MIN)); + prop.put(RESULTS + LogParserPLASMA.DHT_REJECTED, r.get(LogParserPLASMA.DHT_REJECTED)); + prop.put(RESULTS + LogParserPLASMA.DHT_SELECTED, r.get(LogParserPLASMA.DHT_SELECTED)); + prop.put(RESULTS + LogParserPLASMA.DHT_SENT_FAILED, r.get(LogParserPLASMA.DHT_SENT_FAILED)); + t = transformMem(((Long)r.get(LogParserPLASMA.DHT_TRAFFIC_SENT)).longValue()); + prop.put(RESULTS + LogParserPLASMA.DHT_TRAFFIC_SENT, t[0]); + prop.put(RESULTS + LogParserPLASMA.DHT_TRAFFIC_SENT + "Unit", t[1]); + prop.put(RESULTS + LogParserPLASMA.DHT_URLS_SENT, r.get(LogParserPLASMA.DHT_URLS_SENT)); + prop.put(RESULTS + LogParserPLASMA.DHT_WORDS_SELECTED, r.get(LogParserPLASMA.DHT_WORDS_SELECTED)); + t = transformTime(((Integer)r.get(LogParserPLASMA.DHT_WORDS_SELECTED_TIME)).longValue() * 1000L); + prop.put(RESULTS + LogParserPLASMA.DHT_WORDS_SELECTED_TIME, t[0]); + prop.put(RESULTS + LogParserPLASMA.DHT_WORDS_SELECTED_TIME + "Unit", t[1]); + prop.put(RESULTS + LogParserPLASMA.ERROR_CHILD_TWICE_LEFT, r.get(LogParserPLASMA.ERROR_CHILD_TWICE_LEFT)); + prop.put(RESULTS + LogParserPLASMA.ERROR_CHILD_TWICE_RIGHT, r.get(LogParserPLASMA.ERROR_CHILD_TWICE_RIGHT)); + prop.put(RESULTS + LogParserPLASMA.ERROR_MALFORMED_URL, r.get(LogParserPLASMA.ERROR_MALFORMED_URL)); + prop.put(RESULTS + LogParserPLASMA.INDEXED_ANCHORS, r.get(LogParserPLASMA.INDEXED_ANCHORS)); + t = transformTime(((Integer)r.get(LogParserPLASMA.INDEXED_INDEX_TIME)).longValue()); + prop.put(RESULTS + LogParserPLASMA.INDEXED_INDEX_TIME, t[0]); + prop.put(RESULTS + LogParserPLASMA.INDEXED_INDEX_TIME + "Unit", t[1]); + t = transformTime(((Integer)r.get(LogParserPLASMA.INDEXED_PARSE_TIME)).longValue()); + prop.put(RESULTS + LogParserPLASMA.INDEXED_PARSE_TIME, t[0]); + prop.put(RESULTS + LogParserPLASMA.INDEXED_PARSE_TIME + "Unit", t[1]); + prop.put(RESULTS + LogParserPLASMA.INDEXED_SITES, r.get(LogParserPLASMA.INDEXED_SITES)); + t = transformMem(((Integer)r.get(LogParserPLASMA.INDEXED_SITES_SIZE)).longValue()); + prop.put(RESULTS + LogParserPLASMA.INDEXED_SITES_SIZE, t[0]); + prop.put(RESULTS + LogParserPLASMA.INDEXED_SITES_SIZE + "Unit", t[1]); + t = transformTime(((Integer)r.get(LogParserPLASMA.INDEXED_STACK_TIME)).longValue()); + prop.put(RESULTS + LogParserPLASMA.INDEXED_STACK_TIME, t[0]); + prop.put(RESULTS + LogParserPLASMA.INDEXED_STACK_TIME + "Unit", t[1]); + t = transformTime(((Integer)r.get(LogParserPLASMA.INDEXED_STORE_TIME)).longValue()); + prop.put(RESULTS + LogParserPLASMA.INDEXED_STORE_TIME, t[0]); + prop.put(RESULTS + LogParserPLASMA.INDEXED_STORE_TIME + "Unit", t[1]); + prop.put(RESULTS + LogParserPLASMA.INDEXED_WORDS, r.get(LogParserPLASMA.INDEXED_WORDS)); + prop.put(RESULTS + LogParserPLASMA.PEERS_BUSY, r.get(LogParserPLASMA.PEERS_BUSY)); + prop.put(RESULTS + LogParserPLASMA.PEERS_TOO_LESS, r.get(LogParserPLASMA.PEERS_TOO_LESS)); + prop.put(RESULTS + LogParserPLASMA.RANKING_DIST, r.get(LogParserPLASMA.RANKING_DIST)); + prop.put(RESULTS + LogParserPLASMA.RANKING_DIST_FAILED, r.get(LogParserPLASMA.RANKING_DIST_FAILED)); + t = transformTime(((Integer)r.get(LogParserPLASMA.RANKING_DIST_TIME)).longValue()); + prop.put(RESULTS + LogParserPLASMA.RANKING_DIST_TIME, t[0]); + prop.put(RESULTS + LogParserPLASMA.RANKING_DIST_TIME + "Unit", t[1]); + prop.put(RESULTS + LogParserPLASMA.RWIS_BLOCKED, r.get(LogParserPLASMA.RWIS_BLOCKED)); + prop.put(RESULTS + LogParserPLASMA.RWIS_RECEIVED, r.get(LogParserPLASMA.RWIS_RECEIVED)); + t = transformTime(((Long)r.get(LogParserPLASMA.RWIS_RECEIVED_TIME)).longValue()); + prop.put(RESULTS + LogParserPLASMA.RWIS_RECEIVED_TIME, t[0]); + prop.put(RESULTS + LogParserPLASMA.RWIS_RECEIVED_TIME + "Unit", t[1]); + prop.put(RESULTS + LogParserPLASMA.URLS_BLOCKED, r.get(LogParserPLASMA.URLS_BLOCKED)); + prop.put(RESULTS + LogParserPLASMA.URLS_RECEIVED, r.get(LogParserPLASMA.URLS_RECEIVED)); + t = transformTime(((Long)r.get(LogParserPLASMA.URLS_RECEIVED_TIME)).longValue()); + prop.put(RESULTS + LogParserPLASMA.URLS_RECEIVED_TIME, t[0]); + prop.put(RESULTS + LogParserPLASMA.URLS_RECEIVED_TIME + "Unit", t[1]); + prop.put(RESULTS + LogParserPLASMA.URLS_REQUESTED, r.get(LogParserPLASMA.URLS_REQUESTED)); + prop.put(RESULTS + LogParserPLASMA.WORDS_RECEIVED, r.get(LogParserPLASMA.WORDS_RECEIVED)); + l = ((Long)r.get(LogParserPLASMA.TOTAL_PARSER_TIME)).floatValue(); + t = transformTime((long)l); + prop.put(RESULTS + LogParserPLASMA.TOTAL_PARSER_TIME, t[0]); + prop.put(RESULTS + LogParserPLASMA.TOTAL_PARSER_TIME + "Unit", t[1]); + prop.put(RESULTS + LogParserPLASMA.TOTAL_PARSER_RUNS, r.get(LogParserPLASMA.TOTAL_PARSER_RUNS)); + if ((l /= 1000) == 0) { + prop.put(RESULTS + "avgExists", 0); } else { - prop.put("results", 1); - String[] t; - float l; - prop.put(RESULTS + LogParserPLASMA.DHT_DISTANCE_AVERAGE, r.get(LogParserPLASMA.DHT_DISTANCE_AVERAGE)); - prop.put(RESULTS + LogParserPLASMA.DHT_DISTANCE_MAX, r.get(LogParserPLASMA.DHT_DISTANCE_MAX)); - prop.put(RESULTS + LogParserPLASMA.DHT_DISTANCE_MIN, r.get(LogParserPLASMA.DHT_DISTANCE_MIN)); - prop.put(RESULTS + LogParserPLASMA.DHT_REJECTED, r.get(LogParserPLASMA.DHT_REJECTED)); - prop.put(RESULTS + LogParserPLASMA.DHT_SELECTED, r.get(LogParserPLASMA.DHT_SELECTED)); - prop.put(RESULTS + LogParserPLASMA.DHT_SENT_FAILED, r.get(LogParserPLASMA.DHT_SENT_FAILED)); - t = transformMem(((Long)r.get(LogParserPLASMA.DHT_TRAFFIC_SENT)).longValue()); - prop.put(RESULTS + LogParserPLASMA.DHT_TRAFFIC_SENT, t[0]); - prop.put(RESULTS + LogParserPLASMA.DHT_TRAFFIC_SENT + "Unit", t[1]); - prop.put(RESULTS + LogParserPLASMA.DHT_URLS_SENT, r.get(LogParserPLASMA.DHT_URLS_SENT)); - prop.put(RESULTS + LogParserPLASMA.DHT_WORDS_SELECTED, r.get(LogParserPLASMA.DHT_WORDS_SELECTED)); - t = transformTime(((Integer)r.get(LogParserPLASMA.DHT_WORDS_SELECTED_TIME)).longValue() * 1000L); - prop.put(RESULTS + LogParserPLASMA.DHT_WORDS_SELECTED_TIME, t[0]); - prop.put(RESULTS + LogParserPLASMA.DHT_WORDS_SELECTED_TIME + "Unit", t[1]); - prop.put(RESULTS + LogParserPLASMA.ERROR_CHILD_TWICE_LEFT, r.get(LogParserPLASMA.ERROR_CHILD_TWICE_LEFT)); - prop.put(RESULTS + LogParserPLASMA.ERROR_CHILD_TWICE_RIGHT, r.get(LogParserPLASMA.ERROR_CHILD_TWICE_RIGHT)); - prop.put(RESULTS + LogParserPLASMA.ERROR_MALFORMED_URL, r.get(LogParserPLASMA.ERROR_MALFORMED_URL)); - prop.put(RESULTS + LogParserPLASMA.INDEXED_ANCHORS, r.get(LogParserPLASMA.INDEXED_ANCHORS)); - t = transformTime(((Integer)r.get(LogParserPLASMA.INDEXED_INDEX_TIME)).longValue()); - prop.put(RESULTS + LogParserPLASMA.INDEXED_INDEX_TIME, t[0]); - prop.put(RESULTS + LogParserPLASMA.INDEXED_INDEX_TIME + "Unit", t[1]); - t = transformTime(((Integer)r.get(LogParserPLASMA.INDEXED_PARSE_TIME)).longValue()); - prop.put(RESULTS + LogParserPLASMA.INDEXED_PARSE_TIME, t[0]); - prop.put(RESULTS + LogParserPLASMA.INDEXED_PARSE_TIME + "Unit", t[1]); - prop.put(RESULTS + LogParserPLASMA.INDEXED_SITES, r.get(LogParserPLASMA.INDEXED_SITES)); - t = transformMem(((Integer)r.get(LogParserPLASMA.INDEXED_SITES_SIZE)).longValue()); - prop.put(RESULTS + LogParserPLASMA.INDEXED_SITES_SIZE, t[0]); - prop.put(RESULTS + LogParserPLASMA.INDEXED_SITES_SIZE + "Unit", t[1]); - t = transformTime(((Integer)r.get(LogParserPLASMA.INDEXED_STACK_TIME)).longValue()); - prop.put(RESULTS + LogParserPLASMA.INDEXED_STACK_TIME, t[0]); - prop.put(RESULTS + LogParserPLASMA.INDEXED_STACK_TIME + "Unit", t[1]); - t = transformTime(((Integer)r.get(LogParserPLASMA.INDEXED_STORE_TIME)).longValue()); - prop.put(RESULTS + LogParserPLASMA.INDEXED_STORE_TIME, t[0]); - prop.put(RESULTS + LogParserPLASMA.INDEXED_STORE_TIME + "Unit", t[1]); - prop.put(RESULTS + LogParserPLASMA.INDEXED_WORDS, r.get(LogParserPLASMA.INDEXED_WORDS)); - prop.put(RESULTS + LogParserPLASMA.PEERS_BUSY, r.get(LogParserPLASMA.PEERS_BUSY)); - prop.put(RESULTS + LogParserPLASMA.PEERS_TOO_LESS, r.get(LogParserPLASMA.PEERS_TOO_LESS)); - prop.put(RESULTS + LogParserPLASMA.RANKING_DIST, r.get(LogParserPLASMA.RANKING_DIST)); - prop.put(RESULTS + LogParserPLASMA.RANKING_DIST_FAILED, r.get(LogParserPLASMA.RANKING_DIST_FAILED)); - t = transformTime(((Integer)r.get(LogParserPLASMA.RANKING_DIST_TIME)).longValue()); - prop.put(RESULTS + LogParserPLASMA.RANKING_DIST_TIME, t[0]); - prop.put(RESULTS + LogParserPLASMA.RANKING_DIST_TIME + "Unit", t[1]); - prop.put(RESULTS + LogParserPLASMA.RWIS_BLOCKED, r.get(LogParserPLASMA.RWIS_BLOCKED)); - prop.put(RESULTS + LogParserPLASMA.RWIS_RECEIVED, r.get(LogParserPLASMA.RWIS_RECEIVED)); - t = transformTime(((Long)r.get(LogParserPLASMA.RWIS_RECEIVED_TIME)).longValue()); - prop.put(RESULTS + LogParserPLASMA.RWIS_RECEIVED_TIME, t[0]); - prop.put(RESULTS + LogParserPLASMA.RWIS_RECEIVED_TIME + "Unit", t[1]); - prop.put(RESULTS + LogParserPLASMA.URLS_BLOCKED, r.get(LogParserPLASMA.URLS_BLOCKED)); - prop.put(RESULTS + LogParserPLASMA.URLS_RECEIVED, r.get(LogParserPLASMA.URLS_RECEIVED)); - t = transformTime(((Long)r.get(LogParserPLASMA.URLS_RECEIVED_TIME)).longValue()); - prop.put(RESULTS + LogParserPLASMA.URLS_RECEIVED_TIME, t[0]); - prop.put(RESULTS + LogParserPLASMA.URLS_RECEIVED_TIME + "Unit", t[1]); - prop.put(RESULTS + LogParserPLASMA.URLS_REQUESTED, r.get(LogParserPLASMA.URLS_REQUESTED)); - prop.put(RESULTS + LogParserPLASMA.WORDS_RECEIVED, r.get(LogParserPLASMA.WORDS_RECEIVED)); - l = ((Long)r.get(LogParserPLASMA.TOTAL_PARSER_TIME)).floatValue(); - t = transformTime((long)l); - prop.put(RESULTS + LogParserPLASMA.TOTAL_PARSER_TIME, t[0]); - prop.put(RESULTS + LogParserPLASMA.TOTAL_PARSER_TIME + "Unit", t[1]); - prop.put(RESULTS + LogParserPLASMA.TOTAL_PARSER_RUNS, r.get(LogParserPLASMA.TOTAL_PARSER_RUNS)); - if ((l /= 1000) == 0) { - prop.put(RESULTS + "avgExists", 0); - } else { - prop.put(RESULTS + "avgExists", 1); - prop.put(RESULTS + "avgExists_avgParserRunsPerMinute", (int) (((Integer) r.get(LogParserPLASMA.TOTAL_PARSER_RUNS)).floatValue() / l)); - } - - Object[] names = ((HashSet)r.get(LogParserPLASMA.DHT_REJECTED_PEERS_NAME)).toArray(); - Object[] hashes = ((HashSet)r.get(LogParserPLASMA.DHT_REJECTED_PEERS_HASH)).toArray(); - int i = 0; - for (; i 0) ? 1 : 0); - prop.put(RESULTS + "useDHTRejectPeers_DHTRejectPeers", i); - - names = ((HashSet)r.get(LogParserPLASMA.DHT_SENT_PEERS_NAME)).toArray(); - hashes = ((HashSet)r.get(LogParserPLASMA.DHT_SENT_PEERS_HASH)).toArray(); - i = 0; - for (; i 0) ? 1 : 0); - prop.put(RESULTS + "useDHTPeers_DHTPeers", i); - - return prop; + prop.put(RESULTS + "avgExists", 1); + prop.put(RESULTS + "avgExists_avgParserRunsPerMinute", (int) (((Integer) r.get(LogParserPLASMA.TOTAL_PARSER_RUNS)).floatValue() / l)); } + + Object[] names = ((HashSet)r.get(LogParserPLASMA.DHT_REJECTED_PEERS_NAME)).toArray(); + Object[] hashes = ((HashSet)r.get(LogParserPLASMA.DHT_REJECTED_PEERS_HASH)).toArray(); + int i = 0; + for (; i 0) ? 1 : 0); + prop.put(RESULTS + "useDHTRejectPeers_DHTRejectPeers", i); + + names = ((HashSet)r.get(LogParserPLASMA.DHT_SENT_PEERS_NAME)).toArray(); + hashes = ((HashSet)r.get(LogParserPLASMA.DHT_SENT_PEERS_HASH)).toArray(); + i = 0; + for (; i 0) ? 1 : 0); + prop.put(RESULTS + "useDHTPeers_DHTPeers", i); + + return prop; } private static final String MILLISECONDS = "ms"; diff --git a/htroot/TestApplet.java b/htroot/TestApplet.java index bc6b5a258..921af4bbd 100644 --- a/htroot/TestApplet.java +++ b/htroot/TestApplet.java @@ -18,16 +18,10 @@ // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.OutputStream; -import java.io.UnsupportedEncodingException; import java.lang.reflect.InvocationTargetException; import java.util.Iterator; import de.anomic.http.httpHeader; -import de.anomic.http.httpTemplate; import de.anomic.http.httpdFileHandler; import de.anomic.plasma.plasmaSwitchboard; import de.anomic.server.serverByteBuffer; @@ -56,19 +50,18 @@ public class TestApplet { } prop.put("mode", "1"); - File templatefile=filehandler.getOverlayedFile((String)post.get("url")); + //File templatefile=filehandler.getOverlayedFile((String)post.get("url")); File classfile=filehandler.getOverlayedClass((String)post.get("url")); httpHeader header2=new httpHeader(); header2.put("CLIENTIP", "127.0.0.1"); - header2.put("PATH", (String)post.get("url")); + header2.put("PATH", post.get("url")); serverObjects tp=null; try { if(classfile==null || !classfile.exists()){ prop.put("mode_templates", "classfile does not exist"); return prop; - }else{ - tp=(serverObjects)filehandler.invokeServlet(classfile, header2, args); } + tp=(serverObjects)filehandler.invokeServlet(classfile, header2, args); } catch (IllegalArgumentException e) {} catch (IllegalAccessException e) {} @@ -87,22 +80,22 @@ public class TestApplet { tmp.append(key).append("=").append(tp.get(key)).append("\n"); } prop.put("mode_templates", tmp.toString()); - FileInputStream fis=null; - try { - fis=new FileInputStream(templatefile); + //FileInputStream fis=null; + //try { + //fis=new FileInputStream(templatefile); serverByteBuffer o=new serverByteBuffer(); - byte[] structure=httpTemplate.writeTemplate(fis, (OutputStream)o, tp, "-UNRESOLVED_PATTERN-".getBytes("UTF-8")); - prop.put("mode_structure", structure); + //byte[] structure=httpTemplate.writeTemplate(fis, o, tp, "-UNRESOLVED_PATTERN-".getBytes("UTF-8")); + //prop.put("mode_structure", structure); prop.put("mode_text", o.toString()); return prop; - } - catch (FileNotFoundException e) {} - catch (UnsupportedEncodingException e) {} - catch (IOException e) {} + //} + //catch (FileNotFoundException e) {} + //catch (UnsupportedEncodingException e) {} + //catch (IOException e) {} - prop.put("mode_text", "could not finish correctly"); //very informative errormessage - return prop; + //prop.put("mode_text", "could not finish correctly"); //very informative errormessage + //return prop; } diff --git a/htroot/User.html b/htroot/User.html index 82cd7332e..721aab277 100644 --- a/htroot/User.html +++ b/htroot/User.html @@ -4,10 +4,8 @@ YaCy '#[clientname]#': User Page #%env/templates/metas.template%# - + #%env/templates/header.template%# -
-

User Page

#(logged-in)#

diff --git a/htroot/User_p.html b/htroot/User_p.html index 973682341..188e79fdc 100644 --- a/htroot/User_p.html +++ b/htroot/User_p.html @@ -1,6 +1,11 @@ - + + + + YaCy '#[clientname]#': User Page + #%env/templates/metas.template%# + + + #%env/templates/header.template%#

User Administration

@@ -70,3 +75,6 @@ +#%env/templates/footer.template%# + + diff --git a/htroot/User_p.java b/htroot/User_p.java index 1331a49a7..0cf854146 100644 --- a/htroot/User_p.java +++ b/htroot/User_p.java @@ -63,7 +63,6 @@ public class User_p { serverObjects prop = new serverObjects(); plasmaSwitchboard sb = plasmaSwitchboard.getSwitchboard(); userDB.Entry entry=null; - prop.put("SUPERTEMPLATE", "/env/page.html"); //user Supertemplates //default values prop.put("current_user", "newuser"); diff --git a/htroot/Wiki.java b/htroot/Wiki.java index ea5b08047..8fb544ac9 100644 --- a/htroot/Wiki.java +++ b/htroot/Wiki.java @@ -53,7 +53,7 @@ import java.util.Date; import java.util.HashMap; import java.util.Iterator; -import de.anomic.data.Diff; +import de.anomic.data.diff; import de.anomic.data.wikiBoard; import de.anomic.http.httpHeader; import de.anomic.plasma.plasmaSwitchboard; @@ -244,10 +244,10 @@ public class Wiki { if (nentry == null) nentry = entry; if (post.containsKey("compare") && oentry != null && nentry != null) { // TODO: split into paragraphs and compare them with the same diff-algo - Diff diff = new Diff( + diff diff = new diff( new String(oentry.page(), "UTF-8"), new String(nentry.page(), "UTF-8"), 3); - prop.putASIS("mode_versioning_diff", Diff.toHTML(new Diff[] { diff })); + prop.putASIS("mode_versioning_diff", de.anomic.data.diff.toHTML(new diff[] { diff })); prop.put("mode_versioning", 1); } else if (post.containsKey("viewold") && oentry != null) { prop.put("mode_versioning", 2); diff --git a/htroot/env/page.html b/htroot/env/page.html deleted file mode 100644 index 7ea35076f..000000000 --- a/htroot/env/page.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - #[header]# - - - - #%env/templates/metas.template%# - - - #%env/templates/header.template%# - #[page]# - #%env/templates/footer.template%# - - diff --git a/htroot/env/page.java b/htroot/env/page.java deleted file mode 100644 index f3a471040..000000000 --- a/htroot/env/page.java +++ /dev/null @@ -1,41 +0,0 @@ -//page.java - super template, to allow a scripted layout. -//---------------------------------------------------------- -//part of YaCy -// -// (C) 2006 by Alexander Schier -// -// last change: $LastChangedDate: $ by $LastChangedBy: $ -// $LastChangedRevision: $ -// -// 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 - - -//note: this isn't useful, yet. -//this is only a basic demonstration, what can be done with the supertemplates. -import de.anomic.http.httpHeader; -import de.anomic.server.serverObjects; -import de.anomic.server.serverSwitch; - -public class page { - public static serverObjects respond(httpHeader header, serverObjects post, serverSwitch env) { - //plasmaSwitchboard switchboard = (plasmaSwitchboard) env; - serverObjects prop = new serverObjects(); - //prop.put("test1", "testit!"); - //prop.put("test2", 1); - - return prop; - } - -} \ No newline at end of file diff --git a/htroot/ssitest.html b/htroot/ssitest.html new file mode 100644 index 000000000..3656e977d --- /dev/null +++ b/htroot/ssitest.html @@ -0,0 +1,11 @@ + + + + +Dynamisches HTML mit Server Side Includes + + +

Dynamisches HTML mit Server Side Includes

+ + + \ No newline at end of file diff --git a/htroot/ssitest.inc b/htroot/ssitest.inc new file mode 100644 index 000000000..531dc4aae --- /dev/null +++ b/htroot/ssitest.inc @@ -0,0 +1,7 @@ + +

Auf einer Meierei,
+da lebte einst ein braves Huhn,
+das legte, wie die HŸhner tun,
+an jedem Tag ein Ei.
+Und kakelte, mirakelte, spektakelte,
+als obs ein Wunder sei.

\ No newline at end of file diff --git a/source/dbtest.java b/source/dbtest.java index 63e8514a6..2b3afded6 100644 --- a/source/dbtest.java +++ b/source/dbtest.java @@ -640,7 +640,7 @@ final class dbTable implements kelondroIndex { throw new UnsupportedOperationException(); } - public synchronized void addUnique(kelondroRow.Entry row, Date entryDate) throws IOException { + public synchronized void addUnique(kelondroRow.Entry row, Date entryDate) { throw new UnsupportedOperationException(); } diff --git a/source/de/anomic/data/bookmarksDB.java b/source/de/anomic/data/bookmarksDB.java index 348b9c5c7..e5aaac0f4 100644 --- a/source/de/anomic/data/bookmarksDB.java +++ b/source/de/anomic/data/bookmarksDB.java @@ -783,9 +783,8 @@ public class bookmarksDB { public String getOwner(){ if(entry.containsKey(BOOKMARK_OWNER)){ return (String) entry.get(BOOKMARK_OWNER); - }else{ - return null; //null means admin } + return null; //null means admin } public void setOwner(String owner){ entry.put(BOOKMARK_OWNER, owner); @@ -793,16 +792,14 @@ public class bookmarksDB { public boolean getPublic(){ if(entry.containsKey(BOOKMARK_PUBLIC)){ return ((String) entry.get(BOOKMARK_PUBLIC)).equals("public"); - }else{ - return false; } + return false; } public boolean getFeed(){ if(entry.containsKey(BOOKMARK_IS_FEED)){ return ((String) entry.get(BOOKMARK_IS_FEED)).equals("true"); - }else{ - return false; } + return false; } public void setPublic(boolean isPublic){ if(isPublic){ @@ -888,8 +885,8 @@ public class bookmarksDB { public void remove() { if (this.nextEntry != null) { try { - String tagHash = (String)this.nextEntry.getTagHash(); - if (tagHash != null) removeTag((String) tagHash); + String tagHash = this.nextEntry.getTagHash(); + if (tagHash != null) removeTag(tagHash); } catch (kelondroException e) { //resetDatabase(); } @@ -949,16 +946,11 @@ public class bookmarksDB { if(bm1==null || bm2==null) return 0; //XXX: i think this should not happen? maybe this needs further tracing of the bug if(this.newestFirst){ - if(bm2.getTimeStamp() - bm1.getTimeStamp() >0) - return 1; - else - return -1; - }else{ - if(bm1.getTimeStamp() - bm2.getTimeStamp() >0) - return 1; - else - return -1; + if(bm2.getTimeStamp() - bm1.getTimeStamp() >0) return 1; + return -1; } + if(bm1.getTimeStamp() - bm2.getTimeStamp() >0) return 1; + return -1; } } /** diff --git a/source/de/anomic/data/Diff.java b/source/de/anomic/data/diff.java similarity index 95% rename from source/de/anomic/data/Diff.java rename to source/de/anomic/data/diff.java index a55255c15..bac74178a 100644 --- a/source/de/anomic/data/Diff.java +++ b/source/de/anomic/data/diff.java @@ -6,7 +6,7 @@ // Frankfurt, Germany, 2007 // Created 03.02.2007 // -// This file is contributed by Franz Brauße +// This file is contributed by Franz Brau§e // // $LastChangedDate: $ // $LastChangedRevision: $ @@ -52,7 +52,7 @@ import java.util.ArrayList; /** * This class provides a diff-functionality. */ -public class Diff { +public class diff { private final ArrayList /* of Part */ parts = new ArrayList(); private final Object[] o; @@ -63,7 +63,7 @@ public class Diff { * @param n the new String * @throws NullPointerException if one of the arguments is null */ - public Diff(String o, String n) { + public diff(String o, String n) { this(o, n, 1); } @@ -76,7 +76,7 @@ public class Diff { * @throws NullPointerException if o or n is * null */ - public Diff(String o, String n, int minConsecutive) { + public diff(String o, String n, int minConsecutive) { if (o == null || n == null) throw new NullPointerException("neither o nor n must be null"); this.o = new Comparable[o.length()]; for (int i=0; i 0) ? minConsecutive : 1); } - public Diff(Object[] o, Object[] n, int minConsecutive) { + public diff(Object[] o, Object[] n, int minConsecutive) { if (o == null || n == null) throw new NullPointerException("neither o nor n must be null"); this.o = o; this.n = n; @@ -237,10 +237,10 @@ public class Diff { final StringBuffer sb = new StringBuffer(this.posNew - this.posOld); if (this.action == ADDED) { for (int i=this.posOld; i\n"); ps = diffs[i].getParts(); for (int j=0; j").append(htmlTools.replaceXMLEntities(ps[j].getString()).replaceAll("\n", "
")); sb.append(""); @@ -279,4 +279,4 @@ public class Diff { } return new String(sb); } -} +} \ No newline at end of file diff --git a/source/de/anomic/data/gettext.java b/source/de/anomic/data/gettext.java deleted file mode 100644 index e6925a02b..000000000 --- a/source/de/anomic/data/gettext.java +++ /dev/null @@ -1,333 +0,0 @@ -//gettext.java - translations in a simplified gettext-format -//---------------------------------------------------------- -//part of YaCy -// -// (C) 2006 by Alexander Schier -// -// last change: $LastChangedDate: $ by $LastChangedBy: $ -// $LastChangedRevision: $ -// -// 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 - -package de.anomic.data; - -import java.io.BufferedReader; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; -import java.io.InputStreamReader; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Date; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; - -import de.anomic.htmlFilter.htmlFilterContentTransformer; -import de.anomic.server.logging.serverLog; - -public class gettext{ - public static ArrayList createGettextRecursive(File sourceDir, String extensions, String notdir, File oldgettextfile) throws FileNotFoundException{ - if(oldgettextfile==null) - return createGettextRecursive(sourceDir, extensions, notdir, (Map)null); //no old file - return createGettextRecursive(sourceDir, extensions, notdir, parseGettext(oldgettextfile)); - } - public static ArrayList createGettextRecursive(File sourceDir, String extensions, String notdir, Map oldgettext){ - ArrayList list=new ArrayList(); - ArrayList exts=listManager.string2arraylist(extensions); - Iterator it2; - String filename; - ArrayList filenames=new ArrayList(); - - ArrayList dirList=listManager.getDirsRecursive(sourceDir, notdir); - dirList.add(sourceDir); - Iterator it=dirList.iterator(); - File dir=null; - File[] files; - //this looks a lot more complicated, than it is ... - while(it.hasNext()){ - dir=(File)it.next(); - if(dir.isDirectory() && !dir.getName().equals(notdir)){ - files=dir.listFiles(); - for(int i=0;i\\n\""); - list.add("\"X-Generator: YaCy\\n\""); - - list.add("\"Mime-Version: 1.0\\n\""); - list.add(""); - return list; - } - public static ArrayList createGettext(ArrayList filenames, File oldgettextfile) throws FileNotFoundException{ - return createGettext(filenames, parseGettext(oldgettextfile)); - } - /* - * create a list of gettext file for some textfiles - * @param filenames the ArrayList with the Filenames - * @param oldgettextmap a map with the old translations. - */ - public static ArrayList createGettext(ArrayList filenames, Map oldgettext){ - ArrayList list=new ArrayList(); - ArrayList tmp=null; - String filename=null; - Iterator it=filenames.iterator(); - list.addAll(getGettextHeader()); - - while(it.hasNext()){ - try { - filename=(String)it.next(); - //TODO: better possibility to switch the behaviour - //tmp=getGettextSource(new File(filename), oldgettext); - tmp=getGettextSourceFromHTML(new File(filename), oldgettext); - serverLog.logFinest("Gettext", "Extracting Strings from: "+filename); - } catch (FileNotFoundException e) { - System.out.println("File \""+filename+"\" not found."); - } - if(tmp!=null) - list.addAll(tmp); - } - return list; - } - public static ArrayList getGettextSource(File inputfile, File oldmapfile) throws FileNotFoundException{ - if(oldmapfile != null && oldmapfile.exists()) - return getGettextSource(inputfile, parseGettext(oldmapfile)); - return getGettextSource(inputfile); - } - public static ArrayList getGettextSource(File inputfile) throws FileNotFoundException{ - return getGettextSource(inputfile, new HashMap()); - } - public static ArrayList getGettextSource(File inputfile, Map oldgettextmap) throws FileNotFoundException{ - ArrayList strings=getGettextItems(inputfile); - return getGettextSource(inputfile, oldgettextmap, strings); - } - public static ArrayList getGettextSourceFromHTML(File inputfile, Map oldgettextmap) throws FileNotFoundException{ - htmlFilterContentTransformer transformer=new htmlFilterContentTransformer(); - BufferedReader br=new BufferedReader(new FileReader(inputfile)); - StringBuffer content=new StringBuffer(); - String line=""; - try { - while((line=br.readLine())!=null){ - content.append(line).append("\n"); - } - } catch (IOException e) {} - ArrayList strings = transformer.getStrings(content.toString().getBytes()); - return getGettextSource(inputfile, oldgettextmap, strings); - } - public static ArrayList getGettextSource(File inputfile, Map oldgettextmap, ArrayList strings) { - if(oldgettextmap==null) - oldgettextmap=new HashMap(); - - - ArrayList list=new ArrayList(); - Iterator it=strings.iterator(); - if(strings.isEmpty()) - return null; - list.add("#"+inputfile.getName()); - String key; - while(it.hasNext()){ - key=((String)it.next()).replaceAll("\"", "\\\\\"").replaceAll("\n", "\\\\n"); - list.add("msgid \""+key+"\""); - if(oldgettextmap.containsKey(key)) - list.add("msgstr \""+oldgettextmap.get(key)+"\""); - else - list.add("msgstr \"\""); - list.add(""); - } - return list; - } - /* - * create a list of gettext Strings ( _() ) from a file - * @param inputfile the file, which contains the raw Strings. - */ - public static ArrayList getGettextItems(File inputfile) throws FileNotFoundException{ - ArrayList list=new ArrayList(); - int character; - InputStreamReader reader; - int state=0; //0=no gettext macro 1= _ found, 2= ( found and in the string 3=\ found - String untranslatedString=""; - - reader = new InputStreamReader(new FileInputStream(inputfile)); - try { - character=reader.read(); - while(character >=0) { - if(state==0 && (char)character=='_') - state=1; - else if(state==1){ - if((char)character=='('){ - state=2; - untranslatedString=""; - }else{ - state=0; - untranslatedString+=(char)character; - } - }else if(state==2){ - if((char)character=='\\') - state=3; - else if((char)character==')'){ - state=0; - list.add(untranslatedString); - }else{ - untranslatedString+=(char)character; - } - }else if(state==3){ - state=2; - if((char)character==')') - untranslatedString+=")"; - else - untranslatedString+="\\"+(char)character; - }else{ - untranslatedString+=(char)character; - } - character=reader.read(); - } - } catch (IOException e) {} - return list; - } - public static HashMap parseGettext(File gettextfile) throws FileNotFoundException{ - ArrayList gettext=new ArrayList(); - String line; - BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(gettextfile))); - try { - line = br.readLine(); - while (line != null) { - gettext.add(line); - line = br.readLine(); - } - } catch (IOException e) {} - return parseGettext(gettext); - } - public static HashMap parseGettext(ArrayList gettext){ - HashMap map = new HashMap(); - int mode=0; //1= in msgid, 2= in msgstr - String msgid = "", msgstr = "", tmp = ""; - - Iterator it=gettext.iterator(); - while(it.hasNext()){ - tmp=(String) it.next(); - if(tmp.startsWith("msgid \"")){ - if(mode==2) - map.put(msgid, msgstr); - msgid=tmp.substring(7,tmp.length()-1).replaceAll("\\\"", "\""); - msgstr=""; - mode=1; - }else if(tmp.startsWith("msgstr \"")){ - mode=2; - msgstr=tmp.substring(8,tmp.length()-1); - }else if(tmp.startsWith("\"")){ - //multiline strings with "..." on each line - if(mode==1){ - msgid+="\n"+tmp.substring(1,tmp.length()-1).replaceAll("\\\"", "\""); - }else if(mode==2){ - msgstr+="\n"+tmp.substring(1,tmp.length()-1).replaceAll("\\\"", "\""); - } - } - } - map.put(msgid, msgstr); //the last one cannot be put, on the next msgid ;-) - return map; - } - public static void main(String[] argv){ - if(argv.length < 2){ - System.out.println("Syntax: java de.anomic.data.gettext creategettext [inputfile] ... [inputfile]"); - System.out.println("Syntax: java de.anomic.data.gettext parsegettext [gettextfile]"); - System.out.println("Syntax: java de.anomic.data.gettext updategettext [gettextfile] [inputfile] ... [inputfile]"); - System.exit(1); - } - if(argv[0].equals("creategettext")){ - ArrayList filelist=new ArrayList(); - for(int i=1;i2){ - System.out.println("only one file allowed for parsegettext"); - System.exit(1); - } - try { - HashMap translations=parseGettext(new File(argv[1])); - Iterator it=translations.keySet().iterator(); - String key=""; - while(it.hasNext()){ - key=(String)it.next(); - System.out.println("key: "+key); - System.out.println("value: "+translations.get(key)); - } - } catch (FileNotFoundException e) { - System.exit(1); - } - }else if(argv[0].equals("updategettext")){ - if(argv.length < 3){ - System.out.println("Too less arguments"); - System.exit(1); - } - ArrayList filelist=new ArrayList(); - for(int i=2;i 0) System.out.println(" TEXT: " + sbb.toString()); -// serverCharBuffer[] sbbs = httpTemplate.splitQuotations(sbb); -// sbb = new serverCharBuffer(); -// for (int i = 0; i < sbbs.length; i++) { -// if (sbbs[i].isWhitespace(true)) { -// sbb.append(sbbs[i]); -// } else if ((sbbs[i].byteAt(0) == httpTemplate.hash) || -// (sbbs[i].startsWith(httpTemplate.dpdpa))) { -// // this is a template or a part of a template -// sbb.append(sbbs[i]); -// } else { -// // this is a text fragment, generate gettext quotation -// int ws = sbbs[i].whitespaceStart(true); -// int we = sbbs[i].whitespaceEnd(true); -// sbb.append(sbbs[i].getBytes(0, ws)); -// sbb.append('_'); -// sbb.append('('); -// sbb.append(sbbs[i].getBytes(ws, we)); -// sbb.append(')'); -// sbb.append(sbbs[i].getBytes(we)); -// } -// } -// //if (sbb.length() > 0) System.out.println("GETTEXT: " + sbb.toString()); -// return sbb.getChars(); - } if (bluelist != null) { if (bluelistHit(text)) { // System.out.println("FILTERHIT: " + text); diff --git a/source/de/anomic/htmlFilter/htmlFilterWriter.java b/source/de/anomic/htmlFilter/htmlFilterWriter.java index f3c0d05da..8d7175e4d 100644 --- a/source/de/anomic/htmlFilter/htmlFilterWriter.java +++ b/source/de/anomic/htmlFilter/htmlFilterWriter.java @@ -512,7 +512,6 @@ public final class htmlFilterWriter extends Writer { htmlFilterTransformer transformer = new htmlFilterContentTransformer(); // TODO: this does not work at the moment System.exit(0); - transformer.init("gettext"); Reader is = new FileReader(args[0]); FileOutputStream fos = new FileOutputStream(new File(args[0] + ".out")); Writer os = new htmlFilterWriter(fos, "UTF-8",scraper, transformer, false); diff --git a/source/de/anomic/http/httpChunkedOutputStream.java b/source/de/anomic/http/httpChunkedOutputStream.java index be603d2d5..dd5591b34 100644 --- a/source/de/anomic/http/httpChunkedOutputStream.java +++ b/source/de/anomic/http/httpChunkedOutputStream.java @@ -45,12 +45,15 @@ package de.anomic.http; import java.io.FilterOutputStream; import java.io.IOException; +import java.io.InputStream; import java.io.OutputStream; -public final class httpChunkedOutputStream extends FilterOutputStream -{ - private boolean finished = false; - private static final byte[] crlf = {(byte)13,(byte)10}; +import de.anomic.server.serverByteBuffer; +import de.anomic.server.serverCore; +import de.anomic.server.serverFileUtils; + +public final class httpChunkedOutputStream extends FilterOutputStream { + private boolean finished = false; public httpChunkedOutputStream(OutputStream out) { super(out); @@ -63,7 +66,9 @@ public final class httpChunkedOutputStream extends FilterOutputStream public void finish() throws IOException { if (!this.finished) { - this.out.write("0\r\n\r\n".getBytes()); + this.out.write((byte) 48); + this.out.write(serverCore.crlf); + this.out.write(serverCore.crlf); this.out.flush(); this.finished = true; } @@ -74,9 +79,9 @@ public final class httpChunkedOutputStream extends FilterOutputStream if (b.length == 0) return; this.out.write(Integer.toHexString(b.length).getBytes()); - this.out.write(crlf); + this.out.write(serverCore.crlf); this.out.write(b); - this.out.write(crlf); + this.out.write(serverCore.crlf); this.out.flush(); } @@ -85,9 +90,32 @@ public final class httpChunkedOutputStream extends FilterOutputStream if (len == 0) return; this.out.write(Integer.toHexString(len).getBytes()); - this.out.write(crlf); + this.out.write(serverCore.crlf); this.out.write(b, off, len); - this.out.write(crlf); + this.out.write(serverCore.crlf); + this.out.flush(); + } + + public void write(serverByteBuffer b, int off, int len) throws IOException { + if (this.finished) throw new IOException("ChunkedOutputStream already finalized."); + if (len == 0) return; + + this.out.write(Integer.toHexString(len).getBytes()); + this.out.write(serverCore.crlf); + this.out.write(b.getBytes(off, off + len)); + this.out.write(serverCore.crlf); + this.out.flush(); + } + + public void write(InputStream b) throws IOException { + if (this.finished) throw new IOException("ChunkedOutputStream already finalized."); + int len = b.available(); + if (len == 0) return; + + this.out.write(Integer.toHexString(len).getBytes()); + this.out.write(serverCore.crlf); + serverFileUtils.copy(b, out, len); + this.out.write(serverCore.crlf); this.out.flush(); } @@ -95,9 +123,9 @@ public final class httpChunkedOutputStream extends FilterOutputStream if (this.finished) throw new IOException("ChunkedOutputStream already finalized."); this.out.write("1".getBytes()); - this.out.write(crlf); + this.out.write(serverCore.crlf); this.out.write(b); - this.out.write(crlf); + this.out.write(serverCore.crlf); this.out.flush(); } } diff --git a/source/de/anomic/http/httpHeader.java b/source/de/anomic/http/httpHeader.java index 06f011e9c..5b24a08eb 100644 --- a/source/de/anomic/http/httpHeader.java +++ b/source/de/anomic/http/httpHeader.java @@ -491,6 +491,10 @@ public final class httpHeader extends TreeMap implements Map { return null; } + public String userAgent() { + return (String) get(USER_AGENT); + } + public long age() { Date lm = lastModified(); Date sd = date(); diff --git a/source/de/anomic/http/httpSSI.java b/source/de/anomic/http/httpSSI.java new file mode 100644 index 000000000..6ad4778ec --- /dev/null +++ b/source/de/anomic/http/httpSSI.java @@ -0,0 +1,76 @@ +// httpSSI.java +// ----------------------------- +// (C) 2007 by Michael Peter Christen; mc@yacy.net, Frankfurt a. M., Germany +// first published 26.06.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 + +package de.anomic.http; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; + +import de.anomic.server.serverByteBuffer; + +public class httpSSI { + + public static void writeSSI(File referenceFile, serverByteBuffer in, httpChunkedOutputStream out) throws IOException { + writeSSI(referenceFile, in, 0, out); + } + + public static void writeSSI(File referenceFile, serverByteBuffer in, int start, httpChunkedOutputStream out) throws IOException { + int p = in.indexOf("".getBytes(), start + 10); + assert q >= 0; + parseSSI(referenceFile, in, start, q + 3 - start, out); + writeSSI(referenceFile, in, start + q + 3, out); + } else if (p > 0) { + int q = in.indexOf("-->".getBytes(), start + 10); + out.write(in, start, p - start); + parseSSI(referenceFile, in, start + p, q + 3 - start - p, out); + writeSSI(referenceFile, in, start + q + 3, out); + } else /* p < 0 */ { + out.write(in, start, in.length() - start); + } + } + + private static void parseSSI(File referenceFile, serverByteBuffer in, int start, int length, httpChunkedOutputStream out) { + if (in.startsWith("")){ - inheader=false; - }else{ - header.append(line); - } - } - } - - //tp is from the servlet, fis is the content-only from the servlet - //this resolvs templates in both header and content - o = new serverByteBuffer(); - fis=new ByteArrayInputStream((new String(content)).getBytes()); - httpTemplate.writeTemplate(fis, o, tp, "-UNRESOLVED_PATTERN-".getBytes()); - content_s=o.toString(); - o = new serverByteBuffer(); - fis=new ByteArrayInputStream(header.toString().getBytes()); - httpTemplate.writeTemplate(fis, o, tp, "-UNRESOLVED_PATTERN-".getBytes()); - header_s=o.toString(); - - //further processing of page.html (via page.class)? - if (pageClass != null && pageClass.exists()){ - Object tmp = invokeServlet(pageClass, requestHeader, args); - if(tmp instanceof serverObjects){ - tp=new servletProperties((serverObjects)tmp); - }else{ - tp=(servletProperties)tmp; - } - }else - tp = new servletProperties(); - tp.putASIS("header", header_s); - tp.putASIS("page", content_s); - fis=new BufferedInputStream(new FileInputStream(pageFile)); - - } - } - - o = new serverByteBuffer(); - if (zipContent) zippedOut = new GZIPOutputStream(o); - httpTemplate.writeTemplate(fis, (zipContent) ? (OutputStream)zippedOut: (OutputStream)o, tp, "-UNRESOLVED_PATTERN-".getBytes("UTF-8")); + } else { + fis = new BufferedInputStream(new FileInputStream(targetFile)); + } + + // write the array to the client + // we can do that either in standard mode (whole thing completely) or in chunked mode + // since yacy clients do not understand chunked mode, we use this only for communication with the administrator + boolean yacyClient = requestHeader.userAgent().startsWith("yacy"); + boolean chunked = !method.equals(httpHeader.METHOD_HEAD) && !yacyClient; + if (chunked) { + // send page in chunks and parse SSIs + serverByteBuffer o = new serverByteBuffer(); + // apply templates + httpTemplate.writeTemplate(fis, o, tp, "-UNRESOLVED_PATTERN-".getBytes("UTF-8")); + httpd.sendRespondHeader(this.connectionProperties, out, + httpVersion, 200, null, mimeType, -1, + targetDate, null, tp.getOutgoingHeader(), + null, "chunked", nocache); + // send the content in chunked parts, see RFC 2616 section 3.6.1 + //byte[] result = o.toByteArray(); // this interrupts streaming (bad idea!) + httpChunkedOutputStream chos = new httpChunkedOutputStream(out); + httpSSI.writeSSI(targetFile, o, chos); + //chos.write(result); + chos.finish(); + } else { + // send page as whole thing, SSIs are not possible + String contentEncoding = (zipContent) ? "gzip" : null; + // apply templates + serverByteBuffer o = new serverByteBuffer(); if (zipContent) { + GZIPOutputStream zippedOut = new GZIPOutputStream(o); + httpTemplate.writeTemplate(fis, zippedOut, tp, "-UNRESOLVED_PATTERN-".getBytes("UTF-8")); zippedOut.finish(); zippedOut.flush(); zippedOut.close(); zippedOut = null; + } else { + httpTemplate.writeTemplate(fis, o, tp, "-UNRESOLVED_PATTERN-".getBytes("UTF-8")); } - - result = o.toByteArray(); - - if (this.md5Digest != null) { - this.md5Digest.reset(); - this.md5Digest.update(result); - byte[] digest = this.md5Digest.digest(); - StringBuffer digestString = new StringBuffer(); - for ( int i = 0; i < digest.length; i++ ) - digestString.append(Integer.toHexString( digest[i]&0xff)); - - } - } finally { - if (zippedOut != null) try {zippedOut.close();} catch(Exception e) {} - if (o != null) try {o.close(); o = null;} catch(Exception e) {} - if (fis != null) try {fis.close(); fis=null;} catch(Exception e) {} + if (method.equals(httpHeader.METHOD_HEAD)) { + httpd.sendRespondHeader(this.connectionProperties, out, + httpVersion, 200, null, mimeType, o.length(), + targetDate, null, tp.getOutgoingHeader(), + contentEncoding, null, nocache); + } else { + byte[] result = o.toByteArray(); // this interrupts streaming (bad idea!) + httpd.sendRespondHeader(this.connectionProperties, out, + httpVersion, 200, null, mimeType, result.length, + targetDate, null, tp.getOutgoingHeader(), + contentEncoding, null, nocache); + serverFileUtils.write(result, out); + } } - - // write the array to the client - long contentLength = result.length; - String contentEncoding = (zipContent)?"gzip":null; - httpd.sendRespondHeader(this.connectionProperties, out, httpVersion, 200, null, mimeType, contentLength, targetDate, null, tp.getOutgoingHeader(), contentEncoding, null, nocache); - if (! method.equals(httpHeader.METHOD_HEAD)) { - //Thread.sleep(200); // this solved the message problem (!!) - serverFileUtils.write(result, out); - } - } else { // no html int statusCode = 200; diff --git a/source/de/anomic/icap/icapHeader.java b/source/de/anomic/icap/icapHeader.java index 70e9d091b..1e1bb57ca 100644 --- a/source/de/anomic/icap/icapHeader.java +++ b/source/de/anomic/icap/icapHeader.java @@ -147,7 +147,8 @@ public class icapHeader extends TreeMap implements Map { // to make the occurrence of multiple keys possible, we add them using a counter public Object add(Object key, Object value) { int c = keyCount((String) key); - if (c == 0) return put(key, value); else return put("*" + key + "-" + c, value); + if (c == 0) return put(key, value); + return put("*" + key + "-" + c, value); } public int keyCount(String key) { @@ -160,7 +161,8 @@ public class icapHeader extends TreeMap implements Map { // a convenience method to access the map with fail-over defaults public Object get(Object key, Object dflt) { Object result = get(key); - if (result == null) return dflt; else return result; + if (result == null) return dflt; + return result; } // return multiple results diff --git a/source/de/anomic/index/indexCollectionRI.java b/source/de/anomic/index/indexCollectionRI.java index 0209e14e2..ed83e4b39 100644 --- a/source/de/anomic/index/indexCollectionRI.java +++ b/source/de/anomic/index/indexCollectionRI.java @@ -68,12 +68,7 @@ public class indexCollectionRI implements indexRI { } public int size() { - try { - return collectionIndex.size(); - } catch (IOException e) { - e.printStackTrace(); - return 0; - } + return collectionIndex.size(); } public synchronized int indexSize(String wordHash) { @@ -196,11 +191,7 @@ public class indexCollectionRI implements indexRI { } public synchronized void close() { - try { - collectionIndex.close(); - } catch (IOException e) { - e.printStackTrace(); - } + collectionIndex.close(); } } diff --git a/source/de/anomic/index/indexURLEntry.java b/source/de/anomic/index/indexURLEntry.java index 505c0e3f0..1a6124c44 100644 --- a/source/de/anomic/index/indexURLEntry.java +++ b/source/de/anomic/index/indexURLEntry.java @@ -27,7 +27,6 @@ package de.anomic.index; -import java.io.IOException; import java.net.MalformedURLException; import java.text.ParseException; import java.util.ArrayList; @@ -285,7 +284,7 @@ public class indexURLEntry { } } - public kelondroRow.Entry toRowEntry() throws IOException { + public kelondroRow.Entry toRowEntry() { return this.entry; } diff --git a/source/de/anomic/kelondro/kelondroBytesIntMap.java b/source/de/anomic/kelondro/kelondroBytesIntMap.java index 45945f134..0ee0bbc8a 100644 --- a/source/de/anomic/kelondro/kelondroBytesIntMap.java +++ b/source/de/anomic/kelondro/kelondroBytesIntMap.java @@ -32,7 +32,7 @@ public class kelondroBytesIntMap { private kelondroRow rowdef; private kelondroIndex index0, index1; - public kelondroBytesIntMap(kelondroIndex ki) throws IOException { + public kelondroBytesIntMap(kelondroIndex ki) { assert (ki.row().columns() == 2); // must be a key/index relation assert (ki.row().width(1) == 4); // the value must be a b256-encoded int, 4 bytes long this.index0 = null; // not used @@ -46,7 +46,7 @@ public class kelondroBytesIntMap { this.index1 = null; // to show that this is the initialization phase } - public kelondroRow row() throws IOException { + public kelondroRow row() { return index0.row(); } diff --git a/source/de/anomic/kelondro/kelondroCollectionIndex.java b/source/de/anomic/kelondro/kelondroCollectionIndex.java index f3b485705..6a2a7598e 100644 --- a/source/de/anomic/kelondro/kelondroCollectionIndex.java +++ b/source/de/anomic/kelondro/kelondroCollectionIndex.java @@ -264,7 +264,7 @@ public class kelondroCollectionIndex { } } - public int size() throws IOException { + public int size() { return index.size(); } @@ -1000,7 +1000,7 @@ public class kelondroCollectionIndex { } - public synchronized void close() throws IOException { + public synchronized void close() { this.index.close(); Iterator i = arrays.values().iterator(); while (i.hasNext()) { diff --git a/source/de/anomic/kelondro/kelondroDyn.java b/source/de/anomic/kelondro/kelondroDyn.java index 0f004bff6..618ee22f0 100644 --- a/source/de/anomic/kelondro/kelondroDyn.java +++ b/source/de/anomic/kelondro/kelondroDyn.java @@ -123,7 +123,7 @@ public class kelondroDyn { return this.rowdef; } - public synchronized int sizeDyn() throws IOException { + public synchronized int sizeDyn() { //this.segmentCount = 0; //Iterator i = keys(true); while (i.hasNext()) segmentCount++; //return segmentCount; diff --git a/source/de/anomic/kelondro/kelondroDynTree.java b/source/de/anomic/kelondro/kelondroDynTree.java index 2d782d5b3..d7de8c604 100644 --- a/source/de/anomic/kelondro/kelondroDynTree.java +++ b/source/de/anomic/kelondro/kelondroDynTree.java @@ -68,7 +68,7 @@ public class kelondroDynTree { private Hashtable buffer, cache; private long cycleBuffer; - public kelondroDynTree(File file, long preloadTime, int keylength, int nodesize, kelondroRow rowdef, char fillChar, boolean resetOnFail) throws IOException { + public kelondroDynTree(File file, long preloadTime, int keylength, int nodesize, kelondroRow rowdef, char fillChar, boolean resetOnFail) { // creates or opens a DynTree this.file = file; this.preloadTime = preloadTime; diff --git a/source/de/anomic/kelondro/kelondroFlexSplitTable.java b/source/de/anomic/kelondro/kelondroFlexSplitTable.java index 3699f1653..73f60d258 100644 --- a/source/de/anomic/kelondro/kelondroFlexSplitTable.java +++ b/source/de/anomic/kelondro/kelondroFlexSplitTable.java @@ -46,14 +46,14 @@ public class kelondroFlexSplitTable implements kelondroIndex { private File path; private String tablename; - public kelondroFlexSplitTable(File path, String tablename, long preloadTime, kelondroRow rowdef, boolean resetOnFail) throws IOException { + public kelondroFlexSplitTable(File path, String tablename, long preloadTime, kelondroRow rowdef, boolean resetOnFail) { this.path = path; this.tablename = tablename; this.rowdef = rowdef; init(preloadTime, resetOnFail); } - public void init(long preloadTime, boolean resetOnFail) throws IOException { + public void init(long preloadTime, boolean resetOnFail) { // initialized tables map this.tables = new HashMap(); diff --git a/source/de/anomic/kelondro/kelondroFlexTable.java b/source/de/anomic/kelondro/kelondroFlexTable.java index a076d0373..80bff0f28 100644 --- a/source/de/anomic/kelondro/kelondroFlexTable.java +++ b/source/de/anomic/kelondro/kelondroFlexTable.java @@ -423,12 +423,9 @@ public class kelondroFlexTable extends kelondroFlexWidthArray implements kelondr private final Map memoryStats() { // returns statistical data about this object HashMap map = new HashMap(); - try { - map.put("tableIndexChunkSize", (!RAMIndex) ? "0" : Integer.toString(index.row().objectsize)); - map.put("tableIndexCount", (!RAMIndex) ? "0" : Integer.toString(index.size())); - map.put("tableIndexMem", (!RAMIndex) ? "0" : Integer.toString((int) (index.row().objectsize * index.size() * kelondroRowCollection.growfactor))); - } catch (IOException e) { - } + map.put("tableIndexChunkSize", (!RAMIndex) ? "0" : Integer.toString(index.row().objectsize)); + map.put("tableIndexCount", (!RAMIndex) ? "0" : Integer.toString(index.size())); + map.put("tableIndexMem", (!RAMIndex) ? "0" : Integer.toString((int) (index.row().objectsize * index.size() * kelondroRowCollection.growfactor))); return map; } diff --git a/source/de/anomic/kelondro/kelondroIntBytesMap.java b/source/de/anomic/kelondro/kelondroIntBytesMap.java index 3e63b4072..614c3e7ce 100644 --- a/source/de/anomic/kelondro/kelondroIntBytesMap.java +++ b/source/de/anomic/kelondro/kelondroIntBytesMap.java @@ -24,7 +24,6 @@ package de.anomic.kelondro; -import java.io.IOException; import java.util.ArrayList; import java.util.HashSet; import java.util.Iterator; @@ -55,7 +54,7 @@ public class kelondroIntBytesMap { return index1.memoryNeededForGrow(); } - public kelondroRow row() throws IOException { + public kelondroRow row() { return index0.row(); } diff --git a/source/de/anomic/kelondro/kelondroMapTable.java b/source/de/anomic/kelondro/kelondroMapTable.java index 0b609eb8f..dba49ea11 100644 --- a/source/de/anomic/kelondro/kelondroMapTable.java +++ b/source/de/anomic/kelondro/kelondroMapTable.java @@ -63,20 +63,20 @@ public class kelondroMapTable { public void declareMaps( String tablename, int keysize, kelondroOrder objectOrder, int nodesize, int cacheslots, - char fillChar, boolean resetOnFail) throws IOException { + char fillChar, boolean resetOnFail) { declareMaps(tablename, keysize, objectOrder, nodesize, cacheslots, null, null, null, fillChar, resetOnFail); } public void declareMaps( String tablename, int keysize, kelondroOrder objectOrder, int nodesize, int cacheslots, - String[] sortfields, String[] longaccfields, String[] doubleaccfields, char fillChar, boolean resetOnFail) throws IOException { + String[] sortfields, String[] longaccfields, String[] doubleaccfields, char fillChar, boolean resetOnFail) { declareMaps(tablename, keysize, objectOrder, nodesize, cacheslots, sortfields, longaccfields, doubleaccfields, fillChar, 0, resetOnFail); } public void declareMaps( String tablename, int keysize, kelondroOrder objectOrder, int nodesize, int cacheslots, String[] sortfields, String[] longaccfields, String[] doubleaccfields, char fillChar, - long preloadTime, boolean resetOnFail) throws IOException { + long preloadTime, boolean resetOnFail) { if (mTables.containsKey(tablename)) throw new RuntimeException("kelondroTables.declareMap: table '" + tablename + "' declared twice."); if (tTables.containsKey(tablename)) throw new RuntimeException("kelondroTables.declareMap: table '" + tablename + "' declared already in other context."); File tablefile = new File(tablesPath, "table." + tablename + ".mdb"); @@ -87,7 +87,7 @@ public class kelondroMapTable { mTables.put(tablename, map); } - public void declareTree(String tablename, kelondroRow rowdef, long buffersize /*bytes*/, long preloadTime) throws IOException { + public void declareTree(String tablename, kelondroRow rowdef, long buffersize /*bytes*/, long preloadTime) { if (mTables.containsKey(tablename)) throw new RuntimeException("kelondroTables.declareTree: table '" + tablename + "' declared already in other context."); if (tTables.containsKey(tablename)) throw new RuntimeException("kelondroTables.declareTree: table '" + tablename + "' declared twice."); File tablefile = new File(tablesPath, "table." + tablename + ".tdb"); @@ -110,7 +110,7 @@ public class kelondroMapTable { tTables.put(tablename, tree); } - public synchronized Map selectMap(String tablename, String key) throws IOException { + public synchronized Map selectMap(String tablename, String key) { kelondroMapObjects table = (kelondroMapObjects) mTables.get(tablename); if (table == null) throw new RuntimeException("kelondroTables.selectMap: map table '" + tablename + "' does not exist."); if (key.length() > table.keySize()) key = key.substring(0, table.keySize()); diff --git a/source/de/anomic/kelondro/kelondroObjects.java b/source/de/anomic/kelondro/kelondroObjects.java index 5ddcfbb5e..45204562c 100644 --- a/source/de/anomic/kelondro/kelondroObjects.java +++ b/source/de/anomic/kelondro/kelondroObjects.java @@ -149,11 +149,7 @@ public class kelondroObjects { } public synchronized int size() { - try { - return dyn.sizeDyn(); - } catch (IOException e) { - return 0; - } + return dyn.sizeDyn(); } public void close() { diff --git a/source/de/anomic/kelondro/kelondroRowCollection.java b/source/de/anomic/kelondro/kelondroRowCollection.java index 3f4208483..d71ed2604 100644 --- a/source/de/anomic/kelondro/kelondroRowCollection.java +++ b/source/de/anomic/kelondro/kelondroRowCollection.java @@ -301,7 +301,7 @@ public class kelondroRowCollection { addUnique(r, 0, r.length); } - public synchronized void addUniqueMultiple(List rows) throws IOException { + public synchronized void addUniqueMultiple(List rows) { assert this.sortBound == 0 : "sortBound = " + this.sortBound + ", chunkcount = " + this.chunkcount; Iterator i = rows.iterator(); while (i.hasNext()) addUnique((kelondroRow.Entry) i.next()); diff --git a/source/de/anomic/kelondro/kelondroSplittedTree.java b/source/de/anomic/kelondro/kelondroSplittedTree.java index 548e976ce..5d7e96adb 100644 --- a/source/de/anomic/kelondro/kelondroSplittedTree.java +++ b/source/de/anomic/kelondro/kelondroSplittedTree.java @@ -138,7 +138,7 @@ public class kelondroSplittedTree implements kelondroIndex { throw new UnsupportedOperationException(); } - public synchronized void addUnique(kelondroRow.Entry row, Date entryDate) throws IOException { + public synchronized void addUnique(kelondroRow.Entry row, Date entryDate) { throw new UnsupportedOperationException(); } diff --git a/source/de/anomic/plasma/parser/sevenzip/sevenzipParser.java b/source/de/anomic/plasma/parser/sevenzip/sevenzipParser.java index ec9e0d40a..9032a9603 100644 --- a/source/de/anomic/plasma/parser/sevenzip/sevenzipParser.java +++ b/source/de/anomic/plasma/parser/sevenzip/sevenzipParser.java @@ -76,7 +76,7 @@ public class sevenzipParser extends AbstractParser implements Parser { */ private static final String[] LIBX_DEPENDENCIES = new String[] { "J7Zip-modified.jar" }; - public sevenzipParser() throws IOException { + public sevenzipParser() { super(LIBX_DEPENDENCIES); super.parserName = "7zip Archive Parser"; } diff --git a/source/de/anomic/plasma/plasmaCrawlLURL.java b/source/de/anomic/plasma/plasmaCrawlLURL.java index cdb36a851..39f44eec2 100644 --- a/source/de/anomic/plasma/plasmaCrawlLURL.java +++ b/source/de/anomic/plasma/plasmaCrawlLURL.java @@ -95,12 +95,7 @@ public final class plasmaCrawlLURL { public plasmaCrawlLURL(File indexPath, long preloadTime) { super(); - try { - urlIndexFile = new kelondroFlexSplitTable(new File(indexPath, "PUBLIC/TEXT"), "urls", preloadTime, indexURLEntry.rowdef, false); - } catch (IOException e) { - e.printStackTrace(); - System.exit(-1); - } + urlIndexFile = new kelondroFlexSplitTable(new File(indexPath, "PUBLIC/TEXT"), "urls", preloadTime, indexURLEntry.rowdef, false); // init result stacks externResultStack = new LinkedList(); diff --git a/source/de/anomic/plasma/plasmaCrawlStacker.java b/source/de/anomic/plasma/plasmaCrawlStacker.java index 5dee78f64..c65471b0f 100644 --- a/source/de/anomic/plasma/plasmaCrawlStacker.java +++ b/source/de/anomic/plasma/plasmaCrawlStacker.java @@ -143,13 +143,9 @@ public final class plasmaCrawlStacker { this.log.logSevere("Unable to shutdown all remaining stackCrawl threads", e1); } - try { - this.log.logFine("Shutdown. Closing stackCrawl queue."); - if (this.queue != null) this.queue.close(); - this.queue = null; - } catch (IOException e) { - this.log.logSevere("DB could not be closed properly.", e); - } + this.log.logFine("Shutdown. Closing stackCrawl queue."); + if (this.queue != null) this.queue.close(); + this.queue = null; } public int getNumActiveWorker() { @@ -540,7 +536,7 @@ public final class plasmaCrawlStacker { } } - public void close() throws IOException { + public void close() { // closing the db this.urlEntryCache.close(); diff --git a/source/de/anomic/plasma/plasmaHTCache.java b/source/de/anomic/plasma/plasmaHTCache.java index 87ff83c97..a4156703d 100644 --- a/source/de/anomic/plasma/plasmaHTCache.java +++ b/source/de/anomic/plasma/plasmaHTCache.java @@ -1076,7 +1076,7 @@ public final class plasmaHTCache { return this.resInfo; } - public boolean writeResourceInfo() throws IOException { + public boolean writeResourceInfo() { assert(this.nomalizedURLHash != null) : "URL Hash is null"; if (this.resInfo == null) return false; try { diff --git a/source/de/anomic/plasma/plasmaSwitchboard.java b/source/de/anomic/plasma/plasmaSwitchboard.java index 86c4b7814..40a789ac7 100644 --- a/source/de/anomic/plasma/plasmaSwitchboard.java +++ b/source/de/anomic/plasma/plasmaSwitchboard.java @@ -1609,14 +1609,14 @@ public final class plasmaSwitchboard extends serverAbstractSwitch implements ser return cacheManager; } - synchronized public void htEntryStoreEnqueued(plasmaHTCache.Entry entry) throws IOException { + synchronized public void htEntryStoreEnqueued(plasmaHTCache.Entry entry) { if (cacheManager.full()) htEntryStoreProcess(entry); else cacheManager.push(entry); } - synchronized public boolean htEntryStoreProcess(plasmaHTCache.Entry entry) throws IOException { + synchronized public boolean htEntryStoreProcess(plasmaHTCache.Entry entry) { if (entry == null) return false; @@ -1721,11 +1721,7 @@ public final class plasmaSwitchboard extends serverAbstractSwitch implements ser public boolean htEntryStoreJob() { if (cacheManager.empty()) return false; - try { - return htEntryStoreProcess(cacheManager.pop()); - } catch (IOException e) { - return false; - } + return htEntryStoreProcess(cacheManager.pop()); } public int htEntrySize() { diff --git a/source/de/anomic/plasma/plasmaSwitchboardQueue.java b/source/de/anomic/plasma/plasmaSwitchboardQueue.java index d2adb157e..80a6c5e58 100644 --- a/source/de/anomic/plasma/plasmaSwitchboardQueue.java +++ b/source/de/anomic/plasma/plasmaSwitchboardQueue.java @@ -155,7 +155,7 @@ public class plasmaSwitchboardQueue { } } - public void clear() throws IOException { + public void clear() { sbQueueStack = kelondroStack.reset(sbQueueStack); } diff --git a/source/de/anomic/plasma/plasmaWordConnotation.java b/source/de/anomic/plasma/plasmaWordConnotation.java index 66e16c7d5..0f12a7d40 100644 --- a/source/de/anomic/plasma/plasmaWordConnotation.java +++ b/source/de/anomic/plasma/plasmaWordConnotation.java @@ -59,7 +59,7 @@ public class plasmaWordConnotation { private static final int nodesize = 4048; private kelondroDynTree refDB; - public plasmaWordConnotation(File refDBfile, long preloadTime, char fillChar) throws IOException { + public plasmaWordConnotation(File refDBfile, long preloadTime, char fillChar) { refDB = new kelondroDynTree(refDBfile, preloadTime, wordlength, nodesize, new kelondroRow("byte[] word-" + wordlength + ", Cardinal count-" + countlength, kelondroNaturalOrder.naturalOrder, 0), fillChar, true); } diff --git a/source/de/anomic/server/serverByteBuffer.java b/source/de/anomic/server/serverByteBuffer.java index aee8715b6..04ecb4066 100644 --- a/source/de/anomic/server/serverByteBuffer.java +++ b/source/de/anomic/server/serverByteBuffer.java @@ -277,9 +277,13 @@ public final class serverByteBuffer extends OutputStream { } public boolean startsWith(byte[] bs) { - if (length < bs.length) return false; + return startsWith(bs, 0); + } + + public boolean startsWith(byte[] bs, int start) { + if (length - start < bs.length) return false; for (int i = 0; i < bs.length; i++) { - if (buffer[offset + i] != bs[i]) return false; + if (buffer[offset + i + start] != bs[i]) return false; } return true; } diff --git a/source/de/anomic/yacy/yacyClient.java b/source/de/anomic/yacy/yacyClient.java index 1f3d62106..f5e282731 100644 --- a/source/de/anomic/yacy/yacyClient.java +++ b/source/de/anomic/yacy/yacyClient.java @@ -126,6 +126,7 @@ public final class yacyClient { obj.put("mytime", yacyCore.universalDateShortString(new Date())); obj.put("myUTC", System.currentTimeMillis()); obj.put("seed", yacyCore.seedDB.mySeed.genSeedStr(key)); + obj.put("network.unit.name", plasmaSwitchboard.getSwitchboard().getConfig("network.unit.name", yacySeed.DFLT_NETWORK_UNIT)); // sending request result = nxTools.table( @@ -272,7 +273,8 @@ public final class yacyClient { "&youare=" + target.hash + "&key=" + key + "&object=seed" + - "&env=" + seedHash + "&env=" + seedHash + + "&network.unit.name=" + plasmaSwitchboard.getSwitchboard().getConfig("network.unit.name", yacySeed.DFLT_NETWORK_UNIT) ), target.getHexHash() + ".yacyh", 8000, @@ -309,7 +311,8 @@ public final class yacyClient { "&key=" + "&object=rwicount" + "&env=" + wordHash + - "&ttl=0" + "&ttl=0" + + "&network.unit.name=" + plasmaSwitchboard.getSwitchboard().getConfig("network.unit.name", yacySeed.DFLT_NETWORK_UNIT) ), target.getHexHash() + ".yacyh", 10000, @@ -345,7 +348,8 @@ public final class yacyClient { "&key=" + "&object=lurlcount" + "&env=" + - "&ttl=0"; + "&ttl=0" + + "&network.unit.name=" + plasmaSwitchboard.getSwitchboard().getConfig("network.unit.name", yacySeed.DFLT_NETWORK_UNIT); // seinding request try { @@ -452,6 +456,7 @@ public final class yacyClient { obj.put("profile", crypt.simpleEncode(rankingProfile.toExternalString())); obj.put("constraint", constraint.exportB64()); obj.put("mytime", yacyCore.universalDateShortString(new Date())); + obj.put("network.unit.name", plasmaSwitchboard.getSwitchboard().getConfig("network.unit.name", yacySeed.DFLT_NETWORK_UNIT)); if (abstractCache != null) obj.put("abstracts", "auto"); //yacyCore.log.logDebug("yacyClient.search url=" + url); @@ -622,6 +627,7 @@ public final class yacyClient { post.put("iam", yacyCore.seedDB.mySeed.hash); post.put("youare", targetHash); post.put("mytime", yacyCore.universalDateShortString(new Date())); + post.put("network.unit.name", plasmaSwitchboard.getSwitchboard().getConfig("network.unit.name", yacySeed.DFLT_NETWORK_UNIT)); // get target address String address = targetAddress(targetHash); @@ -664,6 +670,7 @@ public final class yacyClient { post.put("youare", targetHash); post.put("subject", subject); post.put("mytime", yacyCore.universalDateShortString(new Date())); + post.put("network.unit.name", plasmaSwitchboard.getSwitchboard().getConfig("network.unit.name", yacySeed.DFLT_NETWORK_UNIT)); try { post.put("message", new String(message, "UTF-8")); } catch (UnsupportedEncodingException e) { @@ -722,6 +729,7 @@ public final class yacyClient { post.put("filename", filename); post.put("filesize", Long.toString(filesize)); post.put("can-send-protocol", "http"); + post.put("network.unit.name", plasmaSwitchboard.getSwitchboard().getConfig("network.unit.name", yacySeed.DFLT_NETWORK_UNIT)); // send request try { @@ -763,6 +771,7 @@ public final class yacyClient { post.put("filesize", Long.toString(file.length)); post.put("md5", serverCodings.encodeMD5Hex(file)); post.put("access", access); + post.put("network.unit.name", plasmaSwitchboard.getSwitchboard().getConfig("network.unit.name", yacySeed.DFLT_NETWORK_UNIT)); HashMap files = new HashMap(); files.put("filename", file); @@ -845,7 +854,8 @@ public final class yacyClient { } post.put("depth", "0"); post.put("ttl", "0"); - + post.put("network.unit.name", plasmaSwitchboard.getSwitchboard().getConfig("network.unit.name", yacySeed.DFLT_NETWORK_UNIT)); + // determining target address final String address = targetSeed.getClusterAddress(); if (address == null) { return null; } @@ -928,7 +938,8 @@ public final class yacyClient { "&result=" + result + "&reason=" + reason + "&wordh=" + wordhashes + - "&lurlEntry=" + ((entry == null) ? "" : crypt.simpleEncode(entry.toString(), key)) + "&lurlEntry=" + ((entry == null) ? "" : crypt.simpleEncode(entry.toString(), key)) + + "&network.unit.name=" + plasmaSwitchboard.getSwitchboard().getConfig("network.unit.name", yacySeed.DFLT_NETWORK_UNIT) ), targetSeed.getHexHash() + ".yacyh", 60000, @@ -1055,7 +1066,7 @@ public final class yacyClient { post.put("iam", yacyCore.seedDB.mySeed.hash); post.put("youare", targetSeed.hash); post.put("wordc", Integer.toString(indexes.length)); - + post.put("network.unit.name", plasmaSwitchboard.getSwitchboard().getConfig("network.unit.name", yacySeed.DFLT_NETWORK_UNIT)); int indexcount = 0; final StringBuffer entrypost = new StringBuffer(indexes.length*73); @@ -1131,6 +1142,8 @@ public final class yacyClient { post.put("key", key); post.put("iam", yacyCore.seedDB.mySeed.hash); post.put("youare", targetSeed.hash); + post.put("network.unit.name", plasmaSwitchboard.getSwitchboard().getConfig("network.unit.name", yacySeed.DFLT_NETWORK_UNIT)); + String resource = ""; int urlc = 0; int urlPayloadSize = 0; @@ -1183,6 +1196,8 @@ public final class yacyClient { final serverObjects post = new serverObjects(2); post.put("iam", yacyCore.seedDB.mySeed.hash); post.put("youare", targetSeed.hash); + post.put("network.unit.name", plasmaSwitchboard.getSwitchboard().getConfig("network.unit.name", yacySeed.DFLT_NETWORK_UNIT)); + String address = targetSeed.getClusterAddress(); if (address == null) { address = "localhost:8080"; } try { @@ -1226,7 +1241,8 @@ public final class yacyClient { "&myseed=" + yacyCore.seedDB.mySeed.genSeedStr(null) + "&count=10" + "&resource=global" + - "&query=" + wordhashe), + "&query=" + wordhashe + + "&network.unit.name=" + plasmaSwitchboard.getSwitchboard().getConfig("network.unit.name", yacySeed.DFLT_NETWORK_UNIT)), target.getHexHash() + ".yacyh", 5000, null, diff --git a/source/de/anomic/yacy/yacyCore.java b/source/de/anomic/yacy/yacyCore.java index 13566f1ca..853157e2c 100644 --- a/source/de/anomic/yacy/yacyCore.java +++ b/source/de/anomic/yacy/yacyCore.java @@ -204,12 +204,7 @@ public class yacyCore { // create or init news database long memNews_time = Long.parseLong(switchboard.getConfig("ramCacheNews_time", "1000")); - try { - newsPool = new yacyNewsPool(yacyDBPath, memNews_time); - } catch (IOException e) { - e.printStackTrace(); - System.exit(-1); - } + newsPool = new yacyNewsPool(yacyDBPath, memNews_time); loadSeedUploadMethods(); diff --git a/source/de/anomic/yacy/yacyNewsDB.java b/source/de/anomic/yacy/yacyNewsDB.java index 8d10f74f1..c70ee26ef 100644 --- a/source/de/anomic/yacy/yacyNewsDB.java +++ b/source/de/anomic/yacy/yacyNewsDB.java @@ -64,13 +64,13 @@ public class yacyNewsDB { private long preloadTime; protected kelondroIndex news; - public yacyNewsDB(File path, long preloadTime) throws IOException { + public yacyNewsDB(File path, long preloadTime) { this.path = path; this.preloadTime = preloadTime; this.news = new kelondroCache(kelondroTree.open(path, true, preloadTime, yacyNewsRecord.rowdef), true, false); } - private void resetDB() throws IOException { + private void resetDB() { try {close();} catch (Exception e) {} if (path.exists()) path.delete(); this.news = new kelondroCache(kelondroTree.open(path, true, preloadTime, yacyNewsRecord.rowdef), true, false); @@ -85,7 +85,7 @@ public class yacyNewsDB { close(); } - public int size() throws IOException { + public int size() { return news.size(); } @@ -148,7 +148,7 @@ public class yacyNewsDB { ); } - protected final kelondroRow.Entry r2b(yacyNewsRecord r) throws IOException { + protected final kelondroRow.Entry r2b(yacyNewsRecord r) { try { if (r == null) return null; String attributes = r.attributes().toString(); diff --git a/source/de/anomic/yacy/yacyNewsPool.java b/source/de/anomic/yacy/yacyNewsPool.java index f0b258521..13b49c933 100644 --- a/source/de/anomic/yacy/yacyNewsPool.java +++ b/source/de/anomic/yacy/yacyNewsPool.java @@ -265,7 +265,7 @@ public class yacyNewsPool { private int maxDistribution; - public yacyNewsPool(File yacyDBPath, long preloadTime) throws IOException { + public yacyNewsPool(File yacyDBPath, long preloadTime) { newsDB = new yacyNewsDB(new File(yacyDBPath, "news1.db"), preloadTime); outgoingNews = new yacyNewsQueue(new File(yacyDBPath, "newsOut1.stack"), newsDB); publishedNews = new yacyNewsQueue(new File(yacyDBPath, "newsPublished1.stack"), newsDB); @@ -283,12 +283,7 @@ public class yacyNewsPool { } public int dbSize() { - try { - return newsDB.size(); - } catch (IOException e) { - e.printStackTrace(); - return 0; - } + return newsDB.size(); } public void publishMyNews(yacyNewsRecord record) { diff --git a/source/de/anomic/yacy/yacySeed.java b/source/de/anomic/yacy/yacySeed.java index 2c24e27f8..fb43d42db 100644 --- a/source/de/anomic/yacy/yacySeed.java +++ b/source/de/anomic/yacy/yacySeed.java @@ -168,6 +168,9 @@ public class yacySeed { /** zero-value */ public static final String ZERO = "0"; + public static final String DFLT_NETWORK_UNIT = "freeworld"; + public static final String DFLT_NETWORK_GROUP = ""; + // class variables /** the peer-hash */ public String hash; diff --git a/yacy.init b/yacy.init index 59ee10e40..7bc7284fd 100644 --- a/yacy.init +++ b/yacy.init @@ -750,12 +750,6 @@ CRDist1Target = kaskelix.de:8080,yacy.dyndns.org:8000,suma-lab.de:8080 # Hash of the peer, you would like to store to the data your installation collected. storagePeerHash = -#use /env/page.html (and if it exists page.class) as super template, -# which includes the generated page in #[page]#. -#This option is for developers only, because it may be integrated by default, or not, -#but its not useful to mix configurations with and without this supertemplate. -usePageTemplate = false - # Search sequence settings # collection: # time = time to get a RWI out of RAM cache, assortments and WORDS files