/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements.  See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License.  You may obtain a copy of the License at
*
*     http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.vxquery.types;

import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.Map;

import javax.xml.namespace.QName;

public final class BuiltinTypeRegistry {
    public static final BuiltinAtomicType XS_ANY_ATOMIC = new BuiltinAtomicType(
            BuiltinTypeConstants.XS_ANY_ATOMIC_TYPE_ID, AnySimpleType.INSTANCE, DerivationProcess.RESTRICTION);

    public static final BuiltinAtomicType XS_STRING = new BuiltinAtomicType(BuiltinTypeConstants.XS_STRING_TYPE_ID,
            XS_ANY_ATOMIC, DerivationProcess.RESTRICTION);

    public static final BuiltinAtomicType XS_NORMALIZED_STRING = new BuiltinAtomicType(
            BuiltinTypeConstants.XS_NORMALIZED_STRING_TYPE_ID, XS_STRING, DerivationProcess.RESTRICTION);

    public static final BuiltinAtomicType XS_TOKEN = new BuiltinAtomicType(BuiltinTypeConstants.XS_TOKEN_TYPE_ID,
            XS_NORMALIZED_STRING, DerivationProcess.RESTRICTION);

    public static final BuiltinAtomicType XS_LANGUAGE = new BuiltinAtomicType(BuiltinTypeConstants.XS_LANGUAGE_TYPE_ID,
            XS_TOKEN, DerivationProcess.RESTRICTION);

    public static final BuiltinAtomicType XS_NMTOKEN = new BuiltinAtomicType(BuiltinTypeConstants.XS_NMTOKEN_TYPE_ID,
            XS_TOKEN, DerivationProcess.RESTRICTION);

    public static final BuiltinAtomicType XS_NAME = new BuiltinAtomicType(BuiltinTypeConstants.XS_NAME_TYPE_ID,
            XS_TOKEN, DerivationProcess.RESTRICTION);

    public static final BuiltinAtomicType XS_NCNAME = new BuiltinAtomicType(BuiltinTypeConstants.XS_NCNAME_TYPE_ID,
            XS_NAME, DerivationProcess.RESTRICTION);

    public static final BuiltinAtomicType XS_ID = new BuiltinAtomicType(BuiltinTypeConstants.XS_ID_TYPE_ID, XS_NCNAME,
            DerivationProcess.RESTRICTION);

    public static final BuiltinAtomicType XS_IDREF = new BuiltinAtomicType(BuiltinTypeConstants.XS_IDREF_TYPE_ID,
            XS_NCNAME, DerivationProcess.RESTRICTION);

    public static final BuiltinAtomicType XS_ENTITY = new BuiltinAtomicType(BuiltinTypeConstants.XS_ENTITY_TYPE_ID,
            XS_NCNAME, DerivationProcess.RESTRICTION);

    public static final BuiltinAtomicType XS_UNTYPED_ATOMIC = new BuiltinAtomicType(
            BuiltinTypeConstants.XS_UNTYPED_ATOMIC_TYPE_ID, XS_ANY_ATOMIC, DerivationProcess.RESTRICTION);

    public static final BuiltinAtomicType XS_DATETIME = new BuiltinAtomicType(BuiltinTypeConstants.XS_DATETIME_TYPE_ID,
            XS_ANY_ATOMIC, DerivationProcess.RESTRICTION);

    public static final BuiltinAtomicType XS_DATE = new BuiltinAtomicType(BuiltinTypeConstants.XS_DATE_TYPE_ID,
            XS_ANY_ATOMIC, DerivationProcess.RESTRICTION);

    public static final BuiltinAtomicType XS_TIME = new BuiltinAtomicType(BuiltinTypeConstants.XS_TIME_TYPE_ID,
            XS_ANY_ATOMIC, DerivationProcess.RESTRICTION);

    public static final BuiltinAtomicType XS_DURATION = new BuiltinAtomicType(BuiltinTypeConstants.XS_DURATION_TYPE_ID,
            XS_ANY_ATOMIC, DerivationProcess.RESTRICTION);

    public static final BuiltinAtomicType XS_YEAR_MONTH_DURATION = new BuiltinAtomicType(
            BuiltinTypeConstants.XS_YEAR_MONTH_DURATION_TYPE_ID, XS_DURATION, DerivationProcess.RESTRICTION);

    public static final BuiltinAtomicType XS_DAY_TIME_DURATION = new BuiltinAtomicType(
            BuiltinTypeConstants.XS_DAY_TIME_DURATION_TYPE_ID, XS_DURATION, DerivationProcess.RESTRICTION);

    public static final BuiltinAtomicType XSEXT_NUMERIC = new BuiltinAtomicType(
            BuiltinTypeConstants.XSEXT_NUMERIC_TYPE_ID, XS_ANY_ATOMIC, DerivationProcess.RESTRICTION);

    public static final BuiltinAtomicType XS_FLOAT = new BuiltinAtomicType(BuiltinTypeConstants.XS_FLOAT_TYPE_ID,
            XSEXT_NUMERIC, DerivationProcess.RESTRICTION);

    public static final BuiltinAtomicType XS_DOUBLE = new BuiltinAtomicType(BuiltinTypeConstants.XS_DOUBLE_TYPE_ID,
            XSEXT_NUMERIC, DerivationProcess.RESTRICTION);

    public static final BuiltinAtomicType XS_DECIMAL = new BuiltinAtomicType(BuiltinTypeConstants.XS_DECIMAL_TYPE_ID,
            XSEXT_NUMERIC, DerivationProcess.RESTRICTION);

    public static final BuiltinAtomicType XS_INTEGER = new BuiltinAtomicType(BuiltinTypeConstants.XS_INTEGER_TYPE_ID,
            XS_DECIMAL, DerivationProcess.RESTRICTION);

    public static final BuiltinAtomicType XS_NON_POSITIVE_INTEGER = new BuiltinAtomicType(
            BuiltinTypeConstants.XS_NON_POSITIVE_INTEGER_TYPE_ID, XS_INTEGER, DerivationProcess.RESTRICTION);

    public static final BuiltinAtomicType XS_NEGATIVE_INTEGER = new BuiltinAtomicType(
            BuiltinTypeConstants.XS_NEGATIVE_INTEGER_TYPE_ID, XS_NON_POSITIVE_INTEGER, DerivationProcess.RESTRICTION);

    public static final BuiltinAtomicType XS_LONG = new BuiltinAtomicType(BuiltinTypeConstants.XS_LONG_TYPE_ID,
            XS_INTEGER, DerivationProcess.RESTRICTION);

    public static final BuiltinAtomicType XS_INT = new BuiltinAtomicType(BuiltinTypeConstants.XS_INT_TYPE_ID, XS_LONG,
            DerivationProcess.RESTRICTION);

    public static final BuiltinAtomicType XS_SHORT = new BuiltinAtomicType(BuiltinTypeConstants.XS_SHORT_TYPE_ID,
            XS_INT, DerivationProcess.RESTRICTION);

    public static final BuiltinAtomicType XS_BYTE = new BuiltinAtomicType(BuiltinTypeConstants.XS_BYTE_TYPE_ID,
            XS_SHORT, DerivationProcess.RESTRICTION);

    public static final BuiltinAtomicType XS_NON_NEGATIVE_INTEGER = new BuiltinAtomicType(
            BuiltinTypeConstants.XS_NON_NEGATIVE_INTEGER_TYPE_ID, XS_INTEGER, DerivationProcess.RESTRICTION);

    public static final BuiltinAtomicType XS_UNSIGNED_LONG = new BuiltinAtomicType(
            BuiltinTypeConstants.XS_UNSIGNED_LONG_TYPE_ID, XS_NON_NEGATIVE_INTEGER, DerivationProcess.RESTRICTION);

    public static final BuiltinAtomicType XS_UNSIGNED_INT = new BuiltinAtomicType(
            BuiltinTypeConstants.XS_UNSIGNED_INT_TYPE_ID, XS_UNSIGNED_LONG, DerivationProcess.RESTRICTION);

    public static final BuiltinAtomicType XS_UNSIGNED_SHORT = new BuiltinAtomicType(
            BuiltinTypeConstants.XS_UNSIGNED_SHORT_TYPE_ID, XS_UNSIGNED_INT, DerivationProcess.RESTRICTION);

    public static final BuiltinAtomicType XS_UNSIGNED_BYTE = new BuiltinAtomicType(
            BuiltinTypeConstants.XS_UNSIGNED_BYTE_TYPE_ID, XS_UNSIGNED_SHORT, DerivationProcess.RESTRICTION);

    public static final BuiltinAtomicType XS_POSITIVE_INTEGER = new BuiltinAtomicType(
            BuiltinTypeConstants.XS_POSITIVE_INTEGER_TYPE_ID, XS_NON_NEGATIVE_INTEGER, DerivationProcess.RESTRICTION);

    public static final BuiltinAtomicType XS_G_YEAR_MONTH = new BuiltinAtomicType(
            BuiltinTypeConstants.XS_G_YEAR_MONTH_TYPE_ID, XS_ANY_ATOMIC, DerivationProcess.RESTRICTION);

    public static final BuiltinAtomicType XS_G_YEAR = new BuiltinAtomicType(BuiltinTypeConstants.XS_G_YEAR_TYPE_ID,
            XS_ANY_ATOMIC, DerivationProcess.RESTRICTION);

    public static final BuiltinAtomicType XS_G_MONTH_DAY = new BuiltinAtomicType(
            BuiltinTypeConstants.XS_G_MONTH_DAY_TYPE_ID, XS_ANY_ATOMIC, DerivationProcess.RESTRICTION);

    public static final BuiltinAtomicType XS_G_DAY = new BuiltinAtomicType(BuiltinTypeConstants.XS_G_DAY_TYPE_ID,
            XS_ANY_ATOMIC, DerivationProcess.RESTRICTION);

    public static final BuiltinAtomicType XS_G_MONTH = new BuiltinAtomicType(BuiltinTypeConstants.XS_G_MONTH_TYPE_ID,
            XS_ANY_ATOMIC, DerivationProcess.RESTRICTION);

    public static final BuiltinAtomicType XS_BOOLEAN = new BuiltinAtomicType(BuiltinTypeConstants.XS_BOOLEAN_TYPE_ID,
            XS_ANY_ATOMIC, DerivationProcess.RESTRICTION);

    public static final BuiltinAtomicType XS_BASE64_BINARY = new BuiltinAtomicType(
            BuiltinTypeConstants.XS_BASE64_BINARY_TYPE_ID, XS_ANY_ATOMIC, DerivationProcess.RESTRICTION);

    public static final BuiltinAtomicType XS_HEX_BINARY = new BuiltinAtomicType(
            BuiltinTypeConstants.XS_HEX_BINARY_TYPE_ID, XS_ANY_ATOMIC, DerivationProcess.RESTRICTION);

    public static final BuiltinAtomicType XS_ANY_URI = new BuiltinAtomicType(BuiltinTypeConstants.XS_ANY_URI_TYPE_ID,
            XS_ANY_ATOMIC, DerivationProcess.RESTRICTION);

    public static final BuiltinAtomicType XS_QNAME = new BuiltinAtomicType(BuiltinTypeConstants.XS_QNAME_TYPE_ID,
            XS_ANY_ATOMIC, DerivationProcess.RESTRICTION);

    public static final BuiltinAtomicType XS_NOTATION = new BuiltinAtomicType(BuiltinTypeConstants.XS_NOTATION_TYPE_ID,
            XS_ANY_ATOMIC, DerivationProcess.RESTRICTION);

    public static final BuiltinAtomicType JS_NULL = new BuiltinAtomicType(BuiltinTypeConstants.JS_NULL_TYPE_ID,
            XS_ANY_ATOMIC, DerivationProcess.RESTRICTION);

    public static final BuiltinTypeRegistry INSTANCE = new BuiltinTypeRegistry();

    private final SchemaType[] types;

    private final QName[] typeNames;

    private BuiltinTypeRegistry() {
        types = new SchemaType[BuiltinTypeConstants.BUILTIN_TYPE_COUNT];
        types[BuiltinTypeConstants.XS_ANY_SIMPLE_TYPE_ID] = AnySimpleType.INSTANCE;
        types[BuiltinTypeConstants.XS_ANY_ATOMIC_TYPE_ID] = XS_ANY_ATOMIC;
        types[BuiltinTypeConstants.XS_STRING_TYPE_ID] = XS_STRING;
        types[BuiltinTypeConstants.XS_NORMALIZED_STRING_TYPE_ID] = XS_NORMALIZED_STRING;
        types[BuiltinTypeConstants.XS_TOKEN_TYPE_ID] = XS_TOKEN;
        types[BuiltinTypeConstants.XS_LANGUAGE_TYPE_ID] = XS_LANGUAGE;
        types[BuiltinTypeConstants.XS_NMTOKEN_TYPE_ID] = XS_NMTOKEN;
        types[BuiltinTypeConstants.XS_NAME_TYPE_ID] = XS_NAME;
        types[BuiltinTypeConstants.XS_NCNAME_TYPE_ID] = XS_NCNAME;
        types[BuiltinTypeConstants.XS_ID_TYPE_ID] = XS_ID;
        types[BuiltinTypeConstants.XS_IDREF_TYPE_ID] = XS_IDREF;
        types[BuiltinTypeConstants.XS_ENTITY_TYPE_ID] = XS_ENTITY;
        types[BuiltinTypeConstants.XS_UNTYPED_ATOMIC_TYPE_ID] = XS_UNTYPED_ATOMIC;
        types[BuiltinTypeConstants.XS_DATETIME_TYPE_ID] = XS_DATETIME;
        types[BuiltinTypeConstants.XS_DATE_TYPE_ID] = XS_DATE;
        types[BuiltinTypeConstants.XS_TIME_TYPE_ID] = XS_TIME;
        types[BuiltinTypeConstants.XS_DURATION_TYPE_ID] = XS_DURATION;
        types[BuiltinTypeConstants.XS_YEAR_MONTH_DURATION_TYPE_ID] = XS_YEAR_MONTH_DURATION;
        types[BuiltinTypeConstants.XS_DAY_TIME_DURATION_TYPE_ID] = XS_DAY_TIME_DURATION;
        types[BuiltinTypeConstants.XSEXT_NUMERIC_TYPE_ID] = XSEXT_NUMERIC;
        types[BuiltinTypeConstants.XS_FLOAT_TYPE_ID] = XS_FLOAT;
        types[BuiltinTypeConstants.XS_DOUBLE_TYPE_ID] = XS_DOUBLE;
        types[BuiltinTypeConstants.XS_DECIMAL_TYPE_ID] = XS_DECIMAL;
        types[BuiltinTypeConstants.XS_INTEGER_TYPE_ID] = XS_INTEGER;
        types[BuiltinTypeConstants.XS_NON_POSITIVE_INTEGER_TYPE_ID] = XS_NON_POSITIVE_INTEGER;
        types[BuiltinTypeConstants.XS_NEGATIVE_INTEGER_TYPE_ID] = XS_NEGATIVE_INTEGER;
        types[BuiltinTypeConstants.XS_LONG_TYPE_ID] = XS_LONG;
        types[BuiltinTypeConstants.XS_INT_TYPE_ID] = XS_INT;
        types[BuiltinTypeConstants.XS_SHORT_TYPE_ID] = XS_SHORT;
        types[BuiltinTypeConstants.XS_BYTE_TYPE_ID] = XS_BYTE;
        types[BuiltinTypeConstants.XS_NON_NEGATIVE_INTEGER_TYPE_ID] = XS_NON_NEGATIVE_INTEGER;
        types[BuiltinTypeConstants.XS_UNSIGNED_LONG_TYPE_ID] = XS_UNSIGNED_LONG;
        types[BuiltinTypeConstants.XS_UNSIGNED_INT_TYPE_ID] = XS_UNSIGNED_INT;
        types[BuiltinTypeConstants.XS_UNSIGNED_SHORT_TYPE_ID] = XS_UNSIGNED_SHORT;
        types[BuiltinTypeConstants.XS_UNSIGNED_BYTE_TYPE_ID] = XS_UNSIGNED_BYTE;
        types[BuiltinTypeConstants.XS_POSITIVE_INTEGER_TYPE_ID] = XS_POSITIVE_INTEGER;
        types[BuiltinTypeConstants.XS_G_YEAR_MONTH_TYPE_ID] = XS_G_YEAR_MONTH;
        types[BuiltinTypeConstants.XS_G_YEAR_TYPE_ID] = XS_G_YEAR;
        types[BuiltinTypeConstants.XS_G_MONTH_DAY_TYPE_ID] = XS_G_MONTH_DAY;
        types[BuiltinTypeConstants.XS_G_DAY_TYPE_ID] = XS_G_DAY;
        types[BuiltinTypeConstants.XS_G_MONTH_TYPE_ID] = XS_G_MONTH;
        types[BuiltinTypeConstants.XS_BOOLEAN_TYPE_ID] = XS_BOOLEAN;
        types[BuiltinTypeConstants.XS_BASE64_BINARY_TYPE_ID] = XS_BASE64_BINARY;
        types[BuiltinTypeConstants.XS_HEX_BINARY_TYPE_ID] = XS_HEX_BINARY;
        types[BuiltinTypeConstants.XS_ANY_URI_TYPE_ID] = XS_ANY_URI;
        types[BuiltinTypeConstants.XS_QNAME_TYPE_ID] = XS_QNAME;
        types[BuiltinTypeConstants.XS_NOTATION_TYPE_ID] = XS_NOTATION;
        types[BuiltinTypeConstants.JS_NULL_TYPE_ID] = JS_NULL;

        typeNames = new QName[BuiltinTypeConstants.BUILTIN_TYPE_COUNT];
        typeNames[BuiltinTypeConstants.XS_ANY_TYPE_ID] = BuiltinTypeQNames.XS_ANY_TYPE_QNAME;
        typeNames[BuiltinTypeConstants.XS_ANY_SIMPLE_TYPE_ID] = BuiltinTypeQNames.XS_ANY_SIMPLE_TYPE_QNAME;
        typeNames[BuiltinTypeConstants.XS_UNTYPED_TYPE_ID] = BuiltinTypeQNames.XS_UNTYPED_QNAME;
        typeNames[BuiltinTypeConstants.XS_ANY_ATOMIC_TYPE_ID] = BuiltinTypeQNames.XS_ANY_ATOMIC_TYPE_QNAME;
        typeNames[BuiltinTypeConstants.XS_STRING_TYPE_ID] = BuiltinTypeQNames.XS_STRING_TYPE_QNAME;
        typeNames[BuiltinTypeConstants.XS_NORMALIZED_STRING_TYPE_ID] = BuiltinTypeQNames.XS_NORMALIZED_STRING_TYPE_QNAME;
        typeNames[BuiltinTypeConstants.XS_TOKEN_TYPE_ID] = BuiltinTypeQNames.XS_TOKEN_TYPE_QNAME;
        typeNames[BuiltinTypeConstants.XS_LANGUAGE_TYPE_ID] = BuiltinTypeQNames.XS_LANGUAGE_TYPE_QNAME;
        typeNames[BuiltinTypeConstants.XS_NMTOKEN_TYPE_ID] = BuiltinTypeQNames.XS_NMTOKEN_TYPE_QNAME;
        typeNames[BuiltinTypeConstants.XS_NAME_TYPE_ID] = BuiltinTypeQNames.XS_NAME_TYPE_QNAME;
        typeNames[BuiltinTypeConstants.XS_NCNAME_TYPE_ID] = BuiltinTypeQNames.XS_NCNAME_TYPE_QNAME;
        typeNames[BuiltinTypeConstants.XS_ID_TYPE_ID] = BuiltinTypeQNames.XS_ID_TYPE_QNAME;
        typeNames[BuiltinTypeConstants.XS_IDREF_TYPE_ID] = BuiltinTypeQNames.XS_IDREF_TYPE_QNAME;
        typeNames[BuiltinTypeConstants.XS_ENTITY_TYPE_ID] = BuiltinTypeQNames.XS_ENTITY_TYPE_QNAME;
        typeNames[BuiltinTypeConstants.XS_UNTYPED_ATOMIC_TYPE_ID] = BuiltinTypeQNames.XS_UNTYPED_ATOMIC_TYPE_QNAME;
        typeNames[BuiltinTypeConstants.XS_DATETIME_TYPE_ID] = BuiltinTypeQNames.XS_DATETIME_TYPE_QNAME;
        typeNames[BuiltinTypeConstants.XS_DATE_TYPE_ID] = BuiltinTypeQNames.XS_DATE_TYPE_QNAME;
        typeNames[BuiltinTypeConstants.XS_TIME_TYPE_ID] = BuiltinTypeQNames.XS_TIME_TYPE_QNAME;
        typeNames[BuiltinTypeConstants.XS_DURATION_TYPE_ID] = BuiltinTypeQNames.XS_DURATION_TYPE_QNAME;
        typeNames[BuiltinTypeConstants.XS_YEAR_MONTH_DURATION_TYPE_ID] = BuiltinTypeQNames.XS_YEAR_MONTH_DURATION_TYPE_QNAME;
        typeNames[BuiltinTypeConstants.XS_DAY_TIME_DURATION_TYPE_ID] = BuiltinTypeQNames.XS_DAY_TIME_DURATION_TYPE_QNAME;
        typeNames[BuiltinTypeConstants.XSEXT_NUMERIC_TYPE_ID] = BuiltinTypeQNames.XSEXT_NUMERIC_TYPE_QNAME;
        typeNames[BuiltinTypeConstants.XS_FLOAT_TYPE_ID] = BuiltinTypeQNames.XS_FLOAT_TYPE_QNAME;
        typeNames[BuiltinTypeConstants.XS_DOUBLE_TYPE_ID] = BuiltinTypeQNames.XS_DOUBLE_TYPE_QNAME;
        typeNames[BuiltinTypeConstants.XS_DECIMAL_TYPE_ID] = BuiltinTypeQNames.XS_DECIMAL_TYPE_QNAME;
        typeNames[BuiltinTypeConstants.XS_INTEGER_TYPE_ID] = BuiltinTypeQNames.XS_INTEGER_TYPE_QNAME;
        typeNames[BuiltinTypeConstants.XS_NON_POSITIVE_INTEGER_TYPE_ID] = BuiltinTypeQNames.XS_NON_POSITIVE_INTEGER_TYPE_QNAME;
        typeNames[BuiltinTypeConstants.XS_NEGATIVE_INTEGER_TYPE_ID] = BuiltinTypeQNames.XS_NEGATIVE_INTEGER_TYPE_QNAME;
        typeNames[BuiltinTypeConstants.XS_LONG_TYPE_ID] = BuiltinTypeQNames.XS_LONG_TYPE_QNAME;
        typeNames[BuiltinTypeConstants.XS_INT_TYPE_ID] = BuiltinTypeQNames.XS_INT_TYPE_QNAME;
        typeNames[BuiltinTypeConstants.XS_SHORT_TYPE_ID] = BuiltinTypeQNames.XS_SHORT_TYPE_QNAME;
        typeNames[BuiltinTypeConstants.XS_BYTE_TYPE_ID] = BuiltinTypeQNames.XS_BYTE_TYPE_QNAME;
        typeNames[BuiltinTypeConstants.XS_NON_NEGATIVE_INTEGER_TYPE_ID] = BuiltinTypeQNames.XS_NON_NEGATIVE_INTEGER_TYPE_QNAME;
        typeNames[BuiltinTypeConstants.XS_UNSIGNED_LONG_TYPE_ID] = BuiltinTypeQNames.XS_UNSIGNED_LONG_TYPE_QNAME;
        typeNames[BuiltinTypeConstants.XS_UNSIGNED_INT_TYPE_ID] = BuiltinTypeQNames.XS_UNSIGNED_INT_TYPE_QNAME;
        typeNames[BuiltinTypeConstants.XS_UNSIGNED_SHORT_TYPE_ID] = BuiltinTypeQNames.XS_UNSIGNED_SHORT_TYPE_QNAME;
        typeNames[BuiltinTypeConstants.XS_UNSIGNED_BYTE_TYPE_ID] = BuiltinTypeQNames.XS_UNSIGNED_BYTE_TYPE_QNAME;
        typeNames[BuiltinTypeConstants.XS_POSITIVE_INTEGER_TYPE_ID] = BuiltinTypeQNames.XS_POSITIVE_INTEGER_TYPE_QNAME;
        typeNames[BuiltinTypeConstants.XS_G_YEAR_MONTH_TYPE_ID] = BuiltinTypeQNames.XS_G_YEAR_MONTH_TYPE_QNAME;
        typeNames[BuiltinTypeConstants.XS_G_YEAR_TYPE_ID] = BuiltinTypeQNames.XS_G_YEAR_TYPE_QNAME;
        typeNames[BuiltinTypeConstants.XS_G_MONTH_DAY_TYPE_ID] = BuiltinTypeQNames.XS_G_MONTH_DAY_TYPE_QNAME;
        typeNames[BuiltinTypeConstants.XS_G_DAY_TYPE_ID] = BuiltinTypeQNames.XS_G_DAY_TYPE_QNAME;
        typeNames[BuiltinTypeConstants.XS_G_MONTH_TYPE_ID] = BuiltinTypeQNames.XS_G_MONTH_TYPE_QNAME;
        typeNames[BuiltinTypeConstants.XS_BOOLEAN_TYPE_ID] = BuiltinTypeQNames.XS_BOOLEAN_TYPE_QNAME;
        typeNames[BuiltinTypeConstants.XS_BASE64_BINARY_TYPE_ID] = BuiltinTypeQNames.XS_BASE64_BINARY_TYPE_QNAME;
        typeNames[BuiltinTypeConstants.XS_HEX_BINARY_TYPE_ID] = BuiltinTypeQNames.XS_HEX_BINARY_TYPE_QNAME;
        typeNames[BuiltinTypeConstants.XS_ANY_URI_TYPE_ID] = BuiltinTypeQNames.XS_ANY_URI_TYPE_QNAME;
        typeNames[BuiltinTypeConstants.XS_QNAME_TYPE_ID] = BuiltinTypeQNames.XS_QNAME_TYPE_QNAME;
        typeNames[BuiltinTypeConstants.XS_NOTATION_TYPE_ID] = BuiltinTypeQNames.XS_NOTATION_TYPE_QNAME;
        typeNames[BuiltinTypeConstants.JS_NULL_TYPE_ID] = BuiltinTypeQNames.JS_NULL_TYPE_QNAME;
    }

    public SchemaType getSchemaTypeById(int id) {
        return types[id];
    }

    public boolean isBuiltinTypeId(int id) {
        return id < BuiltinTypeConstants.BUILTIN_TYPE_COUNT;
    }

    public boolean isBuiltinType(SchemaType type) {
        return isBuiltinTypeId(type.getTypeId());
    }

    public SchemaType getBuiltinBaseType(SchemaType type) {
        while (!isBuiltinType(type)) {
            type = type.getBaseType();
        }
        return type;
    }

    public QName getTypeName(int id) {
        return typeNames[id];
    }

    public static final Map<QName, SchemaType> TYPE_MAP;

    static {
        Map<QName, SchemaType> typeMap = new LinkedHashMap<QName, SchemaType>();
        typeMap.put(BuiltinTypeQNames.XS_ANY_SIMPLE_TYPE_QNAME, AnySimpleType.INSTANCE);
        typeMap.put(BuiltinTypeQNames.XS_ANY_ATOMIC_TYPE_QNAME, XS_ANY_ATOMIC);
        typeMap.put(BuiltinTypeQNames.XS_STRING_TYPE_QNAME, XS_STRING);
        typeMap.put(BuiltinTypeQNames.XS_NORMALIZED_STRING_TYPE_QNAME, XS_NORMALIZED_STRING);
        typeMap.put(BuiltinTypeQNames.XS_TOKEN_TYPE_QNAME, XS_TOKEN);
        typeMap.put(BuiltinTypeQNames.XS_LANGUAGE_TYPE_QNAME, XS_LANGUAGE);
        typeMap.put(BuiltinTypeQNames.XS_NMTOKEN_TYPE_QNAME, XS_NMTOKEN);
        typeMap.put(BuiltinTypeQNames.XS_NAME_TYPE_QNAME, XS_NAME);
        typeMap.put(BuiltinTypeQNames.XS_NCNAME_TYPE_QNAME, XS_NCNAME);
        typeMap.put(BuiltinTypeQNames.XS_ID_TYPE_QNAME, XS_ID);
        typeMap.put(BuiltinTypeQNames.XS_IDREF_TYPE_QNAME, XS_IDREF);
        typeMap.put(BuiltinTypeQNames.XS_ENTITY_TYPE_QNAME, XS_ENTITY);
        typeMap.put(BuiltinTypeQNames.XS_UNTYPED_ATOMIC_TYPE_QNAME, XS_UNTYPED_ATOMIC);
        typeMap.put(BuiltinTypeQNames.XS_DATETIME_TYPE_QNAME, XS_DATETIME);
        typeMap.put(BuiltinTypeQNames.XS_DATE_TYPE_QNAME, XS_DATE);
        typeMap.put(BuiltinTypeQNames.XS_TIME_TYPE_QNAME, XS_TIME);
        typeMap.put(BuiltinTypeQNames.XS_DURATION_TYPE_QNAME, XS_DURATION);
        typeMap.put(BuiltinTypeQNames.XS_YEAR_MONTH_DURATION_TYPE_QNAME, XS_YEAR_MONTH_DURATION);
        typeMap.put(BuiltinTypeQNames.XS_DAY_TIME_DURATION_TYPE_QNAME, XS_DAY_TIME_DURATION);
        typeMap.put(BuiltinTypeQNames.XSEXT_NUMERIC_TYPE_QNAME, XSEXT_NUMERIC);
        typeMap.put(BuiltinTypeQNames.XS_FLOAT_TYPE_QNAME, XS_FLOAT);
        typeMap.put(BuiltinTypeQNames.XS_DOUBLE_TYPE_QNAME, XS_DOUBLE);
        typeMap.put(BuiltinTypeQNames.XS_DECIMAL_TYPE_QNAME, XS_DECIMAL);
        typeMap.put(BuiltinTypeQNames.XS_INTEGER_TYPE_QNAME, XS_INTEGER);
        typeMap.put(BuiltinTypeQNames.XS_NON_POSITIVE_INTEGER_TYPE_QNAME, XS_NON_POSITIVE_INTEGER);
        typeMap.put(BuiltinTypeQNames.XS_NEGATIVE_INTEGER_TYPE_QNAME, XS_NEGATIVE_INTEGER);
        typeMap.put(BuiltinTypeQNames.XS_LONG_TYPE_QNAME, XS_LONG);
        typeMap.put(BuiltinTypeQNames.XS_INT_TYPE_QNAME, XS_INT);
        typeMap.put(BuiltinTypeQNames.XS_SHORT_TYPE_QNAME, XS_SHORT);
        typeMap.put(BuiltinTypeQNames.XS_BYTE_TYPE_QNAME, XS_BYTE);
        typeMap.put(BuiltinTypeQNames.XS_NON_NEGATIVE_INTEGER_TYPE_QNAME, XS_NON_NEGATIVE_INTEGER);
        typeMap.put(BuiltinTypeQNames.XS_UNSIGNED_LONG_TYPE_QNAME, XS_UNSIGNED_LONG);
        typeMap.put(BuiltinTypeQNames.XS_UNSIGNED_INT_TYPE_QNAME, XS_UNSIGNED_INT);
        typeMap.put(BuiltinTypeQNames.XS_UNSIGNED_SHORT_TYPE_QNAME, XS_UNSIGNED_SHORT);
        typeMap.put(BuiltinTypeQNames.XS_UNSIGNED_BYTE_TYPE_QNAME, XS_UNSIGNED_BYTE);
        typeMap.put(BuiltinTypeQNames.XS_POSITIVE_INTEGER_TYPE_QNAME, XS_POSITIVE_INTEGER);
        typeMap.put(BuiltinTypeQNames.XS_G_YEAR_MONTH_TYPE_QNAME, XS_G_YEAR_MONTH);
        typeMap.put(BuiltinTypeQNames.XS_G_YEAR_TYPE_QNAME, XS_G_YEAR);
        typeMap.put(BuiltinTypeQNames.XS_G_MONTH_DAY_TYPE_QNAME, XS_G_MONTH_DAY);
        typeMap.put(BuiltinTypeQNames.XS_G_DAY_TYPE_QNAME, XS_G_DAY);
        typeMap.put(BuiltinTypeQNames.XS_G_MONTH_TYPE_QNAME, XS_G_MONTH);
        typeMap.put(BuiltinTypeQNames.XS_BOOLEAN_TYPE_QNAME, XS_BOOLEAN);
        typeMap.put(BuiltinTypeQNames.XS_BASE64_BINARY_TYPE_QNAME, XS_BASE64_BINARY);
        typeMap.put(BuiltinTypeQNames.XS_HEX_BINARY_TYPE_QNAME, XS_HEX_BINARY);
        typeMap.put(BuiltinTypeQNames.XS_ANY_URI_TYPE_QNAME, XS_ANY_URI);
        typeMap.put(BuiltinTypeQNames.XS_QNAME_TYPE_QNAME, XS_QNAME);
        typeMap.put(BuiltinTypeQNames.XS_NOTATION_TYPE_QNAME, XS_NOTATION);
        TYPE_MAP = Collections.unmodifiableMap(typeMap);
    }
}
