You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@marmotta.apache.org by tk...@apache.org on 2016/10/19 14:04:48 UTC

[6/6] marmotta git commit: some fixes and tests

some fixes and tests


Project: http://git-wip-us.apache.org/repos/asf/marmotta/repo
Commit: http://git-wip-us.apache.org/repos/asf/marmotta/commit/385a92bc
Tree: http://git-wip-us.apache.org/repos/asf/marmotta/tree/385a92bc
Diff: http://git-wip-us.apache.org/repos/asf/marmotta/diff/385a92bc

Branch: refs/heads/MARMOTTA-655_Memento_Compliance_Issues
Commit: 385a92bc7f4f4a11dcdf63864c9cf04b6a6e08cc
Parents: 837d5d0
Author: Thomas Kurz <th...@salzburgresearch.at>
Authored: Wed Oct 19 16:04:26 2016 +0200
Committer: Thomas Kurz <th...@salzburgresearch.at>
Committed: Wed Oct 19 16:04:26 2016 +0200

----------------------------------------------------------------------
 .../versioning/io/HtmlVersionSerializer.java    |   3 +-
 .../versioning/io/LinkVersionSerializer.java    |   4 +-
 .../versioning/model/MementoVersionSet.java     |   9 +-
 .../services/VersionSerializerServiceImpl.java  |  16 +--
 .../platform/versioning/utils/MementoUtils.java |  26 ++++-
 .../webservices/MementoWebService.java          |   4 +-
 .../resources/templates/memento_timemap.ftl     |   4 +-
 .../versioning/MementoWebServiceTest.java       | 105 ++++++++++++++++++-
 8 files changed, 155 insertions(+), 16 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/marmotta/blob/385a92bc/platform/marmotta-versioning-kiwi/src/main/java/org/apache/marmotta/platform/versioning/io/HtmlVersionSerializer.java
----------------------------------------------------------------------
diff --git a/platform/marmotta-versioning-kiwi/src/main/java/org/apache/marmotta/platform/versioning/io/HtmlVersionSerializer.java b/platform/marmotta-versioning-kiwi/src/main/java/org/apache/marmotta/platform/versioning/io/HtmlVersionSerializer.java
index edbf006..881ca02 100644
--- a/platform/marmotta-versioning-kiwi/src/main/java/org/apache/marmotta/platform/versioning/io/HtmlVersionSerializer.java
+++ b/platform/marmotta-versioning-kiwi/src/main/java/org/apache/marmotta/platform/versioning/io/HtmlVersionSerializer.java
@@ -94,7 +94,7 @@ public class HtmlVersionSerializer implements VersionSerializer {
             //write data to map
             Map<String, Object> data = new HashMap<String, Object>();
 
-            data.put("original",original.toString());
+            data.put("original", MementoUtils.originalURI(original.toString(),configurationService.getBaseUri()));
 
             List<Map<String,String>> vs = new ArrayList<Map<String,String>>();
 
@@ -102,6 +102,7 @@ public class HtmlVersionSerializer implements VersionSerializer {
                 Version v = versions.next();
                 Map<String,String> m = new HashMap<String,String>();
                 m.put("date",v.getCommitTime().toString());
+                m.put("formatedDate", MementoUtils.MEMENTO_DATE_FORMAT.format(v.getCommitTime()));
                 m.put("uri",MementoUtils.resourceURI(original.toString(), v.getCommitTime(), configurationService.getBaseUri()).toString());
                 m.put("tstamp", TSTAMP.format(v.getCommitTime()));
                 vs.add(m);

http://git-wip-us.apache.org/repos/asf/marmotta/blob/385a92bc/platform/marmotta-versioning-kiwi/src/main/java/org/apache/marmotta/platform/versioning/io/LinkVersionSerializer.java
----------------------------------------------------------------------
diff --git a/platform/marmotta-versioning-kiwi/src/main/java/org/apache/marmotta/platform/versioning/io/LinkVersionSerializer.java b/platform/marmotta-versioning-kiwi/src/main/java/org/apache/marmotta/platform/versioning/io/LinkVersionSerializer.java
index 60f2aae..5bac7dd 100644
--- a/platform/marmotta-versioning-kiwi/src/main/java/org/apache/marmotta/platform/versioning/io/LinkVersionSerializer.java
+++ b/platform/marmotta-versioning-kiwi/src/main/java/org/apache/marmotta/platform/versioning/io/LinkVersionSerializer.java
@@ -80,7 +80,7 @@ public class LinkVersionSerializer implements VersionSerializer {
 
             //write original resource
             w.append("<");
-            w.append(original.toString());
+            w.append(MementoUtils.originalURI(original.toString(), configurationService.getBaseUri()).toString());
             w.append(">;rel=\"original\",");
             w.newLine();
 
@@ -108,7 +108,7 @@ public class LinkVersionSerializer implements VersionSerializer {
 
                 //add datetime
                 w.append("\"; datetime=\"");
-                w.append(v.getCommitTime().toString());
+                w.append(MementoUtils.MEMENTO_DATE_FORMAT.format(v.getCommitTime()));
                 w.append("\",");
 
                 w.newLine();

http://git-wip-us.apache.org/repos/asf/marmotta/blob/385a92bc/platform/marmotta-versioning-kiwi/src/main/java/org/apache/marmotta/platform/versioning/model/MementoVersionSet.java
----------------------------------------------------------------------
diff --git a/platform/marmotta-versioning-kiwi/src/main/java/org/apache/marmotta/platform/versioning/model/MementoVersionSet.java b/platform/marmotta-versioning-kiwi/src/main/java/org/apache/marmotta/platform/versioning/model/MementoVersionSet.java
index c1a71c2..a3ce5be 100644
--- a/platform/marmotta-versioning-kiwi/src/main/java/org/apache/marmotta/platform/versioning/model/MementoVersionSet.java
+++ b/platform/marmotta-versioning-kiwi/src/main/java/org/apache/marmotta/platform/versioning/model/MementoVersionSet.java
@@ -18,10 +18,13 @@
 package org.apache.marmotta.platform.versioning.model;
 
 import org.apache.marmotta.kiwi.versioning.model.Version;
+import org.apache.marmotta.platform.core.api.config.ConfigurationService;
 import org.apache.marmotta.platform.versioning.exception.MementoException;
 import org.apache.marmotta.platform.versioning.utils.MementoUtils;
 import org.openrdf.model.Resource;
 
+import javax.inject.Inject;
+import java.io.UnsupportedEncodingException;
 import java.util.Date;
 import java.util.HashSet;
 import java.util.Set;
@@ -60,7 +63,11 @@ public class MementoVersionSet {
         links.add(buildLink(prefix,original.toString(),current.getCommitTime(),"memento"));
 
         //add link to original
-        links.add("<"+original.toString()+">;rel=\"original\"");
+        try {
+            links.add("<"+MementoUtils.originalURI(original.toString(),baseURI).toString()+">;rel=\"original\"");
+        } catch (UnsupportedEncodingException e) {
+            throw new MementoException(e);
+        }
 
         //add next and previous if they exist
         if( next != null ) links.add(buildLink(prefix,original.toString(),next.getCommitTime(),"next memento"));

http://git-wip-us.apache.org/repos/asf/marmotta/blob/385a92bc/platform/marmotta-versioning-kiwi/src/main/java/org/apache/marmotta/platform/versioning/services/VersionSerializerServiceImpl.java
----------------------------------------------------------------------
diff --git a/platform/marmotta-versioning-kiwi/src/main/java/org/apache/marmotta/platform/versioning/services/VersionSerializerServiceImpl.java b/platform/marmotta-versioning-kiwi/src/main/java/org/apache/marmotta/platform/versioning/services/VersionSerializerServiceImpl.java
index 579e167..b4b535c 100644
--- a/platform/marmotta-versioning-kiwi/src/main/java/org/apache/marmotta/platform/versioning/services/VersionSerializerServiceImpl.java
+++ b/platform/marmotta-versioning-kiwi/src/main/java/org/apache/marmotta/platform/versioning/services/VersionSerializerServiceImpl.java
@@ -42,15 +42,19 @@ public class VersionSerializerServiceImpl implements VersionSerializerService {
 
     /**
      * returns an adequate serializer for a mimetype
-     * @param type a list of mimetype (from Accept header)
+     * @param types a list of mimetype (from Accept header)
      * @return a serializer
      * @throws IOException if there is no serializer for mimetype
      */
     @Override
-    public VersionSerializer getSerializer(List<ContentType> type) throws IOException {
-        for(VersionSerializer serializer : serializers) {
-            if(MarmottaHttpUtils.bestContentType(serializer.getContentTypes(),type) != null) return serializer;
-        }
-        throw new IOException("Cannot find serializer for " + type);
+    public VersionSerializer getSerializer(List<ContentType> types) throws IOException {
+        for(ContentType type : types) {
+            for(VersionSerializer serializer : serializers) {
+                for(ContentType stype : serializer.getContentTypes()) {
+                    if(stype.matches(type)) return serializer;
+                }
+            }
+        } //TODO there is not fuzzy match e.g. text/*
+        throw new IOException("Cannot find serializer for " + types);
     }
 }

http://git-wip-us.apache.org/repos/asf/marmotta/blob/385a92bc/platform/marmotta-versioning-kiwi/src/main/java/org/apache/marmotta/platform/versioning/utils/MementoUtils.java
----------------------------------------------------------------------
diff --git a/platform/marmotta-versioning-kiwi/src/main/java/org/apache/marmotta/platform/versioning/utils/MementoUtils.java b/platform/marmotta-versioning-kiwi/src/main/java/org/apache/marmotta/platform/versioning/utils/MementoUtils.java
index 5742952..6df05a0 100644
--- a/platform/marmotta-versioning-kiwi/src/main/java/org/apache/marmotta/platform/versioning/utils/MementoUtils.java
+++ b/platform/marmotta-versioning-kiwi/src/main/java/org/apache/marmotta/platform/versioning/utils/MementoUtils.java
@@ -17,10 +17,16 @@
  */
 package org.apache.marmotta.platform.versioning.utils;
 
+import org.apache.marmotta.platform.core.api.config.ConfigurationService;
+
+import java.io.UnsupportedEncodingException;
 import java.net.URI;
+import java.net.URLEncoder;
 import java.text.DateFormat;
 import java.text.SimpleDateFormat;
 import java.util.Date;
+import java.util.Locale;
+import java.util.TimeZone;
 
 /**
  * ...
@@ -38,10 +44,28 @@ public class MementoUtils {
      * is used for date format used in memento resource uris
      * TODO should be HTTP Date format specified by RFC 1123 and in the GMT timezone like "Mon, 19 Sep 2016 23:47:12 GMT"
      */
-    public static final DateFormat MEMENTO_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");
+    public static final DateFormat MEMENTO_DATE_FORMAT;
+
+    static {
+        MEMENTO_DATE_FORMAT = new SimpleDateFormat(
+                "EEE, dd MMM yyyy HH:mm:ss z", Locale.US); //TODO which locale should be used?
+        MEMENTO_DATE_FORMAT.setTimeZone(TimeZone.getTimeZone("GMT"));
+    }
 
     public static final DateFormat MEMENTO_DATE_FORMAT_FOR_URIS = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");
 
+    public static URI originalURI(String resource, String baseURI) throws UnsupportedEncodingException {
+
+        if(resource.startsWith(baseURI)) {
+            return URI.create(resource);
+        } else {
+            return URI.create(
+                    baseURI +
+                            ConfigurationService.RESOURCE_PATH + "?uri=" +
+                            URLEncoder.encode(resource, "UTF-8"));
+        }
+    }
+
     /**
      * builds a memento permalink
      * @param date the date of the version that should be represented by the permalink

http://git-wip-us.apache.org/repos/asf/marmotta/blob/385a92bc/platform/marmotta-versioning-kiwi/src/main/java/org/apache/marmotta/platform/versioning/webservices/MementoWebService.java
----------------------------------------------------------------------
diff --git a/platform/marmotta-versioning-kiwi/src/main/java/org/apache/marmotta/platform/versioning/webservices/MementoWebService.java b/platform/marmotta-versioning-kiwi/src/main/java/org/apache/marmotta/platform/versioning/webservices/MementoWebService.java
index 9174715..ae9b653 100644
--- a/platform/marmotta-versioning-kiwi/src/main/java/org/apache/marmotta/platform/versioning/webservices/MementoWebService.java
+++ b/platform/marmotta-versioning-kiwi/src/main/java/org/apache/marmotta/platform/versioning/webservices/MementoWebService.java
@@ -116,7 +116,7 @@ public class MementoWebService {
                 if(date_string == null) {
                     date = new Date();
                 } else {
-                    DateUtils.parseDate(date_string);
+                    date = DateUtils.parseDate(date_string);
                 }
 
                 URI resource = conn.getValueFactory().createURI(resource_string);
@@ -288,7 +288,7 @@ public class MementoWebService {
                 Set<String> links = new HashSet<String>();
                 links.add("<" + MementoUtils.timegateURI(resource_string, configurationService.getBaseUri()) + ">;rel=timegate");
 
-                links.add("<" + resource_string + ">;rel=original");
+                links.add("<" + MementoUtils.originalURI(resource_string, configurationService.getBaseUri()) + ">;rel=original");
 
                 //create response
                 return Response

http://git-wip-us.apache.org/repos/asf/marmotta/blob/385a92bc/platform/marmotta-versioning-kiwi/src/main/resources/templates/memento_timemap.ftl
----------------------------------------------------------------------
diff --git a/platform/marmotta-versioning-kiwi/src/main/resources/templates/memento_timemap.ftl b/platform/marmotta-versioning-kiwi/src/main/resources/templates/memento_timemap.ftl
index 4deff79..16843e5 100644
--- a/platform/marmotta-versioning-kiwi/src/main/resources/templates/memento_timemap.ftl
+++ b/platform/marmotta-versioning-kiwi/src/main/resources/templates/memento_timemap.ftl
@@ -56,7 +56,7 @@
         var target = "#timeknots",
             v = [
 <#list versions as version>
-            {'name':"${MEMENTO_DATE_FORMAT.format(version.date)}", 'date':new Date("${version.tstamp}"), 'uri':"${version.uri}"},
+            {'name':"${version.formatedDate}", 'date':new Date("${version.tstamp}"), 'uri':"${version.uri}"},
 </#list>
             {'name':"now", 'date':new Date(),'lineWidth':1, 'uri':"${SERVER_URL}resource?uri=${original?url}"}
         ];
@@ -88,7 +88,7 @@
                 </tr>
                 <#list versions as version>
                 <tr>
-                    <td><a target="_blank" href="${version.uri}" class="ldcache">${MEMENTO_DATE_FORMAT.format(version.date)}</a></td>
+                    <td><a target="_blank" href="${version.uri}" class="ldcache">${version.formatedDate}</a></td>
                 </tr>
             </#list>
             </table>

http://git-wip-us.apache.org/repos/asf/marmotta/blob/385a92bc/platform/marmotta-versioning-kiwi/src/test/java/org/apache/marmotta/platform/versioning/MementoWebServiceTest.java
----------------------------------------------------------------------
diff --git a/platform/marmotta-versioning-kiwi/src/test/java/org/apache/marmotta/platform/versioning/MementoWebServiceTest.java b/platform/marmotta-versioning-kiwi/src/test/java/org/apache/marmotta/platform/versioning/MementoWebServiceTest.java
index c78b551..7aa647e 100644
--- a/platform/marmotta-versioning-kiwi/src/test/java/org/apache/marmotta/platform/versioning/MementoWebServiceTest.java
+++ b/platform/marmotta-versioning-kiwi/src/test/java/org/apache/marmotta/platform/versioning/MementoWebServiceTest.java
@@ -1,6 +1,8 @@
 package org.apache.marmotta.platform.versioning;
 
 import com.jayway.restassured.RestAssured;
+import com.jayway.restassured.response.Response;
+import com.jayway.restassured.response.ValidatableResponse;
 import org.apache.marmotta.platform.core.api.importer.ImportService;
 import org.apache.marmotta.platform.core.api.triplestore.ContextService;
 import org.apache.marmotta.platform.core.api.user.UserService;
@@ -8,6 +10,9 @@ import org.apache.marmotta.platform.core.exception.io.MarmottaImportException;
 import org.apache.marmotta.platform.core.test.base.JettyMarmotta;
 import org.apache.marmotta.platform.versioning.utils.MementoUtils;
 import org.apache.marmotta.platform.versioning.webservices.MementoWebService;
+import org.hamcrest.BaseMatcher;
+import org.hamcrest.Description;
+import org.hamcrest.core.IsEqual;
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
 import org.junit.Test;
@@ -16,9 +21,14 @@ import org.slf4j.LoggerFactory;
 
 import java.io.InputStream;
 import java.net.URISyntaxException;
+import java.text.ParseException;
 import java.util.Date;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
-import static com.jayway.restassured.RestAssured.expect;
+import static com.jayway.restassured.RestAssured.*;
+import static org.hamcrest.Matchers.*;
+import static org.junit.Assert.assertTrue;
 
 /**
  * @author Thomas Kurz (tkurz@apache.org)
@@ -75,4 +85,97 @@ public class MementoWebServiceTest {
                 get(MementoUtils.MEMENTO_WEBSERVICE + "/" + MementoUtils.MEMENTO_TIMEGATE + "/http://example.org/resource1");
     }
 
+    @Test
+    public void testTimemapWithoutMementoDatetimeHeader() {
+        expect().
+                log().ifError().header("Memento-Datetime", isEmptyOrNullString()).
+                when().request().redirects().follow(false).
+                get(MementoUtils.MEMENTO_WEBSERVICE + "/" + MementoUtils.MEMENTO_TIMEGATE + "/http://example.org/resource1");
+    }
+
+    @Test
+    public void testWithDatetimeHeader() {
+        expect().
+                log().ifError().
+                when().request().redirects().follow(false).
+                header("Accept-Datetime","Mon, 19 Sep 2016 23:47:12 GMT").
+                get(MementoUtils.MEMENTO_WEBSERVICE + "/" + MementoUtils.MEMENTO_TIMEGATE + "/http://example.org/resource1");
+    }
+
+    @Test
+    public void testDateFormatForTimemap() {
+        when().
+                get(MementoUtils.MEMENTO_WEBSERVICE + "/" + MementoUtils.MEMENTO_TIMEMAP + "/http://example.org/resource1").
+                then().body(containsValidMementoDatetimeFormats("datetime=\"([^\"]+)\""));
+    }
+
+    @Test
+    public void testDateFormatForLinkHeaders() {
+        //timemap
+        expect().
+                log().ifError().
+                when().request().redirects().follow(false).
+                get(MementoUtils.MEMENTO_WEBSERVICE + "/" + MementoUtils.MEMENTO_TIMEMAP + "/http://example.org/resource1").
+                then().header("date",containsValidMementoDatetimeFormats("(.+)"));
+
+        //timegate
+        String location = given().request().redirects().follow(false).
+                when().
+                get(MementoUtils.MEMENTO_WEBSERVICE + "/" + MementoUtils.MEMENTO_TIMEGATE + "/http://example.org/resource1").
+                then().
+                header("date",containsValidMementoDatetimeFormats("(.+)")).
+                header("link", containsValidMementoDatetimeFormats("datetime=\"([^\"]+)\"")).extract().header("location");
+
+        //memento resource
+        when().
+                get(location).
+                then().
+                header("date", containsValidMementoDatetimeFormats("(.+)")).
+                header("memento-datetime",containsValidMementoDatetimeFormats("(.+)")).
+                header("link", containsValidMementoDatetimeFormats("datetime=\"([^\"]+)\"")).extract().header("location");
+    }
+
+    @Test
+    public void testTimemapSerialization() {
+        expect()
+                .log().ifError()
+                .when()
+                .request().header("Accept", "text / html, application / xhtml + xml, application/xml;q=0.9,image/webp,*/*;q=0.8")
+                .get(MementoUtils.MEMENTO_WEBSERVICE + "/" + MementoUtils.MEMENTO_TIMEMAP + "/http://example.org/resource1")
+                .then()
+                .contentType(is("text / html"));
+    }
+
+    //matcher tests if all matching groups are in correct memento datetime serialization
+    private org.hamcrest.Matcher containsValidMementoDatetimeFormats(final String pattern) {
+        return new BaseMatcher() {
+
+            private String lastGroup;
+
+            @Override
+            public boolean matches(final Object item) {
+
+                Pattern p = Pattern.compile(pattern);
+
+                Matcher m = p.matcher((String)item);
+
+                while(m.find()) {
+                    lastGroup = m.group(1);
+                    try {
+                        Date date = MementoUtils.MEMENTO_DATE_FORMAT.parse(lastGroup);
+                        if(!lastGroup.equals(MementoUtils.MEMENTO_DATE_FORMAT.format(date))) return false;
+                    } catch (ParseException ex) {
+                        return false;
+                    }
+                }
+
+                return true;
+            }
+            @Override
+            public void describeTo(final Description description) {
+                description.appendText("datetime does not match MementoDatetime: ").appendText(lastGroup);
+            }
+        };
+    }
+
 }