1
2
3
4
5
6
7
8
9
10
11
12
13
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
36
37
38
39 public final class LoadDirectlyRequiredModulesExecutor extends ControlVisitor
40 implements ModuleServicePluginExecutor {
41
42
43 private static final Class CLASS = LoadDirectlyRequiredModulesExecutor.class;
44
45
46 private KernelModuleReferenceList required;
47
48
49
50
51
52
53
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
78
79
80
81 public KernelModuleReferenceList getRequired() {
82 return required;
83 }
84
85
86
87
88
89
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
105 addError(me);
106 Trace.trace(CLASS, this, "visitEnter(Import)", e);
107 }
108 }
109
110
111
112
113
114
115 public void visitLeave(final ImportList imports) {
116 setBlocked(true);
117 }
118
119 }