Skip to content
Snippets Groups Projects
Commit ce1a74f1 authored by Daniel Plagge's avatar Daniel Plagge
Browse files

Added handling for missing theory plugin

parent 161c9162
No related branches found
No related tags found
No related merge requests found
......@@ -14,6 +14,7 @@ import org.eventb.core.ast.FormulaFactory;
import org.eventb.core.ast.ITypeEnvironment;
import org.eventb.core.ast.Predicate;
import org.eventb.core.ast.Type;
import org.eventb.theory.core.DatabaseUtilities;
import org.eventb.theory.core.IAvailableTheory;
import org.eventb.theory.core.IAvailableTheoryProject;
import org.eventb.theory.core.IDeployedTheoryRoot;
......@@ -36,6 +37,7 @@ import org.rodinp.core.RodinDBException;
import de.be4.classicalb.core.parser.analysis.prolog.ASTProlog;
import de.be4.classicalb.core.parser.node.PExpression;
import de.be4.classicalb.core.parser.node.PPredicate;
import de.prob.core.translator.TranslationFailedException;
import de.prob.prolog.output.IPrologTermOutput;
import de.prob.prolog.output.StructuredPrologOutput;
import de.prob.prolog.term.PrologTerm;
......@@ -44,7 +46,8 @@ public class Theories {
private static final String PROB_THEORY_MAPPING_SUFFIX = "ptm";
public static void translate(IEventBProject project, IPrologTermOutput pout)
throws RodinDBException {
throws TranslationFailedException {
try {
final IRodinProject rProject = project.getRodinProject();
final IDeployedTheoryRoot[] theories = rProject
.getRootElementsOfType(IDeployedTheoryRoot.ELEMENT_TYPE);
......@@ -61,6 +64,9 @@ public class Theories {
}
}
}
} catch (RodinDBException e) {
throw new TranslationFailedException(e);
}
}
/**
......@@ -323,4 +329,10 @@ public class Theories {
}
pto.closeList();
}
public static void touch() throws NoClassDefFoundError {
// Just some dummy code to check if the theory plugin is installed
@SuppressWarnings("unused")
String extension = DatabaseUtilities.DEPLOYED_THEORY_FILE_EXTENSION;
}
}
......@@ -16,7 +16,6 @@ import org.eventb.core.IEventBRoot;
import org.eventb.core.ISCInternalContext;
import org.eventb.core.ISCMachineRoot;
import org.rodinp.core.IInternalElement;
import org.rodinp.core.RodinDBException;
import de.be4.classicalb.core.parser.analysis.prolog.ASTProlog;
import de.be4.classicalb.core.parser.node.Node;
......@@ -29,6 +28,7 @@ import de.prob.prolog.output.IPrologTermOutput;
public abstract class EventBTranslator implements ITranslator {
protected final IEventBProject project;
private boolean theoryIsUsed;
protected EventBTranslator(final IEventBRoot root) {
this.project = root.getEventBProject();
......@@ -41,7 +41,7 @@ public abstract class EventBTranslator implements ITranslator {
this.project = ((ISCMachineRoot) ctx.getRoot()).getEventBProject();
}
private LabelPositionPrinter createPrinter(
private LabelPositionPrinter createLabelPrositionPrinter(
final Collection<AbstractComponentTranslator> translators)
throws TranslationFailedException {
LabelPositionPrinter printer = new LabelPositionPrinter();
......@@ -53,14 +53,21 @@ public abstract class EventBTranslator implements ITranslator {
return printer;
}
private void printModels(
final Collection<? extends AbstractComponentTranslator> refinementChainTranslators,
private Collection<Node> translateModels(
final Collection<? extends AbstractComponentTranslator> refinementChainTranslators) {
Collection<Node> nodes = new ArrayList<Node>();
for (final AbstractComponentTranslator translator : refinementChainTranslators) {
nodes.add(translator.getAST());
theoryIsUsed |= translator.isTheoryUsed();
}
return nodes;
}
private void printModels(final Collection<Node> nodes,
final IPrologTermOutput pout, final ASTProlog prolog) {
pout.openList();
for (final AbstractComponentTranslator translateor : refinementChainTranslators) {
final Node modelAST = translateor.getAST();
modelAST.apply(prolog);
for (final Node node : nodes) {
node.apply(prolog);
}
pout.closeList();
}
......@@ -126,19 +133,27 @@ public abstract class EventBTranslator implements ITranslator {
Collection<AbstractComponentTranslator> translators = new ArrayList<AbstractComponentTranslator>();
translators.addAll(refinementChainTranslators);
translators.addAll(contextTranslators);
return new ASTProlog(pout, createPrinter(translators));
return new ASTProlog(pout, createLabelPrositionPrinter(translators));
}
protected void printProlog(
final Collection<? extends AbstractComponentTranslator> refinementChainTranslators,
final Collection<? extends AbstractComponentTranslator> contextTranslators,
final IPrologTermOutput pout) throws TranslationFailedException {
theoryIsUsed = false;
Collection<Node> machineNodes = translateModels(refinementChainTranslators);
Collection<Node> contextNodes = translateModels(contextTranslators);
if (theoryIsUsed) {
checkIfTheoriesAvailable();
}
final ASTProlog prolog = createAstVisitor(refinementChainTranslators,
contextTranslators, pout);
pout.openTerm("load_event_b_project");
printModels(refinementChainTranslators, pout, prolog);
printModels(contextTranslators, pout, prolog);
printModels(machineNodes, pout, prolog);
printModels(contextNodes, pout, prolog);
pout.openList();
pout.openTerm("exporter_version");
pout.printNumber(2);
......@@ -146,12 +161,9 @@ public abstract class EventBTranslator implements ITranslator {
printProofInformation(refinementChainTranslators, contextTranslators,
pout);
try {
Theories.translate(project, pout);
} catch (NoClassDefFoundError e) {
} catch (RodinDBException e) {
e.printStackTrace();
if (theoryIsUsed) {
translateTheories(project, pout);
}
printPragmaContents(refinementChainTranslators, contextTranslators,
......@@ -161,4 +173,20 @@ public abstract class EventBTranslator implements ITranslator {
pout.printVariable("_Error");
pout.closeTerm();
}
private void checkIfTheoriesAvailable() throws TranslationFailedException {
try {
Theories.touch();
} catch (NoClassDefFoundError e) {
throw new TranslationFailedException(
"Theory",
"The model to animate makes use of a theory but the theory plug-in is not installed");
}
}
private void translateTheories(IEventBProject project2,
IPrologTermOutput pout) throws TranslationFailedException {
Theories.translate(project, pout);
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment