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