jackrabbit-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Roland Porath" <rol...@exari.com>
Subject RE: properties in collections; nailed the bastard
Date Fri, 08 Feb 2008 02:27:45 GMT
Hi Brad

I'll add it to the wiki later but here's a quick fix:

1. dirty hack:
Modify builtin-nodetypes.xml in  org.apache.jackrabbit.core
Change the definition of nt:folder to
   <nodeType name="nt:folder" isMixin="false" hasOrderableChildNodes="false"
        <childNodeDefinition name="*" defaultPrimaryType=""
autoCreated="false" mandatory="false" onParentVersion="VERSION"
protected="false" sameNameSiblings="false">
        <propertyDefinition name="*" requiredType="undefined"
autoCreated="false" mandatory="false" onParentVersion="COPY"
protected="false" multiple="true"/>
        <propertyDefinition name="*" requiredType="undefined"
autoCreated="false" mandatory="false" onParentVersion="COPY"
protected="false" multiple="false"/>

This is quick and dirty hack. 

2. change config.xml in your WEB-INF
In the propertymanager Replace DirListingExportHandler with

The code for WebDAVCollectionPropertyExportHandler is here:


 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *      http://www.apache.org/licenses/LICENSE-2.0
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * See the License for the specific language governing permissions and
 * limitations under the License.
package org.apache.jackrabbit.server.io;

import java.util.Map;

import javax.jcr.Node;
import javax.jcr.Property;
import javax.jcr.PropertyIterator;
import javax.jcr.RepositoryException;
import javax.jcr.Session;

import org.apache.jackrabbit.util.ISO9075;
import org.apache.jackrabbit.util.Text;
import org.apache.jackrabbit.webdav.property.DavPropertyName;
import org.apache.jackrabbit.webdav.xml.Namespace;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

 * WebDAVCollectionPropertyExportHandler
 * export all properties on a collection (mapped to nt:folder)
 * some of the code was copied verbatim from DirListingExportHandler and
 * and parts of that copied code may not actually do anything useful but i
think its better to 
 * err on the side of caution
 * you can find the bits i am not sure of by looking for the tag "CCC"
(cargo cult coding)
 * feel free to modify or kill them if you understand what you are doing
 * author: 		Roland Porath
 * history: 	08/02/08	created
public class WebDAVCollectionPropertyExportHandler implements
PropertyHandler {

    private static Logger log =

     * @see PropertyHandler#exportProperties(PropertyExportContext, boolean)
    public boolean exportProperties(PropertyExportContext exportContext,
boolean isCollection) throws RepositoryException 
        if(!canExport(exportContext, isCollection)) 
        	return false; 
        Node cn = (Node)exportContext.getExportRoot();
        if (log.isDebugEnabled()) log.debug("exporting properties for " +
        //add every property you find to the export context
        //WebDAV has no limitations here
        PropertyIterator it = cn.getProperties();
        while (it.hasNext()) 
            Property p = it.nextProperty();
            DavPropertyName davName = getDavName(p.getName(),
            String valueString = p.getValue().getString();
            exportContext.setProperty(davName, valueString);
            if (log.isDebugEnabled()) log.debug("exporting property name=" +
", davName=" + davName + ", value=" + valueString);
        return true;
     * @see PropertyHandler#canExport(PropertyExportContext context, boolean
    public boolean canExport(PropertyExportContext context, boolean
        if (context == null || context.isCompleted()) 
            return false;
        //END CCC
        return isCollection && context.getExportRoot() != null;
    private DavPropertyName getDavName(String jcrName, Session session)
throws RepositoryException 
        // make sure the local name is xml compliant
        String localName = ISO9075.encode(Text.getLocalName(jcrName));
        String prefix = Text.getNamespacePrefix(jcrName);
        String uri = session.getNamespaceURI(prefix);
        Namespace namespace = Namespace.getNamespace(prefix, uri);
        DavPropertyName name = DavPropertyName.create(localName, namespace);
        return name;

     * @see PropertyHandler#canImport(PropertyExportContext context, boolean
	public boolean canImport(PropertyImportContext context, boolean
		return false;

     * @see PropertyHandler#importProperties(PropertyImportContext
importContext, boolean isCollection) 
	public Map importProperties(PropertyImportContext importContext,
boolean isCollection) throws RepositoryException
		String msg = "importProperties should not be called; this is
only an export handler";
		throw new RepositoryException(msg);

View raw message