diff --git a/htroot/api/timeline.java b/htroot/api/timeline.java new file mode 100644 index 000000000..6dc39bd05 --- /dev/null +++ b/htroot/api/timeline.java @@ -0,0 +1,116 @@ +// timeline.java +// (C) 2009 by Michael Peter Christen; mc@yacy.net, Frankfurt a. M., Germany +// first published 27.02.2009 on http://yacy.net +// +// This is a part of YaCy, a peer-to-peer based web search engine +// +// $LastChangedDate: 2009-02-10 01:06:59 +0100 (Di, 10 Feb 2009) $ +// $LastChangedRevision: 5586 $ +// $LastChangedBy: orbiter $ +// +// LICENSE +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +import java.util.Date; +import java.util.HashMap; +import java.util.Iterator; +import java.util.TreeSet; + +import de.anomic.http.httpRequestHeader; +import de.anomic.kelondro.text.ReferenceContainer; +import de.anomic.kelondro.text.ReferenceRow; +import de.anomic.kelondro.util.DateFormatter; +import de.anomic.plasma.plasmaSearchQuery; +import de.anomic.plasma.plasmaSwitchboard; +import de.anomic.server.serverObjects; +import de.anomic.server.serverSwitch; +import de.anomic.tools.iso639; +import de.anomic.yacy.yacyCore; + +public final class timeline { + + public static serverObjects respond(final httpRequestHeader header, final serverObjects post, final serverSwitch env) { + // return variable that accumulates replacements + final plasmaSwitchboard sb = (plasmaSwitchboard) env; + + final serverObjects prop = new serverObjects(); + if ((post == null) || (env == null)) return prop; + final boolean authenticated = sb.adminAuthenticated(header) >= 2; + + final String querystring = post.get("query", ""); // a string of word hashes that shall be searched and combined + final int count = Math.min((authenticated) ? 1000 : 10, post.getInt("maximumRecords", 1000)); // SRU syntax + final int maxdist= post.getInt("maxdist", Integer.MAX_VALUE); + String language = post.get("language", ""); + if (!iso639.exists(language)) { + // take language from the user agent + String agent = header.get("User-Agent"); + if (agent == null) agent = System.getProperty("user.language"); + language = (agent == null) ? "en" : iso639.userAgentLanguageDetection(agent); + if (language == null) language = "en"; + } + final TreeSet[] query = plasmaSearchQuery.cleanQuery(querystring); // converts also umlaute + + + // tell all threads to do nothing for a specific time + sb.intermissionAllThreads(3000); + + // prepare search + final long timestamp = System.currentTimeMillis(); + + // prepare an abstract result + int indexabstractContainercount = 0; + int joincount = 0; + + // retrieve index containers + yacyCore.log.logInfo("INIT TIMELINE SEARCH: " + plasmaSearchQuery.anonymizedQueryHashes(query[0]) + " - " + count + " links"); + + // get the index container with the result vector + HashMap[] localSearchContainerMaps = sb.webIndex.localSearchContainers(query[0], query[1], null); + final ReferenceContainer index = + ReferenceContainer.joinExcludeContainers( + localSearchContainerMaps[0].values(), + localSearchContainerMaps[1].values(), + maxdist); + + Iterator i = index.entries(); + ReferenceRow entry; + int c = 0; + Date lm; + String lms; + while (i.hasNext() && c < count) { + entry = i.next(); + lm = new Date(entry.lastModified()); + lms = DateFormatter.formatANSIC(lm); + prop.put("event_" + c + "_start", lms); // like "Wed May 01 1963 00:00:00 GMT-0600" + prop.put("event_" + c + "_end", lms); // like "Sat Jun 01 1963 00:00:00 GMT-0600" + prop.put("event_" + c + "_isDuration", 0); // 0 (only a point) or 1 (period of time) + prop.putHTML("event_" + c + "_title", "test"); // short title of the event + prop.putHTML("event_" + c + "_description", ""); // long description of the event + c++; + } + prop.put("event", c); + + // log + yacyCore.log.logInfo("EXIT TIMELINE SEARCH: " + + plasmaSearchQuery.anonymizedQueryHashes(query[0]) + " - " + joincount + " links found, " + + prop.get("linkcount", "?") + " links selected, " + + indexabstractContainercount + " index abstracts, " + + (System.currentTimeMillis() - timestamp) + " milliseconds"); + + return prop; + } + +} diff --git a/htroot/api/timeline.xml b/htroot/api/timeline.xml new file mode 100644 index 000000000..d0f054aaa --- /dev/null +++ b/htroot/api/timeline.xml @@ -0,0 +1,11 @@ + +#{event}# + + #[description]# + +#{/event}# + \ No newline at end of file diff --git a/source/de/anomic/kelondro/util/DateFormatter.java b/source/de/anomic/kelondro/util/DateFormatter.java index 7f1d203fe..34b6c9edc 100644 --- a/source/de/anomic/kelondro/util/DateFormatter.java +++ b/source/de/anomic/kelondro/util/DateFormatter.java @@ -73,6 +73,7 @@ public final class DateFormatter { private static final SimpleDateFormat FORMAT_RFC1123 = new SimpleDateFormat(PATTERN_RFC1123, Locale.US); private static final SimpleDateFormat FORMAT_RFC1036 = new SimpleDateFormat(PATTERN_RFC1036, Locale.US); + private static final SimpleDateFormat FORMAT_ANSIC = new SimpleDateFormat(PATTERN_ANSIC, Locale.US); /** * RFC 2616 requires that HTTP clients are able to parse all 3 different @@ -141,6 +142,10 @@ public final class DateFormatter { if (date == null) return ""; return format(FORMAT_ISO8601, date); } + public static final String formatANSIC(final Date date) { + if (date == null) return ""; + return format(FORMAT_ANSIC, date); + } private static long lastRFC1123long = 0; private static String lastRFC1123string = "";