diff --git a/source/java/org/alfresco/repo/avm/AVMNodeImpl.java b/source/java/org/alfresco/repo/avm/AVMNodeImpl.java index 560f3619fd..3bdba7723a 100644 --- a/source/java/org/alfresco/repo/avm/AVMNodeImpl.java +++ b/source/java/org/alfresco/repo/avm/AVMNodeImpl.java @@ -19,6 +19,9 @@ package org.alfresco.repo.avm; import java.io.Serializable; +import org.hibernate.Query; +import org.hibernate.Session; + /** * Base class for all repository file system like objects. * @author britt @@ -35,16 +38,6 @@ abstract class AVMNodeImpl implements AVMNode, Serializable */ private int fVersionID; - /** - * The ancestor of this. - */ - private AVMNode fAncestor; - - /** - * The node that was merged into this. - */ - private AVMNode fMergedFrom; - /** * The Repository that owns this. */ @@ -87,8 +80,6 @@ abstract class AVMNodeImpl implements AVMNode, Serializable { fID = id; fVersionID = -1; - fAncestor = null; - fMergedFrom = null; fRepository = repo; fIsRoot = false; long time = System.currentTimeMillis(); @@ -107,7 +98,14 @@ abstract class AVMNodeImpl implements AVMNode, Serializable */ public void setAncestor(AVMNode ancestor) { - fAncestor = ancestor; + if (ancestor == null) + { + return; + } + HistoryLinkImpl link = new HistoryLinkImpl(); + link.setAncestor(ancestor); + link.setDescendent(this); + SuperRepository.GetInstance().getSession().save(link); } /** @@ -116,7 +114,10 @@ abstract class AVMNodeImpl implements AVMNode, Serializable */ public AVMNode getAncestor() { - return fAncestor; + Session sess = SuperRepository.GetInstance().getSession(); + Query query = sess.createQuery("select hl.ancestor from HistoryLinkImpl hl where hl.descendent = :desc"); + query.setEntity("desc", this); + return (AVMNode)query.uniqueResult(); } /** @@ -125,7 +126,14 @@ abstract class AVMNodeImpl implements AVMNode, Serializable */ public void setMergedFrom(AVMNode mergedFrom) { - fMergedFrom = mergedFrom; + if (mergedFrom == null) + { + return; + } + MergeLinkImpl link = new MergeLinkImpl(); + link.setMfrom(mergedFrom); + link.setMto(this); + SuperRepository.GetInstance().getSession().save(link); } /** @@ -134,7 +142,10 @@ abstract class AVMNodeImpl implements AVMNode, Serializable */ public AVMNode getMergedFrom() { - return fMergedFrom; + Session sess = SuperRepository.GetInstance().getSession(); + Query query = sess.createQuery("select ml.mfrom from MergeLinkImpl ml where ml.mto = :to"); + query.setEntity("to", this); + return (AVMNode)query.uniqueResult(); } /** diff --git a/source/java/org/alfresco/repo/avm/HistoryLink.java b/source/java/org/alfresco/repo/avm/HistoryLink.java new file mode 100644 index 0000000000..5ec14133e6 --- /dev/null +++ b/source/java/org/alfresco/repo/avm/HistoryLink.java @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2006 Alfresco, Inc. + * + * Licensed under the Mozilla Public License version 1.1 + * with a permitted attribution clause. You may obtain a + * copy of the License at + * + * http://www.alfresco.org/legal/license.txt + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, + * either express or implied. See the License for the specific + * language governing permissions and limitations under the + * License. + */ + +package org.alfresco.repo.avm; + +/** + * Interface for the ancestor-descendent relationship. + * @author britt + */ +interface HistoryLink +{ + /** + * Set the ancestor part of this. + * @param ancestor + */ + public void setAncestor(AVMNode ancestor); + + /** + * Get the ancestor part of this. + * @return The ancestor. + */ + public AVMNode getAncestor(); + + /** + * Set the descendent part of this. + * @param descendent + */ + public void setDescendent(AVMNode descendent); + + /** + * Get the descendent part of this. + * @return + */ + public AVMNode getDescendent(); +} diff --git a/source/java/org/alfresco/repo/avm/HistoryLinkImpl.java b/source/java/org/alfresco/repo/avm/HistoryLinkImpl.java new file mode 100644 index 0000000000..1c375bb638 --- /dev/null +++ b/source/java/org/alfresco/repo/avm/HistoryLinkImpl.java @@ -0,0 +1,75 @@ +/* + * Copyright (C) 2006 Alfresco, Inc. + * + * Licensed under the Mozilla Public License version 1.1 + * with a permitted attribution clause. You may obtain a + * copy of the License at + * + * http://www.alfresco.org/legal/license.txt + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, + * either express or implied. See the License for the specific + * language governing permissions and limitations under the + * License. + */ + +package org.alfresco.repo.avm; + +import java.io.Serializable; + +/** + * Holds a ancestor-descendent relationship. + * @author britt + */ +class HistoryLinkImpl implements HistoryLink, Serializable +{ + private static final long serialVersionUID = -430859344980137718L; + + /** + * The ancestor. + */ + private AVMNode fAncestor; + + /** + * The descendent. + */ + private AVMNode fDescendent; + + /** + * Set the ancestor part of this. + * @param ancestor + */ + public void setAncestor(AVMNode ancestor) + { + fAncestor = ancestor; + } + + /** + * Get the ancestor part of this. + * @return The ancestor. + */ + public AVMNode getAncestor() + { + return fAncestor; + } + + /** + * Set the descendent part of this. + * @param descendent + */ + public void setDescendent(AVMNode descendent) + { + fDescendent = descendent; + } + + /** + * Get the descendent part of this. + * @return The descendent. + */ + public AVMNode getDescendent() + { + return fDescendent; + } +} diff --git a/source/java/org/alfresco/repo/avm/MergeLink.java b/source/java/org/alfresco/repo/avm/MergeLink.java new file mode 100644 index 0000000000..1be0b9c153 --- /dev/null +++ b/source/java/org/alfresco/repo/avm/MergeLink.java @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2006 Alfresco, Inc. + * + * Licensed under the Mozilla Public License version 1.1 + * with a permitted attribution clause. You may obtain a + * copy of the License at + * + * http://www.alfresco.org/legal/license.txt + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, + * either express or implied. See the License for the specific + * language governing permissions and limitations under the + * License. + */ + +package org.alfresco.repo.avm; + +/** + * This is the interface for the merged from - to relationship. + * @author britt + */ +interface MergeLink +{ + /** + * Set the from part. + * @param from + */ + public void setMfrom(AVMNode from); + + /** + * Get the from part. + * @return The from part. + */ + public AVMNode getMfrom(); + + /** + * Set the to part. + * @param to + */ + public void setMto(AVMNode to); + + /** + * Get the to part. + * @return The to part. + */ + public AVMNode getMto(); +} diff --git a/source/java/org/alfresco/repo/avm/MergeLinkImpl.java b/source/java/org/alfresco/repo/avm/MergeLinkImpl.java new file mode 100644 index 0000000000..5be8315928 --- /dev/null +++ b/source/java/org/alfresco/repo/avm/MergeLinkImpl.java @@ -0,0 +1,75 @@ +/* + * Copyright (C) 2006 Alfresco, Inc. + * + * Licensed under the Mozilla Public License version 1.1 + * with a permitted attribution clause. You may obtain a + * copy of the License at + * + * http://www.alfresco.org/legal/license.txt + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, + * either express or implied. See the License for the specific + * language governing permissions and limitations under the + * License. + */ + +package org.alfresco.repo.avm; + +import java.io.Serializable; + +/** + * This contains a single merged from-to relationship. + * @author britt + */ +class MergeLinkImpl implements MergeLink, Serializable +{ + private static final long serialVersionUID = 6672271083042424944L; + + /** + * The node that was merged from. + */ + private AVMNode fFrom; + + /** + * The node that was merged to. + */ + private AVMNode fTo; + + /** + * Set the from part. + * @param from + */ + public void setMfrom(AVMNode from) + { + fFrom = from; + } + + /** + * Get the from part. + * @return The from part. + */ + public AVMNode getMfrom() + { + return fFrom; + } + + /** + * Set the to part. + * @param to + */ + public void setMto(AVMNode to) + { + fTo = to; + } + + /** + * Get the to part. + * @return The to part. + */ + public AVMNode getMto() + { + return fTo; + } +} diff --git a/source/java/org/alfresco/repo/avm/OrphanReaper.java b/source/java/org/alfresco/repo/avm/OrphanReaper.java index 4afeaafe49..5b0af1e968 100644 --- a/source/java/org/alfresco/repo/avm/OrphanReaper.java +++ b/source/java/org/alfresco/repo/avm/OrphanReaper.java @@ -184,6 +184,7 @@ class OrphanReaper implements Runnable { public void perform(Session session) { + SuperRepository.GetInstance().setSession(session); Query query = session.getNamedQuery("FindOrphans"); query.setMaxResults(fBatchSize); List nodes = (List)query.list(); @@ -196,28 +197,48 @@ class OrphanReaper implements Runnable for (AVMNode node : nodes) { // Save away the ancestor and merged from fields from this node. - AVMNode ancestor = node.getAncestor(); - AVMNode mergedFrom = node.getMergedFrom(); - // Get all the nodes that have this node as ancestor. - query = session.getNamedQuery("AVMNode.GetDescendents"); - query.setEntity("node", node); - List descendents = (List)query.list(); - for (AVMNode desc : descendents) + query = session.createQuery("from HistoryLinkImpl hl where hl.descendent = :desc"); + query.setEntity("desc", node); + HistoryLink hlink = (HistoryLink)query.uniqueResult(); + AVMNode ancestor = null; + if (hlink != null) { + ancestor = hlink.getAncestor(); + session.delete(hlink); + } + query = session.createQuery("from MergeLinkImpl ml where ml.mto = :to"); + query.setEntity("to", node); + MergeLink mlink = (MergeLink)query.uniqueResult(); + AVMNode mergedFrom = null; + if (mlink != null) + { + mergedFrom = mlink.getMfrom(); + session.delete(mlink); + } + // Get all the nodes that have this node as ancestor. + query = session.getNamedQuery("HistoryLink.ByAncestor"); + query.setEntity("node", node); + List links = (List)query.list(); + for (HistoryLink link : links) + { + AVMNode desc = link.getDescendent(); desc.setAncestor(ancestor); if (desc.getMergedFrom() == null) { desc.setMergedFrom(mergedFrom); } + session.delete(link); } // Get all the nodes that have this node as mergedFrom - query = session.getNamedQuery("AVMNode.GetMergedTo"); + query = session.getNamedQuery("MergeLink.ByFrom"); query.setEntity("merged", node); - List merged = (List)query.list(); - for (AVMNode merge : merged) + List mlinks = (List)query.list(); + for (MergeLink link : mlinks) { - merge.setMergedFrom(ancestor); + link.getMto().setMergedFrom(ancestor); + session.delete(link); } + session.flush(); node = AVMNodeUnwrapper.Unwrap(node); // Extra work for directories. if (node instanceof DirectoryNode) diff --git a/source/java/org/alfresco/repo/avm/PurgeTest.java b/source/java/org/alfresco/repo/avm/PurgeTest.java index ff69c9ebd1..9e5089d237 100644 --- a/source/java/org/alfresco/repo/avm/PurgeTest.java +++ b/source/java/org/alfresco/repo/avm/PurgeTest.java @@ -37,7 +37,7 @@ public class PurgeTest extends AVMServiceTestBase setupBasicTree(); BulkLoader loader = new BulkLoader(fService); long start = System.currentTimeMillis(); - loader.recursiveLoad("source", "main:/"); + loader.recursiveLoad("source/web", "main:/"); System.err.println("Load time: " + (System.currentTimeMillis() - start) + "ms"); fService.createSnapshot("main"); System.err.println("Load time + snapshot: " + (System.currentTimeMillis() - start) + "ms"); diff --git a/source/java/org/alfresco/repo/avm/hibernate/AVM.hbm.xml b/source/java/org/alfresco/repo/avm/hibernate/AVM.hbm.xml index 5cf3bb1c7f..faafecf0da 100644 --- a/source/java/org/alfresco/repo/avm/hibernate/AVM.hbm.xml +++ b/source/java/org/alfresco/repo/avm/hibernate/AVM.hbm.xml @@ -24,14 +24,6 @@ - - - - @@ -174,6 +166,18 @@ column="parent_id"/> + + + + + + + + + + + + + + + + + +