001 package com.thaiopensource.datatype.xsd; 002 003 import org.relaxng.datatype.ValidationContext; 004 import com.thaiopensource.xml.util.Naming; 005 006 class QNameDatatype extends DatatypeBase { 007 public boolean lexicallyAllows(String str) { 008 return Naming.isQname(str); 009 } 010 011 static class QName { 012 private final String namespaceURI; 013 private final String localName; 014 QName(String namespaceURI, String localName) { 015 this.namespaceURI = namespaceURI; 016 this.localName = localName; 017 } 018 public boolean equals(Object obj) { 019 if (obj == null || !(obj instanceof QName)) 020 return false; 021 QName other = (QName)obj; 022 return namespaceURI.equals(other.namespaceURI) && localName.equals(other.localName); 023 } 024 public int hashCode() { 025 return localName.hashCode() ^ namespaceURI.hashCode(); 026 } 027 } 028 029 Object getValue(String str, ValidationContext vc) { 030 int i = str.indexOf(':'); 031 if (i < 0) { 032 String ns = vc.resolveNamespacePrefix(""); 033 if (ns == null) 034 ns = ""; 035 return new QName(ns, str); 036 } 037 else { 038 String prefix = str.substring(0, i); 039 String ns = vc.resolveNamespacePrefix(prefix); 040 if (ns == null) 041 return null; 042 return new QName(ns, str.substring(i + 1)); 043 } 044 } 045 046 boolean allowsValue(String str, ValidationContext vc) { 047 int i = str.indexOf(':'); 048 return i < 0 || vc.resolveNamespacePrefix(str.substring(0, i)) != null; 049 } 050 051 public boolean isContextDependent() { 052 return true; 053 } 054 }