/*
* @(#)$Id: QnameType.java,v 1.29 2002/10/08 22:01:27 kk122374 Exp $
*
* Copyright 2001 Sun Microsystems, Inc. All Rights Reserved.
*
* This software is the proprietary information of Sun Microsystems, Inc.
* Use is subject to license terms.
*
*/
package com.sun.msv.datatype.xsd;
import org.relaxng.datatype.ValidationContext;
import com.sun.msv.datatype.SerializationContext;
/**
* "QName" type.
*
* type of the value object is {@link QnameValueType}.
* See http://www.w3.org/TR/xmlschema-2/#QName for the spec.
*
* @author <a href="mailto:kohsuke.kawaguchi@eng.sun.com">Kohsuke KAWAGUCHI</a>
*/
public class QnameType extends BuiltinAtomicType implements Discrete {
public static final QnameType theInstance = new QnameType();
private QnameType() { super("QName"); }
final public XSDatatype getBaseType() {
return SimpleURType.theInstance;
}
/**
* QName type always returns true. That is, QName is a context-dependent type.
*/
public boolean isContextDependent() {
return true;
}
private static String getNamespaceURI( String content, ValidationContext context ) {
return context.resolveNamespacePrefix( content.substring(0, content.indexOf(':')) );
}
protected boolean checkFormat( String value, ValidationContext context ) {
// [6] QName ::= (Prefix ':')? LocalPart
// [7] Prefix ::= NCName
// [8] LocalPart ::= NCName
final int first = value.indexOf(':');
// no Prefix, only check LocalPart
if(first <= 0) return XmlNames.isUnqualifiedName(value);
// Prefix exists, check everything
final int last = value.lastIndexOf(':');
if (last != first) return false;
final String prefix = value.substring (0, first);
return XmlNames.isUnqualifiedName(prefix)
&& XmlNames.isUnqualifiedName(value.substring (first + 1))
&& context.resolveNamespacePrefix(prefix)!=null;
}
public Object _createValue( String value, ValidationContext context ) {
String uri,localPart;
// [6] QName ::= (Prefix ':')? LocalPart
// [7] Prefix ::= NCName
// [8] LocalPart ::= NCName
final int first = value.indexOf(':');
if(first <= 0)
{// no Prefix, only check LocalPart
if(!XmlNames.isUnqualifiedName(value)) return null;
uri = context.resolveNamespacePrefix("");
localPart = value;
} else {
// Prefix exists, check everything
final int last = value.lastIndexOf (':');
if (last != first) return null;
final String prefix = value.substring(0, first);
localPart = value.substring(first + 1);
if(!XmlNames.isUnqualifiedName(prefix)
|| !XmlNames.isUnqualifiedName(localPart) )
return null;
uri = context.resolveNamespacePrefix(prefix);
}
if(uri==null) return null;
return new QnameValueType(uri,localPart);
}
public final int isFacetApplicable( String facetName ) {
if( facetName.equals(FACET_PATTERN)
|| facetName.equals(FACET_ENUMERATION)
|| facetName.equals(FACET_WHITESPACE)
|| facetName.equals(FACET_LENGTH)
|| facetName.equals(FACET_MAXLENGTH)
|| facetName.equals(FACET_MINLENGTH)
)
return APPLICABLE;
else
return NOT_ALLOWED;
}
public final int countLength( Object value ) {
QnameValueType v = (QnameValueType)value;
// the spec does not define what is the unit of length.
// TODO: check the update of the spec and modify this if necessary.
return UnicodeUtil.countLength( v.namespaceURI )+
UnicodeUtil.countLength( v.localPart );
}
public String convertToLexicalValue( Object o, SerializationContext context ) {
if(!( o instanceof QnameValueType ))
throw new UnsupportedOperationException();
QnameValueType v = (QnameValueType)o;
return serialize(v.namespaceURI,v.localPart,context);
}
public String serializeJavaObject( Object value, SerializationContext context ) {
if(!(value instanceof String[])) throw new IllegalArgumentException();
String[] input = (String[])value;
if( input.length!=2 ) throw new IllegalArgumentException();
return serialize(input[0],input[1],context);
}
private String serialize( String uri, String local, SerializationContext context ) {
String prefix = context.getNamespacePrefix(uri);
if(prefix==null) return local;
else return prefix+":"+local;
}
public Object _createJavaObject( String literal, ValidationContext context ) {
QnameValueType v = (QnameValueType)createValue(literal,context);
if(v==null) return null;
// return String[2]
else return new String[]{v.namespaceURI,v.localPart};
}
public Class getJavaObjectType() {
return String[].class;
}
}