You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by st...@apache.org on 2007/09/24 17:54:49 UTC

svn commit: r578863 - in /jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core: lock/LockImpl.java nodetype/EffectiveNodeType.java nodetype/ItemDefinitionImpl.java nodetype/NodeDefinitionImpl.java nodetype/NodeTypeImpl.java

Author: stefan
Date: Mon Sep 24 08:54:47 2007
New Revision: 578863

URL: http://svn.apache.org/viewvc?rev=578863&view=rev
Log:
JCR-1104: JSR 283 support

work in (slow) progress...

Modified:
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/lock/LockImpl.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/EffectiveNodeType.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/ItemDefinitionImpl.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/NodeDefinitionImpl.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/NodeTypeImpl.java

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/lock/LockImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/lock/LockImpl.java?rev=578863&r1=578862&r2=578863&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/lock/LockImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/lock/LockImpl.java Mon Sep 24 08:54:47 2007
@@ -48,7 +48,7 @@
         this.node = node;
     }
 
-    //------------------------------------------------------------------< Lock >
+    //-----------------------------------------------------------------< Lock >
 
     /**
      * {@inheritDoc}
@@ -109,5 +109,23 @@
             throw new LockException("Session does not hold lock.");
         }
         // since a lock has no expiration date no other action is required
+    }
+
+    //--------------------------------------------------< new JSR 283 methods >
+    /**
+     * Returns <code>true</code> if the current session is the owner of this
+     * lock, either because it is session-scoped and bound to this session or
+     * open-scoped and this session currently holds the token for this lock.
+     * Returns <code>false</code> otherwise.
+     *
+     * @return a <code>boolean</code>.
+     * @since JCR 2.0
+     */
+    public boolean isLockOwningSession() {
+        try {
+            return info.getLockHolder().equals(node.getSession());
+        } catch (RepositoryException e) {
+            return false;
+        }
     }
 }

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/EffectiveNodeType.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/EffectiveNodeType.java?rev=578863&r1=578862&r2=578863&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/EffectiveNodeType.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/EffectiveNodeType.java Mon Sep 24 08:54:47 2007
@@ -905,6 +905,50 @@
     }
 
     /**
+     * @param name
+     * @throws ConstraintViolationException
+     */
+    public void checkRemoveNodeConstraints(QName name) throws ConstraintViolationException {
+        /**
+         * as there might be multiple definitions with the same name and we
+         * don't know which one is applicable, we check all of them
+         */
+        ItemDef[] defs = getNamedNodeDefs(name);
+        if (defs != null) {
+            for (int i = 0; i < defs.length; i++) {
+                if (defs[i].isMandatory()) {
+                    throw new ConstraintViolationException("can't remove mandatory node");
+                }
+                if (defs[i].isProtected()) {
+                    throw new ConstraintViolationException("can't remove protected node");
+                }
+            }
+        }
+    }
+
+    /**
+     * @param name
+     * @throws ConstraintViolationException
+     */
+    public void checkRemovePropertyConstraints(QName name) throws ConstraintViolationException {
+        /**
+         * as there might be multiple definitions with the same name and we
+         * don't know which one is applicable, we check all of them
+         */
+        ItemDef[] defs = getNamedPropDefs(name);
+        if (defs != null) {
+            for (int i = 0; i < defs.length; i++) {
+                if (defs[i].isMandatory()) {
+                    throw new ConstraintViolationException("can't remove mandatory property");
+                }
+                if (defs[i].isProtected()) {
+                    throw new ConstraintViolationException("can't remove protected property");
+                }
+            }
+        }
+    }
+
+    /**
      * Merges another <code>EffectiveNodeType</code> with this one.
      * Checks for merge conflicts.
      *

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/ItemDefinitionImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/ItemDefinitionImpl.java?rev=578863&r1=578862&r2=578863&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/ItemDefinitionImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/ItemDefinitionImpl.java Mon Sep 24 08:54:47 2007
@@ -119,7 +119,7 @@
                 return NameFormat.format(itemDef.getName(), nsResolver);
             } catch (NoPrefixDeclaredException npde) {
                 // should never get here
-                log.error("encountered unregistered namespace in property name",
+                log.error("encountered unregistered namespace in item name",
                         npde);
                 // not correct, but an acceptable fallback
                 return itemDef.getName().toString();

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/NodeDefinitionImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/NodeDefinitionImpl.java?rev=578863&r1=578862&r2=578863&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/NodeDefinitionImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/NodeDefinitionImpl.java Mon Sep 24 08:54:47 2007
@@ -18,6 +18,8 @@
 
 import org.apache.jackrabbit.name.NamespaceResolver;
 import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.name.NameFormat;
+import org.apache.jackrabbit.name.NoPrefixDeclaredException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -105,6 +107,78 @@
      */
     public boolean allowsSameNameSiblings() {
         return ((NodeDef) itemDef).allowsSameNameSiblings();
+    }
+
+    //--------------------------------------------------< new JSR 283 methods >
+    /**
+     * Returns the names of the required primary node types.
+     * <p/>
+     * If this <code>NodeDefinition</code> is acquired from a live
+     * <code>NodeType</code> this list will reflect the node types returned by
+     * <code>getRequiredPrimaryTypes</code>, above.
+     * <p/>
+     * If this <code>NodeDefinition</code> is actually a
+     * <code>NodeDefinitionTemplate</code> that is not part of a registered node
+     * type, then this method will return the required primary types as set in
+     * that template. If that template is a newly-created empty one, then this
+     * method will return an array containing a single string indicating the
+     * node type <code>nt:base</code>.
+     *
+     * @return a String array
+     * @since JCR 2.0
+     */
+    public String[] getRequiredPrimaryTypeNames() {
+        QName[] ntNames = ((NodeDef) itemDef).getRequiredPrimaryTypes();
+        try {
+            if (ntNames == null || ntNames.length == 0) {
+                // return "nt:base"
+                return new String[] {NameFormat.format(QName.NT_BASE, nsResolver)};
+            } else {
+                String[] names = new String[ntNames.length];
+                for (int i = 0; i < ntNames.length; i++) {
+                    names[i] = NameFormat.format(ntNames[i], nsResolver);
+                }
+                return names;
+            }
+        } catch (NoPrefixDeclaredException npde) {
+            // should never get here
+            log.error("encountered unregistered namespace in node type name",
+                    npde);
+            return new String[0];
+        }
+    }
+
+    /**
+     * Returns the name of the default primary node type.
+     * <p/>
+     * If this <code>NodeDefinition</code> is acquired from a live
+     * <code>NodeType</code> this list will reflect the NodeType returned by
+     * getDefaultPrimaryType, above.
+     * <p/>
+     * If this <code>NodeDefinition</code> is actually a
+     * <code>NodeDefinitionTemplate</code> that is not part of a registered node
+     * type, then this method will return the required primary types as set in
+     * that template. If that template is a newly-created empty one, then this
+     * method will return <code>null</code>.
+     *
+     * @return a String
+     * @since JCR 2.0
+     */
+    public String getDefaultPrimaryTypeName() {
+        QName ntName = ((NodeDef) itemDef).getDefaultPrimaryType();
+        if (ntName == null) {
+            return null;
+        }
+
+        try {
+            return NameFormat.format(ntName, nsResolver);
+        } catch (NoPrefixDeclaredException npde) {
+            // should never get here
+            log.error("encountered unregistered namespace in node type name",
+                    npde);
+            // not correct, but an acceptable fallback
+            return ntName.toString();
+        }
     }
 }
 

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/NodeTypeImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/NodeTypeImpl.java?rev=578863&r1=578862&r2=578863&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/NodeTypeImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/NodeTypeImpl.java Mon Sep 24 08:54:47 2007
@@ -541,4 +541,47 @@
         }
         return propDefs;
     }
+
+    //--------------------------------------------------< new JSR 283 methods >
+    /**
+     * Returns <code>true</code> if removing the child node called
+     * <code>nodeName</code> is allowed by this node type. Returns
+     * <code>false</code> otherwise.
+     *
+     * @param nodeName The name of the child node
+     * @return a boolean
+     * @since JCR 2.0
+     */
+    public boolean canRemoveNode(String nodeName) {
+        try {
+            ent.checkRemoveNodeConstraints(NameFormat.parse(nodeName, nsResolver));
+            return true;
+        } catch (NameException be) {
+            // implementation specific exception, fall through
+        } catch (RepositoryException re) {
+            // fall through
+        }
+        return false;
+    }
+
+    /**
+     * Returns <code>true</code> if removing the property called
+     * <code>propertyName</code> is allowed by this node type. Returns
+     * <code>false</code> otherwise.
+     *
+     * @param propertyName The name of the property
+     * @return a boolean
+     * @since JCR 2.0
+     */
+    public boolean canRemoveProperty(String propertyName) {
+        try {
+            ent.checkRemovePropertyConstraints(NameFormat.parse(propertyName, nsResolver));
+            return true;
+        } catch (NameException be) {
+            // implementation specific exception, fall through
+        } catch (RepositoryException re) {
+            // fall through
+        }
+        return false;
+    }
 }