View Javadoc

1   /* This file is part of the project "Hilbert II" - http://www.qedeq.org" target="alexandria_uri">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.dependency;
17  
18  import org.qedeq.base.io.Parameters;
19  import org.qedeq.base.trace.Trace;
20  import org.qedeq.kernel.bo.module.InternalModuleServiceCall;
21  import org.qedeq.kernel.bo.module.KernelModuleReferenceList;
22  import org.qedeq.kernel.bo.module.KernelQedeqBo;
23  import org.qedeq.kernel.bo.service.basis.ControlVisitor;
24  import org.qedeq.kernel.bo.service.basis.ModuleServicePluginExecutor;
25  import org.qedeq.kernel.se.base.module.Import;
26  import org.qedeq.kernel.se.base.module.ImportList;
27  import org.qedeq.kernel.se.common.ModuleContext;
28  import org.qedeq.kernel.se.common.ModuleDataException;
29  import org.qedeq.kernel.se.common.ModuleService;
30  import org.qedeq.kernel.se.common.SourceFileExceptionList;
31  import org.qedeq.kernel.se.state.LoadingImportsState;
32  
33  
34  /**
35   * Load all directly imported QEDEQ modules.
36   *
37   * @author  Michael Meyling
38   */
39  public final class LoadDirectlyRequiredModulesExecutor extends ControlVisitor
40          implements ModuleServicePluginExecutor {
41  
42      /** This class. */
43      private static final Class CLASS = LoadDirectlyRequiredModulesExecutor.class;
44  
45      /** List of required QEDEQ modules. */
46      private KernelModuleReferenceList required;
47  
48      /**
49       * Constructor.
50       *
51       * @param   plugin      Plugin we work for.
52       * @param   prop        Internal QedeqBo.
53       * @param   parameter   Currently ignored.
54       */
55      public LoadDirectlyRequiredModulesExecutor(final ModuleService plugin, final KernelQedeqBo prop,
56              final Parameters parameter) {
57          super(plugin, prop);
58      }
59  
60      public Object executePlugin(final InternalModuleServiceCall call, final Object data) {
61          if (getKernelQedeqBo().hasLoadedImports()) {
62              return getKernelQedeqBo().getRequiredModules();
63          }
64          this.required = new KernelModuleReferenceList();
65          try {
66              getKernelQedeqBo().setLoadingImportsProgressState(LoadingImportsState.STATE_LOADING_IMPORTS);
67              super.traverse(call.getInternalServiceProcess());
68              getKernelQedeqBo().setLoadedImports(required);
69          } catch (final SourceFileExceptionList sfl) {
70              getKernelQedeqBo().setLoadingImportsFailureState(
71                  LoadingImportsState.STATE_LOADING_IMPORTS_FAILED, sfl);
72          }
73          return required;
74      }
75  
76      /**
77       * Get list of directly referenced modules.
78       *
79       * @return  List of directly required modules.
80       */
81      public KernelModuleReferenceList getRequired() {
82          return required;
83      }
84  
85      /**
86       * Visit import. Loads referenced QEDEQ module and saves reference.
87       *
88       * @param   imp                 Begin visit of this element.
89       * @throws  ModuleDataException Major problem occurred.
90       */
91      public void visitEnter(final Import imp) throws ModuleDataException {
92          final ModuleContext context = getCurrentContext();
93          context.setLocationWithinModule(context.getLocationWithinModule() + ".getLabel()");
94          try {
95              final KernelQedeqBo propNew = getKernelQedeqBo().getKernelServices().loadKernelModule(
96                  getInternalServiceCall().getInternalServiceProcess(),
97                  getKernelQedeqBo().getModuleAddress(), imp.getSpecification());
98              getRequired().addLabelUnique(context, imp.getLabel(), propNew);
99              Trace.param(CLASS, "visitEnter(Import)", "adding context", getCurrentContext());
100         } catch (SourceFileExceptionList e) {
101             final ModuleDataException me = new LoadRequiredModuleException(e.get(0).getErrorCode(),
102                 "import of module with label \"" + imp.getLabel() + "\" failed: "
103                 + e.get(0).getMessage(), context);
104             // TODO mime 20080227: also include reference area in sf creation?
105             addError(me);
106             Trace.trace(CLASS, this, "visitEnter(Import)", e);
107         }
108     }
109 
110     /**
111      * End of visit of import list. Blocks further visits.
112      *
113      * @param   imports             This visit has just ended.
114      */
115     public void visitLeave(final ImportList imports) {
116         setBlocked(true); // block further traverse
117     }
118 
119 }