mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-08-07 17:49:17 +00:00
FIXED : ALF-12531: MMT needs to properly support upgrading of AMP files
git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@33695 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
@@ -117,6 +117,10 @@ public class InstalledFiles
|
|||||||
throw new ModuleManagementToolException("Error whilst reading file '" + getFileLocation(), exception);
|
throw new ModuleManagementToolException("Error whilst reading file '" + getFileLocation(), exception);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
throw new ModuleManagementToolException("Invalid module. The installation file does not exist for module: "+moduleId);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -240,4 +244,14 @@ public class InstalledFiles
|
|||||||
{
|
{
|
||||||
this.mkdirs.add(location);
|
this.mkdirs.add(location);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString()
|
||||||
|
{
|
||||||
|
StringBuilder builder = new StringBuilder();
|
||||||
|
builder.append("InstalledFiles [warLocation=").append(this.warLocation).append(", moduleId=")
|
||||||
|
.append(this.moduleId).append(", adds=").append(this.adds).append(", updates=")
|
||||||
|
.append(this.updates).append(", mkdirs=").append(this.mkdirs).append("]");
|
||||||
|
return builder.toString();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -69,12 +69,14 @@ public class ModuleManagementTool
|
|||||||
|
|
||||||
/** Operations and options supperted via the command line interface to this class */
|
/** Operations and options supperted via the command line interface to this class */
|
||||||
private static final String OP_INSTALL = "install";
|
private static final String OP_INSTALL = "install";
|
||||||
|
private static final String OP_UNINSTALL = "uninstall";
|
||||||
private static final String OP_LIST = "list";
|
private static final String OP_LIST = "list";
|
||||||
private static final String OPTION_VERBOSE = "-verbose";
|
private static final String OPTION_VERBOSE = "-verbose";
|
||||||
private static final String OPTION_FORCE = "-force";
|
private static final String OPTION_FORCE = "-force";
|
||||||
private static final String OPTION_PREVIEW = "-preview";
|
private static final String OPTION_PREVIEW = "-preview";
|
||||||
private static final String OPTION_NOBACKUP = "-nobackup";
|
private static final String OPTION_NOBACKUP = "-nobackup";
|
||||||
private static final String OPTION_DIRECTORY = "-directory";
|
private static final String OPTION_DIRECTORY = "-directory";
|
||||||
|
private static final String OPTION_PURGE = "-purge";
|
||||||
|
|
||||||
private static final int ERROR_EXIT_CODE = 1;
|
private static final int ERROR_EXIT_CODE = 1;
|
||||||
private static final int SUCCESS_EXIT_CODE = 0;
|
private static final int SUCCESS_EXIT_CODE = 0;
|
||||||
@@ -255,30 +257,33 @@ public class ModuleManagementTool
|
|||||||
VersionNumber installedVersion = installedModuleDetails.getVersion();
|
VersionNumber installedVersion = installedModuleDetails.getVersion();
|
||||||
|
|
||||||
int compareValue = installedVersion.compareTo(installingVersion);
|
int compareValue = installedVersion.compareTo(installingVersion);
|
||||||
if (forceInstall == true || compareValue == -1)
|
if (compareValue > 0)
|
||||||
{
|
|
||||||
if (forceInstall == true)
|
|
||||||
{
|
|
||||||
// Warn of forced install
|
|
||||||
outputMessage("WARNING: The installation of this module is being forced. All files will be removed and replaced regardless of exiting versions present.");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Trying to update the extension, old files need to cleaned before we proceed
|
|
||||||
outputMessage("Clearing out files relating to version '" + installedVersion + "' of module '" + installedId + "'");
|
|
||||||
cleanWAR(warFileLocation, installedId, preview);
|
|
||||||
}
|
|
||||||
else if (compareValue == 0)
|
|
||||||
{
|
|
||||||
// Trying to install the same extension version again
|
|
||||||
outputMessage("WARNING: This version of this module is already installed in the WAR. Installation skipped.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
else if (compareValue == 1)
|
|
||||||
{
|
{
|
||||||
// Trying to install an earlier version of the extension
|
// Trying to install an earlier version of the extension
|
||||||
outputMessage("WARNING: A later version of this module is already installed in the WAR. Installation skipped.");
|
outputMessage("WARNING: A later version of this module is already installed in the WAR. Installation skipped. "+
|
||||||
|
"You could force the installation by passing the -force option.",false);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (forceInstall == true)
|
||||||
|
{
|
||||||
|
// Warn of forced install
|
||||||
|
outputMessage("WARNING: The installation of this module is being forced. All files will be removed and replaced regardless of exiting versions present.",false);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (compareValue == 0)
|
||||||
|
{
|
||||||
|
// Trying to install the same extension version again
|
||||||
|
outputMessage("WARNING: This version of this module is already installed in the WAR..upgrading.",false);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (forceInstall == true || compareValue <= 0)
|
||||||
|
{
|
||||||
|
|
||||||
|
// Trying to update the extension, old files need to cleaned before we proceed
|
||||||
|
outputMessage("Clearing out files relating to version '" + installedVersion + "' of module '" + installedId + "'",false);
|
||||||
|
uninstallModule(installedId, warFileLocation, preview, true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if a custom mapping file has been defined
|
// Check if a custom mapping file has been defined
|
||||||
@@ -410,13 +415,14 @@ public class ModuleManagementTool
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Cleans the WAR file of all files relating to the currently installed version of the the AMP.
|
* Cleans the WAR file of all files relating to the currently installed version of the the Module.
|
||||||
*
|
*
|
||||||
* @param warFileLocatio the war file location
|
* @param warFileLocation the war file location
|
||||||
* @param moduleId the module id
|
* @param moduleId the module id
|
||||||
* @param preview indicates whether this is a preview installation
|
* @param preview indicates whether this is a preview installation
|
||||||
|
* @param purge Fully delete all files (including those marked "PRESERVED")
|
||||||
*/
|
*/
|
||||||
private void cleanWAR(String warFileLocation, String moduleId, boolean preview)
|
public void uninstallModule(String moduleId,String warFileLocation, boolean preview, boolean purge)
|
||||||
{
|
{
|
||||||
InstalledFiles installedFiles = new InstalledFiles(warFileLocation, moduleId);
|
InstalledFiles installedFiles = new InstalledFiles(warFileLocation, moduleId);
|
||||||
installedFiles.load();
|
installedFiles.load();
|
||||||
@@ -585,14 +591,6 @@ public class ModuleManagementTool
|
|||||||
throw new UnsupportedOperationException("Enable module is not currently supported");
|
throw new UnsupportedOperationException("Enable module is not currently supported");
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @throws UnsupportedOperationException
|
|
||||||
*/
|
|
||||||
public void uninstallModule(String moduleId, String warLocation)
|
|
||||||
{
|
|
||||||
throw new UnsupportedOperationException("Uninstall module is not currently supported");
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Lists all the currently installed modules in the WAR
|
* Lists all the currently installed modules in the WAR
|
||||||
*
|
*
|
||||||
@@ -603,6 +601,8 @@ public class ModuleManagementTool
|
|||||||
ModuleDetails moduleDetails = null;
|
ModuleDetails moduleDetails = null;
|
||||||
boolean previous = this.verbose;
|
boolean previous = this.verbose;
|
||||||
this.verbose = true;
|
this.verbose = true;
|
||||||
|
boolean moduleFound = false;
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
File moduleDir = new File(warLocation + WarHelper.MODULE_NAMESPACE_DIR, DETECTOR_AMP_AND_WAR);
|
File moduleDir = new File(warLocation + WarHelper.MODULE_NAMESPACE_DIR, DETECTOR_AMP_AND_WAR);
|
||||||
@@ -618,11 +618,12 @@ public class ModuleManagementTool
|
|||||||
{
|
{
|
||||||
if (dir.isDirectory() == true)
|
if (dir.isDirectory() == true)
|
||||||
{
|
{
|
||||||
File moduleProperties = new File(dir.getPath() + "/module.properties", DETECTOR_AMP_AND_WAR);
|
File moduleProperties = new File(dir.getPath() + WarHelper.MODULE_CONFIG_IN_WAR, DETECTOR_AMP_AND_WAR);
|
||||||
if (moduleProperties.exists() == true)
|
if (moduleProperties.exists() == true)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
moduleFound = true;
|
||||||
InputStream is = new FileInputStream(moduleProperties);
|
InputStream is = new FileInputStream(moduleProperties);
|
||||||
moduleDetails = ModuleDetailsHelper.createModuleDetailsFromPropertiesStream(is);
|
moduleDetails = ModuleDetailsHelper.createModuleDetailsFromPropertiesStream(is);
|
||||||
}
|
}
|
||||||
@@ -644,6 +645,11 @@ public class ModuleManagementTool
|
|||||||
{
|
{
|
||||||
outputMessage("No modules are installed in this WAR file");
|
outputMessage("No modules are installed in this WAR file");
|
||||||
}
|
}
|
||||||
|
if (!moduleFound)
|
||||||
|
{
|
||||||
|
outputMessage("No modules were found in this WAR file");
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
@@ -694,77 +700,106 @@ public class ModuleManagementTool
|
|||||||
ModuleManagementTool manager = new ModuleManagementTool();
|
ModuleManagementTool manager = new ModuleManagementTool();
|
||||||
|
|
||||||
String operation = args[0];
|
String operation = args[0];
|
||||||
if (operation.equals(OP_INSTALL) == true && args.length >= 3)
|
try
|
||||||
{
|
{
|
||||||
String aepFileLocation = args[1];
|
if (operation.equals(OP_INSTALL) == true && args.length >= 3)
|
||||||
String warFileLocation = args[2];
|
{
|
||||||
boolean forceInstall = false;
|
String aepFileLocation = args[1];
|
||||||
boolean previewInstall = false;
|
String warFileLocation = args[2];
|
||||||
boolean backup = true;
|
boolean forceInstall = false;
|
||||||
boolean directory = false;
|
boolean previewInstall = false;
|
||||||
|
boolean backup = true;
|
||||||
if (args.length > 3)
|
boolean directory = false;
|
||||||
{
|
|
||||||
for (int i = 3; i < args.length; i++)
|
if (args.length > 3)
|
||||||
{
|
{
|
||||||
String option = args[i];
|
for (int i = 3; i < args.length; i++)
|
||||||
if (OPTION_VERBOSE.equals(option) == true)
|
|
||||||
{
|
{
|
||||||
manager.setVerbose(true);
|
String option = args[i];
|
||||||
}
|
if (OPTION_VERBOSE.equals(option) == true)
|
||||||
else if (OPTION_FORCE.equals(option) == true)
|
{
|
||||||
{
|
manager.setVerbose(true);
|
||||||
forceInstall = true;
|
}
|
||||||
}
|
else if (OPTION_FORCE.equals(option) == true)
|
||||||
else if (OPTION_PREVIEW.equals(option) == true)
|
{
|
||||||
{
|
forceInstall = true;
|
||||||
previewInstall = true;
|
}
|
||||||
manager.setVerbose(true);
|
else if (OPTION_PREVIEW.equals(option) == true)
|
||||||
}
|
{
|
||||||
else if (OPTION_NOBACKUP.equals(option) == true)
|
previewInstall = true;
|
||||||
{
|
manager.setVerbose(true);
|
||||||
backup = false;
|
}
|
||||||
}
|
else if (OPTION_NOBACKUP.equals(option) == true)
|
||||||
else if (OPTION_DIRECTORY.equals(option) == true)
|
{
|
||||||
{
|
backup = false;
|
||||||
directory = true;
|
}
|
||||||
|
else if (OPTION_DIRECTORY.equals(option) == true)
|
||||||
|
{
|
||||||
|
directory = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (directory == false)
|
||||||
|
{
|
||||||
|
// Install the module
|
||||||
|
manager.installModule(aepFileLocation, warFileLocation, previewInstall, forceInstall, backup);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Install the modules from the directory
|
||||||
|
manager.installModules(aepFileLocation, warFileLocation, previewInstall, forceInstall, backup);
|
||||||
|
}
|
||||||
|
System.exit(SUCCESS_EXIT_CODE);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
else if (OP_LIST.equals(operation) == true && args.length == 2)
|
||||||
try
|
|
||||||
{
|
{
|
||||||
if (directory == false)
|
// List the installed modules
|
||||||
{
|
String warFileLocation = args[1];
|
||||||
// Install the module
|
manager.listModules(warFileLocation);
|
||||||
manager.installModule(aepFileLocation, warFileLocation, previewInstall, forceInstall, backup);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Install the modules from the directory
|
|
||||||
manager.installModules(aepFileLocation, warFileLocation, previewInstall, forceInstall, backup);
|
|
||||||
}
|
|
||||||
System.exit(SUCCESS_EXIT_CODE);
|
System.exit(SUCCESS_EXIT_CODE);
|
||||||
}
|
}
|
||||||
catch (ModuleManagementToolException e)
|
else if (OP_UNINSTALL.equals(operation) == true && args.length >= 3)
|
||||||
{
|
{
|
||||||
// These are user-friendly
|
String moduleId = args[1];
|
||||||
manager.outputMessage(e.getMessage());
|
String warLocation = args[2];
|
||||||
outputUsage();
|
boolean purge = false;
|
||||||
System.exit(ERROR_EXIT_CODE);
|
boolean preview = false;
|
||||||
|
|
||||||
|
if (args.length >= 4)
|
||||||
|
{
|
||||||
|
for (int i = 3; i < args.length; i++)
|
||||||
|
{
|
||||||
|
String option = args[i];
|
||||||
|
if (OPTION_PURGE.equals(option) == true)
|
||||||
|
{
|
||||||
|
purge = true;
|
||||||
|
}
|
||||||
|
if (OPTION_PREVIEW.equals(option) == true)
|
||||||
|
{
|
||||||
|
preview = true;
|
||||||
|
manager.setVerbose(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
manager.setVerbose(true);
|
||||||
|
manager.uninstallModule(moduleId, warLocation,preview, purge);
|
||||||
|
System.exit(SUCCESS_EXIT_CODE);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
outputUsage();
|
||||||
|
System.exit(SUCCESS_EXIT_CODE);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
else if (OP_LIST.equals(operation) == true && args.length == 2)
|
catch (ModuleManagementToolException e)
|
||||||
{
|
|
||||||
// List the installed modules
|
|
||||||
String warFileLocation = args[1];
|
|
||||||
manager.listModules(warFileLocation);
|
|
||||||
System.exit(SUCCESS_EXIT_CODE);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
|
// These are user-friendly
|
||||||
|
manager.outputMessage(e.getMessage());
|
||||||
outputUsage();
|
outputUsage();
|
||||||
System.exit(SUCCESS_EXIT_CODE);
|
System.exit(ERROR_EXIT_CODE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -827,5 +862,8 @@ public class ModuleManagementTool
|
|||||||
System.out.println("list: Lists all the modules currently installed in an Alfresco WAR file.");
|
System.out.println("list: Lists all the modules currently installed in an Alfresco WAR file.");
|
||||||
System.out.println("usage: list <WARFileLocation>\n");
|
System.out.println("usage: list <WARFileLocation>\n");
|
||||||
System.out.println("-----------------------------------------------------------\n");
|
System.out.println("-----------------------------------------------------------\n");
|
||||||
|
System.out.println("uninstall: Uninstalls a module from the Alfresco WAR file.");
|
||||||
|
System.out.println("usage: uninstall <ModuleId> <WARFileLocation>\n");
|
||||||
|
System.out.println("-----------------------------------------------------------\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -210,6 +210,28 @@ public class ModuleManagementToolTest extends TestCase
|
|||||||
// TODO need to prove that the war file has not been updated in any way
|
// TODO need to prove that the war file has not been updated in any way
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void testUninstall()
|
||||||
|
throws Exception
|
||||||
|
{
|
||||||
|
manager.setVerbose(true);
|
||||||
|
|
||||||
|
String warLocation = getFileLocation(".war", "module/test.war");
|
||||||
|
String ampLocation = getFileLocation(".amp", "module/test_v1.amp");
|
||||||
|
|
||||||
|
// Initial install of module
|
||||||
|
this.manager.installModule(ampLocation, warLocation, false, false, false);
|
||||||
|
this.manager.listModules(warLocation);
|
||||||
|
this.manager.uninstallModule("test", warLocation, false, false);
|
||||||
|
|
||||||
|
List<String> files = new ArrayList<String>(10);
|
||||||
|
files.add("/WEB-INF/classes/alfresco/module/test/module.properties");
|
||||||
|
files.add("/WEB-INF/classes/alfresco/module/test/modifications.install");
|
||||||
|
files.add("/WEB-INF/lib/test.jar");
|
||||||
|
files.add("/WEB-INF/classes/alfresco/module/test/module-context.xml");
|
||||||
|
checkForFileNonExistance(warLocation, files);
|
||||||
|
}
|
||||||
|
|
||||||
public void testForcedInstall()
|
public void testForcedInstall()
|
||||||
throws Exception
|
throws Exception
|
||||||
{
|
{
|
||||||
@@ -247,6 +269,7 @@ public class ModuleManagementToolTest extends TestCase
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public void testList()
|
public void testList()
|
||||||
throws Exception
|
throws Exception
|
||||||
{
|
{
|
||||||
@@ -271,6 +294,21 @@ public class ModuleManagementToolTest extends TestCase
|
|||||||
return file.getPath();
|
return file.getPath();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// public void testNoWar() throws Exception
|
||||||
|
// {
|
||||||
|
// File noWar = new File("noWar");
|
||||||
|
// File amp = getFile(".amp", "module/test_v1.amp");
|
||||||
|
// try
|
||||||
|
// {
|
||||||
|
// this.manager.installModule(amp, noWar,false,false);
|
||||||
|
// }
|
||||||
|
// catch (ModuleManagementToolException exception)
|
||||||
|
// {
|
||||||
|
// assertTrue(exception.getMessage().endsWith("does not exist."));
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// }
|
||||||
|
|
||||||
private void checkForFileExistance(String warLocation, List<String> files)
|
private void checkForFileExistance(String warLocation, List<String> files)
|
||||||
{
|
{
|
||||||
for (String file : files)
|
for (String file : files)
|
||||||
|
Reference in New Issue
Block a user