/*******************************************************************************
* 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 org.eclipse.virgo.kernel.model.Artifact;
import org.eclipse.virgo.kernel.model.RuntimeArtifactRepository;
import org.eclipse.equinox.region.Region;
import org.eclipse.virgo.nano.serviceability.NonNull;
import org.osgi.framework.BundleContext;
import org.osgi.framework.Version;
import org.osgi.service.cm.ConfigurationAdmin;
import org.osgi.service.cm.ConfigurationEvent;
import org.osgi.service.cm.ConfigurationListener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Implementation of {@link ConfigurationListener} that notices {@link ConfigurationEvent#CM_UPDATED} and
* {@link ConfigurationEvent#CM_DELETED} events to add and remove respectively {@link Artifact}s from the
* {@link RuntimeArtifactRepository}
* <p />
*
* <strong>Concurrent Semantics</strong><br />
*
* Threadsafe
*
*/
final class ModelConfigurationListener implements ConfigurationListener {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
private final RuntimeArtifactRepository artifactRepository;
private final BundleContext bundleContext;
private final ConfigurationAdmin configurationAdmin;
private final Region independentRegion;
public ModelConfigurationListener(@NonNull RuntimeArtifactRepository artifactRepository, @NonNull BundleContext bundleContext, @NonNull ConfigurationAdmin configurationAdmin, @NonNull Region independentRegion) {
this.artifactRepository = artifactRepository;
this.bundleContext = bundleContext;
this.configurationAdmin = configurationAdmin;
this.independentRegion = independentRegion;
}
/**
* {@inheritDoc}
*/
public void configurationEvent(ConfigurationEvent event) {
if (ConfigurationEvent.CM_UPDATED == event.getType()) {
processUpdate(event);
} else if (ConfigurationEvent.CM_DELETED == event.getType()) {
processDelete(event);
}
}
private void processUpdate(ConfigurationEvent event) {
logger.info("Processing update event for '{}'", event.getPid());
this.artifactRepository.add(createArtifact(event));
}
private void processDelete(ConfigurationEvent event) {
logger.info("Processing delete event for '{}'", event.getPid());
Artifact artifact = this.artifactRepository.getArtifact(ConfigurationArtifact.TYPE, event.getPid(), Version.emptyVersion, independentRegion);
if (artifact instanceof ConfigurationArtifact) {
this.artifactRepository.remove(ConfigurationArtifact.TYPE, event.getPid(), Version.emptyVersion, independentRegion);
}
}
private ConfigurationArtifact createArtifact(ConfigurationEvent event) {
return new ConfigurationArtifact(this.bundleContext, this.configurationAdmin, event.getPid(), independentRegion);
}
}