/* =============================================================================== * * Part of the InfoGlue Content Management Platform (www.infoglue.org) * * =============================================================================== * * Copyright (C) * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License version 2, as published by the * Free Software Foundation. See the file LICENSE.html for more information. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY, including 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 * this program; if not, write to the Free Software Foundation, Inc. / 59 Temple * Place, Suite 330 / Boston, MA 02111-1307 / USA. * * =============================================================================== */ package org.infoglue.cms.applications.common; import java.net.URLEncoder; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Iterator; import java.util.Locale; import java.util.Map; import java.util.Properties; import org.apache.commons.codec.binary.Base64; import org.apache.commons.lang.StringEscapeUtils; import org.apache.log4j.Logger; import org.infoglue.cms.util.CmsPropertyHandler; import org.infoglue.deliver.util.CacheController; public class VisualFormatter { private final static Logger logger = Logger.getLogger(VisualFormatter.class.getName()); public VisualFormatter() { } /** * This method takes a date in the form of milliseconds from 1970 and formats it as a * string according to the java.text.SimpleDateFormat syntax. * * @param timeAsMillis - Date in the form of millseconds * @param pattern - The output format * @return The formatted date as a string */ public String formatDate(long timeAsMillis, String pattern) { Date date = new Date(timeAsMillis); SimpleDateFormat formatter = new SimpleDateFormat(pattern); String dateString = formatter.format(date); return dateString; } public String formatDate(Date date, String pattern) { if(date == null) return ""; SimpleDateFormat formatter = new SimpleDateFormat(pattern); String dateString = formatter.format(date); return dateString; } public String formatDate(Date date, Locale locale, String pattern) { if(date == null) return ""; // Format the current time. SimpleDateFormat formatter = new SimpleDateFormat(pattern, locale); String dateString = formatter.format(date); return dateString; } public Date parseDate(String dateString, String pattern) { if(dateString == null) return new Date(); Date date = new Date(); try { // Format the current time. SimpleDateFormat formatter = new SimpleDateFormat(pattern); date = formatter.parse(dateString); } catch(Exception e) { logger.info("Error parsing date:" + dateString); } return date; } public Date parseDate(String dateString, Locale locale, String pattern) { if(dateString == null) return new Date(); Date date = new Date(); try { // Format the current time. SimpleDateFormat formatter = new SimpleDateFormat(pattern, locale); date = formatter.parse(dateString); } catch(Exception e) { logger.info("Error parsing date:" + dateString); } return date; } /** * This method converts all non-standard characters to html-equivalents. */ public final String escapeHTML(String s) { if(s == null) return null; StringBuffer sb = new StringBuffer(); int n = s.length(); for (int i = 0; i < n; i++) { char c = s.charAt(i); switch (c) { case '<': sb.append("<"); break; case '>': sb.append(">"); break; case '&': sb.append("&"); break; case '"': sb.append("""); break; /* case '�': sb.append("à");break; case '�': sb.append("À");break; case '�': sb.append("â");break; case '�': sb.append("Â");break; case '�': sb.append("ä");break; case '�': sb.append("Ä");break; case '�': sb.append("å");break; case '�': sb.append("Å");break; case '�': sb.append("æ");break; case '�': sb.append("Æ");break; case '�': sb.append("ç");break; case '�': sb.append("Ç");break; case '�': sb.append("é");break; case '�': sb.append("É");break; case '�': sb.append("è");break; case '�': sb.append("È");break; case '�': sb.append("ê");break; case '�': sb.append("Ê");break; case '�': sb.append("ë");break; case '�': sb.append("Ë");break; case '�': sb.append("ï");break; case '�': sb.append("Ï");break; case '�': sb.append("ô");break; case '�': sb.append("Ô");break; case '�': sb.append("ö");break; case '�': sb.append("Ö");break; case '�': sb.append("ø");break; case '�': sb.append("Ø");break; case '�': sb.append("ß");break; case '�': sb.append("ù");break; case '�': sb.append("Ù");break; case '�': sb.append("û");break; case '�': sb.append("Û");break; case '�': sb.append("ü");break; case '�': sb.append("Ü");break; case '�': sb.append("®");break; case '�': sb.append("©");break; case '�': sb.append("€"); break; */ default: sb.append(c); break; } } return sb.toString(); } /** * * Temporary method, please do not use. (SS, 2004-12-13) * @deprecated */ public final String escapeHTMLforXMLService(String s) { if(s == null) return null; StringBuffer sb = new StringBuffer(); int n = s.length(); for (int i = 0; i < n; i++) { char c = s.charAt(i); switch (c) { case '<': sb.append("<"); break; case '>': sb.append(">"); break; case '&': sb.append("&"); break; case '"': sb.append("""); break; case '�': sb.append("à");break; case '�': sb.append("À");break; case '�': sb.append("â");break; case '�': sb.append("Â");break; case '�': sb.append("ä");break; case '�': sb.append("Ä");break; case '�': sb.append("å");break; case '�': sb.append("Å");break; case '�': sb.append("æ");break; case '�': sb.append("Æ");break; case '�': sb.append("ç");break; case '�': sb.append("Ç");break; case '�': sb.append("é");break; case '�': sb.append("É");break; case '�': sb.append("è");break; case '�': sb.append("ò");break; case '�': sb.append("È");break; case '�': sb.append("ê");break; case '�': sb.append("Ê");break; case '�': sb.append("ë");break; case '�': sb.append("Ë");break; case '�': sb.append("ï");break; case '�': sb.append("Ï");break; case '�': sb.append("ô");break; case '�': sb.append("Ô");break; case '�': sb.append("ö");break; case '�': sb.append("Ö");break; case '�': sb.append("ø");break; case '�': sb.append("Ø");break; case '�': sb.append("ß");break; case '�': sb.append("ù");break; case '�': sb.append("Ù");break; case '�': sb.append("û");break; case '�': sb.append("Û");break; case '�': sb.append("ü");break; case '�': sb.append("Ü");break; case '�': sb.append("®");break; case '�': sb.append("©");break; case '�': sb.append("€"); break; case '\'': sb.append("’"); break; default: sb.append(c); break; } } return sb.toString(); } public final String escapeExtendedHTML(String s) { if(s == null) return null; StringBuffer sb = new StringBuffer(); int n = s.length(); for (int i = 0; i < n; i++) { char c = s.charAt(i); switch (c) { case '<': sb.append("<"); break; case '>': sb.append(">"); break; case '&': sb.append("&"); break; case '"': sb.append("""); break; /* case '�': sb.append("à");break; case '�': sb.append("À");break; case '�': sb.append("â");break; case '�': sb.append("Â");break; case '�': sb.append("ä");break; case '�': sb.append("Ä");break; case '�': sb.append("å");break; case '�': sb.append("Å");break; case '�': sb.append("æ");break; case '�': sb.append("Æ");break; case '�': sb.append("ç");break; case '�': sb.append("Ç");break; case '�': sb.append("é");break; case '�': sb.append("É");break; case '�': sb.append("è");break; case '�': sb.append("È");break; case '�': sb.append("ê");break; case '�': sb.append("Ê");break; case '�': sb.append("ë");break; case '�': sb.append("Ë");break; case '�': sb.append("ï");break; case '�': sb.append("Ï");break; case '�': sb.append("ô");break; case '�': sb.append("Ô");break; case '�': sb.append("ö");break; case '�': sb.append("Ö");break; case '�': sb.append("ø");break; case '�': sb.append("Ø");break; case '�': sb.append("ß");break; case '�': sb.append("ù");break; case '�': sb.append("Ù");break; case '�': sb.append("û");break; case '�': sb.append("Û");break; case '�': sb.append("ü");break; case '�': sb.append("Ü");break; case '�': sb.append("®");break; case '�': sb.append("©");break; case '�': sb.append("€"); break; */ case '\'': sb.append("’"); break; default: sb.append(c); break; } } return sb.toString(); } /** * This method converts all non-standard characters to html-equivalents. */ public final String escapeForJavascripts(String s) { if(s == null) return null; StringBuffer sb = new StringBuffer(); int n = s.length(); for (int i = 0; i < n; i++) { char c = s.charAt(i); if(c == '\'') sb.append("\\'"); else sb.append(c); } return sb.toString(); } /** * This method converts all non-standard characters to html-equivalents. */ public final String cleanForJavascriptStrings(String s) { if(s == null) return null; String lineSep = System.getProperty("line.separator"); s = s.replaceAll(lineSep, "<br/>"); s = s.replaceAll("\n", "<br/>"); s = s.replaceAll("\r", "<br/>"); StringBuffer sb = new StringBuffer(); int n = s.length(); for (int i = 0; i < n; i++) { char c = s.charAt(i); switch (c) { case '\'': sb.append("\\'"); break; case '"': sb.append("""); break; default: sb.append(c); break; } } return sb.toString(); } public final String cleanForJavascriptStrings(String s, String lineReplaceString) { if(s == null) return null; String lineSep = System.getProperty("line.separator"); if(lineSep != null) s = s.replaceAll(lineSep, lineReplaceString); s = s.replaceAll("\n", lineReplaceString); s = s.replaceAll("\r", lineReplaceString); StringBuffer sb = new StringBuffer(); int n = s.length(); for (int i = 0; i < n; i++) { char c = s.charAt(i); switch (c) { case '\'': sb.append("\\'"); break; case '"': sb.append("""); break; default: sb.append(c); break; } } return sb.toString(); } /** * This method converts all non-standard characters to html-equivalents. */ public final String escapeForAdvancedJavascripts(String s) { if(s == null) return null; StringBuffer sb = new StringBuffer(); int n = s.length(); for (int i = 0; i < n; i++) { char c = s.charAt(i); switch (c) { case '\'': sb.append("\\'"); break; case '"': sb.append("""); break; default: sb.append(c); break; } } return sb.toString(); } public final String replaceNonAscii(String s, char character) { if(s == null) return null; StringBuffer sb = new StringBuffer(); int n = s.length(); for (int i = 0; i < n; i++) { char c = s.charAt(i); if(c < 128 && c > 32) { if(Character.isLetterOrDigit(c) || c == '-' || c == '_' || c == '.') sb.append(c); else sb.append(character); } else { sb.append(character); } } return sb.toString(); } public final String replaceNonAscii(String s, String character) { if(s == null) return null; StringBuffer sb = new StringBuffer(); int n = s.length(); for (int i = 0; i < n; i++) { char c = s.charAt(i); if(c < 128 && c > 32) { if(Character.isLetterOrDigit(c) || c == '-' || c == '_' || c == '.') sb.append(c); else sb.append(character); } else { sb.append(character); } } return sb.toString(); } /** * This method replaces all non-ascii-characters with a corresponding one defined in the system properties-object. * If not defined there it replaces the char with the default character. * @param s * @param defaultCharacter * @return */ public final String replaceNiceURINonAsciiWithSpecifiedChars(String s, String defaultCharacter) { if(s == null) return null; boolean toLowerCase = CmsPropertyHandler.getNiceURIUseLowerCase(); Properties properties = CmsPropertyHandler.getCharacterReplacingMapping(); StringBuffer sb = new StringBuffer(); int n = s.length(); for (int i = 0; i < n; i++) { char c = s.charAt(i); if(c < 128 && c > 32) { if(Character.isLetterOrDigit(c) || c == '-' || c == '_' || c == '.') sb.append(c); else { String replaceChar = properties.getProperty("" + c); if(replaceChar != null && !replaceChar.equals("")) sb.append(replaceChar); else if(defaultCharacter != null && !defaultCharacter.equalsIgnoreCase("none")) sb.append(defaultCharacter); } } else { String replaceChar = properties.getProperty("" + c); if(replaceChar != null && !replaceChar.equals("")) sb.append(replaceChar); else if(defaultCharacter != null && !defaultCharacter.equalsIgnoreCase("none")) sb.append(defaultCharacter); } } return (toLowerCase ? sb.toString().toLowerCase() : sb.toString()); } /** * This method replaces all non-ascii-characters with a corresponding one defined in the system properties-object. * If not defined there it replaces the char with the default character. * @param s * @param defaultCharacter * @return */ public final String replaceNonAsciiWithNumericEntity(String s) { if(s == null) return null; return StringEscapeUtils.escapeHtml(s); } public final String escapeJavascript(String s) { if(s == null) return null; return StringEscapeUtils.escapeJavaScript(s); } public String escapeJSON(String string) { if (string == null || string.length() == 0) { return "\"\""; } char c = 0; int i; int len = string.length(); StringBuilder sb = new StringBuilder(len + 4); String t; sb.append('"'); for (i = 0; i < len; i += 1) { c = string.charAt(i); switch (c) { case '\\': case '"': sb.append('\\'); sb.append(c); break; case '/': // if (b == '<') { sb.append('\\'); // } sb.append(c); break; case '\b': sb.append("\\b"); break; case '\t': sb.append("\\t"); break; case '\n': sb.append("\\n"); break; case '\f': sb.append("\\f"); break; case '\r': sb.append("\\r"); break; default: if (c < ' ') { t = "000" + Integer.toHexString(c); sb.append("\\u" + t.substring(t.length() - 4)); } else { sb.append(c); } } } sb.append('"'); return sb.toString(); } /** * This method converts all non-standard characters to html-equivalents. */ public final String encode(String s) throws Exception { if(s == null) return null; String encodedString = (String)CacheController.getCachedObjectFromAdvancedCache("encodedStringsCache", s); if(encodedString == null) { encodedString = URLEncoder.encode(s, "UTF-8"); CacheController.cacheObjectInAdvancedCache("encodedStringsCache", s, encodedString, null, false); } return encodedString; } public final String encodeBase64(String s) throws Exception { if(s == null) return null; return Base64.encodeBase64URLSafeString(s.getBytes("utf-8")); } /** * This method converts all non-standard characters to html-equivalents. */ public final String encodeURI(String s) throws Exception { if(s == null) return null; String encoding = CmsPropertyHandler.getURIEncoding(); String encodedString = (String)CacheController.getCachedObjectFromAdvancedCache("encodedStringsCache", s); if(encodedString == null) { encodedString = URLEncoder.encode(s, encoding); CacheController.cacheObjectInAdvancedCache("encodedStringsCache", s, encodedString, null, false); } return encodedString; } public final String encodeURI(String s, String encoding) throws Exception { if(s == null) return null; String encodedString = (String)CacheController.getCachedObjectFromAdvancedCache("encodedStringsCache", s); if(encodedString == null) { encodedString = URLEncoder.encode(s, encoding); CacheController.cacheObjectInAdvancedCache("encodedStringsCache", s, encodedString, null, false); } return encodedString; } public String formatFileSize(Object fileSizeObject) { if(fileSizeObject == null) return ""; String fileSizeString = ""; Long fileSize = null; if(fileSizeObject instanceof String) fileSize = new Long((String)fileSizeObject); else if(fileSizeObject instanceof Integer) fileSize = new Long((Integer)fileSizeObject); else if(fileSizeObject instanceof Long) fileSize = (Long)fileSizeObject; float newSize = fileSize; String suffix = "Bytes"; if(fileSize.longValue() >= 1000000000000L) { newSize = fileSize / (1000F * 1000F * 1000F * 1000F); suffix = "TB"; } if(fileSize.longValue() >= 1000000000) { newSize = fileSize / (1000F * 1000F * 1000F); suffix = "GB"; } else if(fileSize.longValue() >= 1000000) { newSize = fileSize / (1000F * 1000F); suffix = "MB"; } else if(fileSize.longValue() >= 1000) { newSize = fileSize / (1000F); suffix = "KB"; } if(newSize > 0) { DecimalFormat df1 = new DecimalFormat("####.00"); fileSizeString = df1.format(newSize) + " " + suffix; } else fileSizeString = "0 Bytes"; return fileSizeString; } /** * Handles replacements on a string from a replacements map */ public String replaceAccordingToMappings(Map<String,String> replaceMap, String original) { if(original == null || replaceMap == null || replaceMap.size() == 0) return original; Iterator<String> replaceMapIterator = replaceMap.keySet().iterator(); while(replaceMapIterator.hasNext()) { String key = replaceMapIterator.next(); String value = (String)replaceMap.get(key); original = original.replaceAll(key, value); } return original; } }