[ 
https://issues.apache.org/jira/browse/XMLSCHEMA-56?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Kevin updated XMLSCHEMA-56:
---------------------------
    Description: 
EDIT 9 May 2019: I have found the source of this bug. It is in the 
org.apache.ws.commons.schema.walker package. Here, both the XmlSchemaWalker and 
XmlSchemaScope classes use HashMaps to store XmlSchemas indexed by namespace. 
For example, in the XmlSchemaWalker's first constructor, each schema in the 
given XmlSchemaCollection (the argument) is added to schemasByNamespace (the 
HashMap). The problem is that if two or more xsd files have schemas with the 
same target namespace (which is legal, and indeed useful), and they are in the 
schema collection (e.g. one file is included by another using <xs:include>), 
each call to schemasByNamespace.put(namespace, schema) will overwrite the 
previously put schema for that namespace. Then, for example, when 
XmlSchemaScope looks up a schema by namespace and calls 
schema.getTypeByName(...) around line 326 that type will not be found unless it 
was defined in the last schema for that namespace to be stored in the Map. This 
results in the behaviour I reported, where an element in a base type (i.e. one 
which was extended using <xs:extension>) was not visited by the walker: the 
base type was not found because a schema with the same target namespace defined 
in an included xsd file was found in the map instead of the one defining the 
type.

One way to remedy this is for the schemasByNamespace member variables in both 
XmlSchemaWalker and XmlSchemaScope to store a list of schemas for each 
namespace, i.e. be a Map<String, List<XmlSchema>> rather than a Map<String, 
XmlSchema>. Then, whenever looking up, for example, a type defined in a schema 
with a certain namespace, access the list of XmlSchemas using 
schemasByNamespace.get(namespace), and then iterate through the list of schemas 
calling getTypeByName(...) until the type in question is found.

--- original bug report:

(EDIT: I have attached a new version of the project (walk2.tar) which takes the 
path to the xsd files as a command line argument. It should now be possible to 
use the .class files without recompiling.)

Hi,

I have a strange issue where the element in a base type (i.e. one which is 
extended by another type) is not visited by the xmlschema-walker. It is strange 
because it only happens in some instances of the test project (i.e. when I copy 
all project files to a new directory it will sometimes happen in that directory 
and sometimes not!). I cannot for the life of me discern a pattern.

This occurs with both 2.2.3 and 2.2.4 of xmlschema (core and walker). I am on 
openSUSE Leap 15 and openjdk 11 (but I've tried 1.8 and same thing happens).

Please see my attached tar file. There are two xsd files in the "xsd" 
directory. The first is "test.xsd". It defines a type "Test" which extends the 
type "Base". The type "Base" has an element "baseElement". The "test.xsd" file 
also includes another xsd file "unused.xsd" which is empty, but the behaviour 
also occurred when "unused.xsd" defined a used type, I just simplified that 
part away for this test. My java file "Main.java" creates an "XmlSchemaWalker" 
with a visitor "MyVisitor". "MyVisitor" prints the element name when it visits 
an element. The file "myOutput" shows what happens when I compile and run the 
test.

*The bug I'm seeing* is that "baseElement" is not visited by the visitor in 
some instances of the project. The root element ("test") is visited. If 
"baseElement" is visited when you test the project, please create a few 
directories, copy the project files into each, and see if you can reproduce the 
error (this is what I mean by "instances" of the project). *NOTE:* you must 
provide as an argument to the program the full path to the xsd files which are 
in the "xsd" subdirectory of the project. You'll also need xmlschema-core and 
xmlschema-walker jar files on the classpath.

I hope you can reproduce the bug. Please let me know if you need more info.

cheers,

Kevin.

 

  was:
(EDIT: I have attached a new version of the project (walk2.tar) which takes the 
path to the xsd files as a command line argument. It should now be possible to 
use the .class files without recompiling.)

Hi,

I have a strange issue where the element in a base type (i.e. one which is 
extended by another type) is not visited by the xmlschema-walker. It is strange 
because it only happens in some instances of the test project (i.e. when I copy 
all project files to a new directory it will sometimes happen in that directory 
and sometimes not!). I cannot for the life of me discern a pattern.

This occurs with both 2.2.3 and 2.2.4 of xmlschema (core and walker). I am on 
openSUSE Leap 15 and openjdk 11 (but I've tried 1.8 and same thing happens).

Please see my attached tar file. There are two xsd files in the "xsd" 
directory. The first is "test.xsd". It defines a type "Test" which extends the 
type "Base". The type "Base" has an element "baseElement". The "test.xsd" file 
also includes another xsd file "unused.xsd" which is empty, but the behaviour 
also occurred when "unused.xsd" defined a used type, I just simplified that 
part away for this test. My java file "Main.java" creates an "XmlSchemaWalker" 
with a visitor "MyVisitor". "MyVisitor" prints the element name when it visits 
an element. The file "myOutput" shows what happens when I compile and run the 
test.

*The bug I'm seeing* is that "baseElement" is not visited by the visitor in 
some instances of the project. The root element ("test") is visited. If 
"baseElement" is visited when you test the project, please create a few 
directories, copy the project files into each, and see if you can reproduce the 
error (this is what I mean by "instances" of the project). *NOTE:* you must 
provide as an argument to the program the full path to the xsd files which are 
in the "xsd" subdirectory of the project. You'll also need xmlschema-core and 
xmlschema-walker jar files on the classpath.

I hope you can reproduce the bug. Please let me know if you need more info.

cheers,

Kevin.

 


> Element defined in a base type sometimes isn't visited by an 
> XmlSchemaWalker's visitor
> --------------------------------------------------------------------------------------
>
>                 Key: XMLSCHEMA-56
>                 URL: https://issues.apache.org/jira/browse/XMLSCHEMA-56
>             Project: XmlSchema
>          Issue Type: Bug
>    Affects Versions: 2.2.3, 2.2.4
>         Environment: openSUSE Leap 15
> open-jdk 11 (but I've tried 1.8 and same thing happens)
> xmlschema 2.2.3 and 2.2.4 (core and walker)
>            Reporter: Kevin
>            Priority: Major
>         Attachments: walk2.tar
>
>
> EDIT 9 May 2019: I have found the source of this bug. It is in the 
> org.apache.ws.commons.schema.walker package. Here, both the XmlSchemaWalker 
> and XmlSchemaScope classes use HashMaps to store XmlSchemas indexed by 
> namespace. For example, in the XmlSchemaWalker's first constructor, each 
> schema in the given XmlSchemaCollection (the argument) is added to 
> schemasByNamespace (the HashMap). The problem is that if two or more xsd 
> files have schemas with the same target namespace (which is legal, and indeed 
> useful), and they are in the schema collection (e.g. one file is included by 
> another using <xs:include>), each call to schemasByNamespace.put(namespace, 
> schema) will overwrite the previously put schema for that namespace. Then, 
> for example, when XmlSchemaScope looks up a schema by namespace and calls 
> schema.getTypeByName(...) around line 326 that type will not be found unless 
> it was defined in the last schema for that namespace to be stored in the Map. 
> This results in the behaviour I reported, where an element in a base type 
> (i.e. one which was extended using <xs:extension>) was not visited by the 
> walker: the base type was not found because a schema with the same target 
> namespace defined in an included xsd file was found in the map instead of the 
> one defining the type.
> One way to remedy this is for the schemasByNamespace member variables in both 
> XmlSchemaWalker and XmlSchemaScope to store a list of schemas for each 
> namespace, i.e. be a Map<String, List<XmlSchema>> rather than a Map<String, 
> XmlSchema>. Then, whenever looking up, for example, a type defined in a 
> schema with a certain namespace, access the list of XmlSchemas using 
> schemasByNamespace.get(namespace), and then iterate through the list of 
> schemas calling getTypeByName(...) until the type in question is found.
> --- original bug report:
> (EDIT: I have attached a new version of the project (walk2.tar) which takes 
> the path to the xsd files as a command line argument. It should now be 
> possible to use the .class files without recompiling.)
> Hi,
> I have a strange issue where the element in a base type (i.e. one which is 
> extended by another type) is not visited by the xmlschema-walker. It is 
> strange because it only happens in some instances of the test project (i.e. 
> when I copy all project files to a new directory it will sometimes happen in 
> that directory and sometimes not!). I cannot for the life of me discern a 
> pattern.
> This occurs with both 2.2.3 and 2.2.4 of xmlschema (core and walker). I am on 
> openSUSE Leap 15 and openjdk 11 (but I've tried 1.8 and same thing happens).
> Please see my attached tar file. There are two xsd files in the "xsd" 
> directory. The first is "test.xsd". It defines a type "Test" which extends 
> the type "Base". The type "Base" has an element "baseElement". The "test.xsd" 
> file also includes another xsd file "unused.xsd" which is empty, but the 
> behaviour also occurred when "unused.xsd" defined a used type, I just 
> simplified that part away for this test. My java file "Main.java" creates an 
> "XmlSchemaWalker" with a visitor "MyVisitor". "MyVisitor" prints the element 
> name when it visits an element. The file "myOutput" shows what happens when I 
> compile and run the test.
> *The bug I'm seeing* is that "baseElement" is not visited by the visitor in 
> some instances of the project. The root element ("test") is visited. If 
> "baseElement" is visited when you test the project, please create a few 
> directories, copy the project files into each, and see if you can reproduce 
> the error (this is what I mean by "instances" of the project). *NOTE:* you 
> must provide as an argument to the program the full path to the xsd files 
> which are in the "xsd" subdirectory of the project. You'll also need 
> xmlschema-core and xmlschema-walker jar files on the classpath.
> I hope you can reproduce the bug. Please let me know if you need more info.
> cheers,
> Kevin.
>  



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to