import Jakarta.util.*; import java.io.*; import java.util.*; // This class provides a programming-interface to guidsl, // and avoids the display of the GUI itself. It is to be used // for invoking the functionality of a guidsl tool. // basic approach: // Tool tool = new Tool( "modelFileName" ); // boolean result = true/false -- result of the SAT test // SATtest t = new SATtest( "name of test" , result ); // t.add( "featureName or -FeatureName); // loop over this // boolean output = true (for debugging) // if (tool.modelDebug(t, output)) ... else ...; public class Tool { cnfModel model; public Tool ( String modelFileName ) { // Step 1: open the guidsl model file FileInputStream inputFile = null; try { inputFile = new FileInputStream( modelFileName ); } catch ( Exception e ) { Util.fatalError( "File " + modelFileName + " not found:" + e.getMessage() ); } // Step 2: create a parser and parse input files // inputRoot is root of parse tree of input file Parser myParser = Parser.getInstance( inputFile ); Model inputRoot = null; try { inputRoot = ( Model ) myParser.parseAll() ; } catch ( Exception e ) { Util.fatalError( "Parsing Exception Thrown in " + modelFileName + ": " + e.getMessage() ); } // Step 3: transform parse tree here into the internal format try { Main.process( inputRoot ); } catch( SemanticException e ) { int errorCnt = Util.errorCount(); Util.fatalError( errorCnt + " error(s) found"); } // Step 4: initialize any additional state variables model = cnfModel.init(); } // end constructor public boolean modelDebug( SATtest t, boolean saveInFile ) { boolean result = false; SATSolver s = new SATSolver(); try { if ( saveInFile ) { solverTest.createOutputFile( model, t ); result = s.solve( solverTest.input2SATSolver ); } else { // use in-memory file solverTest.createOutputBuffer( model, t ); result = s.solve( new LineNumberReader( new StringReader( solverTest.cnfFileString ) ) ); } } catch (Exception e) { Util.fatalError( "failed in debugging model " + e.getMessage() ); } return result == t.isSat; } }