/*
* Copyright (C) 2010 Brockmann Consult GmbH (info@brockmann-consult.de)
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
* Software Foundation; either version 3 of the License, or (at your option)
* any later version.
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, see http://www.gnu.org/licenses/
*/
package com.bc.ceres.swing.update;
import com.bc.ceres.core.runtime.Dependency;
import com.bc.ceres.core.runtime.Module;
import com.bc.ceres.core.runtime.Version;
import com.bc.ceres.core.runtime.internal.ModuleImpl;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
/**
* Can be used to check a {@link ModuleManager} for consistency.
*
* @since 0.6.1
*/
class ConsistencyChecker {
private HashMap<String, MissingDependencyInfo> missingDependencies;
private ModuleManager moduleManager;
public ConsistencyChecker(ModuleManager moduleManager) {
this.moduleManager = moduleManager;
}
public boolean check() {
reset();
Map<String, Module> moduleMap = getCurrentModuleMap();
Collection<Module> modules = moduleMap.values();
for (Module module : modules) {
Dependency[] declaredDependencies = module.getDeclaredDependencies();
for (Dependency dependency : declaredDependencies) {
if (isMandatoryModuleDependency(dependency)) {
String requiredVersionStr = dependency.getVersion();
Version requiredVersion = null;
if (requiredVersionStr != null) {
requiredVersion = Version.parseVersion(requiredVersionStr);
}
Module dependencyModule = findModule(moduleMap, dependency.getModuleSymbolicName(),
requiredVersion);
if (dependencyModule == null) {
addMissingDependency(dependency, module);
}
}
}
}
return missingDependencies == null;
}
private Map<String, Module> getCurrentModuleMap() {
Map<String, Module> modules = new HashMap<String, Module>(37);
for (ModuleItem installedModuleItem : moduleManager.getInstalledModuleItems()) {
if (installedModuleItem.getAction().equals(ModuleItem.Action.NONE)
|| installedModuleItem.getAction().equals(ModuleItem.Action.UPDATE)) {
ModuleImpl module = installedModuleItem.getModule();
modules.put(module.getSymbolicName(), module);
}
if (installedModuleItem.getAction().equals(ModuleItem.Action.UPDATE)) {
Module repositoryModule = installedModuleItem.getRepositoryModule();
if (repositoryModule != null) {
modules.put(repositoryModule.getSymbolicName(), repositoryModule);
}
}
}
for (ModuleItem availableModuleItem : moduleManager.getAvailableModuleItems()) {
if (availableModuleItem.getAction().equals(ModuleItem.Action.INSTALL)) {
ModuleImpl module = availableModuleItem.getModule();
modules.put(module.getSymbolicName(), module);
}
}
return modules;
}
private void reset() {
if (missingDependencies != null) {
missingDependencies.clear();
missingDependencies = null;
}
}
public void addMissingDependency(Dependency dependency, Module dependentModule) {
if (missingDependencies == null) {
missingDependencies = new HashMap<String, MissingDependencyInfo>(10);
}
String dependencyKey = dependency.getModuleSymbolicName() + dependency.getVersion();
if (missingDependencies.get(dependencyKey) == null) {
MissingDependencyInfo dependencyInfo = new MissingDependencyInfo(dependency);
missingDependencies.put(dependencyKey, dependencyInfo);
}
missingDependencies.get(dependencyKey).addDependentModule(dependentModule);
}
public MissingDependencyInfo[] getMissingDependencies() {
if (missingDependencies == null) {
return new MissingDependencyInfo[0];
}
return missingDependencies.values().toArray(new MissingDependencyInfo[missingDependencies.size()]);
}
private static boolean isMandatoryModuleDependency(Dependency dependency) {
return dependency.getModuleSymbolicName() != null && !dependency.isOptional();
}
private static Module findModule(Map<String, Module> modules, String symbolicName, Version requiredVersion) {
Module module = modules.get(symbolicName);
if (requiredVersion == null) {
return module;
}
if (module != null && module.getVersion().compareTo(requiredVersion) >= 0) {
return module;
}
return null;
}
}