bundle fix-applier groovy status Jahia 7.3

How to preserve the bundle status when upgrading Jahia


When upgrading Jahia to a version prior to, some modules may not start automatically.



The persistent state should be flagged on each bundle as Bundle.STARTING, to ensure that all modules with the state STARTED restart automatically after applying a fix applier to upgrade Jahia.

However, the fix applier for version < did not save this persistent state correctly. 

To prevent this you could run this groovy script from the tools Groovy Console:

import org.apache.commons.io.FileUtils
import org.apache.commons.io.filefilter.IOFileFilter
import org.apache.commons.io.filefilter.TrueFileFilter
import org.jahia.osgi.BundleState
import org.jahia.services.SpringContextSingleton
import org.jahia.services.modulemanager.ModuleManager
import org.jahia.settings.SettingsBean

// https://jira.jahia.org/browse/QA-11200

boolean fixIssues = false

String varFolder = SettingsBean.getInstance().getJahiaVarDiskPath()
File bundlesDeployed = new File(new File(varFolder), "bundles-deployed")
IOFileFilter ioff = new IOFileFilter() {
    boolean accept(File file) {
        return "bundle.info".equals(file.getName());

    boolean accept(File dir, String name) {
        return true

final ModuleManager moduleManager = (ModuleManager) SpringContextSingleton.getBean("ModuleManager");
for (File file : FileUtils.listFiles(bundlesDeployed, ioff, TrueFileFilter.INSTANCE)) {
    List<String> lines = FileUtils.readLines(file)
    String bundleID = lines.get(0)
    String bundleKey = lines.get(1)
    int persistentState = lines.get(2) as int

    try {
        BundleState localState = moduleManager.getLocalState(bundleKey)
        int localStateInt = localState.toInt()
        if (localStateInt != persistentState && localStateInt + persistentState != 6) {
            // if localStateInt + persistentState == 6 , then one state is installed, the other one resolved, let's ignore
            log.warn(String.format("Local state (%s=%s) inconsistent with the persistent state (%s) for the bundle %s (bundle ID %s)", localState, localStateInt, persistentState, bundleKey, bundleID))
            if (fixIssues && localStateInt == 32 && persistentState == 8) {
                moduleManager.start(bundleKey, null)
    } catch (org.jahia.services.modulemanager.ModuleNotFoundException ignored) {

This script will list the inconsistent and if you set the fixIssues value to true, then it will change the value so all started bundles should restart after applying a patch. 

This script should be executed before applying a Jahia upgrade.