diff --git a/config/alfresco/messages/patch-service.properties b/config/alfresco/messages/patch-service.properties index da17475e2d..126913bd5f 100644 --- a/config/alfresco/messages/patch-service.properties +++ b/config/alfresco/messages/patch-service.properties @@ -146,4 +146,7 @@ patch.invalidUserPersonAndGroup.result=Fixed ''{0}'' invalid user nodes, ''{1}'' patch.AVMGuidPatch.description=Set GUIDs on AVM nodes. patch.AVMGuidPatch.result=AVM GUIDS set. +patch.AVMLayeredSnapshotPatch.description=Set indirectionVersion on Layered Nodes. +patch.AVMLayeredSnapshotPatch.result=Layered Node indirectionVersions set. + patch.webscripts.description=Adds Web Scripts to Data Dictionary. diff --git a/config/alfresco/patch/patch-services-context.xml b/config/alfresco/patch/patch-services-context.xml index 667254d3fc..34b2757bc1 100644 --- a/config/alfresco/patch/patch-services-context.xml +++ b/config/alfresco/patch/patch-services-context.xml @@ -743,4 +743,14 @@ + + patch.AVMLayeredSnapshotPatch + patch.AVMLayeredSnapshotPatch.description + 0 + 51 + 52 + + + + diff --git a/source/java/org/alfresco/repo/admin/patch/impl/AVMLayeredSnapshotPatch.java b/source/java/org/alfresco/repo/admin/patch/impl/AVMLayeredSnapshotPatch.java new file mode 100644 index 0000000000..a34dde0375 --- /dev/null +++ b/source/java/org/alfresco/repo/admin/patch/impl/AVMLayeredSnapshotPatch.java @@ -0,0 +1,89 @@ +/* + * Copyright (C) 2005-2007 Alfresco Software Limited. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + * As a special exception to the terms and conditions of version 2.0 of + * the GPL, you may redistribute this Program in connection with Free/Libre + * and Open Source Software ("FLOSS") applications as described in Alfresco's + * FLOSS exception. You should have recieved a copy of the text describing + * the FLOSS exception, and it is also available here: + * http://www.alfresco.com/legal/licensing + */ + +package org.alfresco.repo.admin.patch.impl; + +import java.util.List; + +import org.alfresco.i18n.I18NUtil; +import org.alfresco.repo.admin.patch.AbstractPatch; +import org.alfresco.repo.avm.AVMNodeDAO; +import org.alfresco.repo.avm.LayeredDirectoryNode; +import org.alfresco.repo.avm.LayeredFileNode; + +/** + * Patch for changes to Layered Node path traversal. + * @author britt + */ +public class AVMLayeredSnapshotPatch extends AbstractPatch +{ + private AVMNodeDAO fAVMNodeDAO; + + private static final String MSG_SUCCESS = "patch.AVMLayeredSnapshotPatch.result"; + + public AVMLayeredSnapshotPatch() + { + } + + public void setAvmNodeDAO(AVMNodeDAO dao) + { + fAVMNodeDAO = dao; + } + + /* (non-Javadoc) + * @see org.alfresco.repo.admin.patch.AbstractPatch#applyInternal() + */ + @Override + protected String applyInternal() throws Exception + { + while (true) + { + List batch = fAVMNodeDAO.getNullVersionLayeredDirectories(200); + for (LayeredDirectoryNode node : batch) + { + node.setIndirectionVersion(-1); + } + if (batch.size() == 0) + { + break; + } + fAVMNodeDAO.flush(); + } + while (true) + { + List batch = fAVMNodeDAO.getNullVersionLayeredFiles(200); + for (LayeredFileNode node : batch) + { + node.setIndirectionVersion(-1); + } + if (batch.size() == 0) + { + break; + } + fAVMNodeDAO.flush(); + } + return I18NUtil.getMessage(MSG_SUCCESS); + } +} diff --git a/source/java/org/alfresco/repo/avm/AVMNodeDAO.java b/source/java/org/alfresco/repo/avm/AVMNodeDAO.java index 9201331641..1612dc6188 100644 --- a/source/java/org/alfresco/repo/avm/AVMNodeDAO.java +++ b/source/java/org/alfresco/repo/avm/AVMNodeDAO.java @@ -105,4 +105,18 @@ public interface AVMNodeDAO * @return An iterator over all nodes. */ List getEmptyGUIDS(int count); + + /** + * Get a batch of LayeredDirectories which have null indirectionVersions. + * @param count + * @return + */ + List getNullVersionLayeredDirectories(int count); + + /** + * Get a batch of LayeredFiles which have null indirectionVersions. + * @param count + * @return + */ + List getNullVersionLayeredFiles(int count); } diff --git a/source/java/org/alfresco/repo/avm/Layered.java b/source/java/org/alfresco/repo/avm/Layered.java index 4b10fae86a..1d93173dee 100644 --- a/source/java/org/alfresco/repo/avm/Layered.java +++ b/source/java/org/alfresco/repo/avm/Layered.java @@ -36,5 +36,5 @@ interface Layered * Set the indirection version for this layered node. * @param version The indirection version to set. */ - public void setIndirectionVersion(int version); + public void setIndirectionVersion(Integer version); } diff --git a/source/java/org/alfresco/repo/avm/LayeredDirectoryNode.java b/source/java/org/alfresco/repo/avm/LayeredDirectoryNode.java index 00d3e68fdc..e193e37486 100644 --- a/source/java/org/alfresco/repo/avm/LayeredDirectoryNode.java +++ b/source/java/org/alfresco/repo/avm/LayeredDirectoryNode.java @@ -71,17 +71,11 @@ public interface LayeredDirectoryNode extends DirectoryNode, Layered */ public void setIndirection(String indirection); - /** - * Set the indirection version. - * @param version The version to set. - */ - public void setIndirectionVersion(int version); - /** * Get the indirection version. * @return The indirection version. */ - public int getIndirectionVersion(); + public Integer getIndirectionVersion(); /** * Set the opacity of this. diff --git a/source/java/org/alfresco/repo/avm/LayeredDirectoryNodeImpl.java b/source/java/org/alfresco/repo/avm/LayeredDirectoryNodeImpl.java index 67f2c227b5..4bf73fa845 100644 --- a/source/java/org/alfresco/repo/avm/LayeredDirectoryNodeImpl.java +++ b/source/java/org/alfresco/repo/avm/LayeredDirectoryNodeImpl.java @@ -937,16 +937,23 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec /* (non-Javadoc) * @see org.alfresco.repo.avm.LayeredDirectoryNode#setIndirectionVersion(int) */ - public void setIndirectionVersion(int version) + public void setIndirectionVersion(Integer version) { - fIndirectionVersion = version; + if (version == null) + { + fIndirectionVersion = -1; + } + else + { + fIndirectionVersion = version; + } } /** * Get the indirection version. * @return The indirection version. */ - public int getIndirectionVersion() + public Integer getIndirectionVersion() { return fIndirectionVersion; } diff --git a/source/java/org/alfresco/repo/avm/LayeredFileNode.java b/source/java/org/alfresco/repo/avm/LayeredFileNode.java index 495600c8be..8abab7a330 100644 --- a/source/java/org/alfresco/repo/avm/LayeredFileNode.java +++ b/source/java/org/alfresco/repo/avm/LayeredFileNode.java @@ -26,19 +26,13 @@ package org.alfresco.repo.avm; * Interface for a layered file node. * @author britt */ -interface LayeredFileNode extends FileNode, Layered +public interface LayeredFileNode extends FileNode, Layered { - /** - * Set the indirection version. - * @param version The version to set. - */ - public void setIndirectionVersion(int version); - /** * Get the indirection version. * @return The indirection version. */ - public int getIndirectionVersion(); + public Integer getIndirectionVersion(); /** * Make a copy of this node that is a LayeredFileNode. diff --git a/source/java/org/alfresco/repo/avm/LayeredFileNodeImpl.java b/source/java/org/alfresco/repo/avm/LayeredFileNodeImpl.java index fc32e4176d..f1e8281f4e 100644 --- a/source/java/org/alfresco/repo/avm/LayeredFileNodeImpl.java +++ b/source/java/org/alfresco/repo/avm/LayeredFileNodeImpl.java @@ -308,7 +308,7 @@ class LayeredFileNodeImpl extends FileNodeImpl implements LayeredFileNode /* (non-Javadoc) * @see org.alfresco.repo.avm.LayeredFileNode#getIndirectionVersion() */ - public int getIndirectionVersion() + public Integer getIndirectionVersion() { return fIndirectionVersion; } @@ -316,9 +316,16 @@ class LayeredFileNodeImpl extends FileNodeImpl implements LayeredFileNode /* (non-Javadoc) * @see org.alfresco.repo.avm.LayeredFileNode#setIndirectionVersion(int) */ - public void setIndirectionVersion(int version) + public void setIndirectionVersion(Integer version) { - fIndirectionVersion = version; + if (version == null) + { + fIndirectionVersion = -1; + } + else + { + fIndirectionVersion = version; + } } /* (non-Javadoc) diff --git a/source/java/org/alfresco/repo/avm/hibernate/AVMNodeDAOHibernate.java b/source/java/org/alfresco/repo/avm/hibernate/AVMNodeDAOHibernate.java index 6b27ccd25f..50b2b1b200 100644 --- a/source/java/org/alfresco/repo/avm/hibernate/AVMNodeDAOHibernate.java +++ b/source/java/org/alfresco/repo/avm/hibernate/AVMNodeDAOHibernate.java @@ -31,6 +31,8 @@ import org.alfresco.repo.avm.AVMNodeImpl; import org.alfresco.repo.avm.AVMNodeUnwrapper; import org.alfresco.repo.avm.AVMStore; import org.alfresco.repo.avm.DirectoryNode; +import org.alfresco.repo.avm.LayeredDirectoryNode; +import org.alfresco.repo.avm.LayeredFileNode; import org.hibernate.Query; import org.springframework.orm.hibernate3.support.HibernateDaoSupport; @@ -183,4 +185,28 @@ class AVMNodeDAOHibernate extends HibernateDaoSupport implements query.setMaxResults(count); return (List)query.list(); } + + /* (non-Javadoc) + * @see org.alfresco.repo.avm.AVMNodeDAO#getNullVersionLayeredDirectories(int) + */ + @SuppressWarnings("unchecked") + public List getNullVersionLayeredDirectories(int count) + { + Query query = getSession().createQuery("from LayeredDirectoryNodeImpl ldn " + + "where ldn.indirectionVersion is null"); + query.setMaxResults(count); + return (List)query.list(); + } + + /* (non-Javadoc) + * @see org.alfresco.repo.avm.AVMNodeDAO#getNullVersionLayeredFiles(int) + */ + @SuppressWarnings("unchecked") + public List getNullVersionLayeredFiles(int count) + { + Query query = getSession().createQuery("from LayeredFileNodeImpl lfn " + + "where lfn.indirectionVersion is null"); + query.setMaxResults(count); + return (List)query.list(); + } }