/* 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.PrintWriter; import java.util.Date; import java.util.logging.Level; import java.util.logging.Logger; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.axis.utils.XMLUtils; import com.esri.gpt.catalog.search.ASearchEngine; import com.esri.gpt.catalog.search.ResourceLink; import com.esri.gpt.catalog.search.SearchException; import com.esri.gpt.control.georss.AtomFeedWriter; import com.esri.gpt.control.georss.AtomFeedWriter.AtomEntry; import com.esri.gpt.control.georss.AtomFeedWriter.AtomFeed; import com.esri.gpt.framework.jsf.MessageBroker; import com.esri.gpt.framework.util.Val; /** * The Class DistributedAdpAtomSearchPageWriter. * * @author TM */ public class DistributedAdpAtomSearchPageWriter implements ISearchListener { // class variables ============================================================= /** The LOG. */ private static Logger LOG = Logger.getLogger( DistributedAdpAtomSearchPageWriter.class.getCanonicalName()); /** The ATTRIBUT e_ ini. */ private static String ATTRIBUTE_INI = "init" + DistributedAdpAtomSearchPageWriter.class.getCanonicalName(); private static final String NAMESPACE_GPT = "http://www.esri.com/geoportal"; // instance variables ========================================================== /** The _stop further response writes. */ private boolean _stopFurtherResponseWrites; /** The http servlet response. */ private HttpServletResponse _httpServletResponse; /** The http servlet request. */ private HttpServletRequest _httpServletRequest; /** The print writer. */ private PrintWriter _printWriter; /** The atom feed. */ private AtomFeed _atomFeed; /** The message broker. */ private MessageBroker _messageBroker; /** The rest url. */ private String _restUrl; // properties ================================================================== /** * Gets the rest url. * * @return the rest url */ public String getRestUrl() { return _restUrl; } /** * Sets the rest url. * * @param url the new rest url */ public void setRestUrl(String url) { this._restUrl = url; } /** * Gets the prints the writer. * * @return the prints the writer */ private PrintWriter getPrintWriter() { return _printWriter; } /** * Sets the prints the writer. * * @param printWriter the new prints the writer */ private void setPrintWriter(PrintWriter printWriter) { this._printWriter = printWriter; } /** * Sets the servlet request. * * @param request the new servlet request */ public void setServletRequest(HttpServletRequest request) { this._httpServletRequest = request; } /** * Gets the servlet request. * * @return the servlet request */ private HttpServletRequest getServletRequest() { return this._httpServletRequest; } /** * Sets the servlet response. * * @param response the new servlet response */ public void setServletResponse(HttpServletResponse response) { this._httpServletResponse = response; } /** * Sets the message broker. * * @param messageBroker the new message broker */ 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 response. * * @return the servlet response */ private HttpServletResponse getServletResponse() { return this._httpServletResponse; } // methods ===================================================================== /** * Inits the before search. * * @throws Exception the exception */ public void initBeforeSearch() throws Exception { HttpServletResponse response = this.getServletResponse(); HttpServletRequest request = this.getServletRequest(); String queryString = request.getQueryString(); queryString = queryString.replaceAll("((?i)rid=([^&])*)", ""); queryString = queryString.replaceAll("&&", ""); queryString = request.getContextPath() + "/rest/find/document?" + queryString; this.setRestUrl(queryString); this.setPrintWriter(response.getWriter()); response.setContentType("application/atom+xml;charset=UTF-8"); this.setServletRequest(request); this.setServletResponse(response); if(LOG.isLoggable(Level.FINER)) { LOG.finer("Initializing class"); } this._stopFurtherResponseWrites = false; //synchronized (request) { AtomFeed atom = this.getAtomFeed(); atom.addStringToXmlHeader(" xmlns:gpt=\"" + NAMESPACE_GPT + "\""); atom.setTitle(this.getMessageBroker().retrieveMessage( "catalog.search.distributedSearch.atomTitle")); atom.writePreamble(this.getPrintWriter()); } /** * Search event. * * @param event the event */ public void searchEvent(DistributedSearchEvent event) { if(this._stopFurtherResponseWrites == true) { return; } long results = 0; String message = ""; if(event.getSearchStatus().getStatusType().equals( SearchStatus.STATUSTYPE_FAILED)) { message = this.getMessageBroker().retrieveMessage( "catalog.search.distributedSearch.searchFailed") + " : " + event.getSearchStatus().getMessage(); } else if(event.getSearchStatus().getStatusType().equals( SearchStatus.STATUSTYPE_COMPLETED)) { results = event.getSearchStatus().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(event.getSearchStatus().getStatusType().equals( SearchStatus.STATUSTYPE_SEARCH_TIMEOUT)) { message = this.getMessageBroker().retrieveMessage( "catalog.search.distributedSearch.searchTimeout"); } message = Val.chkStr(message); if(!"".equals(message)) { AtomEntry ae = new AtomFeedWriter(this.getPrintWriter()).new AtomEntry(); ae.setId(event.getSearchStatus().getRid()); ae.setTitle(ae.getId() + " " + message); ResourceLink link = new ResourceLink(); link.setLabel(this.getMessageBroker().retrieveMessage( "catalog.search.distributedSearch.linkLabel")); link.setUrl(this.getRestUrl() + "&rid=" + event.getSearchStatus().getRid()); ae.addResourceLink(link); if(event.getSource() instanceof SearchThread) { SearchThread searchThread = (SearchThread) event.getSource(); ASearchEngine engine = searchThread.getSearchEngine(); try { ae.setSummary(engine.getKeyAbstract()); } catch (SearchException e) { LOG.log(Level.FINE,"Could not get summary", e.getMessage()); e.printStackTrace(); } } StringBuffer bCustomXml = new StringBuffer(); bCustomXml .append("<gpt:distributedSearch>") .append("<gpt:hits>").append(results).append("</gpt:hits>"); if (event.getSearchStatus().getStatusType().equals( SearchStatus.STATUSTYPE_COMPLETED)) { long time = System.currentTimeMillis()- event.getSearchStatus() .getStartTimestamp().getTime(); bCustomXml.append("<gpt:msTime>").append(time).append("</gpt:msTime>"); } else if (event.getSearchStatus().getStatusType().equals( SearchStatus.STATUSTYPE_FAILED) || event.getSearchStatus().getStatusType().equals( SearchStatus.STATUSTYPE_SEARCH_TIMEOUT)) { bCustomXml.append("<gpt:error>") .append(Val.escapeXml(message)) .append("</gpt:error>"); } bCustomXml.append("</gpt:distributedSearch>"); ae.setCustomElements(bCustomXml.toString()); PrintWriter writer = this.getPrintWriter(); synchronized(writer) { try { ae.WriteTo(writer); writer.flush(); } catch(Exception e) { LOG.log(Level.INFO, "Error while flushing writer", e); } } } } /** * Search done. * * @throws Exception the exception */ public void searchDone() throws Exception { _stopFurtherResponseWrites = true; AtomFeed atom = this.getAtomFeed(); atom.writeEnd(this.getPrintWriter()); } /** * Gets the atom feed. * * @return the atom feed */ private AtomFeed getAtomFeed() { if(_atomFeed == null) { AtomFeed af = new AtomFeedWriter(this.getPrintWriter()).new AtomFeed(); af.setTitle(getMessageBroker().retrieveMessage("catalog.rest.title")); af.setDescription(getMessageBroker().retrieveMessage( "catalog.rest.description")); af.setAuthor(getMessageBroker().retrieveMessage( "catalog.rest.generator")); af.setCopyright(getMessageBroker().retrieveMessage( "catalog.rest.copyright")); //af.setLink(getEntryBaseUrl()); //af.setId(getEntryBaseUrl()); af.setUpdated(new Date()); _atomFeed = af; } return _atomFeed; } }