XMLBEANS-528: Allow document locator to be set after initialization

git-svn-id: https://svn.apache.org/repos/asf/xmlbeans/trunk@1851650 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/CHANGES.txt b/CHANGES.txt
index facdaa7..1328839 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,5 +1,6 @@
 Changes in V3.0.3 since V3.0.2
 
+* XMLBEANS-528: Allow document locator to be set after initialization
 * XMLBEANS-527: Rename shell script directory, to align on typical directory layout
 
 Changes in V3.0.2 since V3.0.1
diff --git a/src/store/org/apache/xmlbeans/impl/store/Locale.java b/src/store/org/apache/xmlbeans/impl/store/Locale.java
index 7e559c6..e63466d 100755
--- a/src/store/org/apache/xmlbeans/impl/store/Locale.java
+++ b/src/store/org/apache/xmlbeans/impl/store/Locale.java
@@ -3080,6 +3080,19 @@
     private static abstract class SaxHandler
         implements ContentHandler, LexicalHandler , DeclHandler, DTDHandler
     {
+        protected Locale _locale;
+
+        protected LoadContext _context;
+
+        private boolean _wantLineNumbers;
+        private boolean _wantLineNumbersAtEndElt;
+        private boolean _wantCdataBookmarks;
+        private Locator _startLocator;
+        private boolean _insideCDATA = false;
+        private int _entityBytesLimit = 10240;
+        private int _entityBytes = 0;
+        private int _insideEntity = 0;
+
         SaxHandler(Locator startLocator)
         {
             _startLocator = startLocator;
@@ -3090,26 +3103,20 @@
             this(null);
         }
 
-        void initSaxHandler(Locale l, XmlOptions options)
+        void initSaxHandler(Locale l, final XmlOptions options)
         {
             _locale = l;
 
-            options = XmlOptions.maskNull(options);
+            XmlOptions safeOptions = XmlOptions.maskNull(options);
 
-            _context = new Cur.CurLoadContext(_locale, options);
+            _context = new Cur.CurLoadContext(_locale, safeOptions);
 
-            _wantLineNumbers =
-                _startLocator != null &&
-                options.hasOption(XmlOptions.LOAD_LINE_NUMBERS);
-            _wantLineNumbersAtEndElt =
-                _startLocator != null &&
-                options.hasOption(XmlOptions.LOAD_LINE_NUMBERS_END_ELEMENT);
-            _wantCdataBookmarks =
-                _startLocator != null &&
-                options.hasOption(XmlOptions.LOAD_SAVE_CDATA_BOOKMARKS);
+            _wantLineNumbers = safeOptions.hasOption(XmlOptions.LOAD_LINE_NUMBERS);
+            _wantLineNumbersAtEndElt = safeOptions.hasOption(XmlOptions.LOAD_LINE_NUMBERS_END_ELEMENT);
+            _wantCdataBookmarks = safeOptions.hasOption(XmlOptions.LOAD_SAVE_CDATA_BOOKMARKS);
 
-            if (options.hasOption(XmlOptions.LOAD_ENTITY_BYTES_LIMIT))
-                _entityBytesLimit = ((Integer)(options.get(XmlOptions.LOAD_ENTITY_BYTES_LIMIT))).intValue();
+            if (safeOptions.hasOption(XmlOptions.LOAD_ENTITY_BYTES_LIMIT))
+                _entityBytesLimit = (Integer) (safeOptions.get(XmlOptions.LOAD_ENTITY_BYTES_LIMIT));
         }
 
         public void startDocument()
@@ -3145,7 +3152,7 @@
 
             _context.startElement(_locale.makeQualifiedQName(uri, qName));
 
-            if (_wantLineNumbers)
+            if (_wantLineNumbers && _startLocator != null)
             {
                 _context.bookmark(
                     new XmlLineNumber(_startLocator.getLineNumber(),
@@ -3212,7 +3219,7 @@
             throws SAXException
         {
             _context.endElement();
-            if (_wantLineNumbersAtEndElt)
+            if (_wantLineNumbersAtEndElt && _startLocator != null)
             {
                 _context.bookmark(
                     new XmlLineNumber(_startLocator.getLineNumber(),
@@ -3225,7 +3232,7 @@
         {
             _context.text(ch, start, length);
 
-            if (_wantCdataBookmarks && _insideCDATA)
+            if (_wantCdataBookmarks && _insideCDATA && _startLocator != null)
                 _context.bookmarkLastNonAttr(CDataBookmark.CDATA_BOOKMARK);
 
             if (_insideEntity!=0)
@@ -3233,7 +3240,7 @@
                 if ((_entityBytes += length) > _entityBytesLimit)
                 {
                     XmlError err = XmlError.forMessage(XmlErrorCodes.EXCEPTION_EXCEEDED_ENTITY_BYTES,
-                            new Integer[]{ new Integer(_entityBytesLimit) });
+                            new Integer[]{_entityBytesLimit});
 
                     throw new SAXException(err.getMessage());
                 }
@@ -3325,10 +3332,12 @@
             }
         }
 
-        public void setDocumentLocator(Locator locator)
-        {
-            // TODO - for non-Piccolo use cases, use a locator to get line numbers
+        public void setDocumentLocator(Locator locator) {
+            if (_startLocator == null) {
+                _startLocator = locator;
+            }
         }
+
         //DeclHandler
         public void attributeDecl(String eName, String aName, String type, String valueDefault, String value){
              if (type.equals("ID")){
@@ -3347,18 +3356,6 @@
         }
         public void unparsedEntityDecl(String name, String publicId, String systemId, String notationName){
         }
-        protected Locale _locale;
-
-        protected LoadContext _context;
-
-        private boolean _wantLineNumbers;
-        private boolean _wantLineNumbersAtEndElt;
-        private boolean _wantCdataBookmarks;
-        private Locator _startLocator;
-        private boolean _insideCDATA = false;
-        private int _entityBytesLimit = 10240;
-        private int _entityBytes = 0;
-        private int _insideEntity = 0;
     }
 
     private static abstract class SaxLoader