/** * License Agreement for OpenSearchServer * * Copyright (C) 2012-2014 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.render; import com.jaeksoft.searchlib.SearchLibException; import com.jaeksoft.searchlib.function.expression.SyntaxError; import com.jaeksoft.searchlib.query.ParseException; import com.jaeksoft.searchlib.request.AbstractRequest; import com.jaeksoft.searchlib.result.AbstractResult; import com.jaeksoft.searchlib.web.ServletTransaction; import org.apache.commons.lang3.StringEscapeUtils; import java.io.IOException; import java.io.PrintWriter; import java.util.regex.Matcher; import java.util.regex.Pattern; public abstract class AbstractRenderXml<T1 extends AbstractRequest, T2 extends AbstractResult<T1>> extends AbstractRender<T1, T2> { final private Matcher controlMatcher; final private Matcher spaceMatcher; protected PrintWriter writer; protected AbstractRenderXml(T2 result) { super(result); Pattern p = Pattern.compile("\\p{Cntrl}+"); controlMatcher = p.matcher(""); p = Pattern.compile("\\p{Space}+"); spaceMatcher = p.matcher(""); } public abstract void render() throws Exception; protected String xmlTextRender(String text) { synchronized (controlMatcher) { controlMatcher.reset(text); text = controlMatcher.replaceAll(" "); } synchronized (spaceMatcher) { spaceMatcher.reset(text); text = spaceMatcher.replaceAll(" "); } return StringEscapeUtils.escapeXml11(text); } protected void renderPrefix(int status, String queryString) throws ParseException, SyntaxError, SearchLibException, IOException { writer.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); writer.println("<response>"); writer.println("<header>"); writer.print("<status>"); writer.print(status); writer.print("</status>"); if (queryString != null) { writer.print("<query>"); writer.print(StringEscapeUtils.escapeXml11(queryString)); writer.println("</query>"); } writer.println("</header>"); } protected void renderSuffix() { writer.println("</response>"); } final public void render(PrintWriter writer) throws Exception { this.writer = writer; render(); } @Override final public void render(ServletTransaction servletTransaction) throws Exception { servletTransaction.setResponseContentType("text/xml"); writer = servletTransaction.getWriter("UTF-8"); render(); } protected void renderTimers() { result.getTimer().writeXml(writer, request.getTimerMinTime(), request.getTimerMaxDepth()); } }