You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by tr...@apache.org on 2005/08/07 18:13:16 UTC
svn commit: r230679 [2/2] - in
/incubator/jackrabbit/trunk/contrib/jcr-server: ./
client/src/java/org/apache/jackrabbit/client/
client/src/java/org/apache/jackrabbit/webdav/client/methods/
server/src/java/org/apache/jackrabbit/server/ server/src/java/o...
Modified: incubator/jackrabbit/trunk/contrib/jcr-server/webapp/src/java/org/apache/jackrabbit/j2ee/SimpleWebdavServlet.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-server/webapp/src/java/org/apache/jackrabbit/j2ee/SimpleWebdavServlet.java?rev=230679&r1=230678&r2=230679&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-server/webapp/src/java/org/apache/jackrabbit/j2ee/SimpleWebdavServlet.java (original)
+++ incubator/jackrabbit/trunk/contrib/jcr-server/webapp/src/java/org/apache/jackrabbit/j2ee/SimpleWebdavServlet.java Sun Aug 7 09:12:33 2005
@@ -37,6 +37,9 @@
import org.apache.jackrabbit.webdav.simple.DavSessionProviderImpl;
import org.apache.jackrabbit.webdav.simple.LocatorFactoryImpl;
import org.apache.jackrabbit.webdav.simple.ResourceFactoryImpl;
+import org.apache.jackrabbit.webdav.simple.ResourceFilterConfig;
+import org.apache.jackrabbit.webdav.simple.ResourceFilter;
+import org.apache.jackrabbit.webdav.simple.DefaultResourceFilter;
import org.apache.log4j.Logger;
import javax.jcr.Credentials;
@@ -47,6 +50,7 @@
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.net.URL;
+import java.net.MalformedURLException;
/**
* WebdavServlet provides webdav support (level 1 and 2 complient) for repository
@@ -80,7 +84,18 @@
*/
public static final String INIT_PARAM_AUTHENTICATE_HEADER = "authenticate-header";
- public static final String CTX_ATTR_RESOURCE_PATH_PREFIX = "jcr.webdav.resourcepath";
+ /**
+ * Name of the init parameter that specify a separate configuration used
+ * for filtering the resources displayed.
+ */
+ public static final String INIT_PARAM_RESOURCE_FILTER = "resource-filter";
+
+ /**
+ * Servlet context attribute used to store the path prefix instead of
+ * having a static field with this servlet. The latter causes problems
+ * when running multiple
+ */
+ public static final String CTX_ATTR_RESOURCE_PATH_PREFIX = "jackrabbit.webdav.simple.resourcepath";
/**
* the resource path prefix
@@ -131,6 +146,11 @@
private SessionProvider sessionProvider;
/**
+ * The resource filter
+ */
+ private ResourceFilter resourceFilter;
+
+ /**
* Init this servlet
*
* @throws ServletException
@@ -165,6 +185,16 @@
authenticate_header = DEFAULT_AUTHENTICATE_HEADER;
}
log.info("WWW-Authenticate header = '" + authenticate_header + "'");
+
+ String filterParam = getInitParameter(INIT_PARAM_RESOURCE_FILTER);
+ if (filterParam != null) {
+ try {
+ ResourceFilterConfig config = new ResourceFilterConfig();
+ setResourceFilter(config.parse(getServletContext().getResource(filterParam)));
+ } catch (MalformedURLException e) {
+ log.debug("Unable to build resource filter provider.");
+ }
+ }
}
/**
@@ -337,7 +367,7 @@
*/
public DavResourceFactory getResourceFactory() {
if (resourceFactory == null) {
- resourceFactory = new ResourceFactoryImpl(getLockManager());
+ resourceFactory = new ResourceFactoryImpl(getLockManager(), getResourceFilter());
}
return resourceFactory;
}
@@ -419,6 +449,28 @@
*/
public String getAuthenticateHeaderValue() {
return authenticate_header;
+ }
+
+ /**
+ * Returns the resource filter to be applied
+ *
+ * @return
+ */
+ public ResourceFilter getResourceFilter() {
+ // fallback if no config present or invalid: an empty resource filter
+ if (resourceFilter == null) {
+ resourceFilter = new DefaultResourceFilter();
+ }
+ return resourceFilter;
+ }
+
+ /**
+ * Set the resource filter
+ *
+ * @param resourceFilter
+ */
+ public void setResourceFilter(ResourceFilter resourceFilter) {
+ this.resourceFilter = resourceFilter;
}
/**
Modified: incubator/jackrabbit/trunk/contrib/jcr-server/webapp/src/webapp/WEB-INF/catalog.xml
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-server/webapp/src/webapp/WEB-INF/catalog.xml?rev=230679&r1=230678&r2=230679&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-server/webapp/src/webapp/WEB-INF/catalog.xml (original)
+++ incubator/jackrabbit/trunk/contrib/jcr-server/webapp/src/webapp/WEB-INF/catalog.xml Sun Aug 7 09:12:33 2005
@@ -46,7 +46,7 @@
<!--
if the content type matches 'text/xml' the content of the resource
- i considered as xml and deserialized into the jcr repository.
+ is considered as xml and deserialized into the jcr repository.
@return false
-->
<command
Added: incubator/jackrabbit/trunk/contrib/jcr-server/webapp/src/webapp/WEB-INF/filter.xml
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-server/webapp/src/webapp/WEB-INF/filter.xml?rev=230679&view=auto
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-server/webapp/src/webapp/WEB-INF/filter.xml (added)
+++ incubator/jackrabbit/trunk/contrib/jcr-server/webapp/src/webapp/WEB-INF/filter.xml Sun Aug 7 09:12:33 2005
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+<!DOCTYPE filter [
+ <!ELEMENT filter (class, namespaces?, nodetypes?) >
+
+ <!ELEMENT class >
+ <!ATTLIST class
+ name CDATA #REQUIRED
+ >
+ <!ELEMENT namespaces (prefix | uri)* >
+ <!ELEMENT prefix (CDATA) >
+ <!ELEMENT uri (CDATA) >
+
+ <!ELEMENT nodetypes (nodetype)* >
+ <!ELEMENT nodetype (CDATA) >
+]>
+-->
+<!--
+ Filter that allows to prevent certain items from being displayed.
+ Please note, that this has an effect on PROPFIND calls only and does not
+ provide limited access to those items matching any of the filters.
+
+ However specifying a filter may cause problems with PUT or MKCOL if the
+ resource to be created is being filtered out, thus resulting in inconsistent
+ responses (e.g. PUT followed by PROPFIND on parent).
+ -->
+<filter>
+ <!-- class element defines the resource filter to be used. The specified class
+ must implement the ResourceFilter interface -->
+ <class name="org.apache.jackrabbit.webdav.simple.DefaultResourceFilter" />
+ <!-- Nodetype names to be used to filter child nodes.
+ A child node can be filtered if the declaring nodetype of its definition
+ is one of the nodetype names specified in the nodetypes Element.
+ E.g. defining 'rep:root' as filtered nodetype whould result in jcr:system
+ being hidden but no other child node of the root node, since those
+ are defined by the nodetype nt:unstructered.
+ -->
+ <!--
+ <nodetypes>
+ <nodetype>rep:root</nodetype>
+ </nodetypes>
+ -->
+ <!-- Namespace prefixes or uris. Items having a name that matches any of the
+ entries will be filtered.
+ -->
+ <namespaces>
+ <prefix>rep</prefix>
+ <prefix>jcr</prefix>
+ <!--
+ <uri>internal</uri>
+ <uri>http://www.jcp.org/jcr/1.0</uri>
+ -->
+ </namespaces>
+</filter>
+
Propchange: incubator/jackrabbit/trunk/contrib/jcr-server/webapp/src/webapp/WEB-INF/filter.xml
------------------------------------------------------------------------------
svn:eol-style = native
Modified: incubator/jackrabbit/trunk/contrib/jcr-server/webapp/src/webapp/WEB-INF/web.xml
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-server/webapp/src/webapp/WEB-INF/web.xml?rev=230679&r1=230678&r2=230679&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-server/webapp/src/webapp/WEB-INF/web.xml (original)
+++ incubator/jackrabbit/trunk/contrib/jcr-server/webapp/src/webapp/WEB-INF/web.xml Sun Aug 7 09:12:33 2005
@@ -173,6 +173,19 @@
the defines the commons-chain catalog for server tasks.
</description>
</init-param>
+ !--
+ Optional parameter defining namespaces (or uri or prefixes) and/or
+ nodetype names that mark hidden resources.
+ If omitted not resources will be filtered out.
+ -->
+ <init-param>
+ <param-name>resource-filter</param-name>
+ <param-value>/WEB-INF/filter.xml</param-value>
+ <description>
+ Defines namespace (uri or prefix) or nodetype names for hidden
+ resources.
+ </description>
+ </init-param>
<load-on-startup>3</load-on-startup>
</servlet>
Modified: incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/DavResource.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/DavResource.java?rev=230679&r1=230678&r2=230679&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/DavResource.java (original)
+++ incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/DavResource.java Sun Aug 7 09:12:33 2005
@@ -163,6 +163,16 @@
public void removeProperty(DavPropertyName propertyName) throws DavException;
/**
+ * Set/add the specified properties and remove the properties with the given
+ * names from this resource respectively.
+ *
+ * @param setProperties Set of properties to be added or modified
+ * @param removePropertyNames Set of property names to be removed
+ * @throws DavException if an error occurs
+ */
+ public void alterProperties(DavPropertySet setProperties, DavPropertyNameSet removePropertyNames) throws DavException;
+
+ /**
* Retrieve the resource this resource is internal member of.
*
* @return resource this resource is an internal member of. In case this resource
Modified: incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/WebdavRequestImpl.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/WebdavRequestImpl.java?rev=230679&r1=230678&r2=230679&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/WebdavRequestImpl.java (original)
+++ incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/WebdavRequestImpl.java Sun Aug 7 09:12:33 2005
@@ -30,6 +30,7 @@
import org.apache.jackrabbit.webdav.property.DavPropertyNameSet;
import org.apache.jackrabbit.webdav.property.DavPropertySet;
import org.apache.jackrabbit.webdav.property.DefaultDavProperty;
+import org.apache.jackrabbit.webdav.property.DavProperty;
import org.apache.jackrabbit.webdav.transaction.TransactionConstants;
import org.apache.jackrabbit.webdav.transaction.TransactionInfo;
import org.apache.jackrabbit.webdav.version.DeltaVConstants;
@@ -481,11 +482,29 @@
boolean isMatching = false;
String lockToken = resource.getLock(Type.WRITE, Scope.EXCLUSIVE).getToken();
if (lockToken != null) {
- // todo: do not ignore etag
- isMatching = matchesIfHeader(resource.getHref(), lockToken, "");
+ isMatching = matchesIfHeader(resource.getHref(), lockToken, getStrongETag(resource));
} // else: lockToken is null >> the if-header will not match.
return isMatching;
+ }
+
+ /**
+ * Returns the strong etag present on the given resource or empty string
+ * if either the resource does not provide any etag or if the etag is weak.
+ *
+ * @param resource
+ * @return strong etag or empty string.
+ */
+ private String getStrongETag(DavResource resource) {
+ DavProperty prop = resource.getProperty(DavPropertyName.GETETAG);
+ if (prop != null) {
+ String etag = prop.getValue().toString();
+ if (etag != null && etag.length() > 0 && !etag.startsWith("W\\")) {
+ return etag;
+ }
+ }
+ // no strong etag available
+ return "";
}
/**
Modified: incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/header/CodedUrlHeader.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/header/CodedUrlHeader.java?rev=230679&r1=230678&r2=230679&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/header/CodedUrlHeader.java (original)
+++ incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/header/CodedUrlHeader.java Sun Aug 7 09:12:33 2005
@@ -107,4 +107,4 @@
String headerValue = request.getHeader(headerName);
return new CodedUrlHeader(headerName, headerValue);
}
-}
+}
\ No newline at end of file
Modified: incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/header/DepthHeader.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/header/DepthHeader.java?rev=230679&r1=230678&r2=230679&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/header/DepthHeader.java (original)
+++ incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/header/DepthHeader.java Sun Aug 7 09:12:33 2005
@@ -112,4 +112,4 @@
}
return d;
}
-}
+}
\ No newline at end of file
Modified: incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/property/HrefProperty.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/property/HrefProperty.java?rev=230679&r1=230678&r2=230679&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/property/HrefProperty.java (original)
+++ incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/property/HrefProperty.java Sun Aug 7 09:12:33 2005
@@ -84,8 +84,8 @@
Iterator it = ((List)val).iterator();
while (it.hasNext()) {
Object o = it.next();
- if (o instanceof Element) {
- String href = ((Element)o).getChildText(XML_HREF, NAMESPACE);
+ if (o instanceof Element && XML_HREF.equals(((Element)o).getName())) {
+ String href = ((Element)o).getText();
if (href != null) {
hrefList.add(href);
} else {
@@ -95,8 +95,8 @@
log.warn("DAV: href element expected in the content of " + getName().toString());
}
}
- } else if (val instanceof Element) {
- String href = ((Element)val).getChildText(XML_HREF, NAMESPACE);
+ } else if (val instanceof Element && XML_HREF.equals(((Element)val).getName())) {
+ String href = ((Element)val).getText();
if (href != null) {
hrefList.add(href);
} else {