Clover coverage report - QedeqKernelSe Coverage Report
Coverage timestamp: Sa Jan 26 2008 14:11:34 CET
file stats: LOC: 147   Methods: 5
NCLOC: 90   Classes: 1
 
 Source file Conditionals Statements Methods TOTAL
LoadRequiredModules.java 100% 55,3% 100% 62,2%
coverage coverage
 1    /* $Id: LoadRequiredModules.java,v 1.2 2008/01/26 12:39:09 m31 Exp $
 2    *
 3    * This file is part of the project "Hilbert II" - http://www.qedeq.org
 4    *
 5    * Copyright 2000-2007, 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 org.qedeq.kernel.base.module.Import;
 21    import org.qedeq.kernel.base.module.ImportList;
 22    import org.qedeq.kernel.bo.module.DependencyState;
 23    import org.qedeq.kernel.bo.module.ModuleContext;
 24    import org.qedeq.kernel.bo.module.ModuleDataException;
 25    import org.qedeq.kernel.bo.module.ModuleProperties;
 26    import org.qedeq.kernel.bo.module.ModuleReferenceList;
 27    import org.qedeq.kernel.bo.visitor.AbstractModuleVisitor;
 28    import org.qedeq.kernel.bo.visitor.QedeqNotNullTraverser;
 29    import org.qedeq.kernel.common.SourceFileExceptionList;
 30    import org.qedeq.kernel.context.KernelContext;
 31    import org.qedeq.kernel.log.ModuleEventLog;
 32    import org.qedeq.kernel.trace.Trace;
 33    import org.qedeq.kernel.xml.mapper.ModuleDataException2XmlFileException;
 34    import org.qedeq.kernel.xml.parser.DefaultSourceFileExceptionList;
 35   
 36   
 37    /**
 38    * Load all required QEDEQ modules.
 39    *
 40    * @version $Revision: 1.2 $
 41    * @author Michael Meyling
 42    */
 43    public final class LoadRequiredModules extends AbstractModuleVisitor {
 44   
 45    /** This class. */
 46    private static final Class CLASS = LoadRequiredModules.class;
 47   
 48    /** Traverse QEDEQ module with this traverser. */
 49    private final QedeqNotNullTraverser traverser;
 50   
 51    /** QEDEQ module properties object to work on. */
 52    private final ModuleProperties prop;
 53   
 54    /** List of required QEDEQ modules. */
 55    private final ModuleReferenceList required;
 56   
 57    /**
 58    * Constructor.
 59    *
 60    * @param prop QEDEQ module properties object.
 61    */
 62  69 private LoadRequiredModules(final ModuleProperties prop) {
 63  69 this.prop = prop;
 64  69 this.traverser = new QedeqNotNullTraverser(prop.getModuleAddress(), this);
 65  69 required = new ModuleReferenceList();
 66    }
 67   
 68    /**
 69    * Load all required QEDEQ modules for a given QEDEQ module.
 70    *
 71    * @param prop Module properties.
 72    * @throws SourceFileExceptionList Failure(s).
 73    */
 74  124 public static void loadRequired(final ModuleProperties prop) throws SourceFileExceptionList {
 75  124 final String method = "loadRequired(ModuleProperties)";
 76    // did we check this already?
 77  124 if (prop.getDependencyState().areAllRequiredLoaded()) {
 78  50 return; // everything is OK
 79    }
 80  74 KernelContext.getInstance().loadModule(prop.getModuleAddress());
 81  69 prop.setDependencyProgressState(DependencyState.STATE_LOADING_REQUIRED_MODULES);
 82  69 ModuleEventLog.getInstance().stateChanged(prop);
 83  69 final LoadRequiredModules converter = new LoadRequiredModules(prop);
 84  69 try {
 85  69 converter.loadRequired();
 86  69 prop.setLoadedRequiredModules(converter.required);
 87  69 ModuleEventLog.getInstance().stateChanged(prop);
 88    } catch (ModuleDataException e) {
 89  0 final SourceFileExceptionList sfl =
 90    ModuleDataException2XmlFileException.createXmlFileExceptionList(e,
 91    prop.getModule().getQedeq());
 92  0 prop.setDependencyFailureState(DependencyState.STATE_LOADING_REQUIRED_MODULES_FAILED,
 93    sfl);
 94  0 ModuleEventLog.getInstance().stateChanged(prop);
 95  0 throw sfl;
 96    } catch (final RuntimeException e) { // last catch
 97  0 Trace.fatal(LoadRequiredModules.class, method, "programming error", e);
 98  0 ModuleDataException me = new LoadRequiredModuleException(10, e.toString(),
 99    converter.traverser.getCurrentContext());
 100  0 final SourceFileExceptionList sfl =
 101    new DefaultSourceFileExceptionList(me);
 102  0 prop.setDependencyFailureState(
 103    DependencyState.STATE_LOADING_REQUIRED_MODULES_FAILED, sfl);
 104  0 ModuleEventLog.getInstance().stateChanged(prop);
 105  0 throw sfl;
 106    } catch (final Throwable e) { // last catch
 107  0 ModuleDataException me = new LoadRequiredModuleException(10, e.toString(),
 108    converter.traverser.getCurrentContext());
 109  0 final SourceFileExceptionList sfl =
 110    new DefaultSourceFileExceptionList(me);
 111  0 prop.setDependencyFailureState(
 112    DependencyState.STATE_LOADING_REQUIRED_MODULES_FAILED, sfl);
 113  0 ModuleEventLog.getInstance().stateChanged(prop);
 114  0 throw sfl;
 115    }
 116    }
 117   
 118    /**
 119    * Load all required QEDEQ modules for a given QEDEQ module.
 120    *
 121    * @throws ModuleDataException Exception during traverse.
 122    */
 123  69 private final void loadRequired() throws ModuleDataException {
 124  69 traverser.accept(prop.getModule().getQedeq());
 125    }
 126   
 127  57 public void visitEnter(final Import imp) throws ModuleDataException {
 128  57 try {
 129  57 final ModuleProperties propNew = KernelContext.getInstance()
 130    .loadModule(prop.getModule(), imp.getSpecification());
 131  57 required.add(new ModuleContext(traverser.getCurrentContext()), imp.getLabel(), propNew);
 132  57 Trace.param(CLASS, "visitEnter(Import)", "adding context",
 133    traverser.getCurrentContext());
 134  57 loadRequired(propNew);
 135    } catch (SourceFileExceptionList e) {
 136  0 Trace.trace(CLASS, this, "visitEnter(Import)", e);
 137  0 throw new LoadRequiredModuleException(e.get(0).getErrorCode(),
 138    "import of module labeled \"" + imp.getLabel() + "\" failed: "
 139    + e.get(0).getMessage(), traverser.getCurrentContext());
 140    }
 141    }
 142   
 143  40 public void visitLeave(final ImportList imports) {
 144  40 traverser.setBlocked(true);
 145    }
 146   
 147    }