/******************************************************************************* * Copyright (c) 2008, 2010 VMware Inc. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * VMware Inc. - initial contribution *******************************************************************************/ package org.eclipse.virgo.kernel.model.internal.configurationadmin; import java.io.IOException; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; import org.eclipse.equinox.region.Region; import org.eclipse.virgo.kernel.model.RuntimeArtifactRepository; import org.eclipse.virgo.nano.serviceability.NonNull; import org.eclipse.virgo.util.osgi.ServiceRegistrationTracker; import org.osgi.framework.BundleContext; import org.osgi.framework.InvalidSyntaxException; import org.osgi.service.cm.Configuration; import org.osgi.service.cm.ConfigurationAdmin; import org.osgi.service.cm.ConfigurationListener; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * An initializer responsible for registering a {@link ModelConfigurationListener} and enumerating any existing * {@link Configuration} objects from {@link ConfigurationAdmin} * <p /> * * <strong>Concurrent Semantics</strong><br /> * * Threadsafe * * @see ModelConfigurationListener */ public final class ModelConfigurationListenerInitializer { private final Logger logger = LoggerFactory.getLogger(this.getClass()); private final ServiceRegistrationTracker registrationTracker = new ServiceRegistrationTracker(); private final RuntimeArtifactRepository artifactRepository; private final BundleContext bundleContext; private final ConfigurationAdmin configurationAdmin; private final Region globalRegion; public ModelConfigurationListenerInitializer(@NonNull RuntimeArtifactRepository artifactRepository, @NonNull BundleContext bundleContext, @NonNull ConfigurationAdmin configurationAdmin, @NonNull Region globalRegion) { this.artifactRepository = artifactRepository; this.bundleContext = bundleContext; this.configurationAdmin = configurationAdmin; this.globalRegion = globalRegion; } /** * Registers a {@link ModelConfigurationListener} with the service registry. Enumerates any existing * {@link Configuration} objects that exist from {@link ConfigurationAdmin}. * * @throws IOException * @throws InvalidSyntaxException */ @PostConstruct public void initialize() throws IOException, InvalidSyntaxException { ModelConfigurationListener configurationListener = new ModelConfigurationListener(artifactRepository, bundleContext, configurationAdmin, globalRegion); this.registrationTracker.track(this.bundleContext.registerService(ConfigurationListener.class.getCanonicalName(), configurationListener, null)); Configuration[] configurations = this.configurationAdmin.listConfigurations(null); if (configurations != null) { for (Configuration configuration : configurations) { try { this.artifactRepository.add(new ConfigurationArtifact(bundleContext, configurationAdmin, configuration.getPid(), globalRegion)); } catch (Exception e) { logger.error(String.format("Exception adding configuration '%s' to the repository", configuration.getPid()), e); } } } } /** * Unregisters the listener from the service registry */ @PreDestroy public void destroy() { this.registrationTracker.unregisterAll(); } }