You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@ws.apache.org by "Kevin (JIRA)" <ji...@apache.org> on 2019/05/09 07:20:00 UTC

[jira] [Updated] (XMLSCHEMA-56) Element defined in a base type sometimes isn't visited by an XmlSchemaWalker's visitor

     [ 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: dev-unsubscribe@ws.apache.org
For additional commands, e-mail: dev-help@ws.apache.org