/*******************************************************************************
* 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.install.artifact.internal;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import org.osgi.service.cm.Configuration;
import org.osgi.service.cm.ConfigurationAdmin;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.eclipse.virgo.kernel.artifact.fs.ArtifactFS;
import org.eclipse.virgo.kernel.install.artifact.ArtifactIdentity;
import org.eclipse.virgo.util.io.IOUtils;
public final class ConfigLifecycleEngine implements StartEngine, RefreshEngine, StopEngine {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
private final ConfigurationAdmin configurationAdmin;
public ConfigLifecycleEngine(ConfigurationAdmin configurationAdmin) {
this.configurationAdmin = configurationAdmin;
}
public void start(ArtifactIdentity artifactIdentity, ArtifactFS artifactFS) throws StartException {
try {
updateConfiguration(artifactIdentity, artifactFS);
} catch (IOException e) {
String message = String.format("Unable to start configuration '%s' with '%s'", artifactIdentity.getName(), artifactFS);
logger.error(message);
throw new StartException(message, e);
}
}
public void refresh(ArtifactIdentity artifactIdentity, ArtifactFS artifactFS) throws RefreshException {
try {
updateConfiguration(artifactIdentity, artifactFS);
} catch (IOException e) {
String message = String.format("Unable to refresh configuration '%s' with '%s'", artifactIdentity.getName(), artifactFS);
logger.error(message);
throw new RefreshException(message, e);
}
}
private void updateConfiguration(ArtifactIdentity artifactIdentity, ArtifactFS artifactFS) throws IOException {
InputStream inputStream = null;
try {
inputStream = artifactFS.getEntry("").getInputStream();
Configuration configuration = getConfiguration(artifactIdentity);
configuration.update(getProperties(inputStream));
} finally {
IOUtils.closeQuietly(inputStream);
}
}
private Properties getProperties(InputStream inputSteam) throws IOException {
Properties p = new Properties();
p.load(inputSteam);
return p;
}
public void stop(ArtifactIdentity artifactIdentity, ArtifactFS artifactFS) throws StopException {
try {
Configuration configuration = getConfiguration(artifactIdentity);
configuration.delete();
} catch (IOException e) {
String message = String.format("Unable to stop configuration '%s'", artifactIdentity.getName());
logger.error(message);
throw new StopException(message, e);
}
}
private Configuration getConfiguration(ArtifactIdentity artifactIdentity) throws IOException {
return this.configurationAdmin.getConfiguration(artifactIdentity.getName());
}
}