/* * Copyright 2001,2002,2004,2006 The Apache Software Foundation. * * Licensed 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.xerces.impl.dv; import org.apache.xerces.xs.ShortList; import org.apache.xerces.xs.XSConstants; /** * Class to get the information back after content is validated. This info * would be filled by validate(). * * @xerces.internal * * @author Neeraj Bajaj, Sun Microsystems, inc. * * @version $Id: ValidatedInfo.java 371617 2006-01-23 18:41:49Z mrglavas $ */ public class ValidatedInfo { /** * The normalized value of a string value */ public String normalizedValue; /** * The actual value from a string value (QName, Boolean, etc.) * An array of Objects if the type is a list. */ public Object actualValue; /** * The type of the actual value. It's one of the _DT constants * defined in XSConstants.java. The value is used to indicate * the most specific built-in type. * (i.e. short instead of decimal or integer). */ public short actualValueType; /** * If the type is a union type, then the member type which * actually validated the string value. */ public XSSimpleType memberType; /** * If * 1. the type is a union type where one of the member types is a list, or * if the type is a list; and * 2. the item type of the list is a union type * then an array of member types used to validate the values. */ public XSSimpleType[] memberTypes; /** * In the case the value is a list or a list of unions, this value * indicates the type(s) of the items in the list. * For a normal list, the length of the array is 1; for list of unions, * the length of the array is the same as the length of the list. */ public ShortList itemValueTypes; /** * reset the state of this object */ public void reset() { this.normalizedValue = null; this.actualValue = null; this.memberType = null; this.memberTypes = null; } /** * Return a string representation of the value. If there is an actual * value, use toString; otherwise, use the normalized value. */ public String stringValue() { if (actualValue == null) return normalizedValue; else return actualValue.toString(); } /** * Returns true if the two ValidatedInfo objects can be compared in the same * value space. */ public static boolean isComparable(ValidatedInfo info1, ValidatedInfo info2) { final short primitiveType1 = convertToPrimitiveKind(info1.actualValueType); final short primitiveType2 = convertToPrimitiveKind(info2.actualValueType); if (primitiveType1 != primitiveType2) { return (primitiveType1 == XSConstants.ANYSIMPLETYPE_DT && primitiveType2 == XSConstants.STRING_DT || primitiveType1 == XSConstants.STRING_DT && primitiveType2 == XSConstants.ANYSIMPLETYPE_DT); } else if (primitiveType1 == XSConstants.LIST_DT || primitiveType1 == XSConstants.LISTOFUNION_DT) { final ShortList typeList1 = info1.itemValueTypes; final ShortList typeList2 = info2.itemValueTypes; final int typeList1Length = typeList1 != null ? typeList1.getLength() : 0; final int typeList2Length = typeList2 != null ? typeList2.getLength() : 0; if (typeList1Length != typeList2Length) { return false; } for (int i = 0; i < typeList1Length; ++i) { final short primitiveItem1 = convertToPrimitiveKind(typeList1.item(i)); final short primitiveItem2 = convertToPrimitiveKind(typeList2.item(i)); if (primitiveItem1 != primitiveItem2) { if (primitiveItem1 == XSConstants.ANYSIMPLETYPE_DT && primitiveItem2 == XSConstants.STRING_DT || primitiveItem1 == XSConstants.STRING_DT && primitiveItem2 == XSConstants.ANYSIMPLETYPE_DT) { continue; } return false; } } } return true; } /** * Returns the primitive type of the given type. * @param valueType A value type as defined in XSConstants. * @return The primitive type from which valueType was derived. */ private static short convertToPrimitiveKind(short valueType) { /** Primitive datatypes. */ if (valueType <= XSConstants.NOTATION_DT) { return valueType; } /** Types derived from string. */ if (valueType <= XSConstants.ENTITY_DT) { return XSConstants.STRING_DT; } /** Types derived from decimal. */ if (valueType <= XSConstants.POSITIVEINTEGER_DT) { return XSConstants.DECIMAL_DT; } /** Other types. */ return valueType; } }