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);