Hello Magnolians!
I'm opening this 3d since I'm trying to create a code snippet that will permit 
me to re-install automatically certain modules in my repository.

I'd like to achieve this because we have to deploy on our Test Server on a 
daily basis and I don't want to be forced to change the version number because 
within our Development cycle we have to maintain the same version 
number(x.y.z-SNAPSHOT).

Basically the process is based on a file that I add in the tomcat/webapps 
folder. This file will act as a "flag" and in case it's not present some 
modules will be re-installed.

I added into a getExtraInstallTask(), defined in my Handler class, a call to 
the getStartupTasks() (that has been overridden). Inside the overridden 
getStartupTasks() this is what I do:

Preliminary controls:
1. Check if the webapp directory in the tomcat's installation exists or not

2. Check if the file already exists or not

The file exists:

3. I leave to Magnolia the further steps since I assume that if the file 
exists, I don't want to reload any module. So the process will continue by 
himself and at the end I'll login into the Magnolia UI without any issue.

The file doesn't exists:

3. I create the file and put it in the tomcat/webapps directory

4. I get all the installed modules by doing:

[code]
                                // I get all the installed modules
                                                                Map<String, 
ModuleDefinition> map = new HashMap<String, ModuleDefinition>();
                                                                try {
                                                                                
map = new BetwixtModuleDefinitionReader().readAll();
                                                                } catch 
(ModuleManagementException e) {
                                                                                
e.printStackTrace();
                                                                }
[/code]

5. Now that I have all the modules in a map I want to get only the modules that 
are part of my client business. At this point I added a filter based on the 
CanonicalName() and ClassName() of my modules.

6. I split the two modules types:
    6.1 Some from Magnolia that I don't want to touch
    6.2 Some made by me that have for example a 
canonicalName().contains("com.acme")
7. I create a RemoveNodeTask since the modules(6.2) are the ones that have to 
be deleted and installed

[code]
// here is where the deletion tasks are created
for(Entry<String, String> entry : vitecModulesMap.entrySet()) {                 
                                                               
    Task removeNodeTask = new RemoveNodeTask("Delete Acme Module: " + 
entry.getKey(), "Delete Acme Modules to optimize 
installation",RepositoryConstants.CONFIG, "/modules/" + entry.getKey());        
                                                          
    taskForModulesToRemove.add(new NodeExistsDelegateTask("Deletion of Acme's 
modules", "This task will delete the old Acme modules from the application", 
RepositoryConstants.CONFIG, "/modules/" + entry.getKey(), removeNodeTask));     
                                                                                
                                                                                
                                   
}
[/code]

8. The tasks that I create are attached to the getExtraInstallTask() return 
list and finally executed. Everything goes fine until this stage [b]UNLESS[/b] 
the fact that I don't know how to reinstall the modules that have been just 
deleted.

What I tried so far:
- Override the following methods from [b]AbstractModuleVersionHandler[/b] class
[code]
getBasicInstallTasks(InstallContext installContext); // to fix 
ImportUUIDBehavior.IMPORT_UUID_COLLISION_REPLACE_EXISTING 
getInstall(InstallContext installContext); // to fix few null pointer 
exceptions that I was having during the development
getStartupTask(InstallContext installContext); //to add the logic described in 
the steps 1..8
[/code]

- Change a bit the methods from [b]ModuleManagerImpl[/b] class according to my 
needs. All the changes are pure overloading of the existing methods. The 
overloading is used to pass the various variables to avoid 
nullPointerExceptions and further errors. Methods updated are:
[code]
checkForInstallOrUpdates(InstallContextImpl installContextImpl, 
[b]List<ModuleDefinition> acmeModulesDefinitions[/b])
performInstallOrUpdate(final ModuleManagementState state, 
[b]List<ModuleDefinition> modulesDefinitionsList[/b])
loadModulesRepositories([b]List<ModuleDefinition> modulesDefinitions[/b])
[/code]

The addings that I made are in [b]bold[/b]. As you can see the overloading 
involves just the ModuleDefinition list. This is because the ModuleManagerImpl 
class has got a list:
[code]
    /**
     * List<ModuleDefinition> of modules found to be deployed.
     */
    private List<ModuleDefinition> orderedModuleDescriptors;
[/code]

That is private and for this reason can't be used from other classes.

This is what I made since today.

After all these writing I'm wondering if I've been able to explain properly 
what I'm trying to achieve but anyway, if anybody have an answer to the 
question: [b]What to do to trigger a modules re-installation after the step 
8?[/b]
Or need further information please comment.

PS.
I tried by overriding framework classes(as described above) but if anybody has 
got any suggestion (maybe easier than my approach), please let me know!

Thanks for your time and for your further help.
Regards,

-- 
Context is everything: 
http://forum.magnolia-cms.com/forum/thread.html?threadId=6a1862fe-6da8-4277-a57d-f4a648f53345


----------------------------------------------------------------
For list details, see http://www.magnolia-cms.com/community/mailing-lists.html
Alternatively, use our forums: http://forum.magnolia-cms.com/
To unsubscribe, E-mail to: <user-list-unsubscr...@magnolia-cms.com>
----------------------------------------------------------------

Reply via email to