Clover coverage report - QedeqKernelSe Coverage Report
Coverage timestamp: Do Mrz 27 2008 21:46:26 CET
file stats: LOC: 183   Methods: 6
NCLOC: 115   Classes: 1
 
 Source file Conditionals Statements Methods TOTAL
KernelQedeqBoPool.java 86,4% 83,9% 83,3% 84,4%
coverage coverage
 1    /* $Id: KernelQedeqBoPool.java,v 1.1 2008/03/27 05:16:24 m31 Exp $
 2    *
 3    * This file is part of the project "Hilbert II" - http://www.qedeq.org
 4    *
 5    * Copyright 2000-2008, Michael Meyling <mime@qedeq.org>.
 6    *
 7    * "Hilbert II" is free software; you can redistribute
 8    * it and/or modify it under the terms of the GNU General Public
 9    * License as published by the Free Software Foundation; either
 10    * version 2 of the License, or (at your option) any later version.
 11    *
 12    * This program is distributed in the hope that it will be useful,
 13    * but WITHOUT ANY WARRANTY; without even the implied warranty of
 14    * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 15    * GNU General Public License for more details.
 16    */
 17   
 18    package org.qedeq.kernel.bo.control;
 19   
 20    import java.util.ArrayList;
 21    import java.util.HashMap;
 22    import java.util.Iterator;
 23    import java.util.List;
 24    import java.util.Map;
 25   
 26    import org.qedeq.kernel.common.LoadingState;
 27    import org.qedeq.kernel.common.ModuleAddress;
 28    import org.qedeq.kernel.common.QedeqBo;
 29    import org.qedeq.kernel.trace.Trace;
 30    import org.qedeq.kernel.utility.IoUtility;
 31   
 32    /**
 33    * Encapsulates all modules.
 34    */
 35    public class KernelQedeqBoPool {
 36   
 37    /** This class. */
 38    private static final Class CLASS = KernelQedeqBoPool.class;
 39   
 40    /** QEDEQ Modules; key: ModuleAddress, value: KernelQedeqBo. */
 41    private final Map bos = new HashMap();
 42   
 43   
 44    /**
 45    * Get {@link QedeqBo} for an module address. If it is unknown it will be created.
 46    *
 47    * @param address Module address.
 48    * @return QedeqBo for module.
 49    */
 50  1029 final synchronized KernelQedeqBo getKernelQedeqBo(final ModuleAddress address) {
 51  1029 if (bos.containsKey(address)) {
 52  832 return (KernelQedeqBo) bos.get(address);
 53    } else {
 54  197 final KernelQedeqBo prop = new KernelQedeqBo(address);
 55  197 bos.put(address, prop);
 56  197 return prop;
 57    }
 58    }
 59   
 60    /**
 61    * Remove all modules from memory.
 62    */
 63  1 final synchronized void removeAllModules() {
 64  1 final String method = "removeAllModules()";
 65  1 Trace.begin(CLASS, this, method);
 66  1 try {
 67  1 for (final Iterator iterator
 68    = bos.entrySet().iterator();
 69  23 iterator.hasNext(); ) {
 70  22 Map.Entry entry = (Map.Entry) iterator.next();
 71  22 final KernelQedeqBo prop = (KernelQedeqBo) entry.getValue();
 72  22 prop.delete();
 73    }
 74  1 bos.clear();
 75    } catch (RuntimeException e) {
 76  0 Trace.trace(CLASS, this, method, e);
 77    } finally {
 78  1 Trace.end(CLASS, this, method);
 79    }
 80    }
 81   
 82    /**
 83    * Validate module dependencies and throw Error if they are not correct.
 84    */
 85  70 synchronized void validateDependencies() {
 86  70 final String method = "validateDependencies";
 87  70 boolean error = false;
 88  70 Trace.begin(CLASS, this, method);
 89  70 for (final Iterator iterator = bos.entrySet().iterator(); iterator.hasNext(); ) {
 90  993 Map.Entry entry = (Map.Entry) iterator.next();
 91  993 final KernelQedeqBo prop = (KernelQedeqBo) entry.getValue();
 92  993 Trace.param(CLASS, this, method, "prop", prop);
 93  993 if (!prop.hasLoadedRequiredModules()) {
 94  531 continue;
 95    }
 96   
 97    // prop must be in dependent list for all required modules
 98  462 final KernelModuleReferenceList refs = prop.getKernelRequiredModules();
 99  462 for (int i = 0; i < refs.size(); i++) {
 100  283 final KernelQedeqBo ref = refs.getKernelQedeqBo(i);
 101  283 final KernelModuleReferenceList dependents = (KernelModuleReferenceList)
 102    IoUtility.getFieldContent(ref, "dependent"); // TODO mime 20080325: Q & D
 103  283 if (!dependents.contains(prop)) {
 104  0 Trace.fatal(CLASS, this, method, ref.getUrl() + " missing dependent module: "
 105    + prop.getUrl(), null);
 106  0 error = true;
 107    }
 108    }
 109   
 110    // for all dependent modules, prop must be in required list
 111  462 final KernelModuleReferenceList dependents = prop.getDependentModules();
 112  462 for (int i = 0; i < dependents.size(); i++) {
 113  283 final KernelQedeqBo dependent = dependents.getKernelQedeqBo(i);
 114  283 final KernelModuleReferenceList refs2 = (KernelModuleReferenceList)
 115    IoUtility.getFieldContent(dependent, "required");
 116  283 if (!refs2.contains(prop)) { // TODO mime 20080325: Q & D
 117  0 Trace.fatal(CLASS, this, method, dependent.getUrl()
 118    + " missing required module: " + prop.getUrl(), null);
 119  0 error = true;
 120    }
 121    }
 122    }
 123  70 Trace.end(CLASS, this, method);
 124   
 125    // if the dependencies are not ok we throw an error!
 126  70 if (error) {
 127  0 Error e = new Error("QEDEQ dependencies and status are flawed! This is a major error!");
 128  0 Trace.fatal(CLASS, this, method, "Shutdown because of major validation error", e);
 129  0 throw e;
 130    }
 131    }
 132   
 133    /**
 134    * Remove a QEDEQ module from memory.
 135    *
 136    * @param prop Defines the module.
 137    */
 138  6 final synchronized void removeModule(final KernelQedeqBo prop) {
 139  6 final String method = "removeModule(KernelQedeqBo)";
 140  6 Trace.begin(CLASS, this, method);
 141  6 try {
 142  6 Trace.trace(CLASS, this, method, "removing " + prop.getUrl());
 143  6 bos.remove(prop.getModuleAddress());
 144    } catch (RuntimeException e) {
 145  0 Trace.trace(CLASS, this, method, e);
 146    } finally {
 147  6 Trace.end(CLASS, this, method);
 148    }
 149    }
 150   
 151    /**
 152    * Get list of all successfully loaded modules.
 153    *
 154    * @return list of all successfully loaded modules.
 155    */
 156  31 final synchronized ModuleAddress[] getAllLoadedModules() {
 157  31 final String method = "getAllModules()";
 158  31 Trace.begin(CLASS, this, method);
 159  31 try {
 160  31 final List list = new ArrayList();
 161  31 for (final Iterator iterator = bos.entrySet().iterator(); iterator.hasNext(); ) {
 162  138 Map.Entry entry = (Map.Entry) iterator.next();
 163  138 final QedeqBo prop = (QedeqBo) entry.getValue();
 164  138 if (prop.getLoadingState().getCode() >= LoadingState.STATE_LOADED.getCode()) {
 165  106 list.add(prop.getModuleAddress());
 166    }
 167    }
 168  31 return (ModuleAddress[]) list.toArray(new ModuleAddress[] {});
 169    } finally {
 170  31 Trace.end(CLASS, this, method);
 171    }
 172    }
 173   
 174    /**
 175    * Get number of QEDEQ modules in STATE_LOADED.
 176    *
 177    * @return Number of loaded modules.
 178    */
 179  0 final synchronized int getNumberOfLoadedModules() {
 180  0 return getAllLoadedModules().length;
 181    }
 182   
 183    }