Clover Coverage Report
Coverage timestamp: Fri Feb 14 2014 07:28:57 UTC
../../../../../../img/srcFileCovDistChart8.png 62% of files have more coverage
119   572   94   1.72
30   343   0.79   69
69     1.36  
1    
 
  DefaultKernelQedeqBo       Line # 58 119 94 74.8% 0.7477064
 
  (177)
 
1    /* This file is part of the project "Hilbert II" - http://www.qedeq.org
2    *
3    * Copyright 2000-2014, 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.internal;
17   
18    import java.util.ArrayList;
19    import java.util.List;
20   
21    import org.apache.commons.lang.ArrayUtils;
22    import org.qedeq.base.io.SourceArea;
23    import org.qedeq.base.trace.Trace;
24    import org.qedeq.base.utility.EqualsUtility;
25    import org.qedeq.base.utility.StringUtility;
26    import org.qedeq.kernel.bo.common.Element2Latex;
27    import org.qedeq.kernel.bo.common.Element2Utf8;
28    import org.qedeq.kernel.bo.common.ModuleReferenceList;
29    import org.qedeq.kernel.bo.module.InternalKernelServices;
30    import org.qedeq.kernel.bo.module.KernelModuleReferenceList;
31    import org.qedeq.kernel.bo.module.KernelQedeqBo;
32    import org.qedeq.kernel.bo.module.ModuleConstantsExistenceChecker;
33    import org.qedeq.kernel.bo.module.ModuleLabels;
34    import org.qedeq.kernel.bo.module.QedeqFileDao;
35    import org.qedeq.kernel.se.base.module.LatexList;
36    import org.qedeq.kernel.se.base.module.Qedeq;
37    import org.qedeq.kernel.se.common.ModuleAddress;
38    import org.qedeq.kernel.se.common.ModuleContext;
39    import org.qedeq.kernel.se.common.ModuleDataException;
40    import org.qedeq.kernel.se.common.ModuleService;
41    import org.qedeq.kernel.se.common.Service;
42    import org.qedeq.kernel.se.common.SourceFileException;
43    import org.qedeq.kernel.se.common.SourceFileExceptionList;
44    import org.qedeq.kernel.se.dto.module.QedeqVo;
45    import org.qedeq.kernel.se.state.AbstractState;
46    import org.qedeq.kernel.se.state.DependencyState;
47    import org.qedeq.kernel.se.state.FormallyProvedState;
48    import org.qedeq.kernel.se.state.LoadingImportsState;
49    import org.qedeq.kernel.se.state.LoadingState;
50    import org.qedeq.kernel.se.state.WellFormedState;
51   
52   
53    /**
54    * Represents a module and its states. This is a kernel internal representation.
55    *
56    * @author Michael Meyling
57    */
 
58    public class DefaultKernelQedeqBo implements KernelQedeqBo {
59   
60    /** This class. */
61    private static final Class CLASS = DefaultKernelQedeqBo.class;
62   
63    /** Internal kernel services. */
64    private final InternalKernelServices services;
65   
66    /** Address and module specification. */
67    private final ModuleAddress address;
68   
69    /** Loaded QEDEQ module. */
70    private QedeqVo qedeq;
71   
72    /** Required QEDEQ modules. */
73    private KernelModuleReferenceList required;
74   
75    /** Dependent QEDEQ modules. */
76    private KernelModuleReferenceList dependent;
77   
78    /** Predicate and function constant existence checker. */
79    private ModuleConstantsExistenceChecker checker;
80   
81    /** Labels for this module, definitions, etc. */
82    private ModuleLabels labels;
83   
84    /** Can map elements to LaTeX. */
85    private Element2Latex converter;
86   
87    /** Can map elements to UTF-8 text. */
88    private Element2Utf8 textConverter;
89   
90    /** Loader used for loading this object. */
91    private QedeqFileDao loader;
92   
93    /** State change manager. */
94    private final StateManager stateManager;
95   
96    /** Currently running service for this module. */
97    private Service currentlyRunningService;
98   
99    /**
100    * Creates new module properties.
101    *
102    * @param services Internal kernel services.
103    * @param address Module address (not <code>null</code>).
104    * @throws NullPointerException <code>address</code> is null.
105    */
 
106  679 toggle public DefaultKernelQedeqBo(final InternalKernelServices services,
107    final ModuleAddress address) {
108  679 this.services = services;
109  679 this.address = address;
110  679 if (address == null) {
111  1 throw new NullPointerException("ModuleAddress must not be null");
112    }
113  678 required = new KernelModuleReferenceList();
114  678 dependent = new KernelModuleReferenceList();
115  678 stateManager = new StateManager(this);
116    }
117   
118    /**
119    * Set loader used for loading this object.
120    *
121    * @param loader Responsible loader.
122    */
 
123  662 toggle public void setQedeqFileDao(final QedeqFileDao loader) {
124  662 this.loader = loader;
125    }
126   
127    /**
128    * Get loader used to load this object.
129    *
130    * @return Loader.
131    */
 
132  0 toggle public QedeqFileDao getLoader() {
133  0 return this.loader;
134    }
135   
 
136  337 toggle public boolean hasBasicFailures() {
137  337 return stateManager.hasBasicFailures();
138    }
139   
 
140  529 toggle public boolean hasErrors() {
141  529 return stateManager.hasErrors();
142    }
143   
 
144  79 toggle public boolean hasWarnings() {
145  79 return stateManager.hasWarnings();
146    }
147   
 
148  526933 toggle public ModuleAddress getModuleAddress() {
149  526933 return address;
150    }
151   
152    /**
153    * Get internal kernel services.
154    *
155    * @return Internal kernel services.
156    */
 
157  78629 toggle public InternalKernelServices getKernelServices() {
158  78629 return this.services;
159    }
160   
161    /**
162    * Set completeness percentage.
163    *
164    * @param completeness Completeness of loading into memory.
165    */
 
166  0 toggle public void setLoadingCompleteness(final int completeness) {
167  0 stateManager.setLoadingCompleteness(completeness);
168    }
169   
 
170  0 toggle public int getLoadingCompleteness() {
171  0 return stateManager.getLoadingCompleteness();
172    }
173   
174    /**
175    * Delete QEDEQ module. Invalidates all dependent modules.
176    */
 
177  672 toggle public void delete() {
178  672 stateManager.delete();
179    }
180   
181    /**
182    * Set loading progress module state.
183    *
184    * @param state Module loading state. Must not be <code>null</code>.
185    * @throws IllegalStateException State is a failure state or module loaded state.
186    */
 
187  1312 toggle public void setLoadingProgressState(final LoadingState state) {
188  1312 stateManager.setLoadingProgressState(state);
189    }
190   
191    /**
192    * Set failure module state.
193    *
194    * @param state Module loading state. Must not be <code>null</code>.
195    * @param e Exception that occurred during loading. Must not be <code>null</code>.
196    * @throws IllegalArgumentException <code>state</code> is no failure state
197    */
 
198  66 toggle public void setLoadingFailureState(final LoadingState state,
199    final SourceFileExceptionList e) {
200  66 stateManager.setLoadingFailureState(state, e);
201    }
202   
 
203  690 toggle public LoadingState getLoadingState() {
204  690 return stateManager.getLoadingState();
205    }
206   
 
207  3846 toggle public boolean isLoaded() {
208  3846 return stateManager.isLoaded();
209    }
210   
211    /**
212    * Set loading state to "loaded". Also puts <code>null</code> to {@link #getLabels()}.
213    *
214    * @param qedeq This module was loaded. Must not be <code>null</code>.
215    * @param labels Module labels.
216    * @param converter Can convert elements into LaTeX. Must not be <code>null</code>.
217    * @param textConverter Can convert elements into UTF-8 text. Must not be <code>null</code>.
218    * @throws NullPointerException One argument was <code>null</code>.
219    */
 
220  649 toggle public void setLoaded(final QedeqVo qedeq, final ModuleLabels labels,
221    final Element2Latex converter, final Element2Utf8 textConverter) {
222  649 stateManager.setLoaded(qedeq, labels);
223  649 this.converter = converter;
224  649 this.textConverter = textConverter;
225    }
226   
 
227  625724 toggle public Qedeq getQedeq() {
228  625724 return this.qedeq;
229    }
230   
 
231  9456 toggle public Element2Latex getElement2Latex() {
232  9456 return this.converter;
233    }
234   
 
235  3141 toggle public Element2Utf8 getElement2Utf8() {
236  3141 return this.textConverter;
237    }
238   
 
239  411 toggle public void setLoadingImportsProgressState(final LoadingImportsState state) {
240  411 stateManager.setLoadingImportsProgressState(state);
241    }
242   
 
243  2 toggle public void setLoadingImportsFailureState(final LoadingImportsState state,
244    final SourceFileExceptionList e) {
245  2 stateManager.setLoadingImportsFailureState(state, e);
246    }
247   
 
248  0 toggle public LoadingImportsState getLoadingImportsState() {
249  0 return stateManager.getLoadingImportsState();
250    }
251   
 
252  415 toggle public void setLoadedImports(final KernelModuleReferenceList list) {
253  415 stateManager.setLoadedImports(list);
254    }
255   
 
256  1956 toggle public boolean hasLoadedImports() {
257  1956 return stateManager.hasLoadedImports();
258    }
259   
260   
 
261  352 toggle public void setDependencyProgressState(final DependencyState state) {
262  352 stateManager.setDependencyProgressState(state);
263    }
264   
 
265  25 toggle public void setDependencyFailureState(final DependencyState state,
266    final SourceFileExceptionList e) {
267  25 stateManager.setDependencyFailureState(state, e);
268    }
269   
 
270  341 toggle public DependencyState getDependencyState() {
271  341 return stateManager.getDependencyState();
272    }
273   
 
274  342 toggle public void setLoadedRequiredModules() {
275  342 stateManager.setLoadedRequiredModules();
276    }
277   
 
278  18867 toggle public ModuleReferenceList getRequiredModules() {
279  18867 return getKernelRequiredModules();
280    }
281   
 
282  38895 toggle public KernelModuleReferenceList getKernelRequiredModules() {
283  38895 return required;
284    }
285   
 
286  3163 toggle public boolean hasLoadedRequiredModules() {
287  3163 return stateManager.hasLoadedRequiredModules();
288    }
289   
290    /**
291    * Get labels and URLs of all directly dependent modules. These are all modules that are
292    * currently known to import this module.
293    *
294    * @return URLs of all referenced modules.
295    */
 
296  5081 toggle public KernelModuleReferenceList getDependentModules() {
297  5081 return dependent;
298    }
299   
 
300  313 toggle public void setWellFormed(final ModuleConstantsExistenceChecker checker) {
301  313 stateManager.setWellFormed(checker);
302    }
303   
 
304  1434 toggle public boolean isWellFormed() {
305  1434 return stateManager.isWellFormed();
306    }
307   
 
308  29 toggle public boolean isFullyFormallyProved() {
309  29 return stateManager.isFullyFormallyProved();
310    }
311   
 
312  684 toggle public void setWellFormedProgressState(final WellFormedState state) {
313  684 stateManager.setWellFormedProgressState(state);
314    }
315   
 
316  34 toggle public void setWellfFormedFailureState(final WellFormedState state,
317    final SourceFileExceptionList e) {
318  34 stateManager.setWellFormedFailureState(state, e);
319    }
320   
 
321  8 toggle public WellFormedState getWellFormedState() {
322  8 return stateManager.getWellFormedState();
323    }
324   
 
325  28 toggle public void setFormallyProvedProgressState(final FormallyProvedState state) {
326  28 stateManager.setFormallyProvedProgressState(state);
327    }
328   
 
329  5 toggle public void setFormallyProvedFailureState(final FormallyProvedState state,
330    final SourceFileExceptionList e) {
331  5 stateManager.setFormallyProvedFailureState(state, e);
332    }
333   
 
334  0 toggle public FormallyProvedState getFormallyProvedState() {
335  0 return stateManager.getFormallyProvedState();
336    }
337   
 
338  296 toggle public SourceFileExceptionList getErrors() {
339  296 return stateManager.getErrors();
340    }
341   
 
342  66 toggle public SourceFileExceptionList getWarnings() {
343  66 return stateManager.getWarnings();
344    }
345   
 
346  60 toggle public String getStateDescription() {
347  60 return stateManager.getStateDescription();
348    }
349   
 
350  0 toggle public AbstractState getCurrentState() {
351  0 return stateManager.getCurrentState();
352    }
353   
 
354  0 toggle public AbstractState getLastSuccessfulState() {
355  0 return stateManager.getLastSuccesfulState();
356    }
357   
 
358  0 toggle public synchronized Service getCurrentlyRunningService() {
359  0 return currentlyRunningService;
360    }
361   
 
362  2184 toggle public synchronized void setCurrentlyRunningService(final Service currentlyRunningService) {
363  2184 this.currentlyRunningService = currentlyRunningService;
364    }
365   
 
366  66 toggle public String getName() {
367  66 if (address == null) {
368  0 return "null";
369    }
370  66 return address.getName();
371    }
372   
 
373  0 toggle public String getRuleVersion() {
374  0 if (address == null || qedeq == null
375    || qedeq.getHeader() == null
376    || qedeq.getHeader().getSpecification() == null
377    || qedeq.getHeader().getSpecification().getRuleVersion() == null) {
378  0 return "";
379    }
380  0 return qedeq.getHeader().getSpecification().getRuleVersion();
381    }
382   
 
383  3048 toggle public String getUrl() {
384  3048 if (this.address == null) {
385  0 return null;
386    }
387  3048 return this.address.getUrl();
388    }
389   
390    /**
391    * Set label references for QEDEQ module.
392    *
393    * @param labels Label references.
394    */
 
395  2685 toggle public void setLabels(final ModuleLabels labels) {
396  2685 this.labels = labels;
397    }
398   
 
399  67241 toggle public ModuleLabels getLabels() {
400  67241 return labels;
401    }
402   
403    /**
404    * Create exception out of {@link ModuleDataException}.
405    *
406    * @param service This service generated the error.
407    * @param exception Take this exception.
408    * @return Newly created instance.
409    */
 
410  0 toggle public SourceFileExceptionList createSourceFileExceptionList(final Service service,
411    final ModuleDataException exception) {
412  0 SourceArea referenceArea = null;
413  0 if (exception.getReferenceContext() != null) {
414  0 referenceArea = createSourceArea(qedeq, exception.getReferenceContext());
415    }
416  0 final SourceFileException e = new SourceFileException(service, exception,
417    createSourceArea(qedeq, exception.getContext()), referenceArea);
418  0 final SourceFileExceptionList list = new SourceFileExceptionList(e);
419  0 return list;
420    }
421   
422    /**
423    * Create exception out of {@link ModuleDataException}.
424    *
425    * @param service This service generated the error.
426    * @param exception Take this exception.
427    * @param qedeq Take this QEDEQ source. (This might not be accessible via
428    * {@link #getQedeq()}.
429    * @return Newly created instance.
430    */
 
431  0 toggle public SourceFileExceptionList createSourceFileExceptionList(final Service service,
432    final ModuleDataException exception, final Qedeq qedeq) {
433  0 final SourceFileException e = new SourceFileException(service, exception,
434    createSourceArea(qedeq, exception.getContext()), createSourceArea(qedeq,
435    exception.getReferenceContext()));
436  0 final SourceFileExceptionList list = new SourceFileExceptionList(e);
437  0 return list;
438    }
439   
 
440  268 toggle public SourceFileException createSourceFileException(final Service service, final ModuleDataException
441    exception) {
442  268 final SourceArea area = createSourceArea(qedeq, exception.getContext());
443  268 SourceArea referenceArea = null;
444  268 if (exception.getReferenceContext() != null) {
445  15 referenceArea = createSourceArea(qedeq, exception.getReferenceContext());
446    }
447  268 final SourceFileException e = new SourceFileException(service, exception, area, referenceArea);
448  268 return e;
449    }
450   
451    /**
452    * Create area in source file for QEDEQ module context.
453    * If the system property "qedeq.test.xmlLocationFailures" is set to "true" a runtime
454    * exception is thrown if the context is not found.
455    *
456    * @param qedeq Look at this QEDEQ module.
457    * @param context Search for this context.
458    * @return Created file area. Maybe <code>null</code>.
459    */
 
460  283 toggle public SourceArea createSourceArea(final Qedeq qedeq, final ModuleContext context) {
461  283 final String method = "createSourceArea(Qedeq, ModuleContext)";
462  283 SourceArea area = null;
463  283 try {
464  283 area = loader.createSourceArea(qedeq, context);
465    } catch (RuntimeException e) {
466  0 Trace.fatal(CLASS, method, "loader couldn't create context: " + context, e);
467  0 if (Boolean.TRUE.toString().equalsIgnoreCase(
468    System.getProperty("qedeq.test.xmlLocationFailures"))) {
469  0 throw e;
470    }
471    }
472  283 if (area == null) {
473  0 Trace.fatal(CLASS, "createSourceArea", "loader coudn't create context: "
474    + context, new NullPointerException());
475  0 area = new SourceArea(this.getModuleAddress().getUrl());
476    }
477  283 return area;
478    }
479   
 
480  883 toggle public String[] getSupportedLanguages() {
481    // TODO m31 20070704: there should be a better way to
482    // get all supported languages. Time for a new visitor?
483  883 if (!isLoaded() || getQedeq() == null || getQedeq().getHeader() == null
484    || getQedeq().getHeader().getTitle() == null) {
485  0 return ArrayUtils.EMPTY_STRING_ARRAY;
486    }
487  883 final LatexList list = getQedeq().getHeader().getTitle();
488  883 final List result = new ArrayList(list.size());
489  2003 for (int i = 0; i < list.size(); i++) {
490  1120 if (null != list.get(i) && list.get(i).getLanguage() != null
491    && list.get(i).getLanguage().trim().length() > 0) {
492  1120 result.add(list.get(i).getLanguage());
493    }
494    }
495  883 return (String[]) result.toArray(ArrayUtils.EMPTY_STRING_ARRAY);
496    }
497   
 
498  185 toggle public boolean isSupportedLanguage(final String language) {
499  185 return StringUtility.isIn(language, getSupportedLanguages());
500    }
501   
 
502  694 toggle public String getOriginalLanguage() {
503    // TODO 20110316 m31: rework qedeq.xsd to have a default language
504  694 final String[] supported = getSupportedLanguages();
505  694 if (StringUtility.isNotIn("de", supported)) {
506  634 if (supported.length == 0) {
507  0 return "en"; // we have no German only documents
508    }
509  634 return supported[0];
510    }
511  60 return "de";
512    }
513   
514   
515    /**
516    * Set {@link QedeqVo}. Doesn't do any status handling. Only for internal use.
517    *
518    * @param qedeq Set this value.
519    */
 
520  3328 toggle public void setQedeqVo(final QedeqVo qedeq) {
521  3328 this.qedeq = qedeq;
522    }
523   
524    /**
525    * Get {@link StateManager}. Only for internal use.
526    *
527    * @return StateManager
528    */
 
529  101 toggle protected StateManager getStateManager() {
530  101 return this.stateManager;
531    }
532   
533    /**
534    * Get the predicate and function existence checker. Is not <code>null</code>
535    * if logic was (not necessarily successfully) checked.
536    *
537    * @return Checker. Checks if a predicate or function constant is defined.
538    */
 
539  169136 toggle public ModuleConstantsExistenceChecker getExistenceChecker() {
540  169136 return checker;
541    }
542   
 
543  339 toggle public void setExistenceChecker(final ModuleConstantsExistenceChecker checker) {
544  339 this.checker = checker;
545    }
546   
 
547  5957 toggle public int hashCode() {
548  5957 return (getModuleAddress() == null ? 0 : getModuleAddress().hashCode());
549    }
550   
 
551  5334 toggle public boolean equals(final Object obj) {
552  5334 if (obj instanceof DefaultKernelQedeqBo) {
553  5330 return EqualsUtility.equals(((DefaultKernelQedeqBo) obj).getModuleAddress(),
554    this.getModuleAddress());
555    }
556  4 return false;
557    }
558   
 
559  294 toggle public String toString() {
560  294 return address.getUrl();
561    }
562   
 
563  113 toggle public void addPluginErrorsAndWarnings(final ModuleService plugin, final SourceFileExceptionList errors,
564    final SourceFileExceptionList warnings) {
565  113 stateManager.addPluginResults(plugin, errors, warnings);
566    }
567   
 
568  0 toggle public void clearAllPluginErrorsAndWarnings() {
569  0 stateManager.removeAllPluginResults();
570    }
571   
572    }