mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-08-07 17:49:17 +00:00
Merged BRANCHES/V3.2 to HEAD:
18363: WCM clustering - ETHREEOH-3962 (duplicate root node entry) 19091: Fix Part 1 ALF-726: v3.1.x Content Cleaner Job needs to be ported to v3.2 19159: Fixed ALF-726: Migrate pre-3.2 content URLs to new format and pick up tag existing orphaned content 19169: Fix fallout from 19159 for ALF-726: Migrate pre-3.2 content URLs to new format and pick up tag existing orphaned content 19262: ALF-726 Multithreading for content URL conversion git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@19267 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
@@ -19,8 +19,12 @@
|
||||
package org.alfresco.repo.domain.patch;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import org.alfresco.ibatis.BatchingDAO;
|
||||
import org.alfresco.repo.domain.avm.AVMNodeEntity;
|
||||
import org.alfresco.repo.domain.contentdata.ContentDataDAO;
|
||||
import org.alfresco.service.cmr.repository.ContentData;
|
||||
|
||||
|
||||
/**
|
||||
@@ -31,8 +35,25 @@ import org.alfresco.repo.domain.avm.AVMNodeEntity;
|
||||
* @author janv
|
||||
* @since 3.2
|
||||
*/
|
||||
public abstract class AbstractPatchDAOImpl implements PatchDAO
|
||||
public abstract class AbstractPatchDAOImpl implements PatchDAO, BatchingDAO
|
||||
{
|
||||
private ContentDataDAO contentDataDAO;
|
||||
|
||||
protected AbstractPatchDAOImpl()
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the DAO that supplies {@link ContentData} IDs
|
||||
*/
|
||||
public void setContentDataDAO(ContentDataDAO contentDataDAO)
|
||||
{
|
||||
this.contentDataDAO = contentDataDAO;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public Long getAVMNodesCountWhereNewInStore()
|
||||
{
|
||||
return getAVMNodeEntitiesCountWhereNewInStore();
|
||||
@@ -63,4 +84,91 @@ public abstract class AbstractPatchDAOImpl implements PatchDAO
|
||||
protected abstract List<AVMNodeEntity> getNullVersionLayeredDirectoryNodeEntities();
|
||||
|
||||
protected abstract List<AVMNodeEntity> getNullVersionLayeredFileNodeEntities();
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
* <p>
|
||||
* @see #getAdmOldContentProperties(Long, Long)
|
||||
*/
|
||||
public void updateAdmV31ContentProperties(Long minNodeId, Long maxNodeId)
|
||||
{
|
||||
List<Map<String, Object>> props = getAdmOldContentProperties(minNodeId, maxNodeId);
|
||||
|
||||
// Do a first pass to create the ContentData IDs
|
||||
for (Map<String, Object> prop : props)
|
||||
{
|
||||
String stringValue = (String) prop.get("stringValue");
|
||||
|
||||
try
|
||||
{
|
||||
ContentData contentData = ContentData.createContentProperty(stringValue);
|
||||
Long contentDataId = contentDataDAO.createContentData(contentData).getFirst();
|
||||
prop.put("contentDataId", contentDataId);
|
||||
}
|
||||
catch (Throwable e)
|
||||
{
|
||||
// We don't care about this too much as it'll just leak a binary
|
||||
}
|
||||
}
|
||||
|
||||
// Now do the updates in the context of a batch
|
||||
try
|
||||
{
|
||||
// Run using a batch
|
||||
startBatch();
|
||||
|
||||
for (Map<String, Object> prop : props)
|
||||
{
|
||||
Long nodeId = (Long) prop.get("nodeId");
|
||||
Long qnameId = (Long) prop.get("qnameId");
|
||||
Integer listIndex = (Integer) prop.get("listIndex");
|
||||
Long localeId = (Long) prop.get("localeId");
|
||||
Long contentDataId = (Long) prop.get("contentDataId");
|
||||
if (contentDataId == null)
|
||||
{
|
||||
// There was a problem with this
|
||||
continue;
|
||||
}
|
||||
// Update
|
||||
updateAdmOldContentProperty(nodeId, qnameId, listIndex, localeId, contentDataId);
|
||||
}
|
||||
}
|
||||
finally
|
||||
{
|
||||
executeBatch();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Results are of the form:
|
||||
* <pre>
|
||||
* nodeId: java.lang.Long
|
||||
* qnameId: java.lang.Long
|
||||
* listIndex: java.lang.Integer
|
||||
* localeId: java.lang.Long
|
||||
* stringValue: java.lang.String
|
||||
* </pre>
|
||||
*
|
||||
*
|
||||
* @param minNodeId inclusive lower bound for Node ID
|
||||
* @param maxNodeId exclusive upper bound for Node ID
|
||||
* @return Returns a map of query results
|
||||
*/
|
||||
protected abstract List<Map<String, Object>> getAdmOldContentProperties(Long minNodeId, Long maxNodeId);
|
||||
|
||||
/**
|
||||
*
|
||||
* @param nodeId part of the unique key
|
||||
* @param qnameId part of the unique key
|
||||
* @param listIndex part of the unique key
|
||||
* @param localeId part of the unique key
|
||||
* @param longValue the new ContentData ID
|
||||
* @return Returns the row update count
|
||||
*/
|
||||
protected abstract void updateAdmOldContentProperty(
|
||||
Long nodeId,
|
||||
Long qnameId,
|
||||
Integer listIndex,
|
||||
Long localeId,
|
||||
Long longValue);
|
||||
}
|
||||
|
Reference in New Issue
Block a user