001: /**
002: * Redistribution and use of this software and associated documentation
003: * ("Software"), with or without modification, are permitted provided
004: * that the following conditions are met:
005: *
006: * 1. Redistributions of source code must retain copyright
007: * statements and notices. Redistributions must also contain a
008: * copy of this document.
009: *
010: * 2. Redistributions in binary form must reproduce the
011: * above copyright notice, this list of conditions and the
012: * following disclaimer in the documentation and/or other
013: * materials provided with the distribution.
014: *
015: * 3. The name "Exolab" must not be used to endorse or promote
016: * products derived from this Software without prior written
017: * permission of Intalio, Inc. For written permission,
018: * please contact info@exolab.org.
019: *
020: * 4. Products derived from this Software may not be called "Exolab"
021: * nor may "Exolab" appear in their names without prior written
022: * permission of Intalio, Inc. Exolab is a registered
023: * trademark of Intalio, Inc.
024: *
025: * 5. Due credit should be given to the Exolab Project
026: * (http://www.exolab.org/).
027: *
028: * THIS SOFTWARE IS PROVIDED BY INTALIO, INC. AND CONTRIBUTORS
029: * ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT
030: * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
031: * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
032: * INTALIO, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
033: * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
034: * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
035: * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
036: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
037: * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
038: * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
039: * OF THE POSSIBILITY OF SUCH DAMAGE.
040: *
041: * Copyright 1999-2000 (C) Intalio Inc. All Rights Reserved.
042: *
043: * $Id: TypeReference.java 6807 2007-02-11 16:35:16Z wguttmn $
044: */package org.exolab.castor.xml.schema;
045:
046: import org.exolab.castor.xml.ValidationException;
047:
048: /**
049: * Package private class to handles type references.
050: *
051: * @author <a href="mailto:berry@intalio.com">Arnaud Berry</a>
052: * @version $Revision:
053: **/
054: public class TypeReference extends XMLType {
055: /** SerialVersionUID */
056: private static final long serialVersionUID = -8707313918028332092L;
057:
058: /**
059: * The referred type (stored in the schema)
060: */
061: private XMLType referredType = null;
062:
063: /**
064: * Returns the referred type
065: */
066: XMLType getType() {
067: if (referredType == null)
068: resolveTypeReference();
069:
070: return referredType;
071: }
072:
073: /**
074: * Resolves the type reference.
075: */
076: void resolveTypeReference() {
077:
078: String name = getName();
079: if (name == null)
080: return;
081:
082: Schema schema = getSchema();
083: if (schema == null) {
084: //-- ummm we have a problem.
085: String error = "Schema is null. Reference cannot be resolved.";
086: throw new IllegalStateException(error);
087: }
088:
089: //-- is AnyType? resolve namespace if necessary
090: //-- and check for 'anyType'.
091: String canonicalName = name;
092: String nsPrefix = "";
093: int colon = name.indexOf(':');
094: if (colon >= 0) {
095: canonicalName = name.substring(colon + 1);
096: nsPrefix = name.substring(0, colon);
097: }
098: String ns = schema.getNamespace(nsPrefix);
099:
100: if (schema.getSchemaNamespace().equals(ns)) {
101: if (canonicalName.equals(SchemaNames.ANYTYPE)) {
102: referredType = new AnyType(schema);
103: return;
104: }
105: }
106:
107: //-- check simpletype first since it has higher precedence
108: IllegalArgumentException exception = null;
109: try {
110: referredType = getSchema().getSimpleType(getName());
111: } catch (IllegalArgumentException iax) {
112: exception = iax;
113: }
114: if (referredType != null)
115: return; //we found it, return it
116: //-- try to find a complex type
117: referredType = getSchema().getComplexType(getName());
118:
119: if (referredType != null)
120: return; //we found it, return it
121:
122: //-- rethrow exception if necessary
123: if (exception != null)
124: throw exception;
125:
126: } //- resolveTypeReference
127:
128: /**
129: * Sets the parent for this Schema type
130: *
131: * @param parent the parent Structure for SchemaType
132: **/
133: protected void setParent(Structure parent) {
134: //-- never used by references
135: } //-- setParent
136:
137: /**
138: * Returns Structure.UNKNOWN
139: * (This class should not be seen outside ElementDecl anyway)
140: **/
141: public short getStructureType() {
142: return Structure.UNKNOWN;
143: } //-- getStructureType
144:
145: /**
146: * Checks the validity of this type defintion.
147: *
148: * @throws ValidationException when this type definition
149: * is invalid.
150: **/
151: public void validate() throws ValidationException {
152: //-- Do nothing
153:
154: } //-- validate
155:
156: }
|