I am using xerces 2.7.0
it was working fine in earlier version.
when i upgraded xerces to 2.7.0
i faced lot of issues because of this.
- santhosh
--- Begin Message ---
I have found a bug in XMLSchema API.
This bug is regarding the searching of type-definitions in XSModel.
there are two ways to search a type definition:
first approach:
XSModel.getTypeDefinition(name, namespace)
second appraoch
XSModel.getComponentesByNamespace(XSContants.TYPE_DEFINITION, namespace)
.itemByName(namespace, name)
The first approach works fine.
but second appraoch fails if i pass non-interned strings as arugments.
the most irritating thing is:
once second approach is used with non-interned string, after that
passing interned string also fails.
I attached a testcase to reproduce this issue. This bug is very serious for
my application because my application everywhere uses ClarkNames.
Thanks
Santhosh Kumar T
Sr Software Engineer
Fiorano Software Inc.
package santhosh;
import org.apache.xerces.impl.Constants;
import org.apache.xerces.impl.xs.XSImplementationImpl;
import org.apache.xerces.xs.*;
import org.w3c.dom.DOMConfiguration;
import org.w3c.dom.DOMErrorHandler;
import org.w3c.dom.bootstrap.DOMImplementationRegistry;
import org.w3c.dom.ls.LSResourceResolver;
public class SchemaTest{
public static final String DOM_IMPLEMENTATION_REGISTRY = "org.apache.xerces.dom.DOMXSImplementationSourceImpl";
public static final String DOM_IMPLEMENTATION = "XS-Loader";
public static XSModel readXSD(String uri) throws IllegalAccessException, InstantiationException, ClassNotFoundException{
return readXSD(uri, null, null);
}
public static XSModel readXSD(String uri, LSResourceResolver entityResolver, DOMErrorHandler errorHandler)
throws IllegalAccessException, InstantiationException, ClassNotFoundException{
XSLoader xsLoader = createXSLoader(entityResolver, errorHandler);
return xsLoader.loadURI(uri);
}
public static XSLoader createXSLoader(LSResourceResolver entityResolver, DOMErrorHandler errorHandler) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
System.setProperty(DOMImplementationRegistry.PROPERTY, DOM_IMPLEMENTATION_REGISTRY);
DOMImplementationRegistry registry = DOMImplementationRegistry.newInstance();
XSImplementationImpl xsImpl = (XSImplementationImpl)registry.getDOMImplementation(DOM_IMPLEMENTATION);
XSLoader xsLoader = xsImpl.createXSLoader(null);
DOMConfiguration config = xsLoader.getConfig();
config.setParameter(Constants.DOM_VALIDATE, Boolean.TRUE);
if(entityResolver!=null)
config.setParameter(Constants.DOM_RESOURCE_RESOLVER, entityResolver);
if(errorHandler!=null)
config.setParameter(Constants.DOM_ERROR_HANDLER, errorHandler);
return xsLoader;
}
public static String[] getParts(String clarkName){
String namespace, localName;
if(clarkName.charAt(0) == '{'){
int closeBrace = clarkName.indexOf('}');
if(closeBrace < 0)
throw new IllegalArgumentException("No closing '}' in Clark name");
namespace = clarkName.substring(1, closeBrace);
if(closeBrace == clarkName.length())
throw new IllegalArgumentException("Missing local part in Clark name");
localName = clarkName.substring(closeBrace + 1);
} else{
namespace = ""; //NOI18N
localName = clarkName;
}
return new String[]{namespace, localName};
}
public static XSTypeDefinition getTypeUsingApproach1(XSModel model, String clarkName){
String parts[] = getParts(clarkName);
return model.getTypeDefinition(parts[1], parts[0]);
}
public static XSTypeDefinition getTypeUsingApproach2(XSModel model, String clarkName){
String parts[] = getParts(clarkName);
XSNamedMap map = model.getComponentsByNamespace(XSConstants.TYPE_DEFINITION, parts[0]);
return (XSTypeDefinition)map.itemByName(parts[0], parts[1]);
}
public static XSTypeDefinition getTypeUsingApproach2Corrected(XSModel model, String clarkName){
String parts[] = getParts(clarkName);
parts[0] = parts[0].intern();
parts[1] = parts[1].intern();
XSNamedMap map = model.getComponentsByNamespace(XSConstants.TYPE_DEFINITION, parts[0]);
return (XSTypeDefinition)map.itemByName(parts[0], parts[1]);
}
public static void runTest0(String uri) throws Exception{
XSModel model = readXSD(uri);
String clarkName = "{http://www.w3.org/2001/XMLSchema}string";
if(getTypeUsingApproach1(model, clarkName)==null)
System.err.println("test0 failed");
}
public static void runTest1(String uri) throws Exception{
XSModel model = readXSD(uri);
String clarkName = "{http://www.w3.org/2001/XMLSchema}string";
if(getTypeUsingApproach2(model, clarkName)==null)
System.err.println("test1 failed");
}
public static void runTest2(String uri) throws Exception{
XSModel model = readXSD(uri);
String clarkName = "{http://www.w3.org/2001/XMLSchema}string";
if(getTypeUsingApproach2Corrected(model, clarkName)==null)
System.err.println("test2 failed");
}
public static void runTest3(String uri) throws Exception{
XSModel model = readXSD(uri);
String clarkName = "{http://www.w3.org/2001/XMLSchema}string";
if(getTypeUsingApproach2(model, clarkName)==null)
System.err.println("test3a failed");
if(getTypeUsingApproach2Corrected(model, clarkName)==null)
System.err.println("test3b failed");
}
public static void runTest4(String uri) throws Exception{
XSModel model = readXSD(uri);
String clarkName = "{http://www.w3.org/2001/XMLSchema}string";
if(getTypeUsingApproach2Corrected(model, clarkName)==null)
System.err.println("test4a failed");
if(getTypeUsingApproach2(model, clarkName)==null)
System.err.println("test4b failed");
}
public static void main(String[] args) throws Exception{
if(args.length==0){
System.err.println("you must pass a schema file as first argument.");
return;
}
runTest0(args[0]);
runTest1(args[0]);
runTest2(args[0]);
runTest3(args[0]);
}
}
--- End Message ---
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]