public void repositoryEvent()

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);
        }
    }