/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.core.component.registration.internal;
import java.util.Dictionary;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleEvent;
import org.osgi.framework.BundleException;
import org.osgi.framework.BundleListener;
import de.rcenvironment.core.component.api.ComponentConstants;
import de.rcenvironment.core.component.execution.api.Component;
import de.rcenvironment.core.configuration.CommandLineArguments;
import de.rcenvironment.core.utils.common.StringUtils;
/**
* {@link BundleListener} to recognize when new {@link Bundle}s providing a {@link Component} are installed in oder to start this
* {@link Bundle}.
*
* @author Doreen Seider
*/
public class ComponentBundleListener implements BundleListener {
/** The logger for this class. */
private static final Log LOGGER = LogFactory.getLog(ComponentBundleListener.class);
@Override
public void bundleChanged(BundleEvent event) {
if (event.getType() == BundleEvent.INSTALLED) {
ComponentBundleListener.handleBundle(event.getBundle());
}
}
/**
* Checks the given {@link Bundle} if it provides a {@link Component} and declare that in its Manifest and starts it if it does.
*
* @param bundle The given bundle to check and possibly to start.
*/
public static void handleBundle(Bundle bundle) {
if (!CommandLineArguments.isDoNotStartComponentsRequested()) {
Dictionary<String, String> headers = bundle.getHeaders();
String componentEntry = headers.get(ComponentConstants.MANIFEST_ENTRY_RCE_COMPONENT);
if (componentEntry != null && Boolean.valueOf(componentEntry)) {
if (bundle.getState() == Bundle.RESOLVED) {
try {
bundle.start();
} catch (BundleException e) {
LOGGER.error(StringUtils.format("Failed to start bundle '%s' that provides a workflow component",
bundle.getSymbolicName()), e);
}
}
}
}
}
}