diff --git a/src/altk/comm/engine/XMLDOMBroadcast.java b/src/altk/comm/engine/XMLDOMBroadcast.java index 4dd62e4..07fc7da 100644 --- a/src/altk/comm/engine/XMLDOMBroadcast.java +++ b/src/altk/comm/engine/XMLDOMBroadcast.java @@ -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)