[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