Merged V3.2 to HEAD

15897: Merged V3.1 to V3.2
      14485: (RECORD ONLY) ETHREEOH-1937
      14915: (RECORD ONLY) Fix for ETHREEOH-2011: chaining-authentication-context.xml.sample
      14954: (RECORD ONLY) Fix merge error
      14966: (RECORD ONLY) Merged V2.2 to V3.1
         14131: *RECORD ONLY*
         14605: Merged HEAD to V2.2 (workaround for ETWOTWO-1137)
            14368: Fix for ETHREEOH-1936
         14607: Fixed NPE in TextMiningContentTransformer: Lead-up to fix for ETWOTWO-1174
      14992: (RECORD ONLY) Updated svn:mergeinfo for V2.1-A
      15080: Applied suggested fix for ETHREEOH-2252: Emailed content created in wrong space
      15131: Merged V2.1-A to V3.1 (ETHREEOH-2270)
         13465: Fix for ADB-161 ACT 7870 - added 'xsd' to mimetype map.
      15134: Merged V2.2 to V3.1
         14332: (RECORD-ONLY)
         14717: (RECORD-ONLY)
         14745: (RECORD-ONLY)
         14746: Fixed error relating to detection and clean-up of duplicate child associations
         14759: Missed check-in: Set transactionService for post-transaction duplicate child assoc cleanup
         14761: (RECORD-ONLY)
         14885: (RECORD-ONLY)
         14893: (RECORD-ONLY)
         14903: (RECORD-ONLY)
      15204: Fixed ETHREEOH-2303: FixNameCrcValuesPatch throws ConstraintViolationException during upgrade ...
      15214: Fixed ETHREEOH-1861: Offline synchronization updates file content without any changes
      15271: Applied patch fix: Imported users don't conform to case-sensitivity switch
      15352: ETHREEOH-2322
      15361: ETHREEOH-1112
      15369: ETHREEOH-2448
      15419: ETHREEOH-2479
      15431: ETHREEOH-2520 and ETHREEOH-2521
      15587: (RECORD ONLY) Moved Enterprise-only scripts to correct location
      15616: Fix ETHREEOH-2581 - WCM layered folder - can't submit deleted file
      15675: WCM fixes (ETHREEOH-2110 & ETHREEOH-2645)
      15836: Check for null username in ContentUsage service getUserUsage() method
      15840: (RECORD ONLY) Merged V3.2 to V3.1
         14760: Fix for ALFCOM-586 - trims and ignores leading/trailing whitespace before validation in JSF client forms.
      15841: Fixes for ETHREEOH-2702 and ETHREEOH-2687
      15860: (RECORD ONLY) Added Oracle and MS SQL Server config
      15891: Removed unused compiler directive
___________________________________________________________________
Modified: svn:mergeinfo
   Merged /alfresco/BRANCHES/DEV/BELARUS/ETHREEOH-2221:r14753
   Merged /alfresco/BRANCHES/V2.1-A: lots
   Merged /alfresco/BRANCHES/V2.2:r14131,14332,14605,14607,14717,14745-14746,14759,14761,14885,14893,14903
   Merged /alfresco/BRANCHES/V3.1:r14485,14915,14954,14966,14992,15080,15131,15134,15204,15214,15271,15352,15361,15369,15419,15431,15587,15616,15675,15818,15836,15840-15841,15860,15891
   Merged /alfresco/BRANCHES/V3.2:r15897


git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@16886 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Derek Hulley
2009-10-13 20:08:41 +00:00
parent 34b82892b5
commit 2dd348a281
20 changed files with 669 additions and 130 deletions

View File

@@ -75,6 +75,7 @@ public abstract class AbstractPatch implements Patch
private int fixesFromSchema;
private int fixesToSchema;
private int targetSchema;
private boolean force;
private String description;
/** a list of patches that this one depends on */
private List<Patch> dependsOn;
@@ -104,6 +105,7 @@ public abstract class AbstractPatch implements Patch
this.fixesFromSchema = -1;
this.fixesToSchema = -1;
this.targetSchema = -1;
this.force = false;
this.applied = false;
this.applyToTenants = true; // by default, apply to each tenant, if tenant service is enabled
this.dependsOn = Collections.emptyList();
@@ -257,6 +259,25 @@ public abstract class AbstractPatch implements Patch
this.targetSchema = version;
}
/**
* {@inheritDoc}
*/
public boolean isForce()
{
return force;
}
/**
* Set the flag that forces the patch to be forcefully applied. This allows patches to be overridden to induce execution
* regardless of the upgrade or installation versions, or even if the patch has been executed before.
*
* @param force <tt>true</tt> to force the patch to be applied
*/
public void setForce(boolean force)
{
this.force = force;
}
public String getDescription()
{
return description;
@@ -513,7 +534,7 @@ public abstract class AbstractPatch implements Patch
if (timeRemaining > 60000)
{
int reportInterval = getreportingInterval(timeSoFar, timeRemaining);
int reportInterval = getReportingInterval(timeSoFar, timeRemaining);
for (int i = previous + 1; i <= percentComplete; i++)
{
@@ -534,7 +555,7 @@ public abstract class AbstractPatch implements Patch
}
}
private int getreportingInterval(long soFar, long toGo)
private int getReportingInterval(long soFar, long toGo)
{
long total = soFar + toGo;
if (total < RANGE_10)

View File

@@ -62,6 +62,11 @@ public interface Patch
*/
public int getTargetSchema();
/**
* @return Returns <tt>true</tt> if the patch must forcefully run regardless of any other state
*/
public boolean isForce();
/**
* Get patches that this patch depends on
*

View File

@@ -247,18 +247,26 @@ public class PatchServiceImpl implements PatchService
private AppliedPatch applyPatch(Patch patch)
{
boolean forcePatch = patch.isForce();
if (forcePatch)
{
logger.warn(
"Patch will be forcefully executed: \n" +
" Patch: " + patch);
}
// get the patch from the DAO
AppliedPatch appliedPatch = patchDaoService.getAppliedPatch(patch.getId());
// We bypass the patch if it was executed successfully
if (appliedPatch != null)
if (appliedPatch != null && !forcePatch)
{
if (appliedPatch.getSucceeded())
{
// It has already been successfully applied
if (logger.isDebugEnabled())
{
logger.debug("Patch was already successfully applied: \n" +
" patch: " + appliedPatch);
logger.debug(
"Patch was already successfully applied: \n" +
" Patch: " + appliedPatch);
}
return appliedPatch;
}
@@ -268,8 +276,8 @@ public class PatchServiceImpl implements PatchService
boolean success = false;
// first check whether the patch is relevant to the repo
Descriptor repoDescriptor = descriptorService.getInstalledRepositoryDescriptor();
String preceededByAlternative = preceededByAlternative(patch);
boolean applies = applies(repoDescriptor, patch);
String preceededByAlternative = forcePatch ? null : preceededByAlternative(patch);
boolean applies = forcePatch || applies(repoDescriptor, patch);
if (!applies)
{
// create a dummy report

View File

@@ -65,6 +65,7 @@ public class FixNameCrcValuesPatch extends AbstractPatch
{
private static final String MSG_SUCCESS = "patch.fixNameCrcValues.result";
private static final String MSG_REWRITTEN = "patch.fixNameCrcValues.fixed";
private static final String MSG_UNABLE_TO_CHANGE = "patch.fixNameCrcValues.unableToChange";
private SessionFactory sessionFactory;
private NodeDaoService nodeDaoService;
@@ -163,6 +164,10 @@ public class FixNameCrcValuesPatch extends AbstractPatch
@SuppressWarnings("unused")
List<Long> childAssocIds = findMismatchedCrcs();
// Precautionary flush and clear so that we have an empty session
getSession().flush();
getSession().clear();
int updated = 0;
for (Long childAssocId : childAssocIds)
{
@@ -188,7 +193,24 @@ public class FixNameCrcValuesPatch extends AbstractPatch
assoc.setChildNodeNameCrc(crc);
// Persist
updated++;
getSession().flush();
try
{
getSession().flush();
}
catch (Throwable e)
{
String msg = I18NUtil.getMessage(MSG_UNABLE_TO_CHANGE, childNode.getId(), childName, oldCrc, crc, e.getMessage());
// We just log this and add details to the message file
if (logger.isDebugEnabled())
{
logger.debug(msg, e);
}
else
{
logger.warn(msg);
}
writeLine(msg);
}
getSession().clear();
// Record
writeLine(I18NUtil.getMessage(MSG_REWRITTEN, childNode.getId(), childName, oldCrc, crc));