[exo-jcr-commits] exo-jcr SVN: r4268 - in jcr/trunk/exo.jcr.component.core/src: main/java/org/exoplatform/services/jcr/impl/core and 4 other directories.

do-not-reply at jboss.org do-not-reply at jboss.org
Thu Apr 21 09:27:26 EDT 2011


Author: tolusha
Date: 2011-04-21 09:27:25 -0400 (Thu, 21 Apr 2011)
New Revision: 4268

Added:
   jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/api/nodetypes/TestNodeDefinition.java
Modified:
   jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/core/nodetype/NodeTypeDataManager.java
   jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/NodeImpl.java
   jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/NodeTypeDataManagerImpl.java
   jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/version/FrozenNodeInitializer.java
   jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/version/ItemDataCopyIgnoredVisitor.java
   jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/version/ItemDataRestoreVisitor.java
   jcr/trunk/exo.jcr.component.core/src/test/resources/conf/test/wcm-nodetypes.xml
Log:
JCR-1310: Error when get node definition for node

Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/core/nodetype/NodeTypeDataManager.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/core/nodetype/NodeTypeDataManager.java	2011-04-21 13:09:24 UTC (rev 4267)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/core/nodetype/NodeTypeDataManager.java	2011-04-21 13:27:25 UTC (rev 4268)
@@ -100,6 +100,19 @@
       InternalQName[] mixinTypes) throws RepositoryException;
 
    /**
+    * Found node definition based on node name and node type. In case when
+    * suitable node definition not found first occurred residual definition will
+    * be returned.
+    *  
+    * @param nodeName
+    * @param parentNodeType
+    * @param parentMixinTypes
+    * @return
+    */
+   NodeDefinitionData getChildNodeDefinition(InternalQName nodeName, InternalQName nodeType,
+      InternalQName parentNodeType, InternalQName[] parentMixinTypes) throws RepositoryException;
+
+   /**
     * Returns the <i>direct</i> subtypes of this node type in the node type
     * inheritance hierarchy, that is, those which actually declared this node
     * type in their list of supertypes.

Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/NodeImpl.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/NodeImpl.java	2011-04-21 13:09:24 UTC (rev 4267)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/NodeImpl.java	2011-04-21 13:27:25 UTC (rev 4268)
@@ -299,7 +299,7 @@
          primaryTypeName = nodeDef.getDefaultPrimaryType();
       }
       // try to make new node
-      return doAddNode(parent, name, primaryTypeName);
+      return doAddNode(parent, name, primaryTypeName, nodeDef);
 
    }
 
@@ -345,7 +345,7 @@
       InternalQName ptName = locationFactory.parseJCRName(nodeTypeName).getInternalName();
 
       // try to make new node
-      return doAddNode(parent, name, ptName);
+      return doAddNode(parent, name, ptName, null);
    }
 
    /**
@@ -897,8 +897,8 @@
             NodeData parent = (NodeData)dataManager.getItemData(getParentIdentifier());
 
             this.definition =
-               nodeTypesHolder.getChildNodeDefinition(getInternalName(), parent.getPrimaryTypeName(), parent
-                  .getMixinTypeNames());
+               nodeTypesHolder.getChildNodeDefinition(getInternalName(), nodeData().getPrimaryTypeName(),
+                  parent.getPrimaryTypeName(), parent.getMixinTypeNames());
 
             if (definition == null)
             {
@@ -1591,8 +1591,11 @@
       }
 
       this.definition =
-         session.getWorkspace().getNodeTypesHolder().getChildNodeDefinition(getInternalName(),
-            parent.getPrimaryTypeName(), parent.getMixinTypeNames());
+         session
+            .getWorkspace()
+            .getNodeTypesHolder()
+            .getChildNodeDefinition(getInternalName(), nodeData().getPrimaryTypeName(), parent.getPrimaryTypeName(),
+               parent.getMixinTypeNames());
 
       if (definition == null)
       {
@@ -2513,8 +2516,11 @@
       }
       // Check if node is not protected
       NodeDefinitionData childNodeDefinition =
-         session.getWorkspace().getNodeTypesHolder().getChildNodeDefinition(name, nodeData().getPrimaryTypeName(),
-            nodeData().getMixinTypeNames());
+         session
+            .getWorkspace()
+            .getNodeTypesHolder()
+            .getChildNodeDefinition(name, primaryTypeName, nodeData().getPrimaryTypeName(),
+               nodeData().getMixinTypeNames());
       if (childNodeDefinition == null)
       {
          throw new ConstraintViolationException("Can't find child node definition for "
@@ -2987,14 +2993,23 @@
       return dataManager.getLastOrderNumber(nodeData()) + 1;
    }
 
-   private int getNextChildIndex(InternalQName nameToAdd, NodeData parentNode) throws RepositoryException,
-      ItemExistsException
+   /**
+    * Calculates next child node index. Is used existed node definition, if no - get one based on node name
+    * and node type. 
+    */
+   private int getNextChildIndex(InternalQName nameToAdd, InternalQName primaryTypeName, NodeData parentNode,
+      NodeDefinitionData def) throws RepositoryException, ItemExistsException
    {
+      if (def == null)
+      {
+         def =
+            session
+               .getWorkspace()
+               .getNodeTypesHolder()
+               .getChildNodeDefinition(nameToAdd, primaryTypeName, parentNode.getPrimaryTypeName(),
+                  parentNode.getMixinTypeNames());
+      }
 
-      NodeDefinitionData def =
-         session.getWorkspace().getNodeTypesHolder().getChildNodeDefinition(nameToAdd, parentNode.getPrimaryTypeName(),
-            parentNode.getMixinTypeNames());
-
       boolean allowSns = def.isAllowsSameNameSiblings();
 
       int ind = 1;
@@ -3015,27 +3030,16 @@
       };
 
       return ind;
-
-      //      int ind = 0;
-      //      for (NodeData sibling : siblings)
-      //      {
-      //         if (sibling.getQPath().getName().equals(nameToAdd))
-      //         {
-      //            if (allowSns)
-      //               ind++;
-      //            else
-      //               throw new ItemExistsException("The node " + nameToAdd + " already exists in " + getPath()
-      //                  + " and same name sibling is not allowed ");
-      //         }
-      //      }
-      //      return ind + 1;
-
    }
 
-   private NodeImpl doAddNode(NodeImpl parentNode, InternalQName name, InternalQName primaryTypeName)
-      throws ItemExistsException, RepositoryException, ConstraintViolationException, VersionException, LockException
+   /**
+    * Do add node internally. If nodeDef not null it is used in getNextChildIndex() method to
+    * avoid double calculation.
+    */
+   private NodeImpl doAddNode(NodeImpl parentNode, InternalQName name, InternalQName primaryTypeName,
+      NodeDefinitionData nodeDef) throws ItemExistsException, RepositoryException, ConstraintViolationException,
+      VersionException, LockException
    {
-
       validateChildNode(name, primaryTypeName);
 
       // Initialize data
@@ -3043,7 +3047,7 @@
       String identifier = IdGenerator.generate();
 
       int orderNum = parentNode.getNextChildOrderNum();
-      int index = parentNode.getNextChildIndex(name, parentNode.nodeData());
+      int index = parentNode.getNextChildIndex(name, primaryTypeName, parentNode.nodeData(), nodeDef);
 
       QPath path = QPath.makeChildPath(parentNode.getInternalPath(), name, index);
 
@@ -3067,7 +3071,6 @@
       {
          dataManager.updateItemState(autoCreatedState);
       }
-      // addAutoCreatedItems(node.nodeData(), primaryTypeName);
 
       if (LOG.isDebugEnabled())
       {

Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/NodeTypeDataManagerImpl.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/NodeTypeDataManagerImpl.java	2011-04-21 13:09:24 UTC (rev 4267)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/NodeTypeDataManagerImpl.java	2011-04-21 13:27:25 UTC (rev 4268)
@@ -186,7 +186,6 @@
     * @throws RepositoryException 
     */
    public NodeDefinitionData[] getAllChildNodeDefinitions(final InternalQName... nodeTypeNames)
-
    {
       final Collection<NodeDefinitionData> defsAny = new ArrayList<NodeDefinitionData>();
       final HashMap<InternalQName, NodeDefinitionData> defs = new HashMap<InternalQName, NodeDefinitionData>();
@@ -224,7 +223,7 @@
       }
 
       defsAny.addAll(defs.values());
-
+      
       return defsAny.toArray(new NodeDefinitionData[defsAny.size()]);
    }
 
@@ -301,16 +300,7 @@
    public NodeDefinitionData getChildNodeDefinition(final InternalQName nodeName, final InternalQName... nodeTypeNames)
       throws RepositoryException
    {
-
-      NodeDefinitionData ndResidual = this.nodeTypeRepository.getDefaultChildNodeDefinition(nodeName, nodeTypeNames);
-
-      if (ndResidual == null && !Constants.JCR_ANY_NAME.equals(nodeName))
-      {
-         ndResidual = getChildNodeDefinition(Constants.JCR_ANY_NAME, nodeTypeNames);
-      }
-
-      return ndResidual;
-
+      return this.nodeTypeRepository.getDefaultChildNodeDefinition(nodeName, nodeTypeNames);
    }
 
    /**
@@ -320,19 +310,53 @@
    public NodeDefinitionData getChildNodeDefinition(final InternalQName nodeName, final InternalQName primaryNodeType,
       final InternalQName[] mixinTypes) throws RepositoryException
    {
+      return getChildNodeDefinition(nodeName, getNodeTypeNames(primaryNodeType, mixinTypes));
+   }
 
-      if (mixinTypes != null)
+   /**
+    * {@inheritDoc}
+    */
+   public NodeDefinitionData getChildNodeDefinition(InternalQName nodeName, InternalQName nodeType,
+      InternalQName parentNodeType, InternalQName[] parentMixinTypes) throws RepositoryException
+   {
+      NodeDefinitionData[] defs = getAllChildNodeDefinitions(getNodeTypeNames(parentNodeType, parentMixinTypes));
+
+      NodeDefinitionData residualDef = null;
+      NodeDefinitionData firstResidualDef = null;
+
+      outer : for (NodeDefinitionData nodeDef : defs)
       {
-         final InternalQName[] nts = new InternalQName[mixinTypes.length + 1];
-         nts[0] = primaryNodeType;
-         for (int i = 0; i < mixinTypes.length; i++)
+         if (nodeDef.getName().equals(nodeName))
          {
-            nts[i + 1] = mixinTypes[i];
+            return nodeDef;
          }
-         return getChildNodeDefinition(nodeName, nts);
+         else if (nodeDef.isResidualSet())
+         {
+            // store first residual definition to be able to return
+            if (firstResidualDef == null)
+            {
+               firstResidualDef = nodeDef;
+            }
+
+            // check required primary types
+            for (InternalQName requiredPrimaryType : nodeDef.getRequiredPrimaryTypes())
+            {
+               if (!isNodeType(requiredPrimaryType, nodeType))
+               {
+                  continue outer;
+               }
+            }
+
+            // when there are several suitable definitions take the most older
+            if (residualDef == null
+               || isNodeType(residualDef.getRequiredPrimaryTypes()[0], nodeDef.getRequiredPrimaryTypes()[0]))
+            {
+               residualDef = nodeDef;
+            }
+         }
       }
 
-      return getChildNodeDefinition(nodeName, primaryNodeType);
+      return residualDef != null ? residualDef : firstResidualDef;
    }
 
    /**
@@ -1017,4 +1041,21 @@
 
       return changesLog;
    }
+
+   private InternalQName[] getNodeTypeNames(final InternalQName primaryNodeType, final InternalQName[] mixinTypes)
+      throws RepositoryException
+   {
+      InternalQName[] ntn = new InternalQName[1 + (mixinTypes == null ? 0 : mixinTypes.length)];
+      ntn[0] = primaryNodeType;
+
+      if (mixinTypes != null)
+      {
+         for (int i = 0; i < mixinTypes.length; i++)
+         {
+            System.arraycopy(mixinTypes, 0, ntn, 1, mixinTypes.length);
+         }
+      }
+
+      return ntn;
+   }
 }

Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/version/FrozenNodeInitializer.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/version/FrozenNodeInitializer.java	2011-04-21 13:09:24 UTC (rev 4267)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/version/FrozenNodeInitializer.java	2011-04-21 13:27:25 UTC (rev 4268)
@@ -228,7 +228,8 @@
 
       NodeData parent = (NodeData)dataManager.getItemData(node.getParentIdentifier());
       NodeDefinitionData ndef =
-         ntManager.getChildNodeDefinition(qname, parent.getPrimaryTypeName(), parent.getMixinTypeNames());
+         ntManager.getChildNodeDefinition(qname, node.getPrimaryTypeName(), parent.getPrimaryTypeName(),
+            parent.getMixinTypeNames());
       if (ndef == null)
       {
          throw new ConstraintViolationException("Definition not found for " + qname.getAsString());

Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/version/ItemDataCopyIgnoredVisitor.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/version/ItemDataCopyIgnoredVisitor.java	2011-04-21 13:09:24 UTC (rev 4267)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/version/ItemDataCopyIgnoredVisitor.java	2011-04-21 13:27:25 UTC (rev 4268)
@@ -57,6 +57,7 @@
       this.restoredChanges = changes;
    }
 
+   @Override
    protected void entering(PropertyData property, int level) throws RepositoryException
    {
 
@@ -108,6 +109,7 @@
       }
    }
 
+   @Override
    protected void entering(NodeData node, int level) throws RepositoryException
    {
 
@@ -122,8 +124,8 @@
          {
             NodeData existedParent = (NodeData)dataManager.getItemData(node.getParentIdentifier());
             NodeDefinitionData ndef =
-               ntManager.getChildNodeDefinition(node.getQPath().getName(), existedParent.getPrimaryTypeName(),
-                  existedParent.getMixinTypeNames());
+               ntManager.getChildNodeDefinition(node.getQPath().getName(), node.getPrimaryTypeName(),
+                  existedParent.getPrimaryTypeName(), existedParent.getMixinTypeNames());
 
             // the node can be stored as IGNOREd in restore set, check an action
             if (ndef.getOnParentVersion() == OnParentVersionAction.IGNORE)
@@ -164,6 +166,7 @@
       parents.push(null); // skip this node as we hasn't parent in restore result
    }
 
+   @Override
    protected void leaving(NodeData node, int level) throws RepositoryException
    {
       if (parents.size() > 0)

Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/version/ItemDataRestoreVisitor.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/version/ItemDataRestoreVisitor.java	2011-04-21 13:09:24 UTC (rev 4267)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/version/ItemDataRestoreVisitor.java	2011-04-21 13:27:25 UTC (rev 4268)
@@ -199,8 +199,8 @@
          {
             NodeData parent = parents.peek();
             int onParentVersion =
-               nodeTypeDataManager.getChildNodeDefinition(node.getQPath().getName(), parent.getPrimaryTypeName(),
-                  parent.getMixinTypeNames()).getOnParentVersion();
+               nodeTypeDataManager.getChildNodeDefinition(node.getQPath().getName(), node.getPrimaryTypeName(),
+                  parent.getPrimaryTypeName(), parent.getMixinTypeNames()).getOnParentVersion();
 
             if (onParentVersion == OnParentVersionAction.VERSION
                && nodeTypeDataManager.isNodeType(Constants.MIX_VERSIONABLE, node.getPrimaryTypeName(),
@@ -675,7 +675,8 @@
          // current C in the workspace will be left unchanged.
 
          int action =
-            nodeTypeDataManager.getChildNodeDefinition(qname, currentNode().getPrimaryTypeName(),
+            nodeTypeDataManager.getChildNodeDefinition(qname, frozen.getPrimaryTypeName(),
+               currentNode().getPrimaryTypeName(),
                currentNode().getMixinTypeNames()).getOnParentVersion();
 
          if (log.isDebugEnabled())

Added: jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/api/nodetypes/TestNodeDefinition.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/api/nodetypes/TestNodeDefinition.java	                        (rev 0)
+++ jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/api/nodetypes/TestNodeDefinition.java	2011-04-21 13:27:25 UTC (rev 4268)
@@ -0,0 +1,114 @@
+/*
+ * Copyright (C) 2003-2007 eXo Platform SAS.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Affero General Public License
+ * as published by the Free Software Foundation; either version 3
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see<http://www.gnu.org/licenses/>.
+ */
+package org.exoplatform.services.jcr.api.nodetypes;
+
+import org.exoplatform.services.jcr.JcrAPIBaseTest;
+import org.exoplatform.services.jcr.impl.core.NodeImpl;
+import org.exoplatform.services.jcr.impl.core.SessionImpl;
+
+import java.util.GregorianCalendar;
+
+import javax.jcr.Node;
+import javax.jcr.RepositoryException;
+import javax.jcr.version.Version;
+
+/**
+ * @author <a href="mailto:anatoliy.bazko at gmail.com">Anatoliy Bazko</a>
+ * @version $Id: TestNodeDefinitionWCM.java 34360 2009-07-22 23:58:59Z tolusha $
+ */
+public class TestNodeDefinition extends JcrAPIBaseTest
+{
+
+   public void testNodeTypeWCM1() throws Exception
+   {
+      NodeImpl someNode = (NodeImpl)session.getRootNode().addNode("someNode");
+      someNode.addMixin("mix:referenceable");
+
+      NodeImpl exoWebContent = (NodeImpl)session.getRootNode().addNode("exoWebContent", "exo:webContent");
+      exoWebContent.setProperty("exo:title", "tit");
+      session.save();
+
+      // add nt:file
+      NodeImpl ntFile1 = (NodeImpl)exoWebContent.addNode("ntFile-1", "nt:file");
+      NodeImpl jcrContent = (NodeImpl)ntFile1.addNode("jcr:content", "nt:resource");
+      jcrContent.setProperty("jcr:data", "");
+      jcrContent.setProperty("jcr:mimeType", "");
+      jcrContent.setProperty("jcr:lastModified", new GregorianCalendar());
+      session.save();
+
+      exoWebContent.addMixin("exo:actionable");
+      exoWebContent.setProperty("exo:actions", someNode);
+      session.save();
+
+      // add exo:actionStorage
+      NodeImpl actionStorage = (NodeImpl)exoWebContent.addNode("actionStorage", "exo:actionStorage");
+      session.save();
+
+      // add nt:file
+      NodeImpl ntFile2 = (NodeImpl)exoWebContent.addNode("ntFile-2", "nt:file");
+      jcrContent = (NodeImpl)ntFile2.addNode("jcr:content", "nt:resource");
+      jcrContent.setProperty("jcr:data", "");
+      jcrContent.setProperty("jcr:mimeType", "");
+      jcrContent.setProperty("jcr:lastModified", new GregorianCalendar());
+      session.save();
+
+      SessionImpl session = (SessionImpl)repository.login(credentials, WORKSPACE);
+
+      ntFile1 = (NodeImpl)session.getRootNode().getNode("exoWebContent").getNode("ntFile-1");
+      assertEquals(ntFile1.getDefinition().getRequiredPrimaryTypes()[0].getName(), "nt:base");
+
+      ntFile2 = (NodeImpl)session.getRootNode().getNode("exoWebContent").getNode("ntFile-2");
+      assertEquals(ntFile2.getDefinition().getRequiredPrimaryTypes()[0].getName(), "nt:base");
+
+      actionStorage = (NodeImpl)session.getRootNode().getNode("exoWebContent").getNode("actionStorage");
+      assertEquals(actionStorage.getDefinition().getRequiredPrimaryTypes()[0].getName(), "exo:actionStorage");
+   }
+
+   public void testNodeTypeWCM2() throws Exception
+   {
+      Node parent = session.getRootNode().addNode("parent", "exo:newsletterCategory");
+      parent.addNode("child", "nt:unstructured");
+      parent.setProperty("exo:newsletterCategoryTitle", "title");
+      session.save();
+   }
+
+   public void testNTVersionedChild() throws Exception
+   {
+      Node folder1 = session.getRootNode().addNode("folder1", "nt:folder");
+      Node folder2 = folder1.addNode("folder2", "nt:folder");
+      Node folder3 = folder2.addNode("folder3", "nt:folder");
+      folder1.addMixin("mix:versionable");
+      folder3.addMixin("mix:versionable");
+      session.save();
+
+      Version ver1 = folder1.checkin();
+      folder1.checkout();
+
+      folder3 =
+         (NodeImpl)session.getItem("/jcr:system/jcr:versionStorage/" + ver1.getParent().getUUID()
+            + "/1/jcr:frozenNode/folder2/folder3");
+
+      try
+      {
+         folder3.getDefinition();
+      }
+      catch (RepositoryException e)
+      {
+         fail();
+      }
+   }
+}

Modified: jcr/trunk/exo.jcr.component.core/src/test/resources/conf/test/wcm-nodetypes.xml
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/test/resources/conf/test/wcm-nodetypes.xml	2011-04-21 13:09:24 UTC (rev 4267)
+++ jcr/trunk/exo.jcr.component.core/src/test/resources/conf/test/wcm-nodetypes.xml	2011-04-21 13:27:25 UTC (rev 4268)
@@ -253,4 +253,90 @@
     </propertyDefinitions>
   </nodeType>
 
+  <nodeType name="exo:newsletterEntry" isMixin="true" hasOrderableChildNodes="true" primaryItemName="">
+    <propertyDefinitions>
+      <propertyDefinition name="exo:newsletterEntryCategoryName" requiredType="String" autoCreated="true" mandatory="true" onParentVersion="COPY" protected="false" multiple="false">
+        <valueConstraints/>
+      </propertyDefinition>
+      <propertyDefinition name="exo:newsletterEntrySubscriptionName" requiredType="String" autoCreated="true" mandatory="true" onParentVersion="COPY" protected="false" multiple="false">
+        <valueConstraints/>
+      </propertyDefinition>
+      <propertyDefinition name="exo:newsletterEntryType" requiredType="String" autoCreated="true" mandatory="true" onParentVersion="COPY" protected="false" multiple="false">
+        <valueConstraints/>
+      </propertyDefinition>
+      <propertyDefinition name="exo:newsletterEntryDate" requiredType="Date" autoCreated="true" mandatory="true" onParentVersion="COPY" protected="false" multiple="false">
+        <valueConstraints/>
+      </propertyDefinition>
+      <propertyDefinition name="exo:newsletterEntryStatus" requiredType="String" autoCreated="true" mandatory="true" onParentVersion="COPY" protected="false" multiple="false">
+        <valueConstraints/>
+      </propertyDefinition>
+    </propertyDefinitions>
+  </nodeType>
+  
+  <nodeType name="exo:newsletterSubscription" isMixin="false" hasOrderableChildNodes="true" primaryItemName="">
+    <supertypes>
+      <supertype>nt:unstructured</supertype>
+      <supertype>mix:referenceable</supertype>
+    </supertypes>
+    <propertyDefinitions>
+      <propertyDefinition name="exo:newsletterSubscribedUser" requiredType="Reference" autoCreated="true" mandatory="false" onParentVersion="COPY" protected="false" multiple="true">
+        <valueConstraints/>
+      </propertyDefinition>
+    </propertyDefinitions>
+    <childNodeDefinitions>
+      <childNodeDefinition name="*" defaultPrimaryType="nt:base" autoCreated="false" mandatory="false" onParentVersion="VERSION" protected="false" sameNameSiblings="false">
+        <requiredPrimaryTypes>
+          <requiredPrimaryType>nt:base</requiredPrimaryType>
+        </requiredPrimaryTypes>
+      </childNodeDefinition>
+    </childNodeDefinitions>
+  </nodeType>
+  
+  <nodeType name="exo:newsletterCategory" isMixin="false" hasOrderableChildNodes="true" primaryItemName="">
+    <supertypes>
+      <supertype>nt:unstructured</supertype>
+    </supertypes>
+    <propertyDefinitions>
+      <propertyDefinition name="exo:newsletterCategoryTitle" requiredType="String" autoCreated="false" mandatory="true" onParentVersion="COPY" protected="false" multiple="false">
+        <valueConstraints/>
+      </propertyDefinition>
+      <propertyDefinition name="exo:newsletterCategoryDescription" requiredType="String" autoCreated="false" mandatory="false" onParentVersion="COPY" protected="false" multiple="false">
+        <valueConstraints/>
+      </propertyDefinition>
+    </propertyDefinitions>
+    <childNodeDefinitions>
+      <childNodeDefinition name="*" defaultPrimaryType="nt:unstructured" autoCreated="false" mandatory="false" onParentVersion="VERSION" protected="false" sameNameSiblings="false">
+        <requiredPrimaryTypes>
+          <requiredPrimaryType>nt:base</requiredPrimaryType>
+        </requiredPrimaryTypes>
+      </childNodeDefinition>
+      <childNodeDefinition name="*" defaultPrimaryType="exo:newsletterSubscription" autoCreated="false" mandatory="false" onParentVersion="VERSION" protected="false" sameNameSiblings="true">
+        <requiredPrimaryTypes>
+          <requiredPrimaryType>exo:newsletterSubscription</requiredPrimaryType>
+        </requiredPrimaryTypes>
+      </childNodeDefinition>
+    </childNodeDefinitions>
+  </nodeType>
+  
+  <nodeType name="exo:newsletterUser" isMixin="false" hasOrderableChildNodes="true" primaryItemName="">
+    <supertypes>
+      <supertype>nt:unstructured</supertype>
+      <supertype>mix:referenceable</supertype>
+    </supertypes>
+    <propertyDefinitions>
+      <propertyDefinition name="exo:newsletterUserMail" requiredType="String" autoCreated="true" mandatory="true" onParentVersion="COPY" protected="false" multiple="false">
+        <valueConstraints/>
+      </propertyDefinition>
+      <propertyDefinition name="exo:newsletterUserConfirm" requiredType="Boolean" autoCreated="true" mandatory="true" onParentVersion="COPY" protected="false" multiple="false">
+        <valueConstraints/>
+      </propertyDefinition>
+      <propertyDefinition name="exo:newsletterUserBanned" requiredType="Boolean" autoCreated="true" mandatory="true" onParentVersion="COPY" protected="false" multiple="false">
+        <valueConstraints/>
+      </propertyDefinition>
+      <propertyDefinition name="exo:newsletterUserValidationCode" requiredType="String" autoCreated="true" mandatory="true" onParentVersion="COPY" protected="false" multiple="false">
+        <valueConstraints/>
+      </propertyDefinition>
+    </propertyDefinitions>
+  </nodeType>
+
 </nodeTypes>



More information about the exo-jcr-commits mailing list