/*
* Copyright 2011 Future Systems
*
* Licensed 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.krakenapps.webconsole.plugins;
import java.net.MalformedURLException;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.felix.ipojo.annotations.Component;
import org.krakenapps.api.BundleDescriptor;
import org.krakenapps.api.BundleRequirement;
import org.krakenapps.api.PackageDescriptor;
import org.krakenapps.api.PackageManager;
import org.krakenapps.api.PackageNotFoundException;
import org.krakenapps.api.PackageRepository;
import org.krakenapps.api.PackageUpdatePlan;
import org.krakenapps.api.PackageVersionHistory;
import org.krakenapps.api.ProgressMonitor;
import org.krakenapps.api.Version;
import org.krakenapps.msgbus.MsgbusException;
import org.krakenapps.msgbus.Request;
import org.krakenapps.msgbus.Response;
import org.krakenapps.msgbus.handler.MsgbusMethod;
import org.krakenapps.msgbus.handler.MsgbusPlugin;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@Component(name = "webconsole-package-plugin")
@MsgbusPlugin
public class PackagePlugin {
private final Logger logger = LoggerFactory.getLogger(PackagePlugin.class.getName());
private PackageManager packageManager;
public PackagePlugin(BundleContext bc) {
ServiceReference ref = bc.getServiceReference(PackageManager.class.getName());
if (ref != null)
this.packageManager = (PackageManager) bc.getService(ref);
}
@MsgbusMethod
public void getRepositories(Request req, Response resp) {
List<Object> l = new ArrayList<Object>();
for (PackageRepository r : packageManager.getRepositories()) {
Map<String, Object> m = new HashMap<String, Object>();
m.put("alias", r.getAlias());
m.put("url", r.getUrl());
m.put("account", r.getAccount());
m.put("trust_store", r.getTrustStoreAlias());
m.put("key_store", r.getKeyStoreAlias());
l.add(m);
}
resp.put("repositories", l);
}
@MsgbusMethod
public void addRepository(Request req, Response resp) throws MalformedURLException {
String alias = req.getString("alias");
URL url = new URL(req.getString("url"));
packageManager.addRepository(alias, url);
}
@MsgbusMethod
public void addSecureRepository(Request req, Response resp) throws MalformedURLException {
String alias = req.getString("alias");
URL url = new URL(req.getString("url"));
String trustStoreAlias = req.getString("trust_store");
String keyStoreAlias = req.getString("key_store");
packageManager.addSecureRepository(alias, url, trustStoreAlias, keyStoreAlias);
}
@MsgbusMethod
public void removeRepository(Request req, Response resp) {
String alias = req.getString("alias");
packageManager.removeRepository(alias);
}
@MsgbusMethod
public void getInstalledPackages(Request req, Response resp) {
List<Object> l = new ArrayList<Object>();
for (PackageDescriptor desc : packageManager.getInstalledPackages()) {
l.add(marshal(desc));
}
resp.put("packages", l);
}
private Map<String, Object> marshal(PackageDescriptor desc) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ssZ");
Map<String, Object> m = new HashMap<String, Object>();
m.put("name", desc.getName());
m.put("version", desc.getVersion().toString());
m.put("date", dateFormat.format(desc.getDate()));
m.put("description", desc.getDescription());
return m;
}
@MsgbusMethod
public void installPackage(Request req, Response resp) {
String packageName = req.getString("name");
String version = req.getString("version");
ProgressMonitor monitor = newNullMonitor();
try {
packageManager.installPackage(packageName, version, monitor);
} catch (Exception e) {
logger.error("kraken webconsole: package install failed", e);
throw new MsgbusException("core", "package-install-failed");
}
}
@MsgbusMethod
public void updatePackage(Request req, Response resp) {
String packageName = req.getString("name");
Version version = new Version(req.getString("version"));
ProgressMonitor monitor = newNullMonitor();
try {
packageManager.updatePackage(packageName, version, monitor);
} catch (Exception e) {
logger.error("kraken webconsole: package update failed", e);
throw new MsgbusException("core", "package-update-failed");
}
}
@MsgbusMethod
public void uninstallPackage(Request req, Response resp) {
String packageName = req.getString("name");
ProgressMonitor monitor = newNullMonitor();
try {
packageManager.uninstallPackage(packageName, monitor);
} catch (Exception e) {
logger.error("kraken webconsole: package uninstall failed", e);
throw new MsgbusException("core", "package-uninstall-failed");
}
}
@MsgbusMethod
public void checkUpdate(Request req, Response resp) {
String packageName = req.getString("name");
try {
PackageVersionHistory history = packageManager.checkUpdate(packageName);
sendPackageVersion(resp, history);
} catch (Exception e) {
logger.error("kraken webconsole: package check update failed", e);
throw new MsgbusException("core", "package-update-check-failed");
}
}
@MsgbusMethod
public void getLatestVersion(Request req, Response resp) {
String packageName = req.getString("name");
try {
PackageVersionHistory history = packageManager.getLatestVersion(packageName);
sendPackageVersion(resp, history);
} catch (Exception e) {
logger.error("kraken webconsole: package query failed", e);
throw new MsgbusException("core", "package-update-check-failed");
}
}
private void sendPackageVersion(Response resp, PackageVersionHistory history) {
Map<String, Object> m = new HashMap<String, Object>();
m.put("updated", history.getLastUpdated());
m.put("version", history.getVersion().toString());
resp.put("latest", m);
}
@MsgbusMethod
public void checkUninstallDependency(Request req, Response resp) {
String packageName = req.getString("name");
try {
Map<String, List<PackageDescriptor>> plan = packageManager.checkUninstallDependency(packageName);
Map<String, Object> dependency = marshalDependencies(plan);
resp.put("dependency", dependency);
} catch (PackageNotFoundException e) {
throw new MsgbusException("core", "package-not-found");
}
}
private Map<String, Object> marshalDependencies(Map<String, List<PackageDescriptor>> dependency) {
Map<String, Object> m = new HashMap<String, Object>();
for (String bundleSymbolicName : dependency.keySet()) {
List<Object> l = new ArrayList<Object>();
List<PackageDescriptor> descs = dependency.get(bundleSymbolicName);
for (PackageDescriptor desc : descs)
l.add(desc.getName());
m.put(bundleSymbolicName, l);
}
return m;
}
@MsgbusMethod
public void getUpdatePlan(Request req, Response resp) {
String packageName = req.getString("name");
Version version = new Version(req.getString("version"));
try {
PackageUpdatePlan plan = packageManager.getUpdatePlan(packageName, version);
Map<String, Object> m = new HashMap<String, Object>();
m.put("installing", marshalBundleRequirements(plan.getInstallingBundles()));
m.put("remaining", marshalBundleDescriptors(plan.getRemainingBundles()));
m.put("removing", marshalBundleDescriptors(plan.getRemovingBundles()));
resp.put("plan", m);
} catch (Exception e) {
throw new MsgbusException("core", "package-check-update-dependency-failed");
}
}
private List<Object> marshalBundleRequirements(Set<BundleRequirement> requirements) {
List<Object> l = new ArrayList<Object>();
for (BundleRequirement r : requirements) {
Map<String, Object> m = new HashMap<String, Object>();
m.put("name", r.getName());
m.put("version_from", r.getVersionRange().getLow().toString());
m.put("version_to", r.getVersionRange().getHigh().toString());
l.add(m);
}
return l;
}
private List<Object> marshalBundleDescriptors(Set<BundleDescriptor> descriptors) {
List<Object> l = new ArrayList<Object>();
for (BundleDescriptor d : descriptors) {
Map<String, Object> m = new HashMap<String, Object>();
m.put("bundle_id", d.getBundleId());
m.put("symbolic_name", d.getSymbolicName());
m.put("version", d.getVersion());
l.add(m);
}
return l;
}
private ProgressMonitor newNullMonitor() {
ProgressMonitor monitor = new ProgressMonitor() {
@Override
public void writeln(String message) {
}
@Override
public void write(String message) {
}
};
return monitor;
}
}