ModuleLabelsCreator.java
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()(NodeVonode, 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 }