in features/src/main/java/org/apache/karaf/cellar/features/LocalFeaturesListener.java [114:190]
public void repositoryEvent(RepositoryEvent event) {
if (!isEnabled()) {
LOGGER.trace("CELLAR FEATURE: local listener is disabled");
return;
}
// check if the producer is ON
if (eventProducer.getSwitch().getStatus().equals(SwitchStatus.OFF)) {
LOGGER.debug("CELLAR FEATURE: cluster event producer is OFF");
return;
}
ClassLoader originalClassLoader = Thread.currentThread().getContextClassLoader();
try {
Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
if (event != null && event.getRepository() != null) {
Set<Group> groups = groupManager.listLocalGroups();
if (groups != null && !groups.isEmpty()) {
for (Group group : groups) {
ClusterRepositoryEvent clusterRepositoryEvent = new ClusterRepositoryEvent(event.getRepository().getURI().toString(), event.getType());
clusterRepositoryEvent.setSourceGroup(group);
clusterRepositoryEvent.setSourceNode(clusterManager.getNode());
clusterRepositoryEvent.setLocal(clusterManager.getNode());
clusterRepositoryEvent.setInstall(false);
clusterRepositoryEvent.setUninstall(false);
clusterRepositoryEvent.setRefresh(false);
RepositoryEvent.EventType type = event.getType();
Map<String, String> clusterRepositories = clusterManager.getMap(Constants.REPOSITORIES_MAP + Configurations.SEPARATOR + group.getName());
// update the features repositories in the cluster group
if (RepositoryEvent.EventType.RepositoryAdded.equals(type)) {
if (!clusterRepositories.containsKey(event.getRepository().getURI().toString())) {
try {
clusterRepositories.put(event.getRepository().getURI().toString(), event.getRepository().getName());
} catch (Exception e) {
// nothing to do
}
}
// update the features in the cluster group
Map<String, FeatureState> clusterFeatures = clusterManager.getMap(Constants.FEATURES_MAP + Configurations.SEPARATOR + group.getName());
try {
for (Feature feature : event.getRepository().getFeatures()) {
// check the feature in the distributed map
FeatureState clusterFeatureState = new FeatureState();
clusterFeatureState.setName(feature.getName());
clusterFeatureState.setVersion(feature.getVersion());
clusterFeatureState.setInstalled(Boolean.FALSE);
clusterFeatures.put(feature.getName() + "/" + feature.getVersion(), clusterFeatureState);
}
} catch (Exception e) {
LOGGER.warn("CELLAR FEATURE: failed to update the cluster group", e);
}
} else {
// update the repositories in the cluster group
clusterRepositories.remove(event.getRepository().getURI().toString());
// update the features in the cluster group
Map<String, FeatureState> clusterFeatures = clusterManager.getMap(Constants.FEATURES_MAP + Configurations.SEPARATOR + group.getName());
try {
for (Feature feature : event.getRepository().getFeatures()) {
clusterFeatures.remove(feature.getName() + "/" + feature.getVersion());
}
} catch (Exception e) {
LOGGER.warn("CELLAR FEATURE: failed to update the cluster group", e);
}
}
// broadcast the cluster event
eventProducer.produce(clusterRepositoryEvent);
}
}
}
} finally {
Thread.currentThread().setContextClassLoader(originalClassLoader);
}
}