/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.aries.osgi.functional.internal; import org.osgi.framework.ServiceRegistration; import org.osgi.service.cm.ConfigurationException; import org.osgi.service.cm.ManagedServiceFactory; import java.util.Dictionary; import java.util.Hashtable; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicReference; import java.util.function.Consumer; /** * @author Carlos Sierra Andrés */ public class ConfigurationsOSGiImpl extends OSGiImpl<Dictionary<String, ?>> { public ConfigurationsOSGiImpl(String factoryPid) { super(bundleContext -> { Map<String, Tuple<Dictionary<String, ?>>> results = new ConcurrentHashMap<>(); AtomicReference<ServiceRegistration<ManagedServiceFactory>> serviceRegistrationReference = new AtomicReference<>(null); Pipe<Tuple<Dictionary<String, ?>>, Tuple<Dictionary<String, ?>>> added = Pipe.create(); Consumer<Tuple<Dictionary<String, ?>>> addedSource = added.getSource(); Pipe<Tuple<Dictionary<String, ?>>, Tuple<Dictionary<String, ?>>> removed = Pipe.create(); Consumer<Tuple<Dictionary<String, ?>>> removedSource = removed.getSource(); Runnable start = () -> serviceRegistrationReference.set( bundleContext.registerService( ManagedServiceFactory.class, new ConfigurationsManagedServiceFactory( results, removedSource, addedSource), new Hashtable<String, Object>() {{ put("service.pid", factoryPid); }})); return new OSGiResultImpl<>(added, removed, start, () -> { serviceRegistrationReference.get().unregister(); for (Tuple<Dictionary<String, ?>> tuple : results.values()) { removedSource.accept(tuple); } }); }); } private static class ConfigurationsManagedServiceFactory implements ManagedServiceFactory { private final Map<String, Tuple<Dictionary<String, ?>>> _results; private final Consumer<Tuple<Dictionary<String, ?>>> _removedSource; private final Consumer<Tuple<Dictionary<String, ?>>> _addedSource; public ConfigurationsManagedServiceFactory( Map<String, Tuple<Dictionary<String, ?>>> results, Consumer<Tuple<Dictionary<String, ?>>> removedSource, Consumer<Tuple<Dictionary<String, ?>>> addedSource) { _results = results; _removedSource = removedSource; _addedSource = addedSource; } @Override public void deleted(String s) { Tuple<Dictionary<String, ?>> tuple = _results.remove(s); _removedSource.accept(tuple); } @Override public String getName() { return "Functional OSGi Managed Service Factory"; } @Override public void updated( String s, Dictionary<String, ?> dictionary) throws ConfigurationException { Tuple<Dictionary<String, ?>> tuple = Tuple.create( dictionary); Tuple<Dictionary<String, ?>> old = _results.put(s, tuple); if (old != null) { _removedSource.accept(old); } _addedSource.accept(tuple); } } }