/********************************************************************************** * $URL: https://source.sakaiproject.org/contrib/ufp/usermembership/trunk/tool/src/java/org/sakaiproject/umem/tool/ui/Export.java $ * $Id: Export.java 4298 2007-03-16 12:47:20Z nuno@ufp.pt $ *********************************************************************************** * * Copyright (c) 2003, 2004, 2005, 2006, 2007, 2008 The Sakai Foundation * * Licensed under the Educational Community 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.opensource.org/licenses/ECL-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 org.sakaiproject.umem.tool.ui; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; import javax.servlet.http.HttpServletResponse; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.sakaiproject.jsf.spreadsheet.SpreadsheetDataFileWriterCsv; import org.sakaiproject.jsf.spreadsheet.SpreadsheetDataFileWriterXls; import org.sakaiproject.jsf.spreadsheet.SpreadsheetUtil; import org.sakaiproject.util.ResourceLoader; public class Export { /** Our log (commons). */ private static Log LOG = LogFactory.getLog(SiteListBean.class); /** Resource bundle */ private static transient ResourceLoader msgs = new ResourceLoader("org.sakaiproject.umem.tool.bundle.Messages"); /** * Given tabular data and the file-name, export the data to the response output * stream as an excel workbook. * @param content The tabular data to export * @param prefixFileName A filename prefix. This will be appended with unique data and the proper file extension. */ public static void writeAsXls(List<List<Object>> content, String prefixFileName) { SpreadsheetUtil.downloadSpreadsheetData(content, getFileName(prefixFileName), new SpreadsheetDataFileWriterXls()); } public static void writeAsCsv(List<List<Object>> content, String prefixFileName) { SpreadsheetUtil.downloadSpreadsheetData(content, getFileName(prefixFileName), new SpreadsheetDataFileWriterCsv()); } public static StringBuilder appendQuoted(StringBuilder sb, String toQuote) { if(toQuote == null){ ; }else if((toQuote.indexOf(',') >= 0) || (toQuote.indexOf('"') >= 0)){ String out = toQuote.replaceAll("\"", "\"\""); if(LOG.isDebugEnabled()) LOG.debug("Turning '" + toQuote + "' to '" + out + "'"); sb.append("\"").append(out).append("\""); }else{ sb.append(toQuote); } return sb; } /** * Gets the filename for the export * @param prefix Filenameprefix * @return The appropriate filename for the export */ public static String getFileName(String prefix) { Date now = new Date(); DateFormat df = new SimpleDateFormat(msgs.getString("export_filename_date_format")); StringBuilder fileName = new StringBuilder(prefix); fileName.append("-"); fileName.append(df.format(now)); return fileName.toString(); } /** * Try to head off a problem with downloading files from a secure HTTPS * connection to Internet Explorer. When IE sees it's talking to a secure * server, it decides to treat all hints or instructions about caching as * strictly as possible. Immediately upon finishing the download, it throws * the data away. Unfortunately, the way IE sends a downloaded file on to a * helper application is to use the cached copy. Having just deleted the * file, it naturally isn't able to find it in the cache. Whereupon it * delivers a very misleading error message like: "Internet Explorer cannot * download roster from sakai.yoursite.edu. Internet Explorer was not able * to open this Internet site. The requested site is either unavailable or * cannot be found. Please try again later." There are several ways to turn * caching off, and so to be safe we use several ways to turn it back on * again. This current workaround should let IE users save the files to * disk. Unfortunately, errors may still occur if a user attempts to open * the file directly in a helper application from a secure web server. TODO * Keep checking on the status of this. */ public static void protectAgainstInstantDeletion(HttpServletResponse response) { response.reset(); // Eliminate the added-on stuff response.setHeader("Pragma", "public"); // Override old-style cache // control response.setHeader("Cache-Control", "public, must-revalidate, post-check=0, pre-check=0, max-age=0"); // New-style } }