[ 
https://issues.apache.org/jira/browse/ARTEMIS-747?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15515833#comment-15515833
 ] 

ASF GitHub Bot commented on ARTEMIS-747:
----------------------------------------

Github user TomasHofman commented on a diff in the pull request:

    https://github.com/apache/activemq-artemis/pull/791#discussion_r80204402
  
    --- Diff: 
artemis-cli/src/main/java/org/apache/activemq/artemis/cli/commands/tools/XmlDataImporter.java
 ---
    @@ -444,33 +444,59 @@ private void processMessageBody(Message message) 
throws XMLStreamException, IOEx
              }
           }
           reader.next();
    +      ActiveMQServerLogger.LOGGER.debug("XMLStreamReader impl: " + reader);
           if (isLarge) {
              tempFileName = UUID.randomUUID().toString() + ".tmp";
              ActiveMQServerLogger.LOGGER.debug("Creating temp file " + 
tempFileName + " for large message.");
              try (OutputStream out = new FileOutputStream(tempFileName)) {
    -            while (reader.hasNext()) {
    -               if (reader.getEventType() == 
XMLStreamConstants.END_ELEMENT) {
    -                  break;
    -               }
    -               else {
    -                  String characters = new 
String(reader.getTextCharacters(), reader.getTextStart(), 
reader.getTextLength());
    -                  String trimmedCharacters = characters.trim();
    -                  if (trimmedCharacters.length() > 0) { // this will skip 
"indentation" characters
    -                     byte[] data = decode(trimmedCharacters);
    -                     out.write(data);
    -                  }
    -               }
    -               reader.next();
    -            }
    +            getMessageBodyBytes(new MessageBodyBytesProcessor() {
    +               @Override
    +               public void processBodyBytes(byte[] bytes) throws 
IOException {
    +                  out.write(bytes);
    +               }
    +            });
              }
              FileInputStream fileInputStream = new 
FileInputStream(tempFileName);
              BufferedInputStream bufferedInput = new 
BufferedInputStream(fileInputStream);
              ((ClientMessage) message).setBodyInputStream(bufferedInput);
           }
           else {
    -         reader.next(); // step past the "indentation" characters to get 
to the CDATA with the message body
    -         String characters = new String(reader.getTextCharacters(), 
reader.getTextStart(), reader.getTextLength());
    -         message.getBodyBuffer().writeBytes(decode(characters.trim()));
    +         getMessageBodyBytes(new MessageBodyBytesProcessor() {
    +            @Override
    +            public void processBodyBytes(byte[] bytes) throws IOException {
    +               message.getBodyBuffer().writeBytes(bytes);
    +            }
    +         });
    +      }
    +   }
    +
    +   /**
    +    * Message bodies are written to XML as Base64 encoded CDATA elements. 
Some parser implementations won't read the
    +    * entire CDATA element at once (e.g. Woodstox) so it's possible for 
multiple CDATA events to be combined into a
    +    * single Base64 encoded string.  You can't decode bits and pieces of 
each CDATA.  Each CDATA has to be decoded in
    +    * its entirety.
    +    *
    +    * @param processor used to deal with the decoded CDATA elements
    +    * @throws IOException
    +    * @throws XMLStreamException
    +    */
    +   private void getMessageBodyBytes(MessageBodyBytesProcessor processor) 
throws IOException, XMLStreamException {
    +      int currentEventType;
    +      StringBuilder cdata = new StringBuilder();
    +      while (reader.hasNext()) {
    +         currentEventType = reader.getEventType();
    +         if (currentEventType == XMLStreamConstants.END_ELEMENT) {
    +            break;
    +         }
    +         // when we hit a CHARACTERS event we know that the entire CDATA 
is complete so decode and pass back to the processor
    +         else if (currentEventType == XMLStreamConstants.CHARACTERS && 
cdata.length() > 0) {
    --- End diff --
    
    Although the problem would only occur if JDK's STAX implementation happened 
to fragment the the CDATA, which it (probably?) doesn't do. So it may be OK how 
it is.


> Multiple CDATA events during import fails
> -----------------------------------------
>
>                 Key: ARTEMIS-747
>                 URL: https://issues.apache.org/jira/browse/ARTEMIS-747
>             Project: ActiveMQ Artemis
>          Issue Type: Bug
>    Affects Versions: 1.4.0
>            Reporter: Justin Bertram
>            Assignee: Justin Bertram
>
> Message bodies are written to XML as Base64 encoded CDATA elements. Some 
> parser implementations won't read the entire CDATA element at once (e.g. 
> Woodstox) so it's possible for multiple CDATA events to be combined into a 
> single Base64 encoded string.  You can't decode bits and pieces of each 
> CDATA.  Each CDATA has to be decoded in its entirety.  The current importer 
> doesn't deal with this properly.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to