Sfoglia il codice sorgente

Enhance performance by correcting malformed UTF-8 characters in request XML.

tags/Production_5_12_2012
ymlam 13 anni fa
parent
commit
4a4c08e154
1 ha cambiato i file con 19 aggiunte e 33 eliminazioni
  1. +19
    -33
      src/altk/comm/engine/XMLDOMBroadcast.java

+ 19
- 33
src/altk/comm/engine/XMLDOMBroadcast.java Vedi File

@@ -1,9 +1,14 @@
package altk.comm.engine;

import java.io.ByteArrayInputStream;
import java.io.CharArrayReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;
import java.nio.charset.CodingErrorAction;
import java.util.HashMap;
import java.util.Map;
import java.util.Vector;
@@ -12,9 +17,6 @@ import java.util.zip.ZipInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpressionException;
@@ -27,7 +29,6 @@ import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import altk.comm.engine.exception.BroadcastError;
import altk.comm.engine.exception.BroadcastException;
@@ -100,43 +101,29 @@ public abstract class XMLDOMBroadcast extends Broadcast
{
inb = request.getInputStream();
}
/*
// alternate code to find out where are the offending characters in input
myLogger.info("Begin parsing");
SAXParser parser;
try
{
parser = SAXParserFactory.newInstance().newSAXParser();
// constructs an empty ArrayList for use by parser.
// Convert InputStream inb into InputSource, using the UTF-8
// character set, and for use by SAX parser
InputSource is = new InputSource(new InputStreamReader(inb, "UTF-8"));
DefaultHandler parserHandler = new DefaultHandler();
parser.parse(is, parserHandler);
}
catch (ParserConfigurationException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
*/

int contentLength = request.getContentLength();
CommonLogger.activity.info("Receiving " + contentLength + " bytes of data");
byte[] content = new byte[contentLength];
byte[] byteContent = new byte[contentLength];
int offset = 0;
int length = contentLength;
int read;
while (length > 0)
{
read = inb.read(content, offset, length);
read = inb.read(byteContent, offset, length);
if (read < 0) break;
offset += read;
length -= read;
}
CommonLogger.activity.info("Received: " + new String(content, "UTF-8"));
xmlDoc = builder.parse(new ByteArrayInputStream(content), "UTF-8");

// Clean content off bad UTF-8 characters.
Charset utf8Charset = Charset.forName("UTF-8");
CharsetDecoder utf8Decoder = utf8Charset.newDecoder();
utf8Decoder.onMalformedInput(CodingErrorAction.REPLACE).onUnmappableCharacter(CodingErrorAction.REPLACE);
CharBuffer charContent = utf8Decoder.decode(ByteBuffer.wrap(byteContent));
CommonLogger.activity.info("Received: " + charContent);
//Do not use this, as it can be killed by non UTF=8 chars: xmlDoc = builder.parse(new ByteArrayInputStream(byteContent), "UTF-8");
xmlDoc = builder.parse(new InputSource(new CharArrayReader(charContent.array())));
}
catch (SAXException e)
{
@@ -144,10 +131,9 @@ public abstract class XMLDOMBroadcast extends Broadcast
}
catch (IOException e)
{
throw new BroadcastException(BroadcastError.READ_REQUEST_ERROR, "Problem in reading request");
throw new BroadcastException(BroadcastError.READ_REQUEST_ERROR, "Problem in reading request: " + e.getMessage());
}

//String xpath = "//" + broadcastName; // get all first level elements
NodeList broadcastNodes = null;
broadcastNodes = xmlDoc.getElementsByTagName(broadcastType);
if (broadcastNodes.getLength() == 0)


Caricamento…
Annulla
Salva