XmlPositionCorrectionHandler.java
01 /*
02  *  XmlPositionCorrectionHandler.java
03  *
04  *  Copyright (c) 1995-2012, The University of Sheffield. See the file
05  *  COPYRIGHT.txt in the software or at http://gate.ac.uk/gate/COPYRIGHT.txt
06  *
07  *  This file is part of GATE (see http://gate.ac.uk/), and is free
08  *  software, licenced under the GNU Library General Public License,
09  *  Version 2, June 1991 (in the distribution as file licence.html,
10  *  and also available at http://gate.ac.uk/gate/licence.html).
11  *
12  *  Angel Kirilov,  4 January 2002
13  *
14  *  $Id: XmlPositionCorrectionHandler.java 17605 2014-03-09 10:15:34Z markagreenwood $
15  */
16 
17 package gate.xml;
18 
19 import org.xml.sax.helpers.DefaultHandler;
20 
21 
22 /**
23  * This class correct a Xerces parser bug in reported position in file during
24  * the parsing process. Xerces parser cut processed file to 16K peaces. If
25  * the parser cross the 16K border reported in the characters() position is
26  * zerro.
27  *
28  * This bug could be covered if you extend this content handler instead of
29  * org.xml.sax.helpers.DefaultHandler.
30  *
31  * The real content handler should call methods startDocument() and characters()
32  * in order to compute correct position in file. The corrected position could be
33  * received throug protected data member m_realOffset or with getRealOffset().
34  */
35 public class XmlPositionCorrectionHandler extends DefaultHandler {
36 
37   /**
38    * Variables for correction of 16K parser limit for offset
39    */
40   protected long m_realOffset;
41   private int m_lastPosition;
42   private int m_lastSize;
43   private int m_multiplyer;
44 
45   /** Constructor for initialization of variables */
46   public XmlPositionCorrectionHandler() {
47     m_realOffset = 0;
48     m_lastPosition = 0;
49     m_lastSize = 0;
50     m_multiplyer = 0;
51   // XmlPositionCorrectionHandler
52 
53   /** Initialization of variables on start of document parsing */
54   @Override
55   public void startDocument() throws org.xml.sax.SAXException {
56     m_realOffset = 0;
57     m_lastPosition = 0;
58     m_lastSize = 0;
59     m_multiplyer = 0;
60   // startDocument
61 
62   /** Return corrected offset for last characters() call */
63   public long getRealOffset() {
64     return m_realOffset;
65   // getRealOffset
66 
67   /** Here is the correction of the Xerces parser bug. */
68   @Override
69   public void characters(char[] text, int offset, int len)
70                   throws org.xml.sax.SAXException {
71     if(offset == && len == && text.length <= 2) {
72         // unicode char or &xxx; coding
73         return;
74     // if
75 
76     // There is 16K limit for offset. Here is the correction.
77     // Will catch the bug in most cases.
78     if(m_lastPosition - offset > 0x2000
79         || (offset == && m_lastSize+m_lastPosition > 0x3000) ) {
80         m_multiplyer++;
81     }
82     m_lastPosition = offset;
83     m_lastSize = len;
84     m_realOffset = m_multiplyer*0x4000+offset;
85   // characters
86 
87 // XmlPositionCorrectionHandler