From: <bra...@us...> - 2010-08-17 00:43:47
|
Revision: 3233 http://archive-access.svn.sourceforge.net/archive-access/?rev=3233&view=rev Author: bradtofel Date: 2010-08-17 00:43:40 +0000 (Tue, 17 Aug 2010) Log Message: ----------- FEATURE: One step closer to "native" Memento support. Still need a clean-up pass over the .jsp, once functionality is confirmed. Modified Paths: -------------- trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/memento/MementoHTMLReplayRenderer.java trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/memento/MementoRequestParser.java trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/memento/TimeBundleRequestParser.java trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/webapp/AccessPoint.java trunk/archive-access/projects/wayback/wayback-webapp/src/main/webapp/WEB-INF/query/ORE.jsp Modified: trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/memento/MementoHTMLReplayRenderer.java =================================================================== --- trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/memento/MementoHTMLReplayRenderer.java 2010-08-17 00:07:39 UTC (rev 3232) +++ trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/memento/MementoHTMLReplayRenderer.java 2010-08-17 00:43:40 UTC (rev 3233) @@ -49,7 +49,7 @@ */ public class MementoHTMLReplayRenderer extends TextReplayRenderer { /** - * @param httpHeaderProcessor + * @param httpHeaderProcessor to use */ public MementoHTMLReplayRenderer(HttpHeaderProcessor httpHeaderProcessor) { super(httpHeaderProcessor); Modified: trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/memento/MementoRequestParser.java =================================================================== --- trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/memento/MementoRequestParser.java 2010-08-17 00:07:39 UTC (rev 3232) +++ trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/memento/MementoRequestParser.java 2010-08-17 00:43:40 UTC (rev 3233) @@ -42,6 +42,8 @@ */ public class MementoRequestParser extends ArchivalUrlRequestParser { protected RequestParser[] getRequestParsers() { + // all the usual ArchivalURL RequestParsers, plus the memento-specific + // ones: RequestParser[] theParsers = { new ReplayRequestParser(this), new TimeGateRequestParser(this), Modified: trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/memento/TimeBundleRequestParser.java =================================================================== --- trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/memento/TimeBundleRequestParser.java 2010-08-17 00:07:39 UTC (rev 3232) +++ trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/memento/TimeBundleRequestParser.java 2010-08-17 00:43:40 UTC (rev 3233) @@ -3,6 +3,7 @@ import javax.servlet.http.HttpServletRequest; import org.apache.log4j.Logger; +import org.archive.wayback.archivalurl.ArchivalUrlResultURIConverter; import org.archive.wayback.core.WaybackRequest; import org.archive.wayback.exception.BadQueryException; import org.archive.wayback.exception.BetterRequestException; @@ -51,11 +52,18 @@ wbRequest.setCaptureQueryRequest(); wbRequest.setRequestUrl(urlStr); + ArchivalUrlResultURIConverter conv = + (ArchivalUrlResultURIConverter) accessPoint.getUriConverter(); + + String uriPrefix = conv.getReplayURIPrefix(); + String betterUrl = uriPrefix + "timemap/rdf/" + urlStr; + + throw new BetterRequestException(betterUrl, 303); // 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; +// wbRequest.put("redirect", "true"); +// return wbRequest; } if (requestPath.startsWith("timemap")) { Modified: trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/webapp/AccessPoint.java =================================================================== --- trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/webapp/AccessPoint.java 2010-08-17 00:07:39 UTC (rev 3232) +++ trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/webapp/AccessPoint.java 2010-08-17 00:43:40 UTC (rev 3233) @@ -234,7 +234,10 @@ } } catch(BetterRequestException e) { - httpResponse.sendRedirect(e.getBetterURI()); + + httpResponse.setStatus(e.getStatus()); + httpResponse.setHeader("Location", e.getBetterURI()); +// httpResponse.sendRedirect(e.getBetterURI()); handled = true; } catch(WaybackException e) { Modified: 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 2010-08-17 00:07:39 UTC (rev 3232) +++ trunk/archive-access/projects/wayback/wayback-webapp/src/main/webapp/WEB-INF/query/ORE.jsp 2010-08-17 00:43:40 UTC (rev 3233) @@ -44,277 +44,263 @@ //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 + 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)); - // 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'"); - //SimpleDateFormat formatter_utc = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); + Date now = new Date(); - 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.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.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); - //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"); - //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(); - Date f = cResults.getFirstResultDate(); - Date l = cResults.getLastResultDate(); + String ArchiveInterval = formatterk.format(f) + " - " + + formatterk.format(l); - 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 - //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")); - 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>(); - 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; - 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; - Date enddate = null; + // String buffer for special link serialization format + StringBuffer linkbf = new StringBuffer(); - // 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; - 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 ;) - 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 resurl = results.getContextConfig("Prefix") - + formatterk.format(cur.getCaptureDate()) + "/" + u; + String digest = cur.getDigest(); + if (previos_digest == null) { + previos_digest = digest; + } - String digest = cur.getDigest(); - if (previos_digest == null) { - previos_digest = digest; - } + ar = agg.createAggregatedResource(new URI(resurl)); + ar.createTriple(pr_format, cur.getMimeType()); - 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")); - 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); - 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 - // 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"); - } + 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(); + // 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)); + //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")); + 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 [ + //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(); + String start = null; + Triple trd = new TripleJena(); + trd.initialise(new URI(blanc)); + //Calendar cal = Calendar.getInstance(); - if (startdate != null) { + 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); - } + 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()); + //System.out.println("type" +trd.getLiteralType()); - ar.addTriple(triple); - ar.addTriple(tr); - ar.addTriple(trd); + ar.addTriple(triple); + ar.addTriple(tr); + ar.addTriple(trd); - if (!digest.equals("previos_digest")) { + 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_)); + 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; + //Calendar cal = Calendar.getInstance(); + cal.setTime(enddate); + tre.relate(pre, cal); + ar.addTriple(tre); } - previos_blancs.add(blanc); - + previos_blancs.clear(); + previos_digest = digest; } - Iterator it = previos_blancs.iterator(); - while (it.hasNext()) { - String blanc_ = (String) it.next(); - Triple tre = new TripleJena(); - tre.initialise(new URI(blanc_)); + previos_blancs.add(blanc); - cal.setTime(now); //or date of archive stop archiving - tre.relate(pre, cal); + } - ar.addTriple(tre); - } + Iterator it = previos_blancs.iterator(); + while (it.hasNext()) { + String blanc_ = (String) it.next(); + Triple tre = new TripleJena(); + tre.initialise(new URI(blanc_)); - // 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"); + cal.setTime(now); //or date of archive stop archiving + tre.relate(pre, cal); - //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"); + ar.addTriple(tre); + } - //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(); - } + // 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. |