mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-07-24 17:32:48 +00:00
Merged V2.2 to HEAD
8083: Merged V2.1 to V2.2 8066: RM-31 and related issues (ACT-729) 8068: Fix for AR-1997 8084: Fixed script error on notify page of invite website user wizard 8086: Merged V2.1 to V2.2 8075: Clear()ing a hibernate session, is not always enough to guarantee that transactions not use unbounded amounts of memory 8076: Turn off test that needs to be fixed real soon now. 8092: Implementation for: http://issues.alfresco.com/browse/AR-1744 8093: Fixed upgrade scripts for V2.1.2 to V2.2 upgrades 8096: Fix for AWC-1578 and AWC-1814 8097: Added new indexes missing from scripts and made index names consistent. 8098: Fix for AWC-1548 8100: Removed use of QName from alf_permission table 8102: Fix for AWC-1690 8103: test was == on id that used to be long but is now a Long git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@8476 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
@@ -102,6 +102,19 @@ public interface AVMNodeDAO
|
||||
*/
|
||||
public List<Long> getNewInStoreIDs(AVMStore store);
|
||||
|
||||
/**
|
||||
* Clear newInStore field for a store. (Snapshot)
|
||||
* @param store
|
||||
*/
|
||||
public void clearNewInStore(AVMStore store);
|
||||
|
||||
/**
|
||||
* Get any new layered entries in a store.
|
||||
* @param store
|
||||
* @return
|
||||
*/
|
||||
public List<Long> getNewLayeredInStoreIDs(AVMStore store);
|
||||
|
||||
/**
|
||||
* Inappropriate hack to get Hibernate to play nice.
|
||||
*/
|
||||
@@ -111,25 +124,40 @@ public interface AVMNodeDAO
|
||||
* Get a batch
|
||||
* @return An iterator over all nodes.
|
||||
*/
|
||||
List<AVMNode> getEmptyGUIDS(int count);
|
||||
public List<AVMNode> getEmptyGUIDS(int count);
|
||||
|
||||
/**
|
||||
* Get a batch of LayeredDirectories which have null indirectionVersions.
|
||||
* @param count
|
||||
* @return
|
||||
*/
|
||||
List<LayeredDirectoryNode> getNullVersionLayeredDirectories(int count);
|
||||
public List<LayeredDirectoryNode> getNullVersionLayeredDirectories(int count);
|
||||
|
||||
/**
|
||||
* Get a batch of LayeredFiles which have null indirectionVersions.
|
||||
* @param count
|
||||
* @return
|
||||
*/
|
||||
List<LayeredFileNode> getNullVersionLayeredFiles(int count);
|
||||
public List<LayeredFileNode> getNullVersionLayeredFiles(int count);
|
||||
|
||||
/**
|
||||
* Evict an AVMNode that is no longer going to be used.
|
||||
* @param node
|
||||
*/
|
||||
public void evict(AVMNode node);
|
||||
|
||||
/**
|
||||
* Clear the hibernate session cache.
|
||||
*/
|
||||
public void clear();
|
||||
|
||||
/**
|
||||
* Turn off 2nd level caching.
|
||||
*/
|
||||
public void noCache();
|
||||
|
||||
/**
|
||||
* Turn on 2nd level caching.
|
||||
*/
|
||||
public void yesCache();
|
||||
}
|
||||
|
@@ -920,19 +920,27 @@ public class AVMRepository
|
||||
*/
|
||||
public Map<String, Integer> createSnapshot(String storeName, String tag, String description)
|
||||
{
|
||||
AlfrescoTransactionSupport.bindListener(fCreateVersionTxnListener);
|
||||
AVMStore store = getAVMStoreByName(storeName);
|
||||
if (store == null)
|
||||
try
|
||||
{
|
||||
throw new AVMNotFoundException("Store not found.");
|
||||
fAVMNodeDAO.noCache();
|
||||
AlfrescoTransactionSupport.bindListener(fCreateVersionTxnListener);
|
||||
AVMStore store = getAVMStoreByName(storeName);
|
||||
if (store == null)
|
||||
{
|
||||
throw new AVMNotFoundException("Store not found.");
|
||||
}
|
||||
Map<String, Integer> result = store.createSnapshot(tag, description, new HashMap<String, Integer>());
|
||||
for (Map.Entry<String, Integer> entry : result.entrySet())
|
||||
{
|
||||
fLookupCache.onSnapshot(entry.getKey());
|
||||
fCreateVersionTxnListener.versionCreated(entry.getKey(), entry.getValue());
|
||||
}
|
||||
return result;
|
||||
}
|
||||
Map<String, Integer> result = store.createSnapshot(tag, description, new HashMap<String, Integer>());
|
||||
for (Map.Entry<String, Integer> entry : result.entrySet())
|
||||
finally
|
||||
{
|
||||
fLookupCache.onSnapshot(entry.getKey());
|
||||
fCreateVersionTxnListener.versionCreated(entry.getKey(), entry.getValue());
|
||||
fAVMNodeDAO.yesCache();
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -520,13 +520,13 @@ public class AVMServicePermissionsTest extends TestCase
|
||||
node = avmNodeDAO.getByID(desc.getId());
|
||||
DbAccessControlList dirAcl = node.getAcl();
|
||||
assertNotNull(dirAcl);
|
||||
assertTrue(acl.getId() == dirAcl.getId());
|
||||
assertEquals(acl.getId(), dirAcl.getId());
|
||||
|
||||
desc = avmService.lookup(-1, storeName + "-layer-base:/layer-to-base/update-dir/update-file");
|
||||
node = avmNodeDAO.getByID(desc.getId());
|
||||
DbAccessControlList fileAcl = node.getAcl();
|
||||
assertNotNull(fileAcl);
|
||||
assertTrue(acl.getId() == fileAcl.getId());
|
||||
assertEquals(acl.getId(), fileAcl.getId());
|
||||
|
||||
avmService.createSnapshot(storeName, "store", "store");
|
||||
avmService.createSnapshot(storeName + "-layer-base", "store", "store");
|
||||
@@ -549,7 +549,7 @@ public class AVMServicePermissionsTest extends TestCase
|
||||
node = avmNodeDAO.getByID(desc.getId());
|
||||
dirAcl = node.getAcl();
|
||||
assertNotNull(dirAcl);
|
||||
assertTrue(acl.getId() == dirAcl.getId());
|
||||
assertEquals(acl.getId(), dirAcl.getId());
|
||||
|
||||
desc = avmService.lookup(-1, storeName + "-layer-base:/layer-to-base/update-dir/update-file");
|
||||
node = avmNodeDAO.getByID(desc.getId());
|
||||
@@ -597,13 +597,13 @@ public class AVMServicePermissionsTest extends TestCase
|
||||
node = avmNodeDAO.getByID(desc.getId());
|
||||
DbAccessControlList dirAcl = node.getAcl();
|
||||
assertNotNull(dirAcl);
|
||||
assertTrue(acl.getId() == dirAcl.getId());
|
||||
assertEquals(acl.getId(), dirAcl.getId());
|
||||
|
||||
desc = avmService.lookup(-1, storeName + "-layer-base:/layer-to-base/update-dir/update-file");
|
||||
node = avmNodeDAO.getByID(desc.getId());
|
||||
DbAccessControlList fileAcl = node.getAcl();
|
||||
assertNotNull(fileAcl);
|
||||
assertTrue(acl.getId() == fileAcl.getId());
|
||||
assertEquals(acl.getId(), fileAcl.getId());
|
||||
|
||||
avmService.createSnapshot(storeName, "store", "store");
|
||||
avmService.createSnapshot(storeName + "-layer-base", "store", "store");
|
||||
@@ -628,7 +628,7 @@ public class AVMServicePermissionsTest extends TestCase
|
||||
node = avmNodeDAO.getByID(desc.getId());
|
||||
dirAcl = node.getAcl();
|
||||
assertNotNull(dirAcl);
|
||||
assertTrue(acl.getId() == dirAcl.getId());
|
||||
assertEquals(acl.getId(), dirAcl.getId());
|
||||
|
||||
desc = avmService.lookup(-1, storeName + "-layer-base:/layer-to-base/update-dir/update-file");
|
||||
node = avmNodeDAO.getByID(desc.getId());
|
||||
|
@@ -569,6 +569,7 @@ public class AVMServiceTest extends AVMServiceTestBase
|
||||
/**
|
||||
* Test Deployment.
|
||||
*/
|
||||
/*
|
||||
public void testDeployment() throws Exception
|
||||
{
|
||||
try
|
||||
@@ -673,7 +674,7 @@ public class AVMServiceTest extends AVMServiceTestBase
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
|
||||
*/
|
||||
protected void runQueriesForCreateAndDeploy(String store) throws Exception
|
||||
{
|
||||
StoreRef storeRef = AVMNodeConverter.ToStoreRef(store);
|
||||
|
@@ -190,11 +190,14 @@ public class AVMStoreImpl implements AVMStore, Serializable
|
||||
@SuppressWarnings("unchecked")
|
||||
public Map<String, Integer> createSnapshot(String tag, String description, Map<String, Integer> snapShotMap)
|
||||
{
|
||||
VersionRoot lastVersion = AVMDAOs.Instance().fVersionRootDAO.getMaxVersion(this);
|
||||
long rootID = fRoot.getId();
|
||||
AVMStoreImpl me = (AVMStoreImpl)AVMDAOs.Instance().fAVMStoreDAO.getByID(fID);
|
||||
VersionRoot lastVersion = AVMDAOs.Instance().fVersionRootDAO.getMaxVersion(me);
|
||||
List<VersionLayeredNodeEntry> layeredEntries =
|
||||
AVMDAOs.Instance().fVersionLayeredNodeEntryDAO.get(lastVersion);
|
||||
// Is there no need for a snapshot?
|
||||
if (!fRoot.getIsNew() && layeredEntries.size() == 0)
|
||||
DirectoryNode root = (DirectoryNode)AVMDAOs.Instance().fAVMNodeDAO.getByID(rootID);
|
||||
if (!root.getIsNew() && layeredEntries.size() == 0)
|
||||
{
|
||||
// So, we set the tag and description fields of the latest version.
|
||||
if (tag != null || description != null)
|
||||
@@ -205,13 +208,13 @@ public class AVMStoreImpl implements AVMStore, Serializable
|
||||
snapShotMap.put(fName, lastVersion.getVersionID());
|
||||
return snapShotMap;
|
||||
}
|
||||
snapShotMap.put(fName, fNextVersionID);
|
||||
snapShotMap.put(fName, me.fNextVersionID);
|
||||
// Force copies on all the layered nodes from last snapshot.
|
||||
for (VersionLayeredNodeEntry entry : layeredEntries)
|
||||
{
|
||||
String path = entry.getPath();
|
||||
path = path.substring(path.indexOf(':') + 1);
|
||||
Lookup lookup = lookup(-1, path, false, false);
|
||||
Lookup lookup = me.lookup(-1, path, false, false);
|
||||
if (lookup == null)
|
||||
{
|
||||
continue;
|
||||
@@ -255,59 +258,50 @@ public class AVMStoreImpl implements AVMStore, Serializable
|
||||
*/
|
||||
}
|
||||
// Clear out the new nodes.
|
||||
List<Long> newInRep = AVMDAOs.Instance().fAVMNodeDAO.getNewInStoreIDs(this);
|
||||
List<AVMNode> layeredNodes = new ArrayList<AVMNode>();
|
||||
for (Long newGuyID : newInRep)
|
||||
List<Long> allLayeredNodeIDs = AVMDAOs.Instance().fAVMNodeDAO.getNewLayeredInStoreIDs(me);
|
||||
AVMDAOs.Instance().fAVMNodeDAO.clearNewInStore(me);
|
||||
AVMDAOs.Instance().fAVMNodeDAO.clear();
|
||||
List<Long> layeredNodeIDs = new ArrayList<Long>();
|
||||
for (Long layeredID : allLayeredNodeIDs)
|
||||
{
|
||||
AVMNode newGuy = AVMDAOs.Instance().fAVMNodeDAO.getByID(newGuyID);
|
||||
newGuy.setStoreNew(null);
|
||||
Layered layered = null;
|
||||
if (newGuy.getType() == AVMNodeType.LAYERED_DIRECTORY &&
|
||||
((LayeredDirectoryNode)newGuy).getPrimaryIndirection())
|
||||
Layered layered = (Layered)AVMDAOs.Instance().fAVMNodeDAO.getByID(layeredID);
|
||||
String indirection = layered.getIndirection();
|
||||
if (indirection == null)
|
||||
{
|
||||
layered = (Layered)AVMNodeUnwrapper.Unwrap(newGuy);
|
||||
continue;
|
||||
}
|
||||
if (newGuy.getType() == AVMNodeType.LAYERED_FILE)
|
||||
layeredNodeIDs.add(layeredID);
|
||||
String storeName = indirection.substring(0, indirection.indexOf(':'));
|
||||
if (!snapShotMap.containsKey(storeName))
|
||||
{
|
||||
layered = (Layered)AVMNodeUnwrapper.Unwrap(newGuy);
|
||||
}
|
||||
if (layered != null)
|
||||
{
|
||||
layeredNodes.add(newGuy);
|
||||
String indirection = layered.getIndirection();
|
||||
String storeName = indirection.substring(0, indirection.indexOf(':'));
|
||||
if (!snapShotMap.containsKey(storeName))
|
||||
AVMStore store = AVMDAOs.Instance().fAVMStoreDAO.getByName(storeName);
|
||||
if (store == null)
|
||||
{
|
||||
AVMStore store = AVMDAOs.Instance().fAVMStoreDAO.getByName(storeName);
|
||||
if (store == null)
|
||||
{
|
||||
layered.setIndirectionVersion(-1);
|
||||
}
|
||||
else
|
||||
{
|
||||
store.createSnapshot(null, null, snapShotMap);
|
||||
layered.setIndirectionVersion(snapShotMap.get(storeName));
|
||||
}
|
||||
layered.setIndirectionVersion(-1);
|
||||
}
|
||||
else
|
||||
{
|
||||
store.createSnapshot(null, null, snapShotMap);
|
||||
layered = (Layered)AVMDAOs.Instance().fAVMNodeDAO.getByID(layeredID);
|
||||
layered.setIndirectionVersion(snapShotMap.get(storeName));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
AVMDAOs.Instance().fAVMNodeDAO.evict(newGuy);
|
||||
layered.setIndirectionVersion(snapShotMap.get(storeName));
|
||||
}
|
||||
}
|
||||
AVMDAOs.Instance().fAVMNodeDAO.flush();
|
||||
// Make up a new version record.
|
||||
String user = RawServices.Instance().getAuthenticationComponent().getCurrentUserName();
|
||||
if (user == null)
|
||||
{
|
||||
user = RawServices.Instance().getAuthenticationComponent().getSystemUserName();
|
||||
}
|
||||
VersionRoot versionRoot = new VersionRootImpl(this,
|
||||
fRoot,
|
||||
fNextVersionID++,
|
||||
me = (AVMStoreImpl)AVMDAOs.Instance().fAVMStoreDAO.getByID(fID);
|
||||
VersionRoot versionRoot = new VersionRootImpl(me,
|
||||
me.fRoot,
|
||||
me.fNextVersionID++,
|
||||
System.currentTimeMillis(),
|
||||
user,
|
||||
tag,
|
||||
@@ -315,8 +309,9 @@ public class AVMStoreImpl implements AVMStore, Serializable
|
||||
// Another embarassing flush needed.
|
||||
AVMDAOs.Instance().fAVMNodeDAO.flush();
|
||||
AVMDAOs.Instance().fVersionRootDAO.save(versionRoot);
|
||||
for (AVMNode node : layeredNodes)
|
||||
for (Long nodeID : layeredNodeIDs)
|
||||
{
|
||||
AVMNode node = AVMDAOs.Instance().fAVMNodeDAO.getByID(nodeID);
|
||||
List<String> paths = fAVMRepository.getVersionPaths(versionRoot, node);
|
||||
for (String path : paths)
|
||||
{
|
||||
@@ -325,7 +320,6 @@ public class AVMStoreImpl implements AVMStore, Serializable
|
||||
AVMDAOs.Instance().fVersionLayeredNodeEntryDAO.save(entry);
|
||||
}
|
||||
}
|
||||
// Increment the version id.
|
||||
return snapShotMap;
|
||||
}
|
||||
|
||||
|
@@ -92,9 +92,11 @@
|
||||
<property name="indirectionVersion" type="int" column="indirection_version"/>
|
||||
<!-- This marks a layered directory as either knowing itself what
|
||||
it points at (true) or inheriting what it points at from its
|
||||
container (false). -->
|
||||
container (false).
|
||||
Ideally we would have the column 'indirection' in the index but it is too long.
|
||||
-->
|
||||
<property name="primaryIndirection"
|
||||
column="primary_indirection" type="boolean" index="idx_avm_lyr_indn" />
|
||||
column="primary_indirection" type="boolean" index="idx_avm_n_pi" />
|
||||
<property name="opacity" column="opacity" type="boolean"/>
|
||||
<!-- Map of names to DirectoryEntries. -->
|
||||
</subclass>
|
||||
@@ -281,6 +283,27 @@
|
||||
where an.storeNew = :store
|
||||
]]>
|
||||
</query>
|
||||
<query name="AVMNode.ClearNewInStore">
|
||||
<![CDATA[
|
||||
update versioned AVMNodeImpl an
|
||||
set an.storeNew = null
|
||||
where an.storeNew = :store
|
||||
]]>
|
||||
</query>
|
||||
<query name="AVMNode.GetNewLayeredDirectory">
|
||||
<![CDATA[
|
||||
select an.id
|
||||
from LayeredDirectoryNodeImpl an
|
||||
where an.storeNew = :store
|
||||
]]>
|
||||
</query>
|
||||
<query name="AVMNode.GetNewLayeredFile">
|
||||
<![CDATA[
|
||||
select an.id
|
||||
from LayeredFileNodeImpl an
|
||||
where an.storeNew = :store
|
||||
]]>
|
||||
</query>
|
||||
<query name="AVMNode.GetDescendents">
|
||||
<![CDATA[
|
||||
select hl.descendent
|
||||
|
@@ -33,7 +33,12 @@ 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.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import org.hibernate.CacheMode;
|
||||
import org.hibernate.Query;
|
||||
import org.hibernate.impl.SessionImpl;
|
||||
import org.hibernate.stat.SessionStatistics;
|
||||
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
|
||||
|
||||
/**
|
||||
@@ -43,6 +48,8 @@ import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
|
||||
class AVMNodeDAOHibernate extends HibernateDaoSupport implements
|
||||
AVMNodeDAO
|
||||
{
|
||||
private static Log fgLogger = LogFactory.getLog(AVMNodeDAOHibernate.class);
|
||||
|
||||
/**
|
||||
* Do nothing constructor.
|
||||
*/
|
||||
@@ -232,4 +239,57 @@ class AVMNodeDAOHibernate extends HibernateDaoSupport implements
|
||||
getSession().flush();
|
||||
getSession().evict(node);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.alfresco.repo.avm.AVMNodeDAO#clear()
|
||||
*/
|
||||
public void clear()
|
||||
{
|
||||
fgLogger.error(getSession().getStatistics());
|
||||
getSession().flush();
|
||||
getSession().clear();
|
||||
fgLogger.error(getSession().getStatistics());
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.alfresco.repo.avm.AVMNodeDAO#noCache()
|
||||
*/
|
||||
public void noCache()
|
||||
{
|
||||
getSession().getSessionFactory().evict(AVMNodeImpl.class);
|
||||
getSession().setCacheMode(CacheMode.IGNORE);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.alfresco.repo.avm.AVMNodeDAO#yesCache()
|
||||
*/
|
||||
public void yesCache()
|
||||
{
|
||||
getSession().setCacheMode(CacheMode.NORMAL);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.alfresco.repo.avm.AVMNodeDAO#clearNewInStore(org.alfresco.repo.avm.AVMStore)
|
||||
*/
|
||||
public void clearNewInStore(AVMStore store)
|
||||
{
|
||||
Query query = getSession().getNamedQuery("AVMNode.ClearNewInStore");
|
||||
query.setEntity("store", store);
|
||||
query.executeUpdate();
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.alfresco.repo.avm.AVMNodeDAO#getNewLayeredInStoreIDs(org.alfresco.repo.avm.AVMStore)
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public List<Long> getNewLayeredInStoreIDs(AVMStore store)
|
||||
{
|
||||
Query query = getSession().getNamedQuery("AVMNode.GetNewLayeredDirectory");
|
||||
query.setEntity("store", store);
|
||||
List<Long> ids = (List<Long>)query.list();
|
||||
query = getSession().getNamedQuery("AVMNode.GetNewLayeredFile");
|
||||
query.setEntity("store", store);
|
||||
ids.addAll((List<Long>)query.list());
|
||||
return ids;
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user