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. |