import java.io.*; import java.util.*; public class KeyGenerator implements Serializable { protected PrintWriter file; Database theSchema; CodeGenerator theGenerator; public KeyGenerator(CodeGenerator generator) { theGenerator = generator; theSchema = theGenerator.getTheSchema(); } protected void OpenFile(String filename) { try { file = new PrintWriter( new FileWriter(filename) ); theGenerator.RegisterFile(filename); } catch(IOException e) { System.err.println("GENJAVA-F-BADOUTPUT: " + filename + " - " + e.getMessage()); System.exit(-1); } } public void Generate() { String filename = new String(); filename = new String(Genjava.directory); filename += Genjava.filesep; filename += "Key.java"; OpenFile( filename ); file.println("import java.text.DecimalFormat;"); file.println("import java.io.*;"); file.println("import java.util.*;"); file.println(); file.println("public class Key implements Serializable"); file.println("{"); file.println(); file.println(" protected int value = 0;"); if( Genjava.cli_keysize == 12 ) { file.println(" public static final int size = 12;"); file.println(" public static final int versize = 3;"); file.println(" public static final int abbsize = 4;"); file.println(" public static final int rowsize = 5;"); } else { file.println(" public static final int size = 8;"); file.println(" public static final int versize = 2;"); file.println(" public static final int abbsize = 2;"); file.println(" public static final int rowsize = 4;"); } file.println(" protected final int abbmask = 0x000000FF;"); file.println(" protected final int abbshift = 24;"); file.println(" protected final int vermask = 0x000000FF;"); file.println(" protected final int vershift = 16;"); file.println(" protected final int rowmask = 0x0000FFFF;"); file.println(" protected final int rowshift = 0;"); file.println(" protected Database TheSchema;"); file.println(" protected boolean Constructed;"); file.println(); file.println(" public Key(String strval, Database mySchema)"); file.println(" {"); file.println(" String buffer;"); file.println(" int tmpint;"); file.println(); file.println(" Constructed = false;"); file.println(); file.println(" do {"); file.println(" setTheSchema(mySchema);"); file.println(); file.println(" buffer = strval.substring( 0, Key.abbsize );"); file.println(" if(!setAbb(buffer))"); file.println(" break;"); file.println(); file.println(" buffer = strval.substring( Key.abbsize, "); file.println(" Key.abbsize + Key.versize );"); file.println(" tmpint = Integer.parseInt(buffer);"); file.println(" if(!setVersion(tmpint))"); file.println(" break;"); file.println(); file.println(" buffer = strval.substring( Key.abbsize + Key.versize, "); file.println(" Key.size);"); file.println(" tmpint = Integer.parseInt(buffer);"); file.println(" if(!setRow(tmpint))"); file.println(" break;"); file.println(); file.println(" Constructed = true;"); file.println(" } while(false);"); file.println(" }"); file.println(); file.println(" /**"); file.println(" * Returns true if this key was able to be built successfully."); file.println(" * The usual cause for failure is if the table abbreviation found is invalid."); file.println(" */"); file.println(" public boolean Valid()"); file.println(" {"); file.println(" return Constructed;"); file.println(" }"); file.println(); file.println(" /**"); file.println(" * Returns the integer encoding for the key"); file.println(" */"); file.println(" public int getValue()"); file.println(" {"); file.println(" return value;"); file.println(" }"); file.println(); file.println(" /**"); file.println(" * Returns > 0 if the integer key value is greater than that of otherkey,"); file.println(" * Returns < 0 if the integer key value is less than that of otherkey,"); file.println(" * Returns 0 if the integer key value is equal to that of otherkey,"); file.println(" */"); file.println(" public int compare( Key otherkey )"); file.println(" {"); file.println(" return ( value - otherkey.getValue() );"); file.println(" }"); file.println(); file.println(" /**"); file.println(" * Sets the version bytes of the key from its argument"); file.println(" */"); file.println(" public boolean setVersion(int r)"); file.println(" {"); file.println(" value &= ~(vermask << vershift); // Clear field"); file.println(" value |= (r & vermask) << vershift;"); file.println(" return true;"); file.println(" }"); file.println(); file.println(" /**"); file.println(" * Retrieves the version bytes of the key"); file.println(" */"); file.println(" public int getVersion()"); file.println(" {"); file.println(" return (value >> vershift) & vermask;"); file.println(" }"); file.println(); file.println(" /**"); file.println(" * Sets the row number of the key from its argument"); file.println(" */"); file.println(" public boolean setRow(int r)"); file.println(" {"); file.println(" value &= ~(rowmask << rowshift);"); file.println(" value |= (r & rowmask) << rowshift;"); file.println(" return true;"); file.println(" }"); file.println(); file.println(" /**"); file.println(" * Retrieves the row number from the key"); file.println(" */"); file.println(" public int getRow()"); file.println(" {"); file.println(" return (value >> rowshift) & rowmask;"); file.println(" }"); file.println(); file.println(" /**"); file.println(" * Sets the table abbreviation portion of the key"); file.println(" */"); file.println(" public boolean setAbb(String ab)"); file.println(" {"); file.println(" int i;"); file.println(" i = TheSchema.FindTblIdx(ab);"); file.println(); file.println(" if( i < 0 )"); file.println(" return false;"); file.println(); file.println(" value &= ~(abbmask << abbshift);"); file.println(" value |= (i & abbmask) << abbshift;"); file.println(" return true;"); file.println(" }"); file.println(); file.println(" /**"); file.println(" * Retrieves the table abbreviation portion of the key"); file.println(" */"); file.println(" public String getAbb()"); file.println(" {"); file.println(" int i = (value >> abbshift) & abbmask;"); file.println(); file.println(" return TheSchema.FindTblAbbr(i);"); file.println(" }"); file.println(); file.println(" /**"); file.println(" * Retrieves a reference to the global schema"); file.println(" */"); file.println(" public Database getTheSchema()"); file.println(" {"); file.println(" return TheSchema;"); file.println(" }"); file.println(); file.println(" /**"); file.println(" * Modifies this object's reference to the global schema"); file.println(" */"); file.println(" public void setTheSchema(Database value)"); file.println(" {"); file.println(" TheSchema = value;"); file.println(" }"); file.println(); file.println(" public String toString()"); file.println(" {"); file.println(" String retval;"); if( Genjava.cli_keysize == 12 ) { file.println(" DecimalFormat threeDigits = new DecimalFormat( \"000\" );"); file.println(" DecimalFormat fiveDigits = new DecimalFormat( \"00000\" );"); file.println(); file.println(" retval = getAbb();"); file.println(" retval += twoDigits.format(getVersion());"); file.println(" retval += fourDigits.format(getRow());"); } else { file.println(" DecimalFormat twoDigits = new DecimalFormat( \"00\" );"); file.println(" DecimalFormat fourDigits = new DecimalFormat( \"0000\" );"); file.println(); file.println(" retval = getAbb();"); file.println(" retval += twoDigits.format(getVersion());"); file.println(" retval += fourDigits.format(getRow());"); } file.println(" return retval;"); file.println(" }"); file.println("}"); file.close(); } }