📄 xdatatype.java
字号:
// Copyright (c) 2006 Per M.A. Bothner.// This is free software; for specifics see ../../../COPYING.package gnu.kawa.xml;import gnu.bytecode.*;import gnu.mapping.Procedure;import gnu.mapping.Values;import gnu.expr.*;import gnu.text.Printable;import gnu.math.*;import java.math.BigDecimal;import gnu.lists.SeqPosition;import gnu.lists.Consumer;import gnu.xml.TextUtils;import gnu.text.URIPath;/** An atomic type as used in XML Schema and related languages. * For example the {code xs:decimal} type is {@code XDataType.decimalType}. */public class XDataType extends Type implements TypeValue{ Type implementationType; Object name; /** The "parent" type. */ XDataType baseType; /** One of the {@code XXXX_TYPE_CODE} constants. */ int typeCode; public static final int ANY_ATOMIC_TYPE_CODE = 1; public static final int DECIMAL_TYPE_CODE = 2; public static final int INTEGER_TYPE_CODE = 3; public static final int NON_POSITIVE_INTEGER_TYPE_CODE = 4; public static final int NEGATIVE_INTEGER_TYPE_CODE = 5; public static final int LONG_TYPE_CODE = 6; public static final int INT_TYPE_CODE = 7; public static final int SHORT_TYPE_CODE = 8; public static final int BYTE_TYPE_CODE = 9; public static final int NONNEGATIVE_INTEGER_TYPE_CODE = 10; public static final int UNSIGNED_LONG_TYPE_CODE = 11; public static final int UNSIGNED_INT_TYPE_CODE = 12; public static final int UNSIGNED_SHORT_TYPE_CODE = 13; public static final int UNSIGNED_BYTE_TYPE_CODE = 14; public static final int POSITIVE_INTEGER_TYPE_CODE = 15; public static final int FLOAT_TYPE_CODE = 16; public static final int DOUBLE_TYPE_CODE = 17; public static final int DATE_TIME_TYPE_CODE = 18; public static final int DATE_TYPE_CODE = 19; public static final int TIME_TYPE_CODE = 20; public static final int G_YEAR_MONTH_TYPE_CODE = 21; public static final int G_YEAR_TYPE_CODE = 22; public static final int G_MONTH_DAY_TYPE_CODE = 23; public static final int G_DAY_TYPE_CODE = 24; public static final int G_MONTH_TYPE_CODE = 25; public static final int DURATION_TYPE_CODE = 26; public static final int YEAR_MONTH_DURATION_TYPE_CODE = 27; public static final int DAY_TIME_DURATION_TYPE_CODE = 28; public static final int BOOLEAN_TYPE_CODE = 29; public static final int QNAME_TYPE_CODE = 30; public static final int ANY_URI_TYPE_CODE = 31; public static final int BASE64_BINARY_TYPE_CODE = 32; public static final int HEX_BINARY_TYPE_CODE = 33; public static final int NOTATION_TYPE_CODE = 34; public static final int UNTYPED_ATOMIC_TYPE_CODE = 35; public static final int STRING_TYPE_CODE = 36; public static final int NORMALIZED_STRING_TYPE_CODE = 37; public static final int TOKEN_TYPE_CODE = 38; public static final int LANGUAGE_TYPE_CODE = 39; public static final int NMTOKEN_TYPE_CODE = 40; public static final int NAME_TYPE_CODE = 41; public static final int NCNAME_TYPE_CODE = 42; public static final int ID_TYPE_CODE = 43; public static final int IDREF_TYPE_CODE = 44; public static final int ENTITY_TYPE_CODE = 45; public XDataType (Object name, Type implementationType, int typeCode) { super(implementationType); this.name = name; if (name != null) setName(name.toString()); this.implementationType = implementationType; this.typeCode = typeCode; } public static final XDataType anyAtomicType = new XDataType("anyAtomicType", Type.pointer_type, ANY_ATOMIC_TYPE_CODE); public static final XDataType stringType = new XDataType("string", /* #ifdef use:java.lang.CharSequence */ ClassType.make("java.lang.CharSequence"), /* #else */ // ClassType.make("java.lang.String"), /* #endif */ STRING_TYPE_CODE); /** A value implemented as java.lang.String. * Can be cast from CharSequence. */ public static final XDataType stringStringType = new XDataType("String", ClassType.make("java.lang.String"), STRING_TYPE_CODE); public static final XDataType untypedAtomicType = new XDataType("string", ClassType.make("gnu.kawa.xml.UntypedAtomic"), UNTYPED_ATOMIC_TYPE_CODE); public static final XDataType base64BinaryType = new XDataType("base64Binary", ClassType.make("gnu.kawa.xml.Base64Binary"), BASE64_BINARY_TYPE_CODE); public static final XDataType hexBinaryType = new XDataType("hexBinary", ClassType.make("gnu.kawa.xml.HexBinary"), HEX_BINARY_TYPE_CODE); public static final XDataType booleanType = new XDataType("boolean", Type.boolean_type, BOOLEAN_TYPE_CODE); public static final XDataType anyURIType = new XDataType("anyURI", ClassType.make("gnu.text.Path"), ANY_URI_TYPE_CODE); public static final XDataType NotationType = new XDataType("NOTATION", ClassType.make("gnu.kawa.xml.Notation"), NOTATION_TYPE_CODE); public static final XDataType decimalType = // A decimal value is implemented using java.math.BigDecimal. // However, the integer sub-type is implemented using gnu.math.IntNum. // So we use their common supertype as the implementationType. new XDataType("decimal", ClassType.make("java.lang.Number"), DECIMAL_TYPE_CODE); public static final XDataType floatType = new XDataType("float", ClassType.make("java.lang.Float"), FLOAT_TYPE_CODE); public static final XDataType doubleType = new XDataType("double", ClassType.make("java.lang.Double"), DOUBLE_TYPE_CODE); public static final XDataType durationType = new XDataType("duration", ClassType.make("gnu.math.Duration"), DURATION_TYPE_CODE); public static final XDataType yearMonthDurationType = new XDataType("yearMonthDuration", ClassType.make("gnu.math.Duration"), YEAR_MONTH_DURATION_TYPE_CODE); public static final XDataType dayTimeDurationType = new XDataType("dayTimeDuration", ClassType.make("gnu.math.Duration"), DAY_TIME_DURATION_TYPE_CODE); public java.lang.Class getReflectClass() { return implementationType.getReflectClass(); } public Type getImplementationType() { return implementationType; } public void emitCoerceFromObject (CodeAttr code) { Compilation comp = Compilation.getCurrent(); comp.compileConstant(this, Target.pushObject); Method meth = ClassType.make("gnu.kawa.xml.XDataType") .getDeclaredMethod("coerceFromObject", 1); code.emitSwap(); code.emitInvokeVirtual(meth); // Needed to avoid VerifyErrors. implementationType.emitCoerceFromObject(code); } public void emitCoerceToObject (CodeAttr code) { if (typeCode == BOOLEAN_TYPE_CODE) implementationType.emitCoerceToObject(code); else super.emitCoerceToObject(code); } public void emitTestIf(Variable incoming, Declaration decl, Compilation comp) { CodeAttr code = comp.getCode(); if (typeCode == BOOLEAN_TYPE_CODE) { if (incoming != null) code.emitLoad(incoming); Type.boolean_ctype.emitIsInstance(code); code.emitIfIntNotZero(); if (decl != null) { // Error if incoming is null. code.emitLoad(incoming); Type.boolean_type.emitCoerceFromObject(code); decl.compileStore(comp); } return; } comp.compileConstant(this, Target.pushObject); if (incoming == null) code.emitSwap(); else code.emitLoad(incoming); if (decl != null) { code.emitDup(); decl.compileStore(comp); } code.emitInvokeVirtual(Compilation.typeType .getDeclaredMethod("isInstance", 1)); code.emitIfIntNotZero(); } public boolean isInstance (Object obj) { switch (typeCode) { case ANY_ATOMIC_TYPE_CODE: return ! (obj instanceof Values || obj instanceof SeqPosition); case STRING_TYPE_CODE: /* #ifdef use:java.lang.CharSequence */ return obj instanceof java.lang.CharSequence; /* #else */ // return obj instanceof java.lang.String; /* #endif */ case UNTYPED_ATOMIC_TYPE_CODE: return obj instanceof gnu.kawa.xml.UntypedAtomic; case ANY_URI_TYPE_CODE: return obj instanceof gnu.text.Path; case BOOLEAN_TYPE_CODE: return obj instanceof java.lang.Boolean; case FLOAT_TYPE_CODE: return obj instanceof java.lang.Float; case DOUBLE_TYPE_CODE: return obj instanceof java.lang.Double; case DECIMAL_TYPE_CODE: return obj instanceof java.math.BigDecimal || obj instanceof gnu.math.IntNum; case DURATION_TYPE_CODE: return obj instanceof Duration; case YEAR_MONTH_DURATION_TYPE_CODE: return obj instanceof Duration && ((Duration) obj).unit() == Unit.month; case DAY_TIME_DURATION_TYPE_CODE: return obj instanceof Duration && ((Duration) obj).unit() == Unit.second; default:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -