You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by ju...@apache.org on 2010/09/23 13:50:27 UTC
svn commit: r1000414 - in
/jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav:
MultiStatusResponse.java property/DavPropertyNameSet.java
property/DavPropertySet.java
Author: jukka
Date: Thu Sep 23 11:50:27 2010
New Revision: 1000414
URL: http://svn.apache.org/viewvc?rev=1000414&view=rev
Log:
JCR-2750: MultiStatusResponse should not call resource.getProperties
Fixed as suggested by Stepan Koltsov.
Modified:
jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/MultiStatusResponse.java
jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/property/DavPropertyNameSet.java
jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/property/DavPropertySet.java
Modified: jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/MultiStatusResponse.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/MultiStatusResponse.java?rev=1000414&r1=1000413&r2=1000414&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/MultiStatusResponse.java (original)
+++ jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/MultiStatusResponse.java Thu Sep 23 11:50:27 2010
@@ -31,7 +31,9 @@ import org.w3c.dom.Document;
import org.w3c.dom.Element;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.Iterator;
+import java.util.Set;
/**
* <code>MultiStatusResponse</code> represents the DAV:multistatus element defined
@@ -145,7 +147,7 @@ public class MultiStatusResponse impleme
}
/**
- * Constucts a WebDAV multistatus response and retrieves the resource
+ * Constructs a WebDAV multistatus response and retrieves the resource
* properties according to the given <code>DavPropertyNameSet</code>. It
* adds all known property to the '200' set, while unknown properties are
* added to the '404' set.
@@ -160,40 +162,57 @@ public class MultiStatusResponse impleme
* #PROPFIND_ALL_PROP}, {@link #PROPFIND_BY_PROPERTY}, {@link
* #PROPFIND_PROPERTY_NAMES}, {@link #PROPFIND_ALL_PROP_INCLUDE}
*/
- public MultiStatusResponse(DavResource resource, DavPropertyNameSet propNameSet,
- int propFindType) {
+ public MultiStatusResponse(
+ DavResource resource, DavPropertyNameSet propNameSet,
+ int propFindType) {
this(resource.getHref(), null, TYPE_PROPSTAT);
// only property names requested
if (propFindType == PROPFIND_PROPERTY_NAMES) {
- PropContainer status200 = getPropContainer(DavServletResponse.SC_OK, true);
+ PropContainer status200 =
+ getPropContainer(DavServletResponse.SC_OK, true);
for (DavPropertyName propName : resource.getPropertyNames()) {
status200.addContent(propName);
}
- // all or a specified set of property and their values requested.
+ // all or a specified set of property and their values requested.
} else {
- PropContainer status200 = getPropContainer(DavServletResponse.SC_OK, false);
- // clone set of property, since several resources could use this again
- propNameSet = new DavPropertyNameSet(propNameSet);
- // Add requested properties or all non-protected properties, or
- // non-protected properties plus requested properties (allprop/include)
- DavPropertyIterator iter = resource.getProperties().iterator();
- while (iter.hasNext()) {
- DavProperty<?> property = iter.nextProperty();
- boolean allDeadPlusRfc4918LiveProperties =
- propFindType == PROPFIND_ALL_PROP || propFindType == PROPFIND_ALL_PROP_INCLUDE;
- boolean wasRequested = propNameSet.remove(property.getName());
-
- if ((allDeadPlusRfc4918LiveProperties && !property.isInvisibleInAllprop()) || wasRequested) {
- status200.addContent(property);
+ PropContainer status200 =
+ getPropContainer(DavServletResponse.SC_OK, false);
+
+ // Collection of missing property names for 404 responses
+ Set<DavPropertyName> missing =
+ new HashSet<DavPropertyName>(propNameSet.getContent());
+
+ // Add requested properties or all non-protected properties,
+ // or non-protected properties plus requested properties
+ // (allprop/include)
+ if (propFindType == PROPFIND_BY_PROPERTY) {
+ for (DavPropertyName propName : propNameSet) {
+ DavProperty<?> prop = resource.getProperty(propName);
+ if (prop != null) {
+ status200.addContent(prop);
+ missing.remove(propName);
+ }
+ }
+ } else {
+ for (DavProperty<?> property : resource.getProperties()) {
+ boolean allDeadPlusRfc4918LiveProperties =
+ propFindType == PROPFIND_ALL_PROP
+ || propFindType == PROPFIND_ALL_PROP_INCLUDE;
+ boolean wasRequested = missing.remove(property.getName());
+
+ if ((allDeadPlusRfc4918LiveProperties
+ && !property.isInvisibleInAllprop())
+ || wasRequested) {
+ status200.addContent(property);
+ }
}
}
- if (!propNameSet.isEmpty() && propFindType != PROPFIND_ALL_PROP) {
- PropContainer status404 = getPropContainer(DavServletResponse.SC_NOT_FOUND, true);
- DavPropertyNameIterator iter1 = propNameSet.iterator();
- while (iter1.hasNext()) {
- DavPropertyName propName = iter1.nextPropertyName();
+ if (!missing.isEmpty() && propFindType != PROPFIND_ALL_PROP) {
+ PropContainer status404 =
+ getPropContainer(DavServletResponse.SC_NOT_FOUND, true);
+ for (DavPropertyName propName : missing) {
status404.addContent(propName);
}
}
Modified: jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/property/DavPropertyNameSet.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/property/DavPropertyNameSet.java?rev=1000414&r1=1000413&r2=1000414&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/property/DavPropertyNameSet.java (original)
+++ jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/property/DavPropertyNameSet.java Thu Sep 23 11:50:27 2010
@@ -31,7 +31,8 @@ import java.util.Set;
* <code>DavPropertyNameSet</code> represents a Set of {@link DavPropertyName}
* objects.
*/
-public class DavPropertyNameSet extends PropContainer {
+public class DavPropertyNameSet extends PropContainer
+ implements Iterable<DavPropertyName> {
private static Logger log = LoggerFactory.getLogger(DavPropertyNameSet.class);
private final Set<DavPropertyName> set = new HashSet<DavPropertyName>();
@@ -157,7 +158,7 @@ public class DavPropertyNameSet extends
* @see PropContainer#getContent()
*/
@Override
- public Collection<? extends PropEntry> getContent() {
+ public Collection<DavPropertyName> getContent() {
return set;
}
Modified: jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/property/DavPropertySet.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/property/DavPropertySet.java?rev=1000414&r1=1000413&r2=1000414&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/property/DavPropertySet.java (original)
+++ jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/property/DavPropertySet.java Thu Sep 23 11:50:27 2010
@@ -30,7 +30,8 @@ import java.util.NoSuchElementException;
* The <code>DavPropertySet</code> class represents a set of WebDAV
* property.
*/
-public class DavPropertySet extends PropContainer {
+public class DavPropertySet extends PropContainer
+ implements Iterable<DavProperty<?>> {
private static Logger log = LoggerFactory.getLogger(DavPropertySet.class);