/* See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * Esri Inc. licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.esri.gpt.control.rest.search; import java.io.IOException; import java.io.PrintWriter; import java.util.logging.Level; import java.util.logging.Logger; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.esri.gpt.framework.jsf.MessageBroker; /** * The Class SearchPageDistributedAdp. */ public class DistributedAdpSearchPageWriter implements ISearchListener { // class variable ============================================================== /** Class logger **/ private static final Logger LOG = Logger .getLogger(DistributedAdpSearchPageWriter.class.getCanonicalName()); // instance variables ========================================================== /** The servlet Request. **/ private volatile HttpServletRequest _servletRequest; /** The servlet response. **/ private volatile HttpServletResponse _servletResponse; private volatile boolean _stopFurtherResponseWrites; private MessageBroker _messageBroker; // properties ================================================================== /** * The messageBroker * *@param messageBroker */ public void setMessageBroker(MessageBroker messageBroker) { this._messageBroker = messageBroker; } /** * Gets the message broker. * * @return the message broker */ private MessageBroker getMessageBroker() { return this._messageBroker; } /** * Gets the servlet request. * * @return the servlet request */ public HttpServletRequest getServletRequest() { return _servletRequest; } /** * Sets the servlet request. * * @param servletRequest * the new servlet request */ public void setServletRequest(HttpServletRequest servletRequest) { this._servletRequest = servletRequest; } /** * Gets the servlet response. * * @return the servlet response */ public HttpServletResponse getServletResponse() { return _servletResponse; } /** * Sets the servlet response. * * @param servletResponse * the new servlet response */ public void setServletResponse(HttpServletResponse servletResponse) { this._servletResponse = servletResponse; } // methods ================================================================= /** * Instantiates a new search page distributed adp. * * */ public void initBeforeSearch() throws IOException { HttpServletResponse response = this.getServletResponse(); HttpServletRequest request = this.getServletRequest(); this.setServletRequest(request); this.setServletResponse(response); if (LOG.isLoggable(Level.FINER)) { LOG.finer("Initializing class"); } this._stopFurtherResponseWrites = false; // synchronized (request) { //f (request.getAttribute(ATTRIBUTE_HTML_INI) == null) { //response.setBufferSize(10); response.setContentType("text/html"); response.setCharacterEncoding("UTF-8"); // request.setAttribute(ATTRIBUTE_HTML_INI, new Object()); String script = ""; PrintWriter writer = response.getWriter(); writer.write("<html><head>" + script); if (LOG.isLoggable(Level.FINER)) { script = "// Time: " + System.currentTimeMillis() + " Thread # " + Thread.currentThread().getId() + "\n"; script += "Writer = " + writer.hashCode() + "\n"; script += "Response = " + response.hashCode(); LOG.finer("Writting html header <html></head> " + script); } //} // } } /** * On search thread complete. * * @param event * the event * @see com.esri.gpt.control.rest.search.ISearchListener#searchEvent(com.esri.gpt.control.rest.search.DistributedSearchEvent) */ public void searchEvent(DistributedSearchEvent event) { if (LOG.isLoggable(Level.FINER)) { LOG.finer("In Search Thread Complete" + event); } String message = ""; SearchStatus searchStatus = event.getSearchStatus(); if (searchStatus.getStatusType().equals(SearchStatus.STATUSTYPE_COMPLETED)) { long results = searchStatus.getHitCount(); if(results < 0) { message = this.getMessageBroker().retrieveMessage( "catalog.search.distributedSearch.hitCountUnknown"); } else { message = this.getMessageBroker().retrieveMessage( "catalog.search.distributedSearch.results"); message = message.replaceAll("\\{0\\}", String.valueOf( results)); } } else if (searchStatus.getStatusType() .equals(SearchStatus.STATUSTYPE_FAILED)) { message = this.getMessageBroker().retrieveMessage( "catalog.search.distributedSearch.searchFailed") + " : " + event.getSearchStatus().getMessage(); } else if (searchStatus.getStatusType().equals( SearchStatus.STATUSTYPE_WORKING)) { message = searchStatus.getMessage() + " : Working"; } else if (searchStatus.getStatusType().equals( SearchStatus.STATUSTYPE_SEARCH_TIMEOUT)) { message = this.getMessageBroker().retrieveMessage( "catalog.search.distributedSearch.searchTimeout"); } else { message = searchStatus.getMessage(); } String script = "<script type=\"text/javascript\">"; script += "window.parent.updateDistributedSearch( '" + searchStatus.getRid().replaceAll("'", "\'") + "', '" + message.replaceAll("'", "\'") + "','" + searchStatus.getStatusType().replaceAll("'", "\'") + "');"; script += "</script>"; try { if (this._stopFurtherResponseWrites == false) { PrintWriter writer = this.getServletResponse().getWriter(); // There were some connection reset errors sporadically while flushing the // buffer. synchronization is is for good measure synchronized (this) { try { writer.write(script); this.getServletResponse().flushBuffer(); } catch (Exception e) { LOG.log(Level.WARNING, "Error while flushing + " + e.getMessage()); } } if (LOG.isLoggable(Level.FINER)) { script += "// Time: " + System.currentTimeMillis() + " Thread # " + Thread.currentThread().getId() + "\n"; script += "Writer = " + writer.hashCode() + "\n"; script += "Response = " + this.getServletResponse().hashCode(); LOG.finer("Sending " + script); } } else { LOG.finer("Response Already commited." + " Stopped from writting to the response message = " + script + " Search Time so far : " + (System.currentTimeMillis() - searchStatus.getStartTimestamp() .getTime())); } } catch (Throwable e) { LOG.log(Level.WARNING, "Error while writting distributed search message: " + message, e); } } /** * Signals all threads are done processing. * * @see com.esri.gpt.control.rest.search.ISearchListener#searchDone() */ public void searchDone() { String script = "<script type=\"text/javascript\">"; script += "window.parent.distributedSearchDone();"; script += "</script>"; //HttpServletRequest request = this.getServletRequest(); if (LOG.isLoggable(Level.FINER)) { script += "// Time: " + System.currentTimeMillis() + " Thread # " + Thread.currentThread().getId() + "\n"; LOG.finer("Sending " + script); } // synchronized(request) { //if (request.getAttribute(ATTRIBUTE_HTML_END) == null) { //request.setAttribute(ATTRIBUTE_HTML_END, new Object()); script += "</head><body></body></html>"; try { this._stopFurtherResponseWrites = true; PrintWriter printWriter = this.getServletResponse().getWriter(); printWriter.write(script); // printWriter.flush(); } catch (Throwable e) { LOG.log(Level.WARNING, "Error while closing distributed search", e); } //} // } } }