// this extension looks to see if the model file of guidsl is
// in a model directory (test: pathname is model/model.m)
// if so, we examine all subdirectories (layers) of the model
// directory. Any TOKEN that has a matching corresponding layer
// name "Token".toUpperCase(), this is the name that is output
// when generating an equations file. Further if there is a
// layer/help.html file, then this is assigned to the helphtml
// attribute of the corresponding variable.
import java.io.*;
import javax.swing.*;
import Jakarta.util.*;
import java.util.*;
class Main {
static char buffer[] = new char[1000];
static public void process( Model m ) throws SemanticException {
original(m);
if (modelMode) {
try { harvestInfo(); }
catch (IOException e) {
JOptionPane.showMessageDialog(null,
"Model Harvesting Error -- see command line for details",
"Error!", JOptionPane.ERROR_MESSAGE);
System.err.println(e.getMessage());
}
}
}
File root = null;
File par = null;
final static String modelExtension = ".m";
final static String helpfile = "help.html";
final static String featureExpl = "feature.expl";
static void harvestInfo() throws IOException {
// Step 1: get par directory
File root = new File(".");
File par = new File( root.getAbsolutePath() ).getParentFile();
// Step 2: create file filter that retrieves
// only the subdirectories in this directory
FileFilter ff = new FileFilter() {
public boolean accept(File pathname) {
return pathname.isDirectory();
}
};
// Step 3: read all the subdirectories (layers) in this model
File[] list = par.listFiles(ff);
for (int i=0; i<list.length; i++) {
String layerName = list[i].getName();
variable v = variable.find( layerName );
if (v != null) {
if (v.type != variable.Prim && Main.debug)
Util.error("feature " + v.name + " is not a primitive in this directory");
String hname = layerName + File.separator + helpfile;
File html = new File( hname );
if (html.isFile())
v.helpfile = hname;
File help = new File( layerName + File.separator + featureExpl );
if (help.isFile()) {
// this is a hack -- feature files are at most 1000 chars long
FileReader fr = new FileReader( help );
fr.read( buffer );
v.help = new String(buffer);
}
}
}
// Step 4: make sure that all terminals in the grammar are actually layers
if (!Main.debug) return;
Iterator i = variable.Vtable.values().iterator();
while (i.hasNext()) {
variable v = (variable) i.next();
if (v.type != variable.Prim) continue;
File testname = new File( v.name );
if (!testname.isDirectory())
Util.error( v.name + " is a grammar primitive but not implemented ");
}
}
}