You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by an...@apache.org on 2010/02/23 17:32:01 UTC

svn commit: r915415 - /jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/

Author: angela
Date: Tue Feb 23 16:32:00 2010
New Revision: 915415

URL: http://svn.apache.org/viewvc?rev=915415&view=rev
Log:
JCR-2514: spi2dav: Drop Q*DefinitionImpl implementations and use spi-commons Q*DefinitionBuilder

Added:
    jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/DefinitionUtil.java   (with props)
Removed:
    jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/QItemDefinitionImpl.java
    jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/QNodeDefinitionImpl.java
    jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/QNodeTypeDefinitionImpl.java
    jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/QPropertyDefinitionImpl.java
Modified:
    jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java

Added: jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/DefinitionUtil.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/DefinitionUtil.java?rev=915415&view=auto
==============================================================================
--- jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/DefinitionUtil.java (added)
+++ jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/DefinitionUtil.java Tue Feb 23 16:32:00 2010
@@ -0,0 +1,302 @@
+/*
+ * 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,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.spi2dav;
+
+import org.apache.jackrabbit.spi.Name;
+import org.apache.jackrabbit.spi.QNodeDefinition;
+import org.apache.jackrabbit.spi.QNodeTypeDefinition;
+import org.apache.jackrabbit.spi.QPropertyDefinition;
+import org.apache.jackrabbit.spi.QValue;
+import org.apache.jackrabbit.spi.QValueFactory;
+import org.apache.jackrabbit.spi.commons.conversion.NameException;
+import org.apache.jackrabbit.spi.commons.conversion.NamePathResolver;
+import org.apache.jackrabbit.spi.commons.name.NameConstants;
+import org.apache.jackrabbit.spi.commons.nodetype.QItemDefinitionBuilder;
+import org.apache.jackrabbit.spi.commons.nodetype.QNodeDefinitionBuilder;
+import org.apache.jackrabbit.spi.commons.nodetype.QPropertyDefinitionBuilder;
+import org.apache.jackrabbit.spi.commons.nodetype.QNodeTypeDefinitionBuilder;
+import org.apache.jackrabbit.spi.commons.nodetype.constraint.ValueConstraint;
+import org.apache.jackrabbit.spi.commons.value.ValueFactoryQImpl;
+import org.apache.jackrabbit.spi.commons.value.ValueFormat;
+import org.apache.jackrabbit.webdav.jcr.nodetype.NodeTypeConstants;
+import org.apache.jackrabbit.webdav.xml.DomUtil;
+import org.apache.jackrabbit.webdav.xml.ElementIterator;
+import org.w3c.dom.Element;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.jcr.PropertyType;
+import javax.jcr.RepositoryException;
+import javax.jcr.Value;
+import javax.jcr.version.OnParentVersionAction;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Utility to build <code>QNodeTypeDefinition</code>, <code>QNodeDefinition</code>
+ * and <code>QPropertyDefinition</code> from the information retrieved from the
+ * WebDAV response body.
+ */
+class DefinitionUtil implements NodeTypeConstants {
+
+    private static Logger log = LoggerFactory.getLogger(DefinitionUtil.class);
+
+    /**
+     * Avoid instantiation.
+     */
+    private DefinitionUtil() {}
+
+    /**
+     * 
+     * @param declaringNodeType
+     * @param ndefElement
+     * @param resolver
+     * @return
+     * @throws RepositoryException
+     */
+    static QNodeDefinition createQNodeDefinition(Name declaringNodeType, Element ndefElement, NamePathResolver resolver) throws RepositoryException {
+        QNodeDefinitionBuilder builder = new QNodeDefinitionBuilder();
+
+        buildQItemDefinition(declaringNodeType, ndefElement, resolver, builder);
+        
+        // TODO: webdav server sends jcr names -> nsResolver required. improve this.
+        // NOTE: the server should send the namespace-mappings as addition ns-defininitions
+        try {
+
+            if (ndefElement.hasAttribute(DEFAULTPRIMARYTYPE_ATTRIBUTE)) {
+                Name defaultPrimaryType = resolver.getQName(ndefElement.getAttribute(DEFAULTPRIMARYTYPE_ATTRIBUTE));
+                builder.setDefaultPrimaryType(defaultPrimaryType);
+            }
+
+            Element reqPrimaryTypes = DomUtil.getChildElement(ndefElement, REQUIREDPRIMARYTYPES_ELEMENT, null);
+            if (reqPrimaryTypes != null) {
+                ElementIterator it = DomUtil.getChildren(reqPrimaryTypes, REQUIREDPRIMARYTYPE_ELEMENT, null);
+                while (it.hasNext()) {
+                    builder.addRequiredPrimaryType(resolver.getQName(DomUtil.getTextTrim(it.nextElement())));
+                }
+            } else {
+                builder.addRequiredPrimaryType(NameConstants.NT_BASE);
+            }
+
+            if (ndefElement.hasAttribute(SAMENAMESIBLINGS_ATTRIBUTE)) {
+                builder.setAllowsSameNameSiblings(Boolean.valueOf(ndefElement.getAttribute(SAMENAMESIBLINGS_ATTRIBUTE)));
+            }
+        } catch (NameException e) {
+            throw new RepositoryException(e);
+        }
+        return builder.build();
+    }
+
+    /**
+     * 
+     * @param declaringNodeType
+     * @param pdefElement
+     * @param resolver
+     * @param qValueFactory
+     * @return
+     * @throws RepositoryException
+     */
+    static QPropertyDefinition createQPropertyDefinition(Name declaringNodeType, Element pdefElement,
+                                                  NamePathResolver resolver, QValueFactory qValueFactory) throws RepositoryException {
+        QPropertyDefinitionBuilder builder = new QPropertyDefinitionBuilder();
+
+        buildQItemDefinition(declaringNodeType, pdefElement, resolver, builder);
+
+        if (pdefElement.hasAttribute(REQUIREDTYPE_ATTRIBUTE)) {
+            builder.setRequiredType(PropertyType.valueFromName(pdefElement.getAttribute(REQUIREDTYPE_ATTRIBUTE)));
+        }
+
+        if (pdefElement.hasAttribute(MULTIPLE_ATTRIBUTE)) {
+            builder.setMultiple(Boolean.valueOf(pdefElement.getAttribute(MULTIPLE_ATTRIBUTE)));
+        }
+
+        if (pdefElement.hasAttribute(FULL_TEXT_SEARCHABLE_ATTRIBUTE)) {
+            builder.setFullTextSearchable(Boolean.valueOf(pdefElement.getAttribute(FULL_TEXT_SEARCHABLE_ATTRIBUTE)));
+        }
+        if (pdefElement.hasAttribute(QUERY_ORDERABLE_ATTRIBUTE)) {
+            builder.setQueryOrderable(Boolean.valueOf(pdefElement.getAttribute(QUERY_ORDERABLE_ATTRIBUTE)));
+        }
+
+        int requiredType = builder.getRequiredType();                
+        Element child = DomUtil.getChildElement(pdefElement, DEFAULTVALUES_ELEMENT, null);
+        if (child != null) {
+            ElementIterator it = DomUtil.getChildren(child, DEFAULTVALUE_ELEMENT, null);
+            while (it.hasNext()) {
+                String jcrVal = DomUtil.getText(it.nextElement());
+                if (jcrVal == null) {
+                    jcrVal = "";
+                }
+                QValue qValue;
+                if (requiredType == PropertyType.BINARY) {
+                    // TODO: improve
+                    Value v = new ValueFactoryQImpl(qValueFactory, resolver).createValue(jcrVal, requiredType);
+                    qValue = ValueFormat.getQValue(v, resolver, qValueFactory);
+                } else {
+                    qValue = ValueFormat.getQValue(jcrVal, requiredType, resolver, qValueFactory);
+                }
+                builder.addDefaultValue(qValue);
+            }
+        } // else: no default values defined.
+
+        child = DomUtil.getChildElement(pdefElement, VALUECONSTRAINTS_ELEMENT, null);
+        if (child != null) {
+            ElementIterator it = DomUtil.getChildren(child, VALUECONSTRAINT_ELEMENT, null);
+            while (it.hasNext()) {
+                String qValue = DomUtil.getText(it.nextElement());
+                // in case of name and path constraint, the value must be
+                // converted to SPI values
+                // TODO: tobefixed. path-constraint may contain trailing *
+                builder.addValueConstraint(ValueConstraint.create(requiredType, qValue, resolver));
+            }
+        }
+
+        child = DomUtil.getChildElement(pdefElement, AVAILABLE_QUERY_OPERATORS_ELEMENT, null);
+        if (child == null) {
+            builder.setAvailableQueryOperators(new String[0]);
+        } else {
+            List<String> names = new ArrayList<String>();
+            ElementIterator it = DomUtil.getChildren(child, AVAILABLE_QUERY_OPERATOR_ELEMENT, null);
+            while (it.hasNext()) {
+                String str = DomUtil.getText(it.nextElement());
+                names.add(str);
+            }
+            builder.setAvailableQueryOperators(names.toArray(new String[names.size()]));
+        }
+
+        return builder.build();
+    }
+
+    static QNodeTypeDefinition createQNodeTypeDefinition(Element ntdElement, NamePathResolver resolver,
+                                                         QValueFactory qValueFactory)
+            throws RepositoryException {
+        QNodeTypeDefinitionBuilder builder = new QNodeTypeDefinitionBuilder();
+
+        // TODO: webdav-server currently sends jcr-names -> conversion needed
+        // NOTE: the server should send the namespace-mappings as addition ns-defininitions
+        try {
+            if (ntdElement.hasAttribute(NAME_ATTRIBUTE)) {
+                builder.setName(resolver.getQName(ntdElement.getAttribute(NAME_ATTRIBUTE)));
+            }
+
+            if (ntdElement.hasAttribute(PRIMARYITEMNAME_ATTRIBUTE)) {
+                builder.setPrimaryItemName(resolver.getQName(ntdElement.getAttribute(PRIMARYITEMNAME_ATTRIBUTE)));
+            }
+
+            Element child = DomUtil.getChildElement(ntdElement, SUPERTYPES_ELEMENT, null);
+            if (child != null) {
+                ElementIterator stIter = DomUtil.getChildren(child, SUPERTYPE_ELEMENT, null);
+                List<Name> qNames = new ArrayList<Name>();
+                while (stIter.hasNext()) {
+                    Name st = resolver.getQName(DomUtil.getTextTrim(stIter.nextElement()));
+                    qNames.add(st);
+                }
+                builder.setSupertypes(qNames.toArray(new Name[qNames.size()]));
+            }
+            if (ntdElement.hasAttribute(ISMIXIN_ATTRIBUTE)) {
+                builder.setMixin(Boolean.valueOf(ntdElement.getAttribute(ISMIXIN_ATTRIBUTE)));
+            }
+            if (ntdElement.hasAttribute(HASORDERABLECHILDNODES_ATTRIBUTE)) {
+                builder.setOrderableChildNodes(Boolean.valueOf(ntdElement.getAttribute(HASORDERABLECHILDNODES_ATTRIBUTE)));
+            }
+            if (ntdElement.hasAttribute(ISABSTRACT_ATTRIBUTE)) {
+                builder.setAbstract(Boolean.valueOf(ntdElement.getAttribute(ISABSTRACT_ATTRIBUTE)));
+            }
+            if (ntdElement.hasAttribute(ISQUERYABLE_ATTRIBUTE)) {
+                builder.setQueryable(Boolean.valueOf(ntdElement.getAttribute(ISQUERYABLE_ATTRIBUTE)));
+            }
+
+            // nodeDefinitions
+            ElementIterator it = DomUtil.getChildren(ntdElement, CHILDNODEDEFINITION_ELEMENT, null);
+            List<QNodeDefinition> nds = new ArrayList<QNodeDefinition>();
+            while (it.hasNext()) {
+                nds.add(createQNodeDefinition(builder.getName(), it.nextElement(), resolver));
+            }
+            builder.setChildNodeDefs(nds.toArray(new QNodeDefinition[nds.size()]));
+
+            // propertyDefinitions
+            it = DomUtil.getChildren(ntdElement, PROPERTYDEFINITION_ELEMENT, null);
+            List<QPropertyDefinition> pds = new ArrayList<QPropertyDefinition>();
+            while (it.hasNext()) {
+                pds.add(createQPropertyDefinition(builder.getName(), it.nextElement(), resolver, qValueFactory));
+            }
+            builder.setPropertyDefs(pds.toArray(new QPropertyDefinition[pds.size()]));
+        } catch (NameException e) {
+            log.error(e.getMessage());
+            throw new RepositoryException(e);
+        }
+
+        return builder.build();
+    }
+
+    /**
+     * 
+     * @param declaringNodeType
+     * @param itemDefElement
+     * @param resolver
+     * @param builder
+     * @throws RepositoryException
+     */
+    private static void buildQItemDefinition(Name declaringNodeType,
+                                             Element itemDefElement,
+                                             NamePathResolver resolver,
+                                             QItemDefinitionBuilder builder) throws RepositoryException {
+        try {
+            String attr = itemDefElement.getAttribute(DECLARINGNODETYPE_ATTRIBUTE);
+            if (attr != null) {
+                Name dnt = resolver.getQName(attr);
+                if (declaringNodeType != null && !declaringNodeType.equals(dnt)) {
+                    throw new RepositoryException("Declaring nodetype mismatch: In element = '" + dnt + "', Declaring nodetype = '" + declaringNodeType + "'");
+                }
+                builder.setDeclaringNodeType(dnt);
+            } else {
+                builder.setDeclaringNodeType(declaringNodeType);
+            }
+
+            if (itemDefElement.hasAttribute(NAME_ATTRIBUTE)) {
+                String nAttr = itemDefElement.getAttribute(NAME_ATTRIBUTE);
+                if (nAttr.length() > 0) {
+                    builder.setName((isAnyName(nAttr)) ? NameConstants.ANY_NAME : resolver.getQName(nAttr));
+                } else {
+                    builder.setName(NameConstants.ROOT);
+                }
+            } else {
+                // TODO: check if correct..
+                builder.setName(NameConstants.ANY_NAME);
+            }
+        } catch (NameException e) {
+            throw new RepositoryException(e);
+        }
+
+        if (itemDefElement.hasAttribute(AUTOCREATED_ATTRIBUTE)) {
+            builder.setAutoCreated(Boolean.valueOf(itemDefElement.getAttribute(AUTOCREATED_ATTRIBUTE)));
+        }
+        if (itemDefElement.hasAttribute(MANDATORY_ATTRIBUTE)) {
+            builder.setMandatory(Boolean.valueOf(itemDefElement.getAttribute(MANDATORY_ATTRIBUTE)));
+        }
+        if (itemDefElement.hasAttribute(PROTECTED_ATTRIBUTE)) {
+            builder.setProtected(Boolean.valueOf(itemDefElement.getAttribute(PROTECTED_ATTRIBUTE)));
+        }
+
+        if (itemDefElement.hasAttribute(ONPARENTVERSION_ATTRIBUTE)) {
+            builder.setOnParentVersion(OnParentVersionAction.valueFromName(itemDefElement.getAttribute(ONPARENTVERSION_ATTRIBUTE)));
+        }
+    }
+
+    private static boolean isAnyName(String nameAttribute) {
+        return NameConstants.ANY_NAME.getLocalName().equals(nameAttribute);
+    }
+}
\ No newline at end of file

Propchange: jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/DefinitionUtil.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/DefinitionUtil.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision Rev URL

Modified: jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java?rev=915415&r1=915414&r2=915415&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java Tue Feb 23 16:32:00 2010
@@ -770,9 +770,9 @@
                 if (value != null && value instanceof Element) {
                     Element idfElem = (Element) value;
                     if (itemId.denotesNode()) {
-                        definition = new QNodeDefinitionImpl(null, idfElem, resolver);
+                        definition = DefinitionUtil.createQNodeDefinition(null, idfElem, resolver);
                     } else {
-                        definition = new QPropertyDefinitionImpl(null, idfElem, resolver, getQValueFactory());
+                        definition = DefinitionUtil.createQPropertyDefinition(null, idfElem, resolver, getQValueFactory());
                     }
                 }
             }
@@ -2196,7 +2196,7 @@
             List<QNodeTypeDefinition> ntDefs = new ArrayList<QNodeTypeDefinition>();
             NamePathResolver resolver = getNamePathResolver(sessionInfo);
             while (it.hasNext()) {
-                ntDefs.add(new QNodeTypeDefinitionImpl(it.nextElement(), resolver, getQValueFactory()));
+                ntDefs.add(DefinitionUtil.createQNodeTypeDefinition(it.nextElement(), resolver, getQValueFactory()));
             }
             // refresh node type definitions map
             synchronized (nodeTypeDefinitions) {