/**   
 * License Agreement for OpenSearchServer
 *
 * Copyright (C) 2012-2015 Emmanuel Keller / Jaeksoft
 * 
 * http://www.open-search-server.com
 * 
 * This file is part of OpenSearchServer.
 *
 * OpenSearchServer is free software: you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 * OpenSearchServer is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with OpenSearchServer. 
 *  If not, see <http://www.gnu.org/licenses/>.
 **/
package com.jaeksoft.searchlib.parser;

import java.io.IOException;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import com.jaeksoft.searchlib.SearchLibException;
import com.jaeksoft.searchlib.analysis.ClassPropertyEnum;
import com.jaeksoft.searchlib.analysis.LanguageEnum;
import com.jaeksoft.searchlib.streamlimiter.StreamLimiter;

public class XmlParser extends Parser {

	public static final String[] DEFAULT_MIMETYPES = { "application/xml" };

	public static final String[] DEFAULT_EXTENSIONS = { "xml" };

	private static ParserFieldEnum[] fl = { ParserFieldEnum.parser_name,
			ParserFieldEnum.content };

	public XmlParser() {
		super(fl);
	}

	@Override
	public void initProperties() throws SearchLibException {
		super.initProperties();
		addProperty(ClassPropertyEnum.SIZE_LIMIT, "0", null, 20, 1);
	}

	@Override
	protected void parseContent(StreamLimiter streamLimiter, LanguageEnum lang)
			throws IOException {

		try {
			final ParserResultItem result = getNewParserResultItem();
			final StringBuilder stringBuilder = new StringBuilder();
			SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
			SAXParser saxParser = saxParserFactory.newSAXParser();

			DefaultHandler handler = new DefaultHandler() {

				@Override
				public void startElement(String uri, String localName,
						String qName, Attributes attributes) {
					stringBuilder.setLength(0);
				}

				@Override
				public void endElement(String uri, String localName,
						String qName) {
					if (stringBuilder.length() > 0) {
						String t = stringBuilder.toString().trim();
						result.addField(ParserFieldEnum.content, t);
					}
				}

				@Override
				public void characters(char ch[], int start, int length)
						throws SAXException {
					stringBuilder.append(ch, start, length);
				}
			};
			saxParser.parse(new InputSource(streamLimiter.getNewInputStream()),
					handler);
		} catch (ParserConfigurationException e) {
			throw new IOException(e);
		} catch (SAXException e) {
			throw new IOException(e);
		}

	}
}

@@ -1,10 +1,7 @@
 /**
-   
 %0A * 
@@ -41,16 +41,20 @@
 erver%0A *
+ %3Cp%3E
 %0A * Copy
@@ -99,24 +99,27 @@
 Jaeksoft%0A * 
+%3Cp%3E
 %0A * http://w
@@ -147,16 +147,19 @@
 .com%0A * 
+%3Cp%3E
 %0A * This
@@ -191,24 +191,28 @@
 chServer.%0A *
+ %3Cp%3E
 %0A * OpenSear
@@ -419,17 +419,16 @@
 e, or%0A *
- 
  (at you
@@ -454,24 +454,28 @@
  version.%0A *
+ %3Cp%3E
 %0A * OpenSear
@@ -715,20 +715,23 @@
 ails.%0A *
+ %3Cp%3E
 %0A *
- 
  You sho
@@ -791,17 +791,16 @@
 cense%0A *
- 
  along w
@@ -824,13 +824,11 @@
 ver.
- 
 %0A *
- 
  If 
@@ -924,18 +924,40 @@
 ort 
-java.io.IO
+com.jaeksoft.searchlib.SearchLib
 Exce
@@ -967,144 +967,178 @@
 on;%0A
-%0A
 import 
-javax.xml.parsers.ParserConfigurationException;%0Aimport javax.xml.parsers.SAXParser;%0Aimport javax.xml.pars
+com.jaeksoft.searchlib.analysis.ClassPropertyEnum;%0Aimport com.jaeksoft.searchlib.analysis.LanguageEnum;%0Aimport com.jaeksoft.searchlib.streamlimit
 er
-s
 .S
-AXParserFactory
+treamLimiter
 ;%0A
-%0A
 impo
@@ -1284,219 +1284,161 @@
 ort 
-com.jaeksoft.searchlib.SearchLibException;%0Aimport com.jaeksoft.searchlib.analysis.ClassPropertyEnum;%0Aimport com.jaeksoft.searchlib.analysis.LanguageEnum;%0Aimport com.jaeksoft.searchlib.streamlimiter.StreamLimiter
+javax.xml.parsers.ParserConfigurationException;%0Aimport javax.xml.parsers.SAXParser;%0Aimport javax.xml.parsers.SAXParserFactory;%0Aimport java.io.IOException
 ;%0A%0Ap
@@ -1683,20 +1683,17 @@
 er_name,
-%0A%09%09%09
+ 
 ParserFi
@@ -2000,20 +2000,17 @@
 um lang)
-%0A%09%09%09
+ 
 throws I
@@ -2219,24 +2219,118 @@
 Instance();%0A
+%09%09%09saxParserFactory.setFeature(%22http://apache.org/xml/features/disallow-doctype-decl%22, true);%0A
 %09%09%09SAXParser
@@ -2492,39 +2492,33 @@
 tring localName,
-%0A%09%09%09%09%09%09
+ 
 String qName, At
@@ -2650,23 +2650,17 @@
 calName,
-%0A%09%09%09%09%09%09
+ 
 String q
@@ -2895,23 +2895,17 @@
  length)
-%0A%09%09%09%09%09%09
+ 
 throws S
@@ -3046,22 +3046,17 @@
 ream()),
-%0A%09%09%09%09%09
+ 
 handler)
@@ -3101,53 +3101,10 @@
 ion 
-e) %7B%0A%09%09%09throw new IOException(e);%0A%09%09%7D catch (
+%7C 
 SAXE

Fix #1904 - XmlParser may hang