public synchronized void returnParser(SAXParser parser) { try { if (!resetChecked) { try { parser.getClass().getDeclaredMethod("reset", (Class[]) null); resetAvailable = true; } catch (NoSuchMethodException e) { resetAvailable = false; } resetChecked = true; } if (resetAvailable) { parser.reset(); parsers.push(parser); } else if (USE_INTERNAL_PARSER_IMPL) { ((XmlRpcSaxParser) parser).reset(); parsers.push(parser); } } catch (Exception e) { e.printStackTrace(); // TODO log properly } }
private final Document parseTemplateUsingPool( final Configuration configuration, final String documentName, final Reader reader, final ResourcePool<SAXParser> poolToBeUsed) { final SAXParser saxParser = poolToBeUsed.allocate(); final TemplatePreprocessingReader templateReader = (reader instanceof TemplatePreprocessingReader ? (TemplatePreprocessingReader) reader : new TemplatePreprocessingReader(reader, 8192)); try { /* * Parse the document */ final Document document = doParse(configuration, documentName, templateReader, saxParser); if (this.canResetParsers) { try { /* * Reset the parser so that it can be used again. */ saxParser.reset(); } catch (final UnsupportedOperationException e) { if (this.logger.isWarnEnabled()) { this.logger.warn( "[THYMELEAF] The SAX Parser implementation being used (\"{}\") does not implement " + "the \"reset\" operation. This will force Thymeleaf to re-create parser instances " + "each time they are needed for parsing templates, which is more costly. Enabling template " + "cache is recommended, and also using a parser library which implements \"reset\" such as " + "xerces version 2.9.1 or newer.", saxParser.getClass().getName()); } this.canResetParsers = false; } } return document; } catch (final IOException e) { throw new TemplateInputException("Exception parsing document", e); } catch (final TemplateProcessingException e) { throw e; } catch (final SAXParseException e) { final String message = String.format( "Exception parsing document: template=\"%s\", line %d - column %d", documentName, Integer.valueOf(e.getLineNumber()), Integer.valueOf(e.getColumnNumber())); throw new TemplateInputException(message, e); } catch (final SAXException e) { throw new TemplateInputException("Exception parsing document", e); } finally { if (this.canResetParsers) { poolToBeUsed.release(saxParser); } else { poolToBeUsed.discardAndReplace(saxParser); } } }