You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@johnzon.apache.org by "Romain Manni-Bucau (JIRA)" <ji...@apache.org> on 2018/11/11 17:04:00 UTC

[jira] [Resolved] (JOHNZON-194) Issue 190 -> Issues when call close method more than twice using Queue as buffer strategy.

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

Romain Manni-Bucau resolved JOHNZON-194.
----------------------------------------
       Resolution: Fixed
         Assignee: Romain Manni-Bucau
    Fix Version/s: 1.1.11

Fixed in JsonParser

Side note: I'm not convinced a Buffer class would help. These close methods are not intended to be called multiple times. If done it is a bug in the caller code and even if the buffers are protected against that it can have side effects anyway so probably better to stick with current approach IMHO.

> Issue 190 -> Issues when call close method more than twice using Queue as buffer strategy.
> ------------------------------------------------------------------------------------------
>
>                 Key: JOHNZON-194
>                 URL: https://issues.apache.org/jira/browse/JOHNZON-194
>             Project: Johnzon
>          Issue Type: Improvement
>            Reporter: Steve Hubert
>            Assignee: Romain Manni-Bucau
>            Priority: Major
>             Fix For: 1.1.11
>
>
> Hello,
> Issue 190 is not completely solved.
> The writer has been fixed but not the parser.
> Note that I didn't check if there are some other places where a user may corrupt a BufferProvider.
> The issue is also reproducible via the maintenance_1.0x branch.
> Now a jonhzon buffer is just a char[] or a StringBuffer.
> It has neither state (open/close) nor methods to hide the BufferProvider logic.
> A way to protect johnzon  against this bugs family is to add a Buffer.java class.
> This new Buffer.java could be responsible to store the state and encapsulate the BufferProvider stuff.
> Bonus point this class may also contain some methods to write into the buffer and to fill it from an external source.
> As of today these methods are spread into the parser and the writer.
> I understand this refactoring is a lot of work and it may not be worth the effort.
>  
> The code below shows the issue.
> {code:java}
> public class App {
>     public static void parse(final JsonParser parser) {
>         Event e;
>         do {
>             e = parser.next();
>             switch (e) {
>             case KEY_NAME:
>                 System.out.println("KEY_NAME: " + parser.getString());
>                 break;
>             case VALUE_STRING:
>                 System.out.println("VALUE_STRING: " + parser.getString());
>                 break;
>             default:
>                 break;
>             }
>         } while (parser.hasNext());
>     }
>     public static void main(final String[] args) throws Exception {
>         final String jsonText1 = "{\"name\":\"App_1\", \"value\":\"value_1\"}";
>         final String jsonText2 = "{\"name\":\"App_2\", \"value\":\"value_2\"}";
>         final JsonParser jsonParser = Json.createParser(new ByteArrayInputStream(jsonText1.getBytes()));
>         jsonParser.close();
>         jsonParser.close();
>         final JsonParser jsonParser1 = Json.createParser(new ByteArrayInputStream(jsonText1.getBytes()));
>         jsonParser1.next();   // write jsonParser1 buffer
>         final JsonParser jsonParser2 = Json.createParser(new ByteArrayInputStream(jsonText2.getBytes()));
>         jsonParser2.next();   // overwrite jsonParser1 buffer
>         System.out.println("\nParse: " + jsonText1);
>         parse(jsonParser1);
>         System.out.println("\nParse: " + jsonText2);
>         parse(jsonParser2);
>         jsonParser1.close();
>         jsonParser2.close();
>     }
> }
>  {code}
> Output:
> {code:java}
> Parse: {"name":"App_1", "value":"value_1"}
> KEY_NAME: name
> VALUE_STRING: App_2
> KEY_NAME: value
> VALUE_STRING: value_2
> Parse: {"name":"App_2", "value":"value_2"}
> KEY_NAME: name
> VALUE_STRING: App_2
> KEY_NAME: value
> VALUE_STRING: value_2
> {code}
> Best regards



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