package com.esri.gpt.control.georss; import com.esri.gpt.catalog.search.ResourceLink; import com.esri.gpt.catalog.search.SearchResultRecords; import com.esri.gpt.framework.jsf.MessageBroker; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.util.logging.Level; import java.util.logging.Logger; import javax.servlet.http.HttpServletResponse; import org.apache.commons.io.IOUtils; /** * The Class CsvWriter. */ public class CsvWriter extends AFeedWriter2 { // class variables ============================================================= /** The class logger. */ private final static Logger LOG = Logger.getLogger(CsvWriter.class.getCanonicalName()); private static final String CHARACTERS_THAT_MUST_BE_QUOTED = ",\"\n"; private static final String QUOTE = "\""; private static final String ESCAPED_QUOTE = "\"\""; private static final String DELIMETER = ","; // methods ===================================================================== /** * Writes the records * * @param records list of records */ @Override public void write(IFeedRecords records) { PrintWriter writer = null; try { HttpServletResponse response = this.getResponse(); response.setContentType("application/csv;charset=UTF-8"); response.setHeader("Content-Disposition", "filename="+ System.currentTimeMillis() + ".csv"); writer = new PrintWriter( new OutputStreamWriter(response.getOutputStream(), "UTF8"), true); //writer = response.getWriter(); String sRow = this.readHeader(); writer.print(sRow); for (IFeedRecord record : records) { sRow = this.readRow(record); writer.print(sRow); } } catch (Exception e) { LOG.log(Level.WARNING, "Error while ", e); } finally { IOUtils.closeQuietly(writer); } } /** * Read escaped csv field. * * @param field the field * * @return the string (never null) */ private String readEscapedCsvField(String field) { if(field == null || "".equals(field)) { return ""; } if(field.contains(QUOTE)) { field = field.replaceAll(QUOTE, ESCAPED_QUOTE); } for(char ch: CHARACTERS_THAT_MUST_BE_QUOTED.toCharArray()) { if(field.contains(Character.toString(ch)) == true) { field = QUOTE + " " + field + QUOTE ; break; } } return field; } /** * Read csv header. * * @return the string */ protected String readHeader() { StringBuffer row = new StringBuffer(); MessageBroker mBrok = this.getMessageBroker(); row .append(readEscapedCsvField(mBrok.retrieveMessage( "catalog.searchresult.csv.header.contentType"))) .append(DELIMETER) .append(readEscapedCsvField(mBrok.retrieveMessage( "catalog.searchresult.csv.header.urlToMetadata"))) .append(DELIMETER) .append(readEscapedCsvField(mBrok.retrieveMessage( "catalog.searchresult.csv.header.urlToliveData"))) .append(DELIMETER) .append(readEscapedCsvField(mBrok.retrieveMessage( "catalog.searchresult.csv.header.urlToSiteOrDownLoad"))) .append(DELIMETER) .append(readEscapedCsvField(mBrok.retrieveMessage( "catalog.searchresult.csv.header.title"))) .append(DELIMETER) .append(readEscapedCsvField(mBrok.retrieveMessage( "catalog.searchresult.csv.header.abstract"))) .append(DELIMETER) .append(readEscapedCsvField(mBrok.retrieveMessage( "catalog.searchresult.csv.header.west"))) .append(DELIMETER) .append(readEscapedCsvField(mBrok.retrieveMessage( "catalog.searchresult.csv.header.east"))) .append(DELIMETER) .append(readEscapedCsvField(mBrok.retrieveMessage( "catalog.searchresult.csv.header.north"))) .append(DELIMETER) .append(readEscapedCsvField(mBrok.retrieveMessage( "catalog.searchresult.csv.header.south"))) .append(DELIMETER) .append("\n"); return row.toString(); } /** * Read csv row. * * @param record the record * @return the string */ protected String readRow(IFeedRecord record) { StringBuffer row = new StringBuffer(); MessageBroker mBrok = this.getMessageBroker(); String contentType = mBrok.retrieveMessage( "catalog.search.filterContentTypes." + record.getContentType()); String resourceUrl = record.getResourceUrl(); String webSite = record.getResourceLinks().findUrlByTag(ResourceLink.TAG_WEBSITE); if(!record.getContentType().toLowerCase().equals("livedata")) { resourceUrl = ""; } if(record.getContentType().toLowerCase().contains("download")) { webSite = record.getResourceLinks().findUrlByTag(ResourceLink.TAG_OPEN); } row .append(readEscapedCsvField(contentType)) .append(DELIMETER) .append(readEscapedCsvField(record.getViewMetadataUrl())) .append(DELIMETER) .append(readEscapedCsvField(resourceUrl)) .append(DELIMETER) .append(readEscapedCsvField(webSite)) .append(DELIMETER) .append(readEscapedCsvField(record.getTitle())) .append(DELIMETER) .append(readEscapedCsvField(record.getAbstract())) .append(DELIMETER) .append(record.getEnvelope().getMinX()) .append(DELIMETER) .append(record.getEnvelope().getMaxX()) .append(DELIMETER) .append(record.getEnvelope().getMaxY()) .append(DELIMETER) .append(record.getEnvelope().getMinY()) .append(DELIMETER) .append("\n"); return row.toString(); } @Override public void writeError(Throwable err) { try { this.getResponse().sendError(HttpServletResponse.SC_BAD_REQUEST, err.getMessage()); } catch (Exception e) { LOG.log(Level.WARNING, "Error", e); } } }