Author: dkuleshov
Date: 2010-10-19 09:55:03 -0400 (Tue, 19 Oct 2010)
New Revision: 3301
Modified:
jcr/branches/1.12.x/exo.jcr.component.webdav/src/main/java/org/exoplatform/services/jcr/webdav/WebDavConst.java
jcr/branches/1.12.x/exo.jcr.component.webdav/src/main/java/org/exoplatform/services/jcr/webdav/command/GetCommand.java
jcr/branches/1.12.x/exo.jcr.component.webdav/src/main/java/org/exoplatform/services/jcr/webdav/resource/VersionResource.java
jcr/branches/1.12.x/exo.jcr.component.webdav/src/test/java/org/exoplatform/services/jcr/webdav/command/TestGet.java
Log:
JCR-1470: fixed date parsing during if-modified-since header usage
Modified:
jcr/branches/1.12.x/exo.jcr.component.webdav/src/main/java/org/exoplatform/services/jcr/webdav/WebDavConst.java
===================================================================
---
jcr/branches/1.12.x/exo.jcr.component.webdav/src/main/java/org/exoplatform/services/jcr/webdav/WebDavConst.java 2010-10-19
12:50:39 UTC (rev 3300)
+++
jcr/branches/1.12.x/exo.jcr.component.webdav/src/main/java/org/exoplatform/services/jcr/webdav/WebDavConst.java 2010-10-19
13:55:03 UTC (rev 3301)
@@ -18,10 +18,10 @@
*/
package org.exoplatform.services.jcr.webdav;
+import java.util.Hashtable;
+
import org.exoplatform.common.http.HTTPStatus;
-import java.util.Hashtable;
-
/**
* Constants used for webdav service implemetation.
*
@@ -468,7 +468,7 @@
/**
* If-Modified-Since date psttern.
*/
- public static final String IF_MODIFIED_SINCE_PATTERN = "EEE, d MMM yyyy
HH:mm:ss z";
+ public static final String IF_MODIFIED_SINCE_PATTERN = "EEE, dd MMM yyyy
HH:mm:ss z";
}
/**
Modified:
jcr/branches/1.12.x/exo.jcr.component.webdav/src/main/java/org/exoplatform/services/jcr/webdav/command/GetCommand.java
===================================================================
---
jcr/branches/1.12.x/exo.jcr.component.webdav/src/main/java/org/exoplatform/services/jcr/webdav/command/GetCommand.java 2010-10-19
12:50:39 UTC (rev 3300)
+++
jcr/branches/1.12.x/exo.jcr.component.webdav/src/main/java/org/exoplatform/services/jcr/webdav/command/GetCommand.java 2010-10-19
13:55:03 UTC (rev 3301)
@@ -18,6 +18,26 @@
*/
package org.exoplatform.services.jcr.webdav.command;
+import java.io.InputStream;
+import java.net.URI;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Locale;
+
+import javax.jcr.Node;
+import javax.jcr.PathNotFoundException;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+import javax.ws.rs.core.HttpHeaders;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.xml.transform.stream.StreamSource;
+
import org.exoplatform.common.http.HTTPStatus;
import org.exoplatform.common.util.HierarchicalProperty;
import org.exoplatform.services.jcr.webdav.Range;
@@ -39,26 +59,6 @@
import org.exoplatform.services.rest.ext.provider.XSLTStreamingOutput;
import org.exoplatform.services.rest.impl.header.MediaTypeHelper;
-import java.io.InputStream;
-import java.net.URI;
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Locale;
-
-import javax.jcr.Node;
-import javax.jcr.PathNotFoundException;
-import javax.jcr.RepositoryException;
-import javax.jcr.Session;
-import javax.ws.rs.core.HttpHeaders;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import javax.xml.transform.stream.StreamSource;
-
/**
* Created by The eXo Platform SAS Author : <a
* href="gavrikvetal(a)gmail.com">Vitaly Guly</a>.
@@ -118,7 +118,7 @@
VersionedResource versionedFile = new VersionedFileResource(uri, node,
nsContext);
resource = versionedFile.getVersionHistory().getVersion(version);
- lastModifiedProperty = resource.getProperty(FileResource.CREATIONDATE);
+ lastModifiedProperty =
resource.getProperty(FileResource.GETLASTMODIFIED);
istream = ((VersionResource)resource).getContentAsStream();
}
else
@@ -132,10 +132,10 @@
// check before any other reads
if (ifModifiedSince != null)
{
- DateFormat dateFormat = new
SimpleDateFormat(WebDavConst.DateFormat.IF_MODIFIED_SINCE_PATTERN, Locale.US);
+ DateFormat dateFormat = new
SimpleDateFormat(WebDavConst.DateFormat.MODIFICATION, Locale.US);
Date lastModifiedDate =
dateFormat.parse(lastModifiedProperty.getValue());
- dateFormat = new SimpleDateFormat(WebDavConst.DateFormat.MODIFICATION,
Locale.US);
+ dateFormat = new
SimpleDateFormat(WebDavConst.DateFormat.IF_MODIFIED_SINCE_PATTERN, Locale.US);
Date ifModifiedSinceDate = dateFormat.parse(ifModifiedSince);
if(ifModifiedSinceDate.getTime() >= lastModifiedDate.getTime()){
Modified:
jcr/branches/1.12.x/exo.jcr.component.webdav/src/main/java/org/exoplatform/services/jcr/webdav/resource/VersionResource.java
===================================================================
---
jcr/branches/1.12.x/exo.jcr.component.webdav/src/main/java/org/exoplatform/services/jcr/webdav/resource/VersionResource.java 2010-10-19
12:50:39 UTC (rev 3300)
+++
jcr/branches/1.12.x/exo.jcr.component.webdav/src/main/java/org/exoplatform/services/jcr/webdav/resource/VersionResource.java 2010-10-19
13:55:03 UTC (rev 3301)
@@ -18,10 +18,6 @@
*/
package org.exoplatform.services.jcr.webdav.resource;
-import org.exoplatform.common.util.HierarchicalProperty;
-import org.exoplatform.services.jcr.webdav.util.DeltaVConstants;
-import org.exoplatform.services.jcr.webdav.xml.WebDavNamespaceContext;
-
import java.io.InputStream;
import java.net.URI;
import java.util.Calendar;
@@ -34,6 +30,10 @@
import javax.jcr.version.Version;
import javax.xml.namespace.QName;
+import org.exoplatform.common.util.HierarchicalProperty;
+import org.exoplatform.services.jcr.webdav.util.DeltaVConstants;
+import org.exoplatform.services.jcr.webdav.xml.WebDavNamespaceContext;
+
/**
* Created by The eXo Platform SARL .<br/>
*
@@ -174,6 +174,14 @@
return creationDate;
}
+ else if (DeltaVConstants.GETLASTMODIFIED.equals(name))
+ {
+ Calendar created =
version.getNode("jcr:frozenNode").getProperty("jcr:created").getDate();
+ HierarchicalProperty creationDate = new HierarchicalProperty(name, created,
MODIFICATION_PATTERN);
+ creationDate.setAttribute("b:dt", "dateTime.rfc1123");
+ return creationDate;
+
+ }
else
{
throw new PathNotFoundException();
Modified:
jcr/branches/1.12.x/exo.jcr.component.webdav/src/test/java/org/exoplatform/services/jcr/webdav/command/TestGet.java
===================================================================
---
jcr/branches/1.12.x/exo.jcr.component.webdav/src/test/java/org/exoplatform/services/jcr/webdav/command/TestGet.java 2010-10-19
12:50:39 UTC (rev 3300)
+++
jcr/branches/1.12.x/exo.jcr.component.webdav/src/test/java/org/exoplatform/services/jcr/webdav/command/TestGet.java 2010-10-19
13:55:03 UTC (rev 3301)
@@ -18,29 +18,32 @@
*/
package org.exoplatform.services.jcr.webdav.command;
-import org.exoplatform.common.http.HTTPStatus;
-import org.exoplatform.services.jcr.core.nodetype.ExtendedNodeTypeManager;
-import org.exoplatform.services.jcr.core.nodetype.NodeTypeDataManager;
-import org.exoplatform.services.jcr.impl.core.version.VersionImpl;
-import org.exoplatform.services.jcr.webdav.BaseStandaloneTest;
-import org.exoplatform.services.jcr.webdav.WebDavConstants.WebDAVMethods;
-import org.exoplatform.services.jcr.webdav.utils.TestUtils;
-import org.exoplatform.services.rest.ext.provider.XSLTStreamingOutput;
-import org.exoplatform.services.rest.impl.ContainerResponse;
-
import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
-import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.StringWriter;
+import java.text.SimpleDateFormat;
import java.util.Calendar;
+import java.util.Locale;
import javax.jcr.Node;
+import javax.ws.rs.core.MultivaluedMap;
+import org.exoplatform.common.http.HTTPStatus;
+import org.exoplatform.services.jcr.core.nodetype.ExtendedNodeTypeManager;
+import org.exoplatform.services.jcr.core.nodetype.NodeTypeDataManager;
+import org.exoplatform.services.jcr.impl.core.version.VersionImpl;
+import org.exoplatform.services.jcr.webdav.BaseStandaloneTest;
+import org.exoplatform.services.jcr.webdav.WebDavConst;
+import org.exoplatform.services.jcr.webdav.WebDavConstants.WebDAVMethods;
+import org.exoplatform.services.jcr.webdav.utils.TestUtils;
+import org.exoplatform.services.rest.ExtHttpHeaders;
+import org.exoplatform.services.rest.impl.ContainerResponse;
+import org.exoplatform.services.rest.impl.MultivaluedMapImpl;
+
/**
* Created by The eXo Platform SAS Author : Dmytro Katayev
* work.visor.ck(a)gmail.com Aug 13, 2008
@@ -124,6 +127,52 @@
}
+
+ /**
+ * Tests if date passed through header If-modified-since of GET method parsed
correctly.
+ * Details can be found here:
http://jira.exoplatform.org/browse/JCR-1470
+ * @throws Exception
+ */
+ public void testIfModifiedSinceDateParsing() throws Exception
+ {
+ Node fileNode = session.getRootNode().addNode("node",
"nt:file");
+ fileNode.addMixin("mix:versionable");
+
+ Node contentNode = fileNode.addNode("jcr:content",
"nt:resource");
+ contentNode.setProperty("jcr:mimeType", "text/plain");
+
+ Calendar creationDate = Calendar.getInstance();
+ Calendar IfModifiedSince = Calendar.getInstance();
+ IfModifiedSince.add(Calendar.HOUR, -2);
+ creationDate.add(Calendar.HOUR, -1);
+ contentNode.setProperty("jcr:data", creationDate);
+ contentNode.setProperty("jcr:lastModified", creationDate);
+
+ session.save();
+
+ fileNode.checkin();
+ fileNode.checkout();
+
+ String path =
+ getPathWS() + "/" + fileNode.getName() + "?time=" +
IfModifiedSince.getTimeInMillis() + "&version=1";
+
+ SimpleDateFormat dateFormat = new
SimpleDateFormat(WebDavConst.DateFormat.IF_MODIFIED_SINCE_PATTERN, Locale.US);
+ String ifModifiedSinceDate = dateFormat.format(IfModifiedSince.getTime());
+
+ MultivaluedMap<String, String> headers = new MultivaluedMapImpl();
+ headers.add(ExtHttpHeaders.IF_MODIFIED_SINCE, ifModifiedSinceDate);
+ ContainerResponse response = service(WebDAVMethods.GET, path, "",
headers, null);
+ assertEquals(HTTPStatus.OK, response.getStatus());
+
+ headers.clear();
+
+ IfModifiedSince.add(Calendar.HOUR, +4);
+ ifModifiedSinceDate = dateFormat.format(IfModifiedSince.getTime());
+ headers.add(ExtHttpHeaders.IF_MODIFIED_SINCE, ifModifiedSinceDate);
+ response = service(WebDAVMethods.GET, path, "", headers, null);
+ assertEquals(HTTPStatus.NOT_MODIFIED, response.getStatus());
+ }
+
@Override
protected String getRepositoryName()
{