You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by re...@apache.org on 2008/04/18 16:15:13 UTC

svn commit: r649548 - in /jackrabbit/trunk: jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/ jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/nodetype/ jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/...

Author: reschke
Date: Fri Apr 18 07:15:10 2008
New Revision: 649548

URL: http://svn.apache.org/viewvc?rev=649548&view=rev
Log:
JCR-1543: add QNodeTypeDefinition.getSupportedMixins(), use it for JCR2SPI's Node.canAddMixin.

Modified:
    jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/NodeImpl.java
    jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/nodetype/EffectiveNodeType.java
    jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/nodetype/EffectiveNodeTypeImpl.java
    jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/QNodeTypeDefinitionImpl.java
    jackrabbit/trunk/jackrabbit-spi/src/main/java/org/apache/jackrabbit/spi/QNodeTypeDefinition.java

Modified: jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/NodeImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/NodeImpl.java?rev=649548&r1=649547&r2=649548&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/NodeImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/NodeImpl.java Fri Apr 18 07:15:10 2008
@@ -1446,6 +1446,12 @@
         Name[] existingNts = getNodeState().getNodeTypeNames();
         // build effective node type representing primary type including existing mixin's
         EffectiveNodeType entExisting = session.getEffectiveNodeTypeProvider().getEffectiveNodeType(existingNts);
+        
+        // check if the base type supports adding this mixin
+        if (! entExisting.supportsMixin(mixinName)) {
+            log.debug(mixin.getName() + ": not supported on node type " + primaryTypeName);
+            return false;
+        }
 
         // check if adding new mixin conflicts with existing nodetypes
         if (entExisting.includesNodeType(mixinName)) {

Modified: jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/nodetype/EffectiveNodeType.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/nodetype/EffectiveNodeType.java?rev=649548&r1=649547&r2=649548&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/nodetype/EffectiveNodeType.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/nodetype/EffectiveNodeType.java Fri Apr 18 07:15:10 2008
@@ -43,6 +43,15 @@
      *         <code>false</code>
      */
     public boolean includesNodeType(Name nodeTypeName);
+    
+    /**
+     * Determines whether this effective node type supports adding
+     * the specified mixin.
+     * @param mixin name of mixin type
+     * @return <code>true</code> if the mixin type is supported, otherwise
+     *         <code>false</code>
+     */
+    public boolean supportsMixin(Name mixin);
 
     /**
      * Determines whether this effective node type representation includes

Modified: jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/nodetype/EffectiveNodeTypeImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/nodetype/EffectiveNodeTypeImpl.java?rev=649548&r1=649547&r2=649548&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/nodetype/EffectiveNodeTypeImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/nodetype/EffectiveNodeTypeImpl.java Fri Apr 18 07:15:10 2008
@@ -58,6 +58,8 @@
     private final HashMap namedItemDefs;
     // list of unnamed item definitions (i.e. residual definitions)
     private final ArrayList unnamedItemDefs;
+    // (optional) set of additional mixins supported on node type
+    private Set supportedMixins;
 
     /**
      * private constructor.
@@ -68,6 +70,7 @@
         allNodeTypes = new TreeSet();
         namedItemDefs = new HashMap();
         unnamedItemDefs = new ArrayList();
+        supportedMixins = null;
     }
 
     /**
@@ -93,6 +96,15 @@
         ent.mergedNodeTypes.add(ntName);
         ent.allNodeTypes.add(ntName);
 
+        Name[] smixins = ntd.getSupportedMixinTypes();
+    
+        if (smixins != null) {
+            ent.supportedMixins = new HashSet();
+            for (int i = 0; i < smixins.length; i++) {
+                ent.supportedMixins.add(smixins[i]);
+            }
+        }
+        
         // map of all item definitions (maps id to definition)
         // used to effectively detect ambiguous child definitions where
         // ambiguity is defined in terms of definition identity
@@ -206,15 +218,6 @@
         return ent;
     }
 
-    /**
-     * Factory method: creates a new 'empty' effective node type instance
-     *
-     * @return a new EffectiveNodeType
-     */
-    static EffectiveNodeType create() {
-        return new EffectiveNodeTypeImpl();
-    }
-
     //--------------------------------------------------< EffectiveNodeType >---
     /**
      * @see EffectiveNodeType#getInheritedNodeTypes()
@@ -511,6 +514,19 @@
 
     /**
      * @inheritDoc
+     * @see EffectiveNodeType#supportsMixin(Name)
+     */
+    public boolean supportsMixin(Name mixin) {
+        if (supportedMixins == null) {
+            return true;
+        }
+        else {
+            return supportedMixins.contains(mixin);
+        }
+    }
+
+    /**
+     * @inheritDoc
      * @see EffectiveNodeType#checkAddNodeConstraints(Name, ItemDefinitionProvider)
      */
     public void checkAddNodeConstraints(Name name, ItemDefinitionProvider definitionProvider)
@@ -812,6 +828,11 @@
             clone.namedItemDefs.put(key, new ArrayList(list));
         }
         clone.unnamedItemDefs.addAll(unnamedItemDefs);
+        
+        if (supportedMixins != null) {
+            clone.supportedMixins = new HashSet();
+            clone.supportedMixins.addAll(supportedMixins);
+        }
 
         return clone;
     }

Modified: jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/QNodeTypeDefinitionImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/QNodeTypeDefinitionImpl.java?rev=649548&r1=649547&r2=649548&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/QNodeTypeDefinitionImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/QNodeTypeDefinitionImpl.java Fri Apr 18 07:15:10 2008
@@ -46,6 +46,11 @@
     private final Name[] supertypes;
 
     /**
+     * The names of the supported mixins on this node type (or <code>null</code>)
+     */
+    private final Name[] supportedMixins;
+
+    /**
      * Indicates whether this is a mixin node type definition.
      */
     private final boolean isMixin;
@@ -99,9 +104,42 @@
      *                               <code>null</code>.
      * @param declaredPropDefs       the declared property definitions.
      * @param declaredNodeDefs       the declared child node definitions.
+     * @deprecated use {@link #QNodeTypeDefinitionImpl(Name, Name[], Name[], boolean, boolean, Name, QPropertyDefinition[], QNodeDefinition[])}
+     */
+    public QNodeTypeDefinitionImpl(Name name,
+                                   Name[] supertypes,
+                                   boolean isMixin,
+                                   boolean hasOrderableChildNodes,
+                                   Name primaryItemName,
+                                   QPropertyDefinition[] declaredPropDefs,
+                                   QNodeDefinition[] declaredNodeDefs) {
+        this.name = name;
+        this.supertypes = supertypes;
+        this.supportedMixins = null;
+        this.isMixin = isMixin;
+        this.hasOrderableChildNodes = hasOrderableChildNodes;
+        this.primaryItemName = primaryItemName;
+        this.propertyDefs = getSerializablePropertyDefs(declaredPropDefs);
+        this.childNodeDefs = getSerializableNodeDefs(declaredNodeDefs);
+    }
+
+    /**
+     * Creates a new serializable qualified node type definition.
+     *
+     * @param name                   the name of the node type
+     * @param supertypes             the names of the supertypes
+     * @param supportedMixins        the names of supported mixins (or <code>null</code>)
+     * @param isMixin                if this is a mixin node type
+     * @param hasOrderableChildNodes if this node type has orderable child
+     *                               nodes.
+     * @param primaryItemName        the name of the primary item, or
+     *                               <code>null</code>.
+     * @param declaredPropDefs       the declared property definitions.
+     * @param declaredNodeDefs       the declared child node definitions.
      */
     public QNodeTypeDefinitionImpl(Name name,
                                    Name[] supertypes,
+                                   Name[] supportedMixins,
                                    boolean isMixin,
                                    boolean hasOrderableChildNodes,
                                    Name primaryItemName,
@@ -109,6 +147,7 @@
                                    QNodeDefinition[] declaredNodeDefs) {
         this.name = name;
         this.supertypes = supertypes;
+        this.supportedMixins = supportedMixins;
         this.isMixin = isMixin;
         this.hasOrderableChildNodes = hasOrderableChildNodes;
         this.primaryItemName = primaryItemName;
@@ -216,7 +255,18 @@
         }
         return dependencies;
     }
-
+    
+    public Name[] getSupportedMixinTypes() {
+        if (supportedMixins == null) {
+            return null;
+        }
+        else {
+            Name[] mixins = new Name[supportedMixins.length];
+            System.arraycopy(supportedMixins, 0, mixins, 0, supportedMixins.length);
+            return mixins;
+        }
+    }
+    
     //-------------------------------< internal >-------------------------------
 
     /**

Modified: jackrabbit/trunk/jackrabbit-spi/src/main/java/org/apache/jackrabbit/spi/QNodeTypeDefinition.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-spi/src/main/java/org/apache/jackrabbit/spi/QNodeTypeDefinition.java?rev=649548&r1=649547&r2=649548&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-spi/src/main/java/org/apache/jackrabbit/spi/QNodeTypeDefinition.java (original)
+++ jackrabbit/trunk/jackrabbit-spi/src/main/java/org/apache/jackrabbit/spi/QNodeTypeDefinition.java Fri Apr 18 07:15:10 2008
@@ -48,6 +48,17 @@
     public Name[] getSupertypes();
 
     /**
+     * Returns an array containing the names of additional mixin types
+     * supported on this node type.
+     * <p>
+     * The returned array must not be modified by the application.
+     *
+     * @return an array of mixin type names, or <code>null</code>
+     * when there are no known constraints.
+     */
+    public Name[] getSupportedMixinTypes();
+
+    /**
      * Returns the value of the mixin flag.
      *
      * @return true if this is a mixin node type; false otherwise.