/*
* Copyright 2009 NCHOVY
*
* 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.pkg;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import org.krakenapps.api.AlreadyInstalledPackageException;
import org.krakenapps.api.BundleRequirement;
import org.krakenapps.api.PackageDescriptor;
import org.krakenapps.api.PackageRepository;
import org.krakenapps.api.Version;
import org.krakenapps.api.VersionRange;
import org.krakenapps.confdb.Config;
import org.krakenapps.confdb.ConfigDatabase;
import org.krakenapps.confdb.ConfigService;
import org.krakenapps.confdb.Predicates;
/**
* Package configurator for metadata management
*
* @author xeraph
*
*/
public class PackageDatabase {
private ConfigService conf;
public PackageDatabase(ConfigService conf) {
this.conf = conf;
insertDefaultRepositories();
}
private void insertDefaultRepositories() {
PackageRepository[] DEFAULT_REPOSITORIES = null;
try {
DEFAULT_REPOSITORIES = new PackageRepository[] { PackageRepository.create("krakenapps", new URL(
"http://download.krakenapps.org/kraken/")) };
} catch (MalformedURLException e) {
}
if (getPackageRepositories().size() > 0)
return;
for (PackageRepository repo : DEFAULT_REPOSITORIES) {
try {
createPackageRepository(repo);
} catch (IllegalStateException e) {
// ignore duplicated repos
}
}
}
public List<PackageRepository> getPackageRepositories() {
ConfigDatabase db = conf.ensureDatabase("kraken-core");
Collection<PackageRepositoryConfig> repos = db.findAll(PackageRepositoryConfig.class).getDocuments(
PackageRepositoryConfig.class);
List<PackageRepository> repositories = new ArrayList<PackageRepository>();
for (PackageRepositoryConfig repo : repos) {
repositories.add(convert(repo));
}
return repositories;
}
public PackageRepository getPackageRepository(String alias) {
ConfigDatabase db = conf.ensureDatabase("kraken-core");
Config c = db.findOne(PackageRepositoryConfig.class, Predicates.field("alias", alias));
if (c == null)
return null;
return convert(c.getDocument(PackageRepositoryConfig.class));
}
private PackageRepository convert(PackageRepositoryConfig repo) {
try {
URL url = new URL(repo.getUrl());
String alias = repo.getAlias();
boolean auth = repo.isAuthRequired();
String account = repo.getAccount();
String password = repo.getPassword();
String trustStoreAlias = repo.getTrustStoreAlias();
String keyStoreAlias = repo.getKeyStoreAlias();
if (url.getProtocol().equals("https"))
return PackageRepository.createHttps(alias, url, trustStoreAlias, keyStoreAlias);
else if (auth)
return PackageRepository.createHttpAuth(alias, url, account, password);
else
return PackageRepository.create(alias, url);
} catch (MalformedURLException e) {
}
return null;
}
public void createPackageRepository(PackageRepository repo) {
ConfigDatabase db = conf.ensureDatabase("kraken-core");
Config c = db.findOne(PackageRepositoryConfig.class, Predicates.field("alias", repo.getAlias()));
if (c != null)
throw new IllegalStateException("duplicated repository name: " + repo.getAlias());
PackageRepositoryConfig config = new PackageRepositoryConfig(repo);
db.add(config);
}
public void updatePackageRepository(PackageRepository repo) {
ConfigDatabase db = conf.ensureDatabase("kraken-core");
Config c = db.findOne(PackageRepositoryConfig.class, Predicates.field("alias", repo.getAlias()));
if (c == null)
throw new IllegalStateException("repository [" + repo.getAlias() + "] not found");
PackageRepositoryConfig config = new PackageRepositoryConfig(repo);
db.update(c, config);
}
public void removePackageRepository(String alias) {
ConfigDatabase db = conf.ensureDatabase("kraken-core");
Config c = db.findOne(PackageRepositoryConfig.class, Predicates.field("alias", alias));
if (c == null)
throw new IllegalStateException("package repository [" + alias + "] not found");
c.remove();
}
public List<PackageDescriptor> getInstalledPackages() {
ConfigDatabase db = conf.ensureDatabase("kraken-core");
List<PackageDescriptor> packages = new ArrayList<PackageDescriptor>();
Collection<InstalledPackage> installedPkgs = db.findAll(InstalledPackage.class).getDocuments(InstalledPackage.class);
for (InstalledPackage installed : installedPkgs) {
PackageDescriptor pkg = toPackageObject(installed);
packages.add(pkg);
}
return packages;
}
private PackageDescriptor toPackageObject(InstalledPackage pkg) {
Date released = pkg.getReleased();
Version version = new Version(pkg.getVersion());
PackageDescriptor desc = new PackageDescriptor(pkg.getName(), version, released);
for (PackageBundleRequirement req : pkg.getBundleRequirements()) {
String name = req.getName();
String lowVersion = req.getLowVersion();
String highVersion = req.getHighVersion();
VersionRange range = new VersionRange(new Version(lowVersion), new Version(highVersion));
BundleRequirement bundleDesc = new BundleRequirement(name, range);
desc.getBundleRequirements().add(bundleDesc);
}
return desc;
}
public PackageDescriptor findInstalledPackage(String name) {
ConfigDatabase db = conf.ensureDatabase("kraken-core");
Config c = db.findOne(InstalledPackage.class, Predicates.field("name", name));
if (c == null)
return null;
return toPackageObject(c.getDocument(InstalledPackage.class));
}
public void installPackage(PackageDescriptor pkg) throws AlreadyInstalledPackageException {
ConfigDatabase db = conf.ensureDatabase("kraken-core");
Config c = db.findOne(InstalledPackage.class, Predicates.field("name", pkg.getName()));
if (c != null)
throw new IllegalStateException("package [" + pkg.getName() + "] already installed");
InstalledPackage installed = new InstalledPackage();
installed.setName(pkg.getName());
installed.setVersion(pkg.getVersion().toString());
installed.setReleased(pkg.getDate());
installed.setDescription(pkg.getDescription());
for (BundleRequirement bundleDesc : pkg.getBundleRequirements()) {
PackageBundleRequirement req = new PackageBundleRequirement();
req.setName(bundleDesc.getName());
req.setLowVersion(bundleDesc.getVersionRange().getLow().toString());
req.setHighVersion(bundleDesc.getVersionRange().getHigh().toString());
installed.getBundleRequirements().add(req);
}
db.add(installed);
}
public void uninstallPackage(String name) {
ConfigDatabase db = conf.ensureDatabase("kraken-core");
Config c = db.findOne(InstalledPackage.class, Predicates.field("name", name));
if (c == null)
throw new IllegalStateException("package [" + name + "] not found");
c.remove();
}
public void updatePackage(PackageDescriptor pkg) {
try {
uninstallPackage(pkg.getName());
installPackage(pkg);
} catch (AlreadyInstalledPackageException e) {
e.printStackTrace();
}
}
}