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 2004/12/08 15:13:57 UTC

svn commit: r111271 - /incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/nodetype/NodeTypeRegistry.java

Author: stefan
Date: Wed Dec  8 06:13:56 2004
New Revision: 111271

URL: http://svn.apache.org/viewcvs?view=rev&rev=111271
Log:
fixing JIRA issue JCR-25: default value with autocreated fields 
Modified:
   incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/nodetype/NodeTypeRegistry.java

Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/nodetype/NodeTypeRegistry.java
Url: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/nodetype/NodeTypeRegistry.java?view=diff&rev=111271&p1=incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/nodetype/NodeTypeRegistry.java&r1=111270&p2=incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/nodetype/NodeTypeRegistry.java&r2=111271
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/nodetype/NodeTypeRegistry.java	(original)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/nodetype/NodeTypeRegistry.java	Wed Dec  8 06:13:56 2004
@@ -111,11 +111,24 @@
     // map of id's and node definitions
     private final HashMap nodeDefs;
 
-    // namespace registry for resolving prefixes and namespace URI's;
-    // used for (de)serializing node type definitions
+    /**
+     * namespace registry for resolving prefixes and namespace URI's;
+     * used for (de)serializing node type definitions
+     */
     private final NamespaceRegistryImpl nsReg;
 
     /**
+     * FIXME
+     * flag used to temporarily disable checking that auto-created properties
+     * have a default value; this check has to be disabled while validating
+     * built-in node types because there are properties defined in built-in
+     * node types which are auto-created but don't have a fixed default value
+     * that can be exposed in a property definition because it is
+     * system-generated (e.g. jcr:primaryType in nt:base).
+     */
+    private boolean checkAutoCreatePropHasDefault = true;
+
+    /**
      * Listeners (soft references)
      */
     private final Map listeners =
@@ -168,6 +181,11 @@
         nodeDefs.put(new NodeDefId(rootNodeDef), rootNodeDef);
 
         // load and register pre-defined (i.e. built-in) node types
+        /**
+         * temporarily disable checking that auto-create properties have
+         * default values
+         */
+        checkAutoCreatePropHasDefault = false;
         builtInNTDefs = new NodeTypeDefStore();
         InputStream in = null;
         try {
@@ -183,6 +201,10 @@
             log.error(error, intde);
             throw new RepositoryException(error, intde);
         } finally {
+            /**
+             * re-enable checking that auto-create properties have default values
+             */
+            checkAutoCreatePropHasDefault = true;
             if (in != null) {
                 try {
                     in.close();
@@ -427,12 +449,13 @@
                  * (won't trap recursion on a deeper inheritance level)
                  */
                 if (name.equals(supertypes[i])) {
-                    String msg = "invalid supertype: " + supertypes[i] + " (infinite recursion))";
+                    String msg = "[" + name + "] invalid supertype: "
+                            + supertypes[i] + " (infinite recursion))";
                     log.error(msg);
                     throw new InvalidNodeTypeDefException(msg);
                 }
                 if (!registeredNTDefs.containsKey(supertypes[i])) {
-                    String msg = "invalid supertype: " + supertypes[i];
+                    String msg = "[" + name + "] invalid supertype: " + supertypes[i];
                     log.error(msg);
                     throw new InvalidNodeTypeDefException(msg);
                 }
@@ -464,23 +487,25 @@
                 // make sure that all primary types except nt:base extend from nt:base
                 if (!ntd.isMixin() && !NT_BASE.equals(ntd.getName()) &&
                         !est.includesNodeType(NT_BASE)) {
-                    String msg = "all primary node types except nt:base itself must be (directly or indirectly) derived from nt:base";
+                    String msg = "[" + name
+                            + "] all primary node types except nt:base itself must be (directly or indirectly) derived from nt:base";
                     log.error(msg);
                     throw new InvalidNodeTypeDefException(msg);
                 }
             } catch (NodeTypeConflictException ntce) {
-                String msg = "failed to validate supertypes";
+                String msg = "[" + name + "] failed to validate supertypes";
                 log.error(msg, ntce);
                 throw new InvalidNodeTypeDefException(msg, ntce);
             } catch (NoSuchNodeTypeException nsnte) {
-                String msg = "failed to validate supertypes";
+                String msg = "[" + name + "] failed to validate supertypes";
                 log.error(msg, nsnte);
                 throw new InvalidNodeTypeDefException(msg, nsnte);
             }
         } else {
             // no supertypes specified: has to be either a mixin type or nt:base
             if (!ntd.isMixin() && !NT_BASE.equals(ntd.getName())) {
-                String msg = "all primary node types except nt:base itself must be (directly or indirectly) derived from nt:base";
+                String msg = "[" + name
+                        + "] all primary node types except nt:base itself must be (directly or indirectly) derived from nt:base";
                 log.error(msg);
                 throw new InvalidNodeTypeDefException(msg);
             }
@@ -495,12 +520,12 @@
             // check primary item flag
             if (pd.isPrimaryItem()) {
                 if (pd.definesResidual()) {
-                    String msg = "primary item must specify a name";
+                    String msg = "[" + name + "#" + pd.getName() + "] primary item must specify a name";
                     log.error(msg);
                     throw new InvalidNodeTypeDefException(msg);
                 }
                 if (primaryItem != null) {
-                    String msg = "more than one primary item specified";
+                    String msg = "[" + name + "#" + pd.getName() + "] more than one primary item specified";
                     log.error(msg);
                     throw new InvalidNodeTypeDefException(msg);
                 } else {
@@ -509,7 +534,8 @@
             }
             // check that auto-created properties specify a name
             if (pd.definesResidual() && pd.isAutoCreate()) {
-                String msg = "auto-created properties must specify a name";
+                String msg = "[" + name + "#" + pd.getName()
+                        + "] auto-created properties must specify a name";
                 log.error(msg);
                 throw new InvalidNodeTypeDefException(msg);
             }
@@ -525,16 +551,26 @@
                         reqType = defVals[j].getType();
                     } else {
                         if (defVals[j].getType() != reqType) {
-                            String msg = "type of default value(s) is not consistent with required property type";
+                            String msg = "[" + name + "#" + pd.getName()
+                                    + "] type of default value(s) is not consistent with required property type";
                             log.error(msg);
                             throw new InvalidNodeTypeDefException(msg);
                         }
                     }
                 }
+            } else {
+                // no default values specified
+                if (checkAutoCreatePropHasDefault) {
+                    // auto-created properties must have a default value
+                    if (pd.isAutoCreate()) {
+                        String msg = "[" + name + "#" + pd.getName()
+                                + "] auto-created property must have a default value";
+                        log.error(msg);
+                        throw new InvalidNodeTypeDefException(msg);
+                    }
+                }
             }
-            /**
-             * todo check that auto-created properties have have at least either default values or system generated values
-             */
+
             // check that default values satisfy value constraints
             ValueConstraint[] constraints = pd.getValueConstraints();
             if (constraints != null && constraints.length > 0) {
@@ -557,9 +593,8 @@
                         }
                         if (!satisfied) {
                             // report last exception we encountered
-                            String msg = "default value of property "
-                                    + (pd.definesResidual() ? "*" : pd.getName().toString())
-                                    + " does not satisfy value constraint";
+                            String msg = "[" + name + "#" + pd.getName()
+                                    + "] default value does not satisfy value constraint";
                             log.error(msg, cve);
                             throw new InvalidNodeTypeDefException(msg, cve);
                         }
@@ -576,9 +611,9 @@
                         ReferenceConstraint rc = (ReferenceConstraint) constraints[j];
                         QName ntName = rc.getNodeTypeName();
                         if (!name.equals(ntName) && !registeredNTDefs.containsKey(ntName)) {
-                            String msg = "invalid REFERENCE value constraint '"
-                                    + ntName + "' (unknown node type) in property definition "
-                                    + (pd.definesResidual() ? "*" : pd.getName().toString());
+                            String msg = "[" + name + "#" + pd.getName()
+                                    + "] invalid REFERENCE value constraint '"
+                                    + ntName + "' (unknown node type)";
                             log.error(msg);
                             throw new InvalidNodeTypeDefException(msg);
                         }
@@ -594,12 +629,14 @@
             // check primary item flag
             if (cnd.isPrimaryItem()) {
                 if (cnd.definesResidual()) {
-                    String msg = "primary item must specify a name";
+                    String msg = "[" + name + "#" + cnd.getName()
+                            + "] primary item must specify a name";
                     log.error(msg);
                     throw new InvalidNodeTypeDefException(msg);
                 }
                 if (primaryItem != null) {
-                    String msg = "more than one primary item specified";
+                    String msg = "[" + name + "#" + cnd.getName()
+                            + "] more than one primary item specified";
                     log.error(msg);
                     throw new InvalidNodeTypeDefException(msg);
                 } else {
@@ -608,7 +645,8 @@
             }
             // check that auto-created child-nodes specify a name
             if (cnd.definesResidual() && cnd.isAutoCreate()) {
-                String msg = "auto-created child-nodes must specify a name";
+                String msg = "[" + name + "#" + cnd.getName()
+                        + "] auto-created child-nodes must specify a name";
                 log.error(msg);
                 throw new InvalidNodeTypeDefException(msg);
             }
@@ -626,8 +664,8 @@
                  * exception: the node type just being registered
                  */
                 if (!name.equals(dpt) && !registeredNTDefs.containsKey(dpt)) {
-                    String msg = "invalid default primary type '" + dpt
-                            + "' in childnode definition " + cnd.getName();
+                    String msg = "[" + name + "#" + cnd.getName()
+                            + "] invalid default primary type '" + dpt + "'";
                     log.error(msg);
                     throw new InvalidNodeTypeDefException(msg);
                 }
@@ -658,11 +696,13 @@
                         checkForCircularNodeAutoCreation(defaultENT, definingNTs);
                     }
                 } catch (NodeTypeConflictException ntce) {
-                    String msg = "failed to validate default primary type";
+                    String msg = "[" + name + "#" + cnd.getName()
+                            + "] failed to validate default primary type";
                     log.error(msg, ntce);
                     throw new InvalidNodeTypeDefException(msg, ntce);
                 } catch (NoSuchNodeTypeException nsnte) {
-                    String msg = "failed to validate default primary type";
+                    String msg = "[" + name + "#" + cnd.getName()
+                            + "] failed to validate default primary type";
                     log.error(msg, nsnte);
                     throw new InvalidNodeTypeDefException(msg, nsnte);
                 }
@@ -686,7 +726,8 @@
                      * notable exception: the node type just being registered
                      */
                     if (!name.equals(rpt) && !registeredNTDefs.containsKey(rpt)) {
-                        String msg = "invalid required primary type: " + rpt;
+                        String msg = "[" + name + "#" + cnd.getName()
+                                + "] invalid required primary type: " + rpt;
                         log.error(msg);
                         throw new InvalidNodeTypeDefException(msg);
                     }
@@ -695,7 +736,9 @@
                      * primary type constraint
                      */
                     if (defaultENT != null && !defaultENT.includesNodeType(rpt)) {
-                        String msg = "default primary type does not satisfy required primary type constraint " + rpt;
+                        String msg = "[" + name + "#" + cnd.getName()
+                                + "] default primary type does not satisfy required primary type constraint "
+                                + rpt;
                         log.error(msg);
                         throw new InvalidNodeTypeDefException(msg);
                     }
@@ -717,11 +760,13 @@
                             }
                         }
                     } catch (NodeTypeConflictException ntce) {
-                        String msg = "failed to validate required primary type constraint";
+                        String msg = "[" + name + "#" + cnd.getName()
+                                + "] failed to validate required primary type constraint";
                         log.error(msg, ntce);
                         throw new InvalidNodeTypeDefException(msg, ntce);
                     } catch (NoSuchNodeTypeException nsnte) {
-                        String msg = "failed to validate required primary type constraint";
+                        String msg = "[" + name + "#" + cnd.getName()
+                                + "] failed to validate required primary type constraint";
                         log.error(msg, nsnte);
                         throw new InvalidNodeTypeDefException(msg, nsnte);
                     }
@@ -738,11 +783,11 @@
             try {
                 ent = EffectiveNodeType.create(this, ntd);
             } catch (NodeTypeConflictException ntce) {
-                String msg = "failed to resolve node type definition";
+                String msg = "[" + name + "] failed to resolve node type definition";
                 log.error(msg, ntce);
                 throw new InvalidNodeTypeDefException(msg, ntce);
             } catch (NoSuchNodeTypeException nsnte) {
-                String msg = "failed to resolve node type definition";
+                String msg = "[" + name + "] failed to resolve node type definition";
                 log.error(msg, nsnte);
                 throw new InvalidNodeTypeDefException(msg, nsnte);
             }