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();
+ }
}