/*
 * 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.
 */

/**
 * ExtensionMapper.java
 *
 * This file was auto-generated from WSDL
 * by the Apache Axis2 version: SNAPSHOT  Built on : Dec 21, 2007 (04:03:30 LKT)
 */

package org.apache.axis2.databinding.types.xsd;

/**
 * ExtensionMapper class
 */

public class ExtensionMapper {

    public static java.lang.Object getTypeObject(java.lang.String namespaceURI,
                                                 java.lang.String typeName,
                                                 javax.xml.stream.XMLStreamReader reader) throws java.lang.Exception {


        if ("http://www.w3.org/2001/XMLSchema".equals(namespaceURI) &&
                        "unsignedByte".equals(typeName)) {

            return org.apache.axis2.databinding.types.xsd.UnsignedByte.Factory.parse(reader);


        }


        if ("http://www.w3.org/2001/XMLSchema".equals(namespaceURI) &&
                        "NMTOKEN".equals(typeName)) {

            return org.apache.axis2.databinding.types.xsd.NMTOKEN.Factory.parse(reader);


        }


        if (
                "http://www.w3.org/2001/XMLSchema".equals(namespaceURI) &&
                        "duration".equals(typeName)) {

            return org.apache.axis2.databinding.types.xsd.Duration.Factory.parse(reader);


        }


        if (
                "http://www.w3.org/2001/XMLSchema".equals(namespaceURI) &&
                        "int".equals(typeName)) {

            return org.apache.axis2.databinding.types.xsd._int.Factory.parse(reader);


        }


        if (
                "http://www.w3.org/2001/XMLSchema".equals(namespaceURI) &&
                        "string".equals(typeName)) {

            return org.apache.axis2.databinding.types.xsd.String.Factory.parse(reader);


        }


        if (
                "http://www.w3.org/2001/XMLSchema".equals(namespaceURI) &&
                        "NOTATION".equals(typeName)) {

            return org.apache.axis2.databinding.types.xsd.NOTATION.Factory.parse(reader);


        }


        if (
                "http://www.w3.org/2001/XMLSchema".equals(namespaceURI) &&
                        "time".equals(typeName)) {

            return org.apache.axis2.databinding.types.xsd.Time.Factory.parse(reader);


        }


        if (
                "http://www.w3.org/2001/XMLSchema".equals(namespaceURI) &&
                        "gDay".equals(typeName)) {

            return org.apache.axis2.databinding.types.xsd.GDay.Factory.parse(reader);


        }


        if (
                "http://www.w3.org/2001/XMLSchema".equals(namespaceURI) &&
                        "hexBinary".equals(typeName)) {

            return org.apache.axis2.databinding.types.xsd.HexBinary.Factory.parse(reader);


        }


        if (
                "http://www.w3.org/2001/XMLSchema".equals(namespaceURI) &&
                        "nonNegativeInteger".equals(typeName)) {

            return org.apache.axis2.databinding.types.xsd.NonNegativeInteger.Factory.parse(reader);


        }


        if (
                "http://www.w3.org/2001/XMLSchema".equals(namespaceURI) &&
                        "NCName".equals(typeName)) {

            return org.apache.axis2.databinding.types.xsd.NCName.Factory.parse(reader);


        }


        if (
                "http://www.w3.org/2001/XMLSchema".equals(namespaceURI) &&
                        "NMTOKENS".equals(typeName)) {

            return org.apache.axis2.databinding.types.xsd.NMTOKENS.Factory.parse(reader);


        }


        if (
                "http://www.w3.org/2001/XMLSchema".equals(namespaceURI) &&
                        "unsignedInt".equals(typeName)) {

            return org.apache.axis2.databinding.types.xsd.UnsignedInt.Factory.parse(reader);


        }


        if (
                "http://www.w3.org/2001/XMLSchema".equals(namespaceURI) &&
                        "unsignedLong".equals(typeName)) {

            return org.apache.axis2.databinding.types.xsd.UnsignedLong.Factory.parse(reader);


        }


        if (
                "http://www.w3.org/2001/XMLSchema".equals(namespaceURI) &&
                        "negativeInteger".equals(typeName)) {

            return org.apache.axis2.databinding.types.xsd.NegativeInteger.Factory.parse(reader);


        }


        if (
                "http://www.w3.org/2001/XMLSchema".equals(namespaceURI) &&
                        "dateTime".equals(typeName)) {

            return org.apache.axis2.databinding.types.xsd.DateTime.Factory.parse(reader);


        }


        if (
                "http://www.w3.org/2001/XMLSchema".equals(namespaceURI) &&
                        "unsignedShort".equals(typeName)) {

            return org.apache.axis2.databinding.types.xsd.UnsignedShort.Factory.parse(reader);


        }


        if (
                "http://www.w3.org/2001/XMLSchema".equals(namespaceURI) &&
                        "gYearMonth".equals(typeName)) {

            return org.apache.axis2.databinding.types.xsd.GYearMonth.Factory.parse(reader);


        }


        if (
                "http://www.w3.org/2001/XMLSchema".equals(namespaceURI) &&
                        "boolean".equals(typeName)) {

            return org.apache.axis2.databinding.types.xsd._boolean.Factory.parse(reader);


        }


        if (
                "http://www.w3.org/2001/XMLSchema".equals(namespaceURI) &&
                        "nonPositiveInteger".equals(typeName)) {

            return org.apache.axis2.databinding.types.xsd.NonPositiveInteger.Factory.parse(reader);


        }


        if (
                "http://www.w3.org/2001/XMLSchema".equals(namespaceURI) &&
                        "base64".equals(typeName)) {

            return org.apache.axis2.databinding.types.xsd.Base64.Factory.parse(reader);


        }


        if (
                "http://www.w3.org/2001/XMLSchema".equals(namespaceURI) &&
                        "double".equals(typeName)) {

            return org.apache.axis2.databinding.types.xsd._double.Factory.parse(reader);


        }


        if (
                "http://www.w3.org/2001/XMLSchema".equals(namespaceURI) &&
                        "float".equals(typeName)) {

            return org.apache.axis2.databinding.types.xsd._float.Factory.parse(reader);


        }


        if (
                "http://www.w3.org/2001/XMLSchema".equals(namespaceURI) &&
                        "base64Binary".equals(typeName)) {

            return org.apache.axis2.databinding.types.xsd.Base64Binary.Factory.parse(reader);


        }


        if (
                "http://www.w3.org/2001/XMLSchema".equals(namespaceURI) &&
                        "gMonthDay".equals(typeName)) {

            return org.apache.axis2.databinding.types.xsd.GMonthDay.Factory.parse(reader);


        }


        if (
                "http://www.w3.org/2001/XMLSchema".equals(namespaceURI) &&
                        "Name".equals(typeName)) {

            return org.apache.axis2.databinding.types.xsd.Name.Factory.parse(reader);


        }


        if (
                "http://www.w3.org/2001/XMLSchema".equals(namespaceURI) &&
                        "ENTITY".equals(typeName)) {

            return org.apache.axis2.databinding.types.xsd.ENTITY.Factory.parse(reader);


        }


        if (
                "http://www.w3.org/2001/XMLSchema".equals(namespaceURI) &&
                        "byte".equals(typeName)) {

            return org.apache.axis2.databinding.types.xsd._byte.Factory.parse(reader);


        }


        if (
                "http://www.w3.org/2001/XMLSchema".equals(namespaceURI) &&
                        "long".equals(typeName)) {

            return org.apache.axis2.databinding.types.xsd._long.Factory.parse(reader);


        }


        if (
                "http://www.w3.org/2001/XMLSchema".equals(namespaceURI) &&
                        "IDREF".equals(typeName)) {

            return org.apache.axis2.databinding.types.xsd.IDREF.Factory.parse(reader);


        }


        if (
                "http://www.w3.org/2001/XMLSchema".equals(namespaceURI) &&
                        "gYear".equals(typeName)) {

            return org.apache.axis2.databinding.types.xsd.GYear.Factory.parse(reader);


        }


        if (
                "http://www.w3.org/2001/XMLSchema".equals(namespaceURI) &&
                        "ID".equals(typeName)) {

            return org.apache.axis2.databinding.types.xsd.ID.Factory.parse(reader);


        }


        if (
                "http://www.w3.org/2001/XMLSchema".equals(namespaceURI) &&
                        "anyURI".equals(typeName)) {

            return org.apache.axis2.databinding.types.xsd.AnyURI.Factory.parse(reader);


        }


        if (
                "http://www.w3.org/2001/XMLSchema".equals(namespaceURI) &&
                        "token".equals(typeName)) {

            return org.apache.axis2.databinding.types.xsd.Token.Factory.parse(reader);


        }


        if (
                "http://www.w3.org/2001/XMLSchema".equals(namespaceURI) &&
                        "positiveInteger".equals(typeName)) {

            return org.apache.axis2.databinding.types.xsd.PositiveInteger.Factory.parse(reader);


        }


        if (
                "http://www.w3.org/2001/XMLSchema".equals(namespaceURI) &&
                        "short".equals(typeName)) {

            return org.apache.axis2.databinding.types.xsd._short.Factory.parse(reader);


        }


        if (
                "http://www.w3.org/2001/XMLSchema".equals(namespaceURI) &&
                        "language".equals(typeName)) {

            return org.apache.axis2.databinding.types.xsd.Language.Factory.parse(reader);


        }


        if (
                "http://www.w3.org/2001/XMLSchema".equals(namespaceURI) &&
                        "ENTITIES".equals(typeName)) {

            return org.apache.axis2.databinding.types.xsd.ENTITIES.Factory.parse(reader);


        }


        if (
                "http://www.w3.org/2001/XMLSchema".equals(namespaceURI) &&
                        "date".equals(typeName)) {

            return org.apache.axis2.databinding.types.xsd.Date.Factory.parse(reader);


        }


        if (
                "http://www.w3.org/2001/XMLSchema".equals(namespaceURI) &&
                        "integer".equals(typeName)) {

            return org.apache.axis2.databinding.types.xsd.Integer.Factory.parse(reader);


        }


        if (
                "http://www.w3.org/2001/XMLSchema".equals(namespaceURI) &&
                        "QName".equals(typeName)) {

            return org.apache.axis2.databinding.types.xsd.QName.Factory.parse(reader);


        }


        if (
                "http://www.w3.org/2001/XMLSchema".equals(namespaceURI) &&
                        "normalizedString".equals(typeName)) {

            return org.apache.axis2.databinding.types.xsd.NormalizedString.Factory.parse(reader);


        }


        if (
                "http://www.w3.org/2001/XMLSchema".equals(namespaceURI) &&
                        "IDREFS".equals(typeName)) {

            return org.apache.axis2.databinding.types.xsd.IDREFS.Factory.parse(reader);


        }


        if (
                "http://www.w3.org/2001/XMLSchema".equals(namespaceURI) &&
                        "decimal".equals(typeName)) {

            return org.apache.axis2.databinding.types.xsd.Decimal.Factory.parse(reader);


        }


        if (
                "http://www.w3.org/2001/XMLSchema".equals(namespaceURI) &&
                        "gMonth".equals(typeName)) {

            return org.apache.axis2.databinding.types.xsd.GMonth.Factory.parse(reader);


        }
        System.out.println("Names pace ==> " + namespaceURI + " type " + typeName);

        throw new org.apache.axis2.databinding.ADBException("Unsupported type " + namespaceURI + " " + typeName);
    }

}
    