|
From: <bra...@us...> - 2010-07-27 23:57:07
|
Revision: 3191
http://archive-access.svn.sourceforge.net/archive-access/?rev=3191&view=rev
Author: bradtofel
Date: 2010-07-27 23:57:00 +0000 (Tue, 27 Jul 2010)
Log Message:
-----------
INITIAL REV: very preliminary Memento-style date-time content negotiation support. .JSP files really need some cleanup. lots of static references and date parsing operations should be centralized into a Memento.java support class.
Added Paths:
-----------
trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/requestparser/MementoParser.java
trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/requestparser/TimeBundleParser.java
trunk/archive-access/projects/wayback/wayback-webapp/src/main/webapp/WEB-INF/query/Memento.jsp
trunk/archive-access/projects/wayback/wayback-webapp/src/main/webapp/WEB-INF/query/ORE.jsp
Added: trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/requestparser/MementoParser.java
===================================================================
--- trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/requestparser/MementoParser.java (rev 0)
+++ trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/requestparser/MementoParser.java 2010-07-27 23:57:00 UTC (rev 3191)
@@ -0,0 +1,155 @@
+package org.archive.wayback.requestparser;
+
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.Iterator;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.log4j.Logger;
+import org.archive.wayback.core.WaybackRequest;
+import org.archive.wayback.exception.BadQueryException;
+import org.archive.wayback.exception.BetterRequestException;
+import org.archive.wayback.webapp.AccessPoint;
+
+/**
+ * RequestParser subclass which matches ".../timegate/URL" requests, and parses
+ * the Accept-Datetime header
+ *
+ * @author Lyudmila Balakireva
+ *
+ */
+public class MementoParser extends WrappedRequestParser {
+ private static final Logger LOGGER =
+ Logger.getLogger(MementoParser.class.getName());
+
+ String DTHEADER = "Accept-Datetime";
+
+ List<SimpleDateFormat> dtsupportedformats =
+ new ArrayList<SimpleDateFormat>();
+
+ String MEMENTO_BASE = "timegate";
+
+ /**
+ * @param wrapped
+ * BaseRequestParser with configuration
+ */
+ public MementoParser(BaseRequestParser wrapped) {
+ super(wrapped);
+
+ dtsupportedformats
+ .add(new SimpleDateFormat("E, dd MMM yyyy HH:mm:ss Z"));
+ dtsupportedformats.add(new SimpleDateFormat("E, dd MMM yyyy Z"));
+ dtsupportedformats.add(new SimpleDateFormat("E, dd MMM yyyy"));
+ }
+
+ @Override
+ public WaybackRequest parse(HttpServletRequest httpRequest,
+ AccessPoint accessPoint) throws BadQueryException,
+ BetterRequestException {
+
+ String base = accessPoint.translateRequestPath(httpRequest);
+ String requestPath = accessPoint.translateRequestPathQuery(httpRequest);
+
+ LOGGER.trace("requestPath:" + requestPath);
+ if (base.startsWith(MEMENTO_BASE)) {
+
+ // strip leading "timegate/":
+ String urlStr = base.substring(requestPath.indexOf("/") + 1);
+
+ // get the "Accept-Datetime" header:
+ String httpdate = getHttpDate(httpRequest);
+ Date dtconnegdate = null;
+ if (httpdate != null) {
+ dtconnegdate = checkDateValidity(httpdate, dtsupportedformats);
+ if (dtconnegdate == null) {
+ return null;
+ }
+ } else {
+ // TODO: should this return null her? no header..
+ }
+
+ WaybackRequest wbRequest = new WaybackRequest();
+ if (wbRequest.getStartTimestamp() == null) {
+ wbRequest.setStartTimestamp(getEarliestTimestamp());
+ }
+ if (dtconnegdate != null) {
+ wbRequest.setAnchorDate(dtconnegdate);
+ } else {
+ wbRequest.setAnchorTimestamp(getLatestTimestamp());
+ }
+
+ wbRequest.put("dtconneg", httpdate);
+
+ if (wbRequest.getEndTimestamp() == null) {
+ wbRequest.setEndTimestamp(getLatestTimestamp());
+ }
+ wbRequest.setCaptureQueryRequest();
+ wbRequest.setRequestUrl(urlStr);
+ if (wbRequest != null) {
+ wbRequest.setResultsPerPage(getMaxRecords());
+ }
+ return wbRequest;
+ }
+ return null;
+ }
+
+ /**
+ * Extract the value of the "Accept-Datetime" HTTP request header, if
+ * present, and further strips the date value from any surrounding "{","}"
+ * @param req HttpServletRequest for this request
+ * @return the raw String containing the date information, or null if no
+ * such HTTP header exists.
+ */
+ public String getHttpDate(HttpServletRequest req) {
+ String httpdate = req.getHeader(DTHEADER);
+
+ if (httpdate != null) {
+ int j = httpdate.indexOf("{", 0);
+
+ if (j >= 0) {
+
+ httpdate = httpdate.substring(httpdate.indexOf("{", 0) + 1);
+
+ }
+
+ if (httpdate.indexOf("}") > 0) {
+ httpdate = httpdate.substring(0, httpdate.indexOf("}"));
+
+ }
+ }
+ return httpdate;
+ }
+
+ /**
+ * Attempt to parse the String httpdate argument using one of the
+ * SimpleDateFormats provided.
+ *
+ * @param httpdate
+ * String version of a Date
+ * @param list
+ * of SimpleDateFormats to parse the httpdate
+ * @return Date object set to the time parsed, or null if not parsed
+ */
+ public Date checkDateValidity(String httpdate, List<SimpleDateFormat> list) {
+
+ Date d = null;
+ Iterator<SimpleDateFormat> it = list.iterator();
+ while (it.hasNext()) {
+ SimpleDateFormat formatter = it.next();
+ try {
+
+ d = formatter.parse(httpdate);
+ break;
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ }
+
+ return d;
+ }
+}
Property changes on: trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/requestparser/MementoParser.java
___________________________________________________________________
Added: svn:keywords
+ Author Date Revision Id
Added: trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/requestparser/TimeBundleParser.java
===================================================================
--- trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/requestparser/TimeBundleParser.java (rev 0)
+++ trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/requestparser/TimeBundleParser.java 2010-07-27 23:57:00 UTC (rev 3191)
@@ -0,0 +1,88 @@
+package org.archive.wayback.requestparser;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.log4j.Logger;
+import org.archive.wayback.core.WaybackRequest;
+import org.archive.wayback.exception.BadQueryException;
+import org.archive.wayback.exception.BetterRequestException;
+import org.archive.wayback.webapp.AccessPoint;
+
+/**
+ * RequestParser subclass which parses "timebundle/URL" and
+ * "timemap/FORMAT/URL" requests
+ *
+ * @author Lyudmila Balakireva
+ *
+ */
+public class TimeBundleParser extends WrappedRequestParser {
+ private static final Logger LOGGER =
+ Logger.getLogger(TimeBundleParser.class.getName());
+
+ String MEMENTO_BASE = "timegate";
+
+ /**
+ * @param wrapped BaseRequestParser holding config
+ */
+ public TimeBundleParser(BaseRequestParser wrapped) {
+ super(wrapped);
+ }
+
+ @Override
+ public WaybackRequest parse(HttpServletRequest httpRequest,
+ AccessPoint accessPoint) throws BadQueryException,
+ BetterRequestException {
+
+ String requestPath = accessPoint.translateRequestPathQuery(httpRequest);
+ LOGGER.trace("requestpath:" + requestPath);
+
+ if (requestPath.startsWith("timebundle")) {
+
+ WaybackRequest wbRequest = new WaybackRequest();
+ String urlStr = requestPath.substring(requestPath.indexOf("/") + 1);
+ if (wbRequest.getStartTimestamp() == null) {
+ wbRequest.setStartTimestamp(getEarliestTimestamp());
+ }
+ if (wbRequest.getEndTimestamp() == null) {
+ wbRequest.setEndTimestamp(getLatestTimestamp());
+ }
+ wbRequest.setCaptureQueryRequest();
+ wbRequest.setRequestUrl(urlStr);
+
+ // TODO: is it critical to return a 303 code, or will a 302 do?
+ // if so, this and ORE.jsp can be simplified by throwing a
+ // BetterRequestException here.
+ wbRequest.put("redirect", "true");
+ return wbRequest;
+ }
+
+ if (requestPath.startsWith("timemap")) {
+
+ String urlStrplus = requestPath
+ .substring(requestPath.indexOf("/") + 1);
+ String format = urlStrplus.substring(0, urlStrplus.indexOf("/"));
+
+ LOGGER.trace("format:" + format);
+ String urlStr = urlStrplus.substring(urlStrplus.indexOf("/") + 1);
+ LOGGER.trace("id:" + urlStr);
+ WaybackRequest wbRequest = new WaybackRequest();
+ if (wbRequest.getStartTimestamp() == null) {
+ wbRequest.setStartTimestamp(getEarliestTimestamp());
+ }
+ wbRequest.setAnchorTimestamp(getLatestTimestamp());
+ wbRequest.put("format", format);
+ if (wbRequest.getEndTimestamp() == null) {
+ wbRequest.setEndTimestamp(getLatestTimestamp());
+ }
+ wbRequest.setCaptureQueryRequest();
+ wbRequest.setRequestUrl(urlStr);
+ if (wbRequest != null) {
+ wbRequest.setResultsPerPage(getMaxRecords());
+ }
+ return wbRequest;
+
+ }
+ return null;
+ }
+
+}
Property changes on: trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/requestparser/TimeBundleParser.java
___________________________________________________________________
Added: svn:keywords
+ Author Date Revision Id
Added: trunk/archive-access/projects/wayback/wayback-webapp/src/main/webapp/WEB-INF/query/Memento.jsp
===================================================================
--- trunk/archive-access/projects/wayback/wayback-webapp/src/main/webapp/WEB-INF/query/Memento.jsp (rev 0)
+++ trunk/archive-access/projects/wayback/wayback-webapp/src/main/webapp/WEB-INF/query/Memento.jsp 2010-07-27 23:57:00 UTC (rev 3191)
@@ -0,0 +1,192 @@
+<%@ page import="java.util.Date" %>
+<%@ page import="org.archive.wayback.core.UIResults" %>
+<%@ page import="org.archive.wayback.util.StringFormatter" %>
+<%@ page import="org.archive.wayback.core.WaybackRequest" %>
+<%@ page import="org.archive.wayback.core.CaptureSearchResults" %>
+<%@ page import="org.archive.wayback.core.CaptureSearchResult"%>
+<%@ page import="org.archive.wayback.ResultURIConverter" %>
+<%@ page import="java.text.SimpleDateFormat" %>
+<%@ page import="org.archive.wayback.util.Timestamp" %>
+<%@ page import="java.util.Iterator" %>
+<%@ page import="java.util.List" %>
+<%@ page import="java.util.ArrayList" %>
+<%@ page import="org.archive.wayback.ResultURIConverter" %>
+<%@ page import="org.archive.wayback.archivalurl.ArchivalUrlResultURIConverter" %>
+<%
+ response.setHeader("Vary", "negotiate,accept-datetime");
+ SimpleDateFormat httpformatterl = new SimpleDateFormat(
+ "E, dd MMM yyyy HH:mm:ss z");
+ Date now = new Date();
+ UIResults results = UIResults.extractCaptureQuery(request);//nuzno potom perepisat'
+
+ WaybackRequest wbRequest = results.getWbRequest();
+ //String p_url = wbRequest.getContextPrefix();
+
+ String u = wbRequest.getRequestUrl();
+ // String agguri = p_url.replace("memento","ore") +"timebundle/" + u;
+ // String ad = wbRequest.getStartTimestamp();
+ // Date sdate = wbRequest.getStartDate();
+ //Date pdate = wbRequest.getAnchorDate();
+ String dtdate = wbRequest.get("dtconneg");
+
+ Date dt = now;
+ if (dtdate != null) {
+ dt = httpformatterl.parse(dtdate);
+ }
+ CaptureSearchResults cResults = results.getCaptureResults();
+ CaptureSearchResult res = cResults.getClosest(wbRequest, true);
+
+ Date closestDate = res.getCaptureDate();
+ //String url = res.getRedirectUrl();
+ String agguri = results.getContextConfig("aggregationPrefix")
+ + "timebundle/" + u;
+ String timemap = " , <"
+ + results.getContextConfig("aggregationPrefix")
+ + "timemap/link/" + u
+ + ">;rel=\"timemap\"; type=\"text/csv\"";
+ ArchivalUrlResultURIConverter uriconverter = (ArchivalUrlResultURIConverter) results
+ .getURIConverter();
+ String uriPrefix = uriconverter.getReplayURIPrefix();
+ String replayUrl = results.resultToReplayUrl(res);
+ //alternates header
+ String qvalue = "1.0"; //just example
+ StringBuffer sb = new StringBuffer();
+ // sb.append("{");
+ //sb.append("\"" + u +"\" "+qvalue);
+ //sb.append(" {dt original}},");
+ //calculate X-Archive-Interval
+
+ StringFormatter fmt = results.getWbRequest().getFormatter();
+ Date f = cResults.getFirstResultDate();
+ Date l = cResults.getLastResultDate();
+ SimpleDateFormat formatterk = new SimpleDateFormat("yyyyMMddHHmmss");
+
+ //sb.append("{\"" + uriPrefix +formatterk.format(f)+"/" +u +"\" " +qvalue);
+ //sb.append(" {dt " + "\""+httpformatterl.format(f) +"\" first}}");
+ sb.append(", <" + uriPrefix + formatterk.format(f) + "/" + u
+ + ">;rel=\"first-memento\"; datetime=\""
+ + httpformatterl.format(f) + "\"");
+ if (!f.equals(l)) {
+
+ // sb.append(",");
+ // sb.append("{\"" + uriPrefix +formatterk.format(l)+"/" +u +"\" " +qvalue);
+ // sb.append(" {dt " + "\""+httpformatterl.format(l) +"\" last}}");
+ sb.append(", <" + uriPrefix + formatterk.format(f) + "/" + u
+ + ">;rel=\"last-memento\"; datetime=\""
+ + httpformatterl.format(f) + "\"");
+ }
+
+ //response.setHeader("X-Archive-Interval","{"+httpformatterl.format(f)+"} - {"+httpformatterl.format(l)+"}");
+
+ // calculate closest values for alternates
+
+ CaptureSearchResult closestleft = null;
+ CaptureSearchResult closestright = null;
+ long rclosestDistance = 0;
+ long lclosestDistance = 0;
+ CaptureSearchResult cur = null;
+ String anchorDate = null;
+
+ long maxWindow = -1;
+ //long wantTime = wbRequest.getReplayDate().getTime();
+ long wantTime = closestDate.getTime();
+
+ Iterator<CaptureSearchResult> itr = cResults.iterator();
+ while (itr.hasNext()) {
+ cur = itr.next();
+ cur.getCaptureDate();
+ //long curDistance = Math.abs(wantTime - cur.getCaptureDate().getTime());
+ long curDistance = wantTime - cur.getCaptureDate().getTime();
+ // == 0 propuskaem
+ if (curDistance > 0) {
+ if ((closestright == null)
+ || (Math.abs(curDistance) < Math
+ .abs(rclosestDistance))) {
+ closestright = cur;
+ rclosestDistance = Math.abs(curDistance);
+ }
+ }
+
+ if (curDistance < 0) {
+ if ((closestleft == null)
+ || (Math.abs(curDistance) < Math
+ .abs(lclosestDistance))) {
+ closestleft = cur;
+ lclosestDistance = Math.abs(curDistance);
+ }
+ }
+
+ }
+
+ if ((dt.before(f)) || dt.after(now)) {
+ //if ((pdate.before(f))||pdate.after(now)) {
+ response.setHeader("TCN", "list");
+ response.setStatus(406);
+ // response.setHeader("Link","<"+agguri+">;rel=\"aggregation\"");
+ // sb.append("}");
+ // response.setHeader("Alternates",sb.toString());
+ } else {
+ // SimpleDateFormat formatterk = new SimpleDateFormat("yyyyMMddHHmmss");
+
+ // StringBuffer sb = new StringBuffer();
+
+ // List list = new ArrayList();
+ if (closestleft != null) {
+ if (!closestleft.getCaptureDate().equals(f)) {
+ // sb.append(",");
+ // sb.append("{\"" + uriPrefix +formatterk.format(closestleft.getCaptureDate())+"/" +u +"\" "+qvalue);
+ // sb.append(" {dt " +"\""+httpformatterl.format(closestleft.getCaptureDate()) +"\" prev} {type " + closestleft.getMimeType() +"}}");
+ sb.append(", <" + uriPrefix + formatterk.format(f)
+ + "/" + u
+ + ">;rel=\"prev-memento\"; datetime=\""
+ + httpformatterl.format(f) + "\"");
+ // list.add(closestleft);
+ }
+ }
+ if (closestright != null) {
+ if (!closestright.getCaptureDate().equals(l)) {
+ // sb.append(",");
+ // sb.append("{\"" + uriPrefix +formatterk.format(closestright.getCaptureDate())+"/" +u +"\" " +qvalue);
+ //sb.append(" {dt " +"\""+httpformatterl.format(closestright.getCaptureDate()) +"\" next} {type " + closestright.getMimeType() +"}}");
+ sb.append(", <" + uriPrefix + formatterk.format(f)
+ + "/" + u
+ + ">;rel=\"next-memento\"; datetime=\""
+ + httpformatterl.format(f) + "\"");
+ }
+
+ // list.add(closestright);
+ }
+
+ // Iterator it = list.iterator();
+ //int count=0;
+ //while (it.hasNext()) {
+
+ // count++;
+ //CaptureSearchResult alt = (CaptureSearchResult) it.next();
+
+ // sb.append("{");
+ //sb.append("\"" + uriPrefix +formatterk.format(alt.getCaptureDate())+"/" +u +"\" ");
+ //sb.append("{dt " + httpformatterl.format(alt.getCaptureDate()) +"} {type " + alt.getMimeType() +"}");
+
+ //sb.append("}");
+ //if (count!=list.size()) {
+ // sb.append(","); }
+
+ //}
+
+ // sb.append("}");
+ String origlink = ", <" + u + ">;rel=\"original\"";
+ String memento = ",<" + replayUrl
+ + ">;rel=\"memento\";datetime=\""
+ + httpformatterl.format(closestDate) + "\"";
+ response.setHeader("Link", "<" + agguri
+ + ">;rel=\"timebundle\"" + origlink + sb.toString()
+ + memento + timemap); //added timemap
+ // response.setHeader("Alternates",sb.toString());
+ response.setHeader("TCN", "choice");
+ response.setHeader("Location", replayUrl);
+ // response.setStatus(302,"Found"); //does'not work
+ response.sendError(302, "Found");
+
+ }
+%>
\ No newline at end of file
Added: trunk/archive-access/projects/wayback/wayback-webapp/src/main/webapp/WEB-INF/query/ORE.jsp
===================================================================
--- trunk/archive-access/projects/wayback/wayback-webapp/src/main/webapp/WEB-INF/query/ORE.jsp (rev 0)
+++ trunk/archive-access/projects/wayback/wayback-webapp/src/main/webapp/WEB-INF/query/ORE.jsp 2010-07-27 23:57:00 UTC (rev 3191)
@@ -0,0 +1,320 @@
+<%@ page import="java.util.Date" %>
+<%@ page import="org.archive.wayback.core.UIResults" %>
+<%@ page import="org.archive.wayback.util.StringFormatter" %>
+<%@ page import="org.archive.wayback.core.WaybackRequest" %>
+<%@ page import="org.archive.wayback.core.CaptureSearchResults" %>
+<%@ page import="org.archive.wayback.core.CaptureSearchResult"%>
+<%@ page import="org.archive.wayback.ResultURIConverter" %>
+<%@ page import="java.text.SimpleDateFormat" %>
+<%@ page import="org.archive.wayback.util.Timestamp" %>
+<%@ page import="java.util.Iterator" %>
+<%@ page import="java.util.List" %>
+<%@ page import="java.util.ArrayList" %>
+<%@ page import="org.dspace.foresite.Aggregation" %>
+<%@ page import="org.dspace.foresite.ResourceMap" %>
+<%@ page import="org.dspace.foresite.Agent" %>
+<%@ page import="org.dspace.foresite.OREFactory" %>
+<%@ page import="org.dspace.foresite.AggregatedResource" %>
+<%@ page import="org.dspace.foresite.ORESerialiser" %>
+<%@ page import="org.dspace.foresite.ORESerialiserFactory" %>
+<%@ page import="org.dspace.foresite.ResourceMapDocument" %>
+<%@ page import="java.io.PrintWriter" %>
+<%@ page import="java.net.URI" %>
+<%@ page import="org.dspace.foresite.Predicate" %>
+<%@ page import="org.archive.wayback.archivalurl.ArchivalUrlResultURIConverter" %>
+<%@page import="org.dspace.foresite.Triple"%>
+<%@page import="org.dspace.foresite.jena.TripleJena"%>
+<%@page import="java.util.UUID"%>
+<%@page import="java.util.Calendar"%>
+<%
+ UIResults results = UIResults.extractCaptureQuery(request);//nuzno potom perepisat'
+ SimpleDateFormat httpformatterl = new SimpleDateFormat(
+ "E, dd MMM yyyy HH:mm:ss z");
+ WaybackRequest wbRequest = results.getWbRequest();
+ CaptureSearchResults cResults = results.getCaptureResults();
+ CaptureSearchResult res = cResults.getClosest(wbRequest, true);
+
+ ArchivalUrlResultURIConverter uriconverter = (ArchivalUrlResultURIConverter) results
+ .getURIConverter();
+ String uriPrefix = uriconverter.getReplayURIPrefix();
+ //String p_url = wbRequest.getContextPrefix();
+ String u = wbRequest.getRequestUrl();
+ String agguri = uriPrefix + "timebundle/" + u;
+ //String agguri = results.getContextConfig("Prefix") + "timebundle/" + u;
+ //String remuri = p_url +"timemap/" + u;
+ //System.out.println(agguri);
+ //System.out.println(remuri);
+ String redirection = null;
+ if (wbRequest.containsKey("redirect")) {
+ redirection = wbRequest.get("redirect");
+ }
+ if (redirection != null) {
+ //default poka
+ //skip content negotiation
+
+ // TODO: see comment in TimeBundleParser - could be handled elsewhere
+ response.setStatus(303);
+ response.setHeader("Location", uriPrefix + "timemap/rdf/" + u);
+ //response.sendRedirect(p_url +"timemap/rdf/" + u);
+ } else {
+ String format = wbRequest.get("format");
+ // System.out.println("here");
+ Aggregation agg = OREFactory.createAggregation(new URI(agguri));
+ //System.out.println("here");
+ ResourceMap rem = agg.createResourceMap(new URI(uriPrefix
+ + "timemap/" + format + "/" + u));
+
+ //SimpleDateFormat formatter_utc = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
+
+ Date now = new Date();
+
+ rem.setCreated(now);
+ Predicate pr_type = new Predicate();
+ pr_type.setURI(new URI(
+ "http://www.w3.org/1999/02/22-rdf-syntax-ns#type"));
+
+ rem.setModified(now);
+ rem.createTriple(pr_type, new URI(
+ "http://www.mementoweb.org/terms/tb/TimeMap"));
+ //rem.addType(new URI("http://www.mementoweb.org/terms/tb/TimeMap"));
+ Agent creator = OREFactory.createAgent();
+ creator.addName("Foresite Toolkit (Java)");
+ //creator.addMbox(new URI("for...@go..."));
+
+ //rem.addAgent(new URI("http://foresite-toolkit.googlecode.com/#javaAgent"),creator);
+ rem.addCreator(creator);
+ agg.addTitle("Memento Time Bundle for " + u);
+
+ //CaptureSearchResults cResults = results.getCaptureResults();
+ //CaptureSearchResult res = cResults.getClosest(wbRequest,true);
+ Iterator<CaptureSearchResult> itr = cResults.iterator();
+ SimpleDateFormat formatterk = new SimpleDateFormat(
+ "yyyyMMddHHmmss");
+
+ Date f = cResults.getFirstResultDate();
+ Date l = cResults.getLastResultDate();
+
+ String ArchiveInterval = formatterk.format(f) + " - "
+ + formatterk.format(l);
+
+ //agg.createTriple(new URI("http://www.mementoweb.org/ns/archiveInterval"),ArchiveInterval);
+ agg.addType(new URI(
+ "http://www.mementoweb.org/terms/tb/TimeBundle"));
+ //String mementourl =p_url.replace("ore","memento");
+ //include original into aggregation
+
+ AggregatedResource ar_o = agg.createAggregatedResource(new URI(
+ u));
+ ar_o.createTriple(pr_type, new URI(
+ "http://www.mementoweb.org/terms/tb/OriginalResource"));
+ //include timegate into aggregation
+ AggregatedResource ar_tg = agg
+ .createAggregatedResource(new URI(results
+ .getContextConfig("Prefix")
+ + "timegate/" + u));
+ Predicate pr_format = new Predicate();
+ pr_format.setURI(new URI(
+ "http://purl.org/dc/elements/1.1/format"));
+ ar_tg.createTriple(pr_format, new URI(u));
+ ar_tg.createTriple(pr_type, new URI(
+ "http://www.mementoweb.org/terms/tb/TimeGate"));
+
+ String previos_digest = null;
+ List<String> previos_blancs = new ArrayList<String>();
+
+ Predicate pr = new Predicate();
+ pr.setURI(new URI("http://www.mementoweb.org/terms/tb/start"));
+ Predicate pre = new Predicate();
+ pre.setURI(new URI("http://www.mementoweb.org/terms/tb/end"));
+ Calendar cal = Calendar.getInstance();
+ AggregatedResource ar = null;
+
+ Date enddate = null;
+
+ // String buffer for special link serialization format
+ StringBuffer linkbf = new StringBuffer();
+
+ linkbf.append("<" + u + ">;rel=\"original\"\n");
+ linkbf.append(",<" + agguri + ">;rel=\"timebundle\"\n");
+ String firstmemento = null;
+
+ while (itr.hasNext()) {
+ CaptureSearchResult cur = itr.next();
+ //I am not deduping urls (by digest) for the rdf serialization running out of time, extra efforts for me now ;)
+
+ String resurl = results.getContextConfig("Prefix")
+ + formatterk.format(cur.getCaptureDate()) + "/" + u;
+
+ String digest = cur.getDigest();
+ if (previos_digest == null) {
+ previos_digest = digest;
+ }
+
+ ar = agg.createAggregatedResource(new URI(resurl));
+ ar.createTriple(pr_format, cur.getMimeType());
+
+ Predicate pr_1 = new Predicate();
+ pr_1.setURI(new URI(
+ "http://www.mementoweb.org/terms/tb/mementoFor"));
+ ar.createTriple(pr_1, new URI(u));
+ ar.createTriple(pr_type, new URI(
+ "http://www.mementoweb.org/terms/tb/Memento"));
+
+ Date startdate = cur.getDuplicateDigestStoredDate();
+ //System.out.println("start:"+startdate);
+ enddate = cur.getCaptureDate();
+ //System.out.println("end:"+enddate);
+
+ // serialiase it in links format only for unique digest
+
+ if (startdate == null) {
+ if (firstmemento == null) {
+ linkbf.append(",<" + resurl
+ + ">;rel=\"first-memento\";datetime=\""
+ + httpformatterl.format(enddate) + "\"\n");
+ firstmemento = "firstmemento";
+ } else {
+ linkbf.append(",<" + resurl
+ + ">;rel=\"memento\";datetime=\""
+ + httpformatterl.format(enddate) + "\"\n");
+ }
+ }
+
+ // Adding blanc node
+ Triple triple = new TripleJena();
+ triple.initialise(new URI(resurl));
+ Predicate pred = new Predicate();
+ UUID a = UUID.randomUUID();
+ String blanc = "urn:uuid:" + a.toString();
+
+ //System.out.println(blanc);
+ pred.setURI(new URI(
+ "http://www.mementoweb.org/terms/tb/validOver"));
+ triple.relate(pred, new URI(blanc));
+ Triple tr = new TripleJena();
+ tr.initialise(new URI(blanc));
+
+ tr.relate(pr_type, new URI(
+ "http://www.mementoweb.org/terms/tb/Period"));
+
+ //period difined by [ [ interval [ date first digest recorded and date of next digest recorded [
+
+ String start = null;
+ Triple trd = new TripleJena();
+ trd.initialise(new URI(blanc));
+ //Calendar cal = Calendar.getInstance();
+
+ if (startdate != null) {
+
+ cal.setTime(startdate);
+ trd.relate(pr, cal);
+ start = httpformatterl.format(startdate);
+ } else {
+ cal.setTime(enddate);
+ trd.relate(pr, cal);
+ start = httpformatterl.format(enddate);
+ }
+
+ //System.out.println("type" +trd.getLiteralType());
+
+ ar.addTriple(triple);
+ ar.addTriple(tr);
+ ar.addTriple(trd);
+
+ if (!digest.equals("previos_digest")) {
+
+ Iterator<String> it = previos_blancs.iterator();
+ while (it.hasNext()) {
+ String blanc_ = (String) it.next();
+ Triple tre = new TripleJena();
+ tre.initialise(new URI(blanc_));
+
+ //Calendar cal = Calendar.getInstance();
+ cal.setTime(enddate);
+ tre.relate(pre, cal);
+ ar.addTriple(tre);
+ }
+
+ previos_blancs.clear();
+ previos_digest = digest;
+ }
+
+ previos_blancs.add(blanc);
+
+ }
+
+ Iterator it = previos_blancs.iterator();
+ while (it.hasNext()) {
+ String blanc_ = (String) it.next();
+ Triple tre = new TripleJena();
+ tre.initialise(new URI(blanc_));
+
+ cal.setTime(now); //or date of archive stop archiving
+ tre.relate(pre, cal);
+
+ ar.addTriple(tre);
+ }
+
+ // additional logic for link format
+ int m_index = linkbf.lastIndexOf("\"memento\"");
+ //System.out.println(m_index);
+ linkbf.insert(m_index + 1, "last-");
+ //System.out.println("here");
+
+ //String format = wbRequest.get("format");
+ ORESerialiser serial = null;
+ if (format.equals("rdf")) {
+ serial = ORESerialiserFactory.getInstance("RDF/XML");
+ response.setContentType("application/rdf+xml");
+ }
+ //else if (format.equals("atom")) {
+ // serial = ORESerialiserFactory.getInstance("ATOM-1.0");
+ //}
+ //else if (format.equals ("html")) {
+ // serial = ORESerialiserFactory.getInstance("RDFa");
+ //}
+ //removed n3 because serialization of the date to the String type
+ //else if (format.equals("n3")) {
+ //serial = ORESerialiserFactory.getInstance("N3");
+
+ //response.setContentType("text/n3");
+ //}
+ else if (format.equals("link")) {
+ PrintWriter pw = response.getWriter();
+ //System.out.println(linkbf.toString());
+
+ // TODO: are we sure this is right? We want to flush *before*
+ // setting content-type?
+ pw.print(linkbf.toString());
+ pw.flush();
+ response.setContentType("text/csv");
+ } else {
+ // response.setStatus(404);
+ // TODO: this should be handled in TimeBundleParser to allow
+ // usual Exception rendering to happen.
+ response.sendError(404, "Unknown TimeMap serialization");
+ }
+ if (serial != null) {
+ ResourceMapDocument doc = serial.serialise(rem);
+ // TODO: this could get really big. Any way to stream the data out
+ // so we don't need another copy beyond the ResourceMap,
+ // and other helper objects?
+ String serialisation = doc.toString();
+ if (format.equals("rdf")) {
+ //bug in jena? did not serialise date to date type but to string type // stupid fix will need investigate it
+ serialisation = serialisation
+ .replaceAll(
+ "end rdf:datatype=\"http://www.w3.org/2001/XMLSchema#string",
+ "end rdf:datatype=\"http://www.w3.org/2001/XMLSchema#dateTime");
+ serialisation = serialisation
+ .replaceAll(
+ "start rdf:datatype=\"http://www.w3.org/2001/XMLSchema#string",
+ "start rdf:datatype=\"http://www.w3.org/2001/XMLSchema#dateTime");
+ }
+ PrintWriter pw = response.getWriter();
+ pw.print(serialisation);
+ pw.flush();
+ }
+
+ }
+%>
\ No newline at end of file
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|