Towards 0.2 --
[cql-java-moved-to-github.git] / src / org / z3950 / zing / cql / CQLGenerator.java
index 67e70d1..c0f05ce 100644 (file)
@@ -1,4 +1,4 @@
-// $Id: CQLGenerator.java,v 1.2 2002-10-30 11:13:18 mike Exp $
+// $Id: CQLGenerator.java,v 1.4 2002-11-06 00:05:58 mike Exp $
 
 package org.z3950.zing.cql;
 import java.util.Properties;
@@ -22,7 +22,7 @@ import java.io.FileNotFoundException;
  * this distribution - there is a <TT>generate_<I>x</I>()</TT> method
  * for each grammar element <I>X</I>.
  *
- * @version    $Id: CQLGenerator.java,v 1.2 2002-10-30 11:13:18 mike Exp $
+ * @version    $Id: CQLGenerator.java,v 1.4 2002-11-06 00:05:58 mike Exp $
  * @see                <A href="http://zing.z3950.org/cql/index.html"
  *                     >http://zing.z3950.org/cql/index.html</A>
  */
@@ -125,11 +125,11 @@ public class CQLGenerator {
      * method, or decompiled into CQL using its <TT>toCQL</TT>
      * method.
      */
-    public CQLNode generate() throws ParameterMissingException {
+    public CQLNode generate() throws MissingParameterException {
        return generate_cql_query();
     }
 
-    private CQLNode generate_cql_query() throws ParameterMissingException {
+    private CQLNode generate_cql_query() throws MissingParameterException {
        if (!maybe("complexQuery")) {
            return generate_search_clause();
        }
@@ -149,7 +149,7 @@ public class CQLGenerator {
        return generate_search_clause();
     }
 
-    private CQLNode generate_search_clause() throws ParameterMissingException {
+    private CQLNode generate_search_clause() throws MissingParameterException {
        if (maybe("complexClause")) {
            return generate_cql_query();
        }
@@ -183,14 +183,14 @@ public class CQLGenerator {
        return qualifier;
     }
 
-    private CQLRelation generate_relation() throws ParameterMissingException {
+    private CQLRelation generate_relation() throws MissingParameterException {
        String base = generate_base_relation();
        CQLRelation rel = new CQLRelation(base);
        // ### should generate modifiers too
        return rel;
     }
 
-    private String generate_base_relation() throws ParameterMissingException {
+    private String generate_base_relation() throws MissingParameterException {
        if (maybe("equalsRelation")) {
            return "=";
        } else if (maybe("numericRelation")) {
@@ -242,10 +242,10 @@ public class CQLGenerator {
        return "";              // shut up compiler warning
     }
 
-    boolean maybe(String param) throws ParameterMissingException {
+    boolean maybe(String param) throws MissingParameterException {
        String probability = params.getProperty(param);
        if (probability == null)
-           throw new ParameterMissingException(param);
+           throw new MissingParameterException(param);
 
        double dice = rnd.nextDouble();
        double threshhold = new Double(probability).doubleValue();
@@ -260,13 +260,14 @@ public class CQLGenerator {
      * A simple test-harness for the generator.
      * <P>
      * It generates a single random query using the parameters
-     * specified in a nominated properties file, and decompiles it
-     * into CQL which is written to standard output.
+     * specified in a nominated properties file, plus any additional
+     * <I>name value</I> pairs provided on the command-line, and
+     * decompiles it into CQL which is written to standard output.
      * <P>
      * For example,
-     * <TT>java org.z3950.zing.cql.CQLGenerator etc/generate.properties</TT>
+     * <TT>java org.z3950.zing.cql.CQLGenerator
+     * etc/generate.properties seed 18398</TT>,
      * where the file <TT>generate.properties</TT> contains:<PRE>
-     * seed=18398
      * complexQuery=0.4
      * complexClause=0.4
      * equalsRelation=0.5
@@ -281,25 +282,32 @@ public class CQLGenerator {
      * @param configFile
      * The name of a properties file from which to read the
      * configuration parameters (see above).
+     * @param name
+     * The name of a configuration parameter.
+     * @param value
+     * The value to assign to the configuration parameter named in
+     * the immediately preceding command-line argument.
      * @return
      * A CQL query expressed in a form that should be comprehensible
      * to all conformant CQL compilers.
      */
     public static void main (String[] args) throws Exception {
-       if (args.length != 1) {
-           System.err.println("Usage: CQLGenerator <props-file>");
+       if (args.length % 2 != 1) {
+           System.err.println("Usage: CQLGenerator <props-file> "+
+                              "[<name> <value>]...");
            System.exit(1);
        }
 
        String configFile = args[0];
        InputStream f = new FileInputStream(configFile);
        if (f == null)
-           throw new FileNotFoundException("getResourceAsStream(" +
-                                           configFile + ")");
+           throw new FileNotFoundException(configFile);
 
        Properties params = new Properties();
        params.load(f);
        f.close();
+       for (int i = 1; i < args.length; i += 2)
+           params.setProperty(args[i], args[i+1]);
 
        CQLGenerator generator = new CQLGenerator(params);
        CQLNode tree = generator.generate();