// $Id: Datatype.java,v 1.5 2003/09/29 23:24:21 jderoo Exp $
// PxButton | build | javac -O *.java |

import java.util.*;
import org.apache.xerces.impl.dv.xs.*;

public class Datatype {
  static final String XSD = "<http://www.w3.org/2001/XMLSchema#";
  static final String XSDID = "<http://www.w3.org/2001/XMLSchema#ID>";
  static final String XSDIDREF = "<http://www.w3.org/2001/XMLSchema#IDREF>";
  static final String XSDNCName = "<http://www.w3.org/2001/XMLSchema#NCName>";
  static final String XSDNMTOKEN = "<http://www.w3.org/2001/XMLSchema#NMTOKEN>";
  static final String XSDName = "<http://www.w3.org/2001/XMLSchema#Name>";
  static final String XSDanyURI = "<http://www.w3.org/2001/XMLSchema#anyURI>";
  static final String XSDbase64Binary = "<http://www.w3.org/2001/XMLSchema#base64Binary>";
  static final String XSDboolean = "<http://www.w3.org/2001/XMLSchema#boolean>";
  static final String XSDbyte = "<http://www.w3.org/2001/XMLSchema#byte>";
  static final String XSDdate = "<http://www.w3.org/2001/XMLSchema#date>";
  static final String XSDdateTime = "<http://www.w3.org/2001/XMLSchema#dateTime>";
  static final String XSDdecimal = "<http://www.w3.org/2001/XMLSchema#decimal>";
  static final String XSDdouble = "<http://www.w3.org/2001/XMLSchema#double>";
  static final String XSDduration = "<http://www.w3.org/2001/XMLSchema#duration>";
  static final String XSDfloat = "<http://www.w3.org/2001/XMLSchema#float>";
  static final String XSDgDay = "<http://www.w3.org/2001/XMLSchema#gDay>";
  static final String XSDgMonth = "<http://www.w3.org/2001/XMLSchema#gMonth>";
  static final String XSDgMonthDay = "<http://www.w3.org/2001/XMLSchema#gMonthDay>";
  static final String XSDgYear = "<http://www.w3.org/2001/XMLSchema#gYear>";
  static final String XSDgYearMonth = "<http://www.w3.org/2001/XMLSchema#gYearMonth>";
  static final String XSDhexBinary = "<http://www.w3.org/2001/XMLSchema#hexBinary>";
  static final String XSDint = "<http://www.w3.org/2001/XMLSchema#int>";
  static final String XSDinteger = "<http://www.w3.org/2001/XMLSchema#integer>";
  static final String XSDlanguage = "<http://www.w3.org/2001/XMLSchema#language>";
  static final String XSDlong = "<http://www.w3.org/2001/XMLSchema#long>";
  static final String XSDnegativeInteger = "<http://www.w3.org/2001/XMLSchema#negativeInteger>";
  static final String XSDnonNegativeInteger = "<http://www.w3.org/2001/XMLSchema#nonNegativeInteger>";
  static final String XSDnonPositiveInteger = "<http://www.w3.org/2001/XMLSchema#nonPositiveInteger>";
  static final String XSDnormalizedString = "<http://www.w3.org/2001/XMLSchema#normalizedString>";
  static final String XSDpositiveInteger = "<http://www.w3.org/2001/XMLSchema#positiveInteger>";
  static final String XSDshort = "<http://www.w3.org/2001/XMLSchema#short>";
  static final String XSDstring = "<http://www.w3.org/2001/XMLSchema#string>";
  static final String XSDtime = "<http://www.w3.org/2001/XMLSchema#time>";
  static final String XSDtoken = "<http://www.w3.org/2001/XMLSchema#token>";
  static final String XSDunsignedByte = "<http://www.w3.org/2001/XMLSchema#unsignedByte>";
  static final String XSDunsignedInt = "<http://www.w3.org/2001/XMLSchema#unsignedInt>";
  static final String XSDunsignedLong = "<http://www.w3.org/2001/XMLSchema#unsignedLong>";
  static final String XSDunsignedShort = "<http://www.w3.org/2001/XMLSchema#unsignedShort>";

  static Hashtable num = null;

  static final boolean isNumeric(String dt) {
    if (num == null) {
      num = new Hashtable();
      num.put(XSDbyte, new Object());
      num.put(XSDdecimal, new Object());
      num.put(XSDdouble, new Object());
      num.put(XSDfloat, new Object());
      num.put(XSDint, new Object());
      num.put(XSDinteger, new Object());
      num.put(XSDlong, new Object());
      num.put(XSDnegativeInteger, new Object());
      num.put(XSDnonNegativeInteger, new Object());
      num.put(XSDnonPositiveInteger, new Object());
      num.put(XSDpositiveInteger, new Object());
      num.put(XSDshort, new Object());
      num.put(XSDunsignedByte, new Object());
      num.put(XSDunsignedInt, new Object());
      num.put(XSDunsignedLong, new Object());
      num.put(XSDunsignedShort, new Object());
    }
    return num.get(dt) != null;
  }

  static final int compare(String dt1, String s1, String dt2, String s2) {
    String dt = dt1;
    if (isNumeric(dt1) && isNumeric(dt2) && dt1 != dt2) dt = XSDdouble;
    try {
      if (dt == XSDID) {TypeValidator dv = new StringDV(); return dv.compare(dv.getActualValue(s1, null), dv.getActualValue(s2, null));}
      if (dt == XSDIDREF) {TypeValidator dv = new StringDV(); return dv.compare(dv.getActualValue(s1, null), dv.getActualValue(s2, null));}
      if (dt == XSDNCName) {TypeValidator dv = new StringDV(); return dv.compare(dv.getActualValue(s1, null), dv.getActualValue(s2, null));}
      if (dt == XSDNMTOKEN) {TypeValidator dv = new StringDV(); return dv.compare(dv.getActualValue(s1, null), dv.getActualValue(s2, null));}
      if (dt == XSDName) {TypeValidator dv = new StringDV(); return dv.compare(dv.getActualValue(s1, null), dv.getActualValue(s2, null));}
      if (dt == XSDanyURI) {TypeValidator dv = new AnyURIDV(); return dv.compare(dv.getActualValue(s1.trim(), null), dv.getActualValue(s2.trim(), null));}
      if (dt == XSDbase64Binary) {TypeValidator dv = new Base64BinaryDV(); return dv.compare(dv.getActualValue(s1.trim(), null), dv.getActualValue(s2.trim(), null));}
      if (dt == XSDboolean) {TypeValidator dv = new BooleanDV(); return dv.compare(dv.getActualValue(s1.trim(), null), dv.getActualValue(s2.trim(), null));}
      if (dt == XSDbyte) {TypeValidator dv = new DecimalDV(); return dv.compare(dv.getActualValue(s1.trim(), null), dv.getActualValue(s2.trim(), null));}
      if (dt == XSDdate) {TypeValidator dv = new DateDV(); return dv.compare(dv.getActualValue(s1.trim(), null), dv.getActualValue(s2.trim(), null));}
      if (dt == XSDdateTime) {TypeValidator dv = new DateTimeDV(); return dv.compare(dv.getActualValue(s1.trim(), null), dv.getActualValue(s2.trim(), null));}
      if (dt == XSDdecimal) {TypeValidator dv = new DecimalDV(); return dv.compare(dv.getActualValue(s1.trim(), null), dv.getActualValue(s2.trim(), null));}
      if (dt == XSDdouble) {TypeValidator dv = new DoubleDV(); return dv.compare(dv.getActualValue(s1.trim(), null), dv.getActualValue(s2.trim(), null));}
      if (dt == XSDduration) {TypeValidator dv = new DurationDV(); return dv.compare(dv.getActualValue(s1.trim(), null), dv.getActualValue(s2.trim(), null));}
      if (dt == XSDfloat) {TypeValidator dv = new FloatDV(); return dv.compare(dv.getActualValue(s1.trim(), null), dv.getActualValue(s2.trim(), null));}
      if (dt == XSDgDay) {TypeValidator dv = new DayDV(); return dv.compare(dv.getActualValue(s1.trim(), null), dv.getActualValue(s2.trim(), null));}
      if (dt == XSDgMonth) {TypeValidator dv = new MonthDV(); return dv.compare(dv.getActualValue(s1.trim(), null), dv.getActualValue(s2.trim(), null));}
      if (dt == XSDgMonthDay) {TypeValidator dv = new MonthDayDV(); return dv.compare(dv.getActualValue(s1.trim(), null), dv.getActualValue(s2.trim(), null));}
      if (dt == XSDgYear) {TypeValidator dv = new YearDV(); return dv.compare(dv.getActualValue(s1.trim(), null), dv.getActualValue(s2.trim(), null));}
      if (dt == XSDgYearMonth) {TypeValidator dv = new YearMonthDV(); return dv.compare(dv.getActualValue(s1.trim(), null), dv.getActualValue(s2.trim(), null));}
      if (dt == XSDhexBinary) {TypeValidator dv = new HexBinaryDV(); return dv.compare(dv.getActualValue(s1.trim(), null), dv.getActualValue(s2.trim(), null));}
      if (dt == XSDint) {TypeValidator dv = new DecimalDV(); return dv.compare(dv.getActualValue(s1.trim(), null), dv.getActualValue(s2.trim(), null));}
      if (dt == XSDinteger) {TypeValidator dv = new DecimalDV(); return dv.compare(dv.getActualValue(s1.trim(), null), dv.getActualValue(s2.trim(), null));}
      if (dt == XSDlanguage) {TypeValidator dv = new StringDV(); return dv.compare(dv.getActualValue(s1, null), dv.getActualValue(s2, null));}
      if (dt == XSDlong) {TypeValidator dv = new DecimalDV(); return dv.compare(dv.getActualValue(s1.trim(), null), dv.getActualValue(s2.trim(), null));}
      if (dt == XSDnegativeInteger) {TypeValidator dv = new DecimalDV(); return dv.compare(dv.getActualValue(s1.trim(), null), dv.getActualValue(s2.trim(), null));}
      if (dt == XSDnonNegativeInteger) {TypeValidator dv = new DecimalDV(); return dv.compare(dv.getActualValue(s1.trim(), null), dv.getActualValue(s2.trim(), null));}
      if (dt == XSDnonPositiveInteger) {TypeValidator dv = new DecimalDV(); return dv.compare(dv.getActualValue(s1.trim(), null), dv.getActualValue(s2.trim(), null));}
      if (dt == XSDnormalizedString) {TypeValidator dv = new StringDV(); return dv.compare(dv.getActualValue(s1, null), dv.getActualValue(s2, null));}
      if (dt == XSDpositiveInteger) {TypeValidator dv = new DecimalDV(); return dv.compare(dv.getActualValue(s1.trim(), null), dv.getActualValue(s2.trim(), null));}
      if (dt == XSDshort) {TypeValidator dv = new DecimalDV(); return dv.compare(dv.getActualValue(s1.trim(), null), dv.getActualValue(s2.trim(), null));}
      if (dt == XSDstring) {TypeValidator dv = new StringDV(); return dv.compare(dv.getActualValue(s1, null), dv.getActualValue(s2, null));}
      if (dt == XSDtime) {TypeValidator dv = new TimeDV(); return dv.compare(dv.getActualValue(s1.trim(), null), dv.getActualValue(s2.trim(), null));}
      if (dt == XSDtoken) {TypeValidator dv = new StringDV(); return dv.compare(dv.getActualValue(s1, null), dv.getActualValue(s2, null));}
      if (dt == XSDunsignedByte) {TypeValidator dv = new DecimalDV(); return dv.compare(dv.getActualValue(s1.trim(), null), dv.getActualValue(s2.trim(), null));}
      if (dt == XSDunsignedInt) {TypeValidator dv = new DecimalDV(); return dv.compare(dv.getActualValue(s1.trim(), null), dv.getActualValue(s2.trim(), null));}
      if (dt == XSDunsignedLong) {TypeValidator dv = new DecimalDV(); return dv.compare(dv.getActualValue(s1.trim(), null), dv.getActualValue(s2.trim(), null));}
      if (dt == XSDunsignedShort) {TypeValidator dv = new DecimalDV(); return dv.compare(dv.getActualValue(s1.trim(), null), dv.getActualValue(s2.trim(), null));}
      return s1.compareTo(s2);
    }
    catch (Exception e) {
      if (Euler.debug || Euler.trace) System.err.println("** " + e);
      return s1.compareTo(s2);
    }
  }
}
