Index: create_db_hsqldb.sql =================================================================== --- create_db_hsqldb.sql (revision 160266) +++ create_db_hsqldb.sql (working copy) @@ -2,14 +2,14 @@ CREATE TABLE JCR_PROPERTY(ITEM_ID VARCHAR(200) NOT NULL,NAME VARCHAR(100),VALUE VARCHAR(100),PARENT_UUID VARCHAR(36),PROP_TYPE INTEGER,DEFINITION_ID VARCHAR(100),MULTI_VALUED CHAR(1),PRIMARY KEY (ITEM_ID)) CREATE TABLE JCR_NODE_MIXIN_TYPE(NODE_UUID VARCHAR(36) NOT NULL,MIXIN_TYPE VARCHAR(100)) CREATE TABLE JCR_NODE_PARENT(NODE_UUID VARCHAR(36) NOT NULL,PARENT_UUID VARCHAR(36)) -CREATE TABLE JCR_CHILD_NODE(PARENT_UUID VARCHAR(36),UUID VARCHAR(36),NAME VARCHAR(100),NODE_INDEX INTEGER) +CREATE TABLE JCR_CHILD_NODE(PARENT_UUID VARCHAR(36),UUID VARCHAR(36),NAME VARCHAR(100),SAMENAME_INDEX INTEGER,CHILDREN_INDEX INTEGER) CREATE TABLE JCR_NODE_PROPERTY(PARENT_UUID VARCHAR(36) NOT NULL,NAME VARCHAR(100)) CREATE TABLE JCR_NODE_REF(NREF_ID IDENTITY,TARGET_UUID VARCHAR(36) NOT NULL,PROP_UUID VARCHAR(36),PROP_NAME VARCHAR(100)) CREATE TABLE JCR_BLOB(BLOB_ID IDENTITY, PARENT_UUID VARCHAR(36), PROP_NAME VARCHAR(100), VALUE_INDEX INTEGER, BLOB_SIZE INTEGER, BLOB_VALUE LONGVARBINARY) CREATE INDEX JCR_NODE_PROPERTY_INDEX1 ON JCR_NODE_PROPERTY(PARENT_UUID, NAME) CREATE INDEX JCR_NODE_PROPERTY_INDEX2 ON JCR_NODE_PROPERTY(PARENT_UUID) -CREATE INDEX JCR_CHILD_NODE_INDEX1 ON JCR_CHILD_NODE (PARENT_UUID, UUID, NAME, NODE_INDEX) -CREATE INDEX JCR_CHILD_NODE_INDEX2 ON JCR_CHILD_NODE (PARENT_UUID) +CREATE INDEX JCR_CHILD_NODE_INDEX1 ON JCR_CHILD_NODE (PARENT_UUID, UUID, NAME, SAMENAME_INDEX) +CREATE INDEX JCR_CHILD_NODE_INDEX2 ON JCR_CHILD_NODE (PARENT_UUID, CHILDREN_INDEX) CREATE INDEX JCR_NODE_MIXIN_TYPE_INDEX1 ON JCR_NODE_MIXIN_TYPE (NODE_UUID, MIXIN_TYPE) CREATE INDEX JCR_NODE_MIXIN_TYPE_INDEX2 ON JCR_NODE_MIXIN_TYPE (NODE_UUID) CREATE INDEX JCR_NODE_PARENT_INDEX1 ON JCR_NODE_PARENT (NODE_UUID, PARENT_UUID) Index: applications/test/hibernate/jackrabbit.hbm.xml =================================================================== --- applications/test/hibernate/jackrabbit.hbm.xml (revision 160266) +++ applications/test/hibernate/jackrabbit.hbm.xml (working copy) @@ -40,14 +40,15 @@ - + + - + - + Index: applications/test/workspaces/test/workspace.xml =================================================================== --- applications/test/workspaces/test/workspace.xml (revision 0) +++ applications/test/workspaces/test/workspace.xml (revision 0) @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + Index: applications/test/workspaces/default/workspace.xml =================================================================== --- applications/test/workspaces/default/workspace.xml (revision 160307) +++ applications/test/workspaces/default/workspace.xml (working copy) @@ -14,8 +14,8 @@ persistence of the workspace: class: FQN of class implementing PersistenceManager interface --> - - + + Index: applications/test/jaas.config =================================================================== --- applications/test/jaas.config (revision 0) +++ applications/test/jaas.config (revision 0) @@ -0,0 +1,3 @@ +Jackrabbit { + org.apache.jackrabbit.core.security.SimpleLoginModule required anonymousId="anonymous"; +}; \ No newline at end of file Index: applications/test/ojb/repository_user.xml =================================================================== --- applications/test/ojb/repository_user.xml (revision 160266) +++ applications/test/ojb/repository_user.xml (working copy) @@ -55,7 +55,7 @@ element-class-ref="org.apache.jackrabbit.core.state.orm.ORMChildNodeEntry" auto-update="true" auto-delete="true" - orderby="index" + orderby="childrenIndex" sort="ASC" > @@ -160,11 +160,17 @@ primarykey="true" /> + Index: applications/test/repositoryStubImpl.properties =================================================================== --- applications/test/repositoryStubImpl.properties (revision 160307) +++ applications/test/repositoryStubImpl.properties (working copy) @@ -392,4 +392,7 @@ javax.jcr.tck.OnParentVersionCopyTest.nodename4=test:copyOnParentVersion javax.jcr.tck.OnParentVersionCopyTest.nodetype=nt:unstructured javax.jcr.tck.OnParentVersionAbortTest.nodename4=test:abortOnParentVersion +<<<<<<< .mine +javax.jcr.tck.OnParentVersionAbortTest.nodetype=nt:unstructured======= javax.jcr.tck.OnParentVersionAbortTest.nodetype=nt:unstructured +>>>>>>> .r160307 Index: src/java/org/apache/jackrabbit/core/state/orm/hibernate/HibernateNodeState.java =================================================================== --- src/java/org/apache/jackrabbit/core/state/orm/hibernate/HibernateNodeState.java (revision 160307) +++ src/java/org/apache/jackrabbit/core/state/orm/hibernate/HibernateNodeState.java (working copy) @@ -23,6 +23,9 @@ import org.apache.jackrabbit.core.ItemId; import org.apache.jackrabbit.core.state.NodeState; import org.apache.jackrabbit.core.state.orm.ORMNodeState; +import java.util.TreeSet; +import java.util.List; +import java.util.ArrayList; /** *

Hibernate-specific node state class. This is necessary because @@ -30,7 +33,9 @@ */ public class HibernateNodeState extends ORMNodeState { - private Set setChildNodeEntries = new HashSet(); + // might be a bug here because it seems that these entries should be + // ordered + private List listChildNodeEntries = new ArrayList(); private Set setParentUUIDs = new HashSet(); private Set setMixinTypeNames = new HashSet(); private Set setPropertyEntries = new HashSet(); @@ -45,11 +50,11 @@ fromPersistentNodeState(state); } public Collection getChildNodeEntries() { - return setChildNodeEntries; + return listChildNodeEntries; } public void setChildNodeEntries(Collection childNodeEntries) { - this.setChildNodeEntries.clear(); - this.setChildNodeEntries.addAll(childNodeEntries); + this.listChildNodeEntries.clear(); + this.listChildNodeEntries.addAll(childNodeEntries); } public Collection getPropertyEntries() { @@ -79,12 +84,12 @@ this.setParentUUIDs.addAll(parentUUIDs); } - public Set getSetChildNodeEntries() { - return setChildNodeEntries; + public List getListChildNodeEntries() { + return listChildNodeEntries; } - public void setSetChildNodeEntries(Set setChildNodeEntries) { - this.setChildNodeEntries = setChildNodeEntries; + public void setListChildNodeEntries(List listChildNodeEntries) { + this.listChildNodeEntries = listChildNodeEntries; } public Set getSetPropertyEntries() { Index: src/java/org/apache/jackrabbit/core/state/orm/ORMNodeState.java =================================================================== --- src/java/org/apache/jackrabbit/core/state/orm/ORMNodeState.java (revision 160307) +++ src/java/org/apache/jackrabbit/core/state/orm/ORMNodeState.java (working copy) @@ -71,11 +71,13 @@ definitionId = state.getDefinitionId().toString(); } Iterator childNodeEntriesIter = state.getChildNodeEntries().iterator(); + int i=0; while (childNodeEntriesIter.hasNext()) { ChildNodeEntry curChildNodeEntry = (ChildNodeEntry) childNodeEntriesIter.next(); log.debug("childNodeEntry " + curChildNodeEntry.getIndex() + " name=" + curChildNodeEntry.getName() + " uuid=" + curChildNodeEntry.getUUID()); - ORMChildNodeEntry childNode = new ORMChildNodeEntry(this, curChildNodeEntry, uuid); + ORMChildNodeEntry childNode = new ORMChildNodeEntry(this, curChildNodeEntry, uuid, i); getChildNodeEntries().add(childNode); + i++; } Iterator propertyEntryIter = state.getPropertyEntries().iterator(); while (propertyEntryIter.hasNext()) { Index: src/java/org/apache/jackrabbit/core/state/orm/ORMChildNodeEntry.java =================================================================== --- src/java/org/apache/jackrabbit/core/state/orm/ORMChildNodeEntry.java (revision 160307) +++ src/java/org/apache/jackrabbit/core/state/orm/ORMChildNodeEntry.java (working copy) @@ -28,18 +28,22 @@ private String uuid; private String parentUUID; private String name; - private Integer index; + // this is the index used for same name siblings + private Integer sameNameIndex; private Integer dbId; private ORMNodeState parent; + // this is the index used for conserving the order of child nodes. + private Integer childrenIndex; public ORMChildNodeEntry() { } - public ORMChildNodeEntry(ORMNodeState parent, ChildNodeEntry childNodeEntry, String parentUUID) { + public ORMChildNodeEntry(ORMNodeState parent, ChildNodeEntry childNodeEntry, String parentUUID, int childrenIndex) { this.parent = parent; uuid = childNodeEntry.getUUID(); this.parentUUID = parentUUID; name = childNodeEntry.getName().toString(); - index = new Integer(childNodeEntry.getIndex()); + sameNameIndex = new Integer(childNodeEntry.getIndex()); + this.childrenIndex = new Integer(childrenIndex); } public void setUuid(String uuid) { @@ -54,8 +58,9 @@ this.name = name; } - public void setIndex(Integer index) { - this.index = index; + public void setSameNameIndex(Integer sameNameIndex) { + + this.sameNameIndex = sameNameIndex; } public void setDbId(Integer dbId) { @@ -66,6 +71,10 @@ this.parent = parent; } + public void setChildrenIndex(Integer childrenIndex) { + this.childrenIndex = childrenIndex; + } + public String getUuid() { return uuid; } @@ -78,8 +87,9 @@ return name; } - public Integer getIndex() { - return index; + public Integer getSameNameIndex() { + + return sameNameIndex; } public Integer getDbId() { @@ -90,6 +100,10 @@ return parent; } + public Integer getChildrenIndex() { + return childrenIndex; + } + public boolean equals(Object obj) { if (!(obj instanceof ORMChildNodeEntry)) { return false; @@ -97,7 +111,8 @@ ORMChildNodeEntry right = (ORMChildNodeEntry) obj; if (getUuid().equals(right.getUuid()) && getName().equals(right.getName()) && - (getIndex().equals(right.getIndex()))) { + (getSameNameIndex().equals(right.getSameNameIndex())) && + (getChildrenIndex().equals(right.getChildrenIndex()))) { return true; } else { return false; @@ -109,10 +124,10 @@ return 0; } ORMChildNodeEntry right = (ORMChildNodeEntry) obj; - return (getUuid() + getName() + getIndex()).compareTo(right.getUuid() + right.getName() + right.getIndex()); + return (getChildrenIndex() + getUuid() + getName() + getSameNameIndex()).compareTo(right.getChildrenIndex() + right.getUuid() + right.getName() + right.getSameNameIndex()); } public int hashCode() { - return (getUuid() + getName() + getIndex()).hashCode(); + return (getChildrenIndex() + getUuid() + getName() + getSameNameIndex()).hashCode(); } } Index: create_db_mysql.sql =================================================================== --- create_db_mysql.sql (revision 160266) +++ create_db_mysql.sql (working copy) @@ -37,7 +37,8 @@ PARENT_UUID VARCHAR(36) NOT NULL, UUID VARCHAR(36), NAME VARCHAR(100), - NODE_INDEX INTEGER + SAMENAME_INDEX INTEGER, + CHILDREN_INDEX INTEGER ) TYPE=InnoDB; CREATE TABLE JCR_NODE_PROPERTY( @@ -67,8 +68,8 @@ CREATE INDEX JCR_NODE_PROPERTY_INDEX1 ON JCR_NODE_PROPERTY(PARENT_UUID, NAME); CREATE INDEX JCR_NODE_PROPERTY_INDEX2 ON JCR_NODE_PROPERTY(PARENT_UUID); -CREATE INDEX JCR_CHILD_NODE_INDEX1 ON JCR_CHILD_NODE (PARENT_UUID, UUID, NAME, NODE_INDEX); -CREATE INDEX JCR_CHILD_NODE_INDEX2 ON JCR_CHILD_NODE (PARENT_UUID); +CREATE INDEX JCR_CHILD_NODE_INDEX1 ON JCR_CHILD_NODE (PARENT_UUID, UUID, NAME, SAMENAME_INDEX); +CREATE INDEX JCR_CHILD_NODE_INDEX2 ON JCR_CHILD_NODE (PARENT_UUID, CHILDREN_INDEX); CREATE INDEX JCR_NODE_MIXIN_TYPE_INDEX1 ON JCR_NODE_MIXIN_TYPE (NODE_UUID, MIXIN_TYPE); CREATE INDEX JCR_NODE_MIXIN_TYPE_INDEX2 ON JCR_NODE_MIXIN_TYPE (NODE_UUID);