@Override public Optional<ExperimentalFeature> getFeature(String featureId) { return features.stream() .filter(feature -> feature.getFeatureId().equals(featureId)) .map(feature -> (ExperimentalFeature) feature) .findAny(); }
@Override public Optional<ExperimentalFeature> getFeature(String featureId) { return features.stream() .filter(feature -> feature.getFeatureId().equals(featureId)) .map(feature -> (ExperimentalFeature) feature) .findAny(); }
@Override public void store(final ExperimentalFeatureImpl feature) { List<ExperimentalFeatureImpl> registeredFeatures = (List<ExperimentalFeatureImpl>) getFeatures(); Optional<ExperimentalFeatureImpl> optional = registeredFeatures.stream() .filter(registeredFeature -> registeredFeature.getFeatureId().equals(feature.getFeatureId())) .findAny(); if (optional.isPresent()) { ExperimentalFeatureImpl registeredFeature = optional.get(); registeredFeature.setEnabled(feature.isEnabled()); doStoreFeatures(registeredFeatures, () -> this.maybeNotifyFeatureUpdate(feature)); } }
@Override public void store(final ExperimentalFeatureImpl feature) { List<ExperimentalFeatureImpl> registeredFeatures = (List<ExperimentalFeatureImpl>) getFeatures(); Optional<ExperimentalFeatureImpl> optional = registeredFeatures.stream() .filter(registeredFeature -> registeredFeature.getFeatureId().equals(feature.getFeatureId())) .findAny(); if (optional.isPresent()) { ExperimentalFeatureImpl registeredFeature = optional.get(); registeredFeature.setEnabled(feature.isEnabled()); doStoreFeatures(registeredFeatures, () -> this.maybeNotifyFeatureUpdate(feature)); } }
private boolean syncLoadedFeatures(final List<ExperimentalFeatureImpl> registeredFeatures) { final Collection<ExperimentalFeatureDefinition> expectedDefinitions = getSupportedDefinitions(); List<String> registryFeatureIds = registeredFeatures.stream().map(ExperimentalFeatureImpl::getFeatureId).collect(Collectors.toList()); List<String> expectedFeatureIds = expectedDefinitions.stream().map(ExperimentalFeatureDefinition::getId).collect(Collectors.toList()); List<String> missingFeatures = expectedFeatureIds.stream() .filter(expectedFeatureId -> !registryFeatureIds.contains(expectedFeatureId)) .collect(Collectors.toList()); boolean requiresSync = false; if (!missingFeatures.isEmpty()) { requiresSync = true; missingFeatures.stream() .forEach(expectedFeatureId -> registeredFeatures.add(new ExperimentalFeatureImpl(expectedFeatureId, false))); } List<ExperimentalFeatureImpl> extraFeatures = registryFeatureIds.stream() .filter(registeredFeatureId -> !expectedFeatureIds.contains(registeredFeatureId)) .map(registryFeatureId -> registeredFeatures.stream().filter(experimentalFeature -> experimentalFeature.getFeatureId().equals(registryFeatureId)).findAny().orElse(null)) .filter(Objects::nonNull) .collect(Collectors.toList()); if (!extraFeatures.isEmpty()) { requiresSync = true; registeredFeatures.removeAll(extraFeatures); } return requiresSync; }
private boolean syncLoadedFeatures(final List<ExperimentalFeatureImpl> registeredFeatures) { final Collection<ExperimentalFeatureDefinition> expectedDefinitions = getSupportedDefinitions(); List<String> registryFeatureIds = registeredFeatures.stream().map(ExperimentalFeatureImpl::getFeatureId).collect(Collectors.toList()); List<String> expectedFeatureIds = expectedDefinitions.stream().map(ExperimentalFeatureDefinition::getId).collect(Collectors.toList()); List<String> missingFeatures = expectedFeatureIds.stream() .filter(expectedFeatureId -> !registryFeatureIds.contains(expectedFeatureId)) .collect(Collectors.toList()); boolean requiresSync = false; if (!missingFeatures.isEmpty()) { requiresSync = true; missingFeatures.stream() .forEach(expectedFeatureId -> registeredFeatures.add(new ExperimentalFeatureImpl(expectedFeatureId, false))); } List<ExperimentalFeatureImpl> extraFeatures = registryFeatureIds.stream() .filter(registeredFeatureId -> !expectedFeatureIds.contains(registeredFeatureId)) .map(registryFeatureId -> registeredFeatures.stream().filter(experimentalFeature -> experimentalFeature.getFeatureId().equals(registryFeatureId)).findAny().orElse(null)) .filter(Objects::nonNull) .collect(Collectors.toList()); if (!extraFeatures.isEmpty()) { requiresSync = true; registeredFeatures.removeAll(extraFeatures); } return requiresSync; }
public void doStoreFeatures(Collection<ExperimentalFeatureImpl> features, Runnable callback) { final String path = getStoragePath(); final Path fsPath = fileSystem.getPath(path); Properties properties = new Properties(); features.stream() .filter(experimentalFeature -> defRegistry.getFeatureById(experimentalFeature.getFeatureId()) != null) .forEach(feature -> properties.put(feature.getFeatureId(), String.valueOf(feature.isEnabled()))); try (OutputStream out = ioService.newOutputStream(fsPath)) { ioService.startBatch(fileSystem); properties.store(out, COMMENTS); if (callback != null) { callback.run(); } } catch (Exception ex) { log().warn("Impossible to write experimental features registry on '{}': {}", path, ex); } finally { ioService.endBatch(); } }
public void doStoreFeatures(Collection<ExperimentalFeatureImpl> features, Runnable callback) { final String path = getStoragePath(); final Path fsPath = fileSystem.getPath(path); Properties properties = new Properties(); features.stream() .filter(experimentalFeature -> defRegistry.getFeatureById(experimentalFeature.getFeatureId()) != null) .forEach(feature -> properties.put(feature.getFeatureId(), String.valueOf(feature.isEnabled()))); try (OutputStream out = ioService.newOutputStream(fsPath)) { ioService.startBatch(fileSystem); properties.store(out, COMMENTS); if (callback != null) { callback.run(); } } catch (Exception ex) { log().warn("Impossible to write experimental features registry on '{}': {}", path, ex); } finally { ioService.endBatch(); } }
@Test public void testWrongNotifyFeatureUpdate() { initService(true); ExperimentalFeatureImpl feature = new ExperimentalFeatureImpl(FEATURE_1, true); service.updateExperimentalFeature(feature.getFeatureId(), feature.isEnabled()); verify(event, never()).fire(any()); feature = new ExperimentalFeatureImpl(WRONG_FEATURE_ID, true); service.updateExperimentalFeature(feature.getFeatureId(), feature.isEnabled()); verify(event, never()).fire(any()); }
@Test public void testNotifyFeatureUpdateWhenExperimentalDisabled() { initService(false); ExperimentalFeatureImpl feature = new ExperimentalFeatureImpl(FEATURE_1, false); service.updateExperimentalFeature(feature.getFeatureId(), feature.isEnabled()); verify(event, never()).fire(any()); }
@Test public void testWrongNotifyFeatureUpdate() { initService(true); ExperimentalFeatureImpl feature = new ExperimentalFeatureImpl(FEATURE_1, true); service.updateExperimentalFeature(feature.getFeatureId(), feature.isEnabled()); verify(event, never()).fire(any()); feature = new ExperimentalFeatureImpl(WRONG_FEATURE_ID, true); service.updateExperimentalFeature(feature.getFeatureId(), feature.isEnabled()); verify(event, never()).fire(any()); }
@Test public void testNotifyFeatureUpdateWhenExperimentalDisabled() { initService(false); ExperimentalFeatureImpl feature = new ExperimentalFeatureImpl(FEATURE_1, false); service.updateExperimentalFeature(feature.getFeatureId(), feature.isEnabled()); verify(event, never()).fire(any()); }
@Test public void testNotifyFeatureUpdate() { initService(true); ExperimentalFeatureImpl feature = new ExperimentalFeatureImpl(FEATURE_1, false); service.updateExperimentalFeature(feature.getFeatureId(), feature.isEnabled()); checkNotifyFeatureUpdate(feature); }
@Test public void testNotifyFeatureUpdate() { initService(true); ExperimentalFeatureImpl feature = new ExperimentalFeatureImpl(FEATURE_1, false); service.updateExperimentalFeature(feature.getFeatureId(), feature.isEnabled()); checkNotifyFeatureUpdate(feature); }