001 /* This file is part of the project "Hilbert II" - http://www.qedeq.org
002 *
003 * Copyright 2000-2014, Michael Meyling <mime@qedeq.org>.
004 *
005 * "Hilbert II" is free software; you can redistribute
006 * it and/or modify it under the terms of the GNU General Public
007 * License as published by the Free Software Foundation; either
008 * version 2 of the License, or (at your option) any later version.
009 *
010 * This program is distributed in the hope that it will be useful,
011 * but WITHOUT ANY WARRANTY; without even the implied warranty of
012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
013 * GNU General Public License for more details.
014 */
015
016 package org.qedeq.kernel.bo.service.basis;
017
018 import org.qedeq.base.trace.Trace;
019 import org.qedeq.kernel.bo.module.InternalServiceJob;
020 import org.qedeq.kernel.bo.module.KernelQedeqBo;
021 import org.qedeq.kernel.bo.module.ModuleLabels;
022 import org.qedeq.kernel.se.base.module.Axiom;
023 import org.qedeq.kernel.se.base.module.ChangedRule;
024 import org.qedeq.kernel.se.base.module.ChangedRuleList;
025 import org.qedeq.kernel.se.base.module.FunctionDefinition;
026 import org.qedeq.kernel.se.base.module.Import;
027 import org.qedeq.kernel.se.base.module.Node;
028 import org.qedeq.kernel.se.base.module.PredicateDefinition;
029 import org.qedeq.kernel.se.base.module.Proposition;
030 import org.qedeq.kernel.se.base.module.Rule;
031 import org.qedeq.kernel.se.common.ModuleDataException;
032 import org.qedeq.kernel.se.common.Service;
033 import org.qedeq.kernel.se.common.SourceFileExceptionList;
034 import org.qedeq.kernel.se.dto.module.NodeVo;
035
036
037 /**
038 * Create mapping from labels to {@link org.qedeq.kernel.se.dto.module.NodeVo} for a QEDEQ module.
039 *
040 * @author Michael Meyling
041 */
042 public final class ModuleLabelsCreator extends ControlVisitor {
043
044 /** This class. */
045 private static final Class CLASS = ModuleLabelsCreator.class;
046
047 /** QEDEQ module labels, definitions, references, etc. */
048 private ModuleLabels labels;
049
050 /** Current node id. */
051 private String nodeId = "";
052
053 /**
054 * Constructor.
055 *
056 * @param service This service we work for.
057 * @param prop Internal QedeqBo.
058 */
059 public ModuleLabelsCreator(final Service service, final KernelQedeqBo prop) {
060 super(service, prop);
061 }
062
063 /**
064 * Visit import. Loads referenced QEDEQ module and saves reference.
065 *
066 * @param imp Begin visit of this element.
067 */
068 public void visitEnter(final Import imp) {
069 try {
070 this.labels.addLabel(getCurrentContext(),
071 imp.getLabel());
072 } catch (ModuleDataException me) {
073 addError(me);
074 Trace.trace(CLASS, this, "visitEnter(Import)", me);
075 }
076 }
077
078 public void visitEnter(final Axiom axiom) {
079 setBlocked(true); // block further traverse
080 }
081
082 public void visitEnter(final Proposition proposition) {
083 setBlocked(true); // block further traverse
084 }
085
086 /**
087 * Increase function definition counter.
088 *
089 * @param funcDef Begin visit of this element.
090 */
091 public void visitEnter(final FunctionDefinition funcDef) {
092 setBlocked(true); // block further traverse
093 // we always save the definition, even if there already exists an entry
094 labels.addFunction(funcDef, getCurrentContext());
095 }
096
097 public void visitEnter(final PredicateDefinition predDef) {
098 setBlocked(true); // block further traverse
099 // we always save the definition, even if there already exists an entry
100 labels.addPredicate(predDef, getCurrentContext());
101 }
102
103 public void visitEnter(final Rule rule) {
104 setBlocked(true); // block further traverse
105 // we always save the definition, even if there already exists an entry
106 labels.addRule(nodeId, rule, getCurrentContext());
107 if (rule.getChangedRuleList() != null) {
108 final ChangedRuleList list = rule.getChangedRuleList();
109 for (int i = 0; i < list.size() && list.get(i) != null; i++) {
110 final ChangedRule r = list.get(i);
111 labels.addChangedRule(nodeId, rule, r, getCurrentContext());
112 }
113 }
114 }
115
116 public void visitEnter(final Node node) {
117 nodeId = node.getId();
118 }
119
120 public void visitLeave(final Node node) {
121 nodeId = "";
122 try {
123 labels.addNode(getCurrentContext(), (NodeVo) node, getKernelQedeqBo(),
124 getCurrentNumbers());
125 } catch (ModuleDataException me) {
126 addError(me);
127 Trace.trace(CLASS, this, "visitEnter(Node)", me);
128 }
129 setBlocked(false); // allow further traverse
130 }
131
132 /**
133 * Fill QEDEQ module labels.
134 *
135 * @param process We work for this process.
136 * @param labels Herein the labels are filled.
137 * @throws SourceFileExceptionList Traverse lead to errors.
138 */
139 public void createLabels(final InternalServiceJob process, final ModuleLabels labels)
140 throws SourceFileExceptionList {
141 this.labels = labels;
142 traverse(process);
143 }
144
145 /**
146 * Get QEDEQ module labels.
147 *
148 * @return QEDEQ module labels. */
149 public ModuleLabels getLabels() {
150 return labels;
151 }
152
153 }
|