1 31 32 package org.opencms.util; 33 34 import org.opencms.file.CmsObject; 35 import org.opencms.main.CmsException; 36 import org.opencms.xml.CmsXmlException; 37 38 import java.io.BufferedReader ; 39 import java.io.IOException ; 40 import java.io.StringReader ; 41 import java.io.StringWriter ; 42 import java.util.StringTokenizer ; 43 44 import javax.xml.transform.Source ; 45 import javax.xml.transform.Transformer ; 46 import javax.xml.transform.TransformerFactory ; 47 import javax.xml.transform.stream.StreamResult ; 48 import javax.xml.transform.stream.StreamSource ; 49 50 53 public class CmsXsltUtil { 54 55 56 public static final char TEXT_DELIMITER = '"'; 57 58 59 public static final String TAG_START_DELIMITER = "<"; 60 61 62 public static final String TAG_END_DELIMITER = ">"; 63 64 65 static final String [] DELIMITERS = {";", ",", "\t"}; 66 67 81 public static String transformXmlContent(CmsObject cms, String xsltFile, String xmlContent) throws CmsException, CmsXmlException { 82 83 Source xmlSource = new StreamSource (new StringReader (xmlContent)); 85 String xsltString = new String (cms.readFile(xsltFile).getContents()); 86 Source xsltSource = new StreamSource (new StringReader (xsltString)); 87 String result = null; 88 89 try { 90 TransformerFactory transFact = TransformerFactory.newInstance(); 91 Transformer trans = transFact.newTransformer(xsltSource); 92 93 StringWriter writer = new StringWriter (); 94 trans.transform(xmlSource, new StreamResult (writer)); 95 result = writer.toString(); 96 } catch (Exception exc) { 97 throw new CmsXmlException(Messages.get().container(Messages.ERR_CSV_XML_TRANSFORMATION_FAILED_0)); 98 } 99 100 if (result.startsWith("<?xml version=\"1.0\" encoding=\"UTF-8\"?>")) { 102 return result.substring(38); 103 } else { 104 return result; 105 } 106 } 107 108 123 public static String transformCsvContent(CmsObject cms, String xsltFile, String csvContent, String delimiter) throws CmsException, CmsXmlException { 124 125 String xmlContent = ""; 126 try { 127 xmlContent = getTableHtml(csvContent, delimiter); 128 } catch (IOException e) { 129 throw new CmsXmlException(Messages.get().container(Messages.ERR_CSV_XML_TRANSFORMATION_FAILED_0)); 130 } 131 132 if (xsltFile != null) { 135 xmlContent = transformXmlContent(cms, xsltFile, xmlContent); 136 } 137 138 return xmlContent; 139 } 140 141 152 private static String getTableHtml(String csvData, String delimiter) throws IOException { 153 154 String lineSeparator = System.getProperty("line.separator"); 155 String formatString = csvData.substring(0, csvData.indexOf(lineSeparator)); 156 157 if (delimiter == null) { 158 delimiter = getPreferredDelimiter(csvData); 159 } 160 161 StringBuffer xml = new StringBuffer ("<table>"); 162 if (isFormattingInformation(formatString, delimiter)) { 163 xml.append(getColGroup(formatString, delimiter)); 165 csvData = csvData.substring(formatString.length() + lineSeparator.length()); 167 } 168 169 String line; 170 BufferedReader br = new BufferedReader (new StringReader (csvData)); 171 while ((line = br.readLine()) != null) { 172 xml.append("<tr>\n"); 173 174 StringTokenizer t = new StringTokenizer (line, delimiter, true); 176 boolean hasValue = false; 177 while (t.hasMoreElements()) { 178 String item = (String )t.nextElement(); 179 if (!hasValue) { 180 xml.append("\t<td>"); 181 hasValue = true; 182 } 183 if (!item.equals(delimiter)) { 184 185 item = removeStringDelimiters(item); 187 188 if (item.startsWith(TAG_START_DELIMITER) && item.endsWith(TAG_END_DELIMITER)) { 190 xml.append(item); 191 } else { 192 xml.append(CmsStringUtil.escapeHtml(item)); 193 } 194 } else { 195 xml.append("</td>\n"); 196 hasValue = false; 197 } 198 } 199 if (hasValue) { 200 xml.append("</td>\n"); 201 } else { 202 xml.append("<td></td>\n"); 203 } 204 205 xml.append("</tr>\n"); 206 } 207 208 return xml.append("</table>").toString(); 209 } 210 211 218 private static String getColGroup(String formatString, String delimiter) { 219 220 StringBuffer colgroup = new StringBuffer (128); 221 String [] formatStrings = formatString.split(delimiter); 222 colgroup.append("<colgroup>"); 223 for (int i = 0; i < formatStrings.length; i++) { 224 colgroup.append("<col align=\""); 225 char align = formatStrings[i].trim().charAt(0); 226 switch (align) { 227 case 'l': 228 colgroup.append("left"); 229 break; 230 case 'c': 231 colgroup.append("center"); 232 break; 233 case 'r': 234 colgroup.append("right"); 235 break; 236 default: 237 throw new RuntimeException ("invalid format option"); 238 } 239 colgroup.append("\"/>"); 240 } 241 return colgroup.append("</colgroup>").toString(); 242 } 243 244 252 private static boolean isFormattingInformation(String formatString, String delimiter) { 253 254 String [] formatStrings = formatString.split(delimiter); 255 for (int i = 0; i < formatStrings.length; i++) { 256 if (!formatStrings[i].trim().matches("[lcr]")) { 257 return false; 258 } 259 } 260 return true; 261 } 262 263 271 private static String removeStringDelimiters(String key) { 272 273 String k = key.trim(); 274 if (CmsStringUtil.isNotEmpty(k)) { 275 if (k.charAt(0) == TEXT_DELIMITER) { 276 k = k.substring(1); 277 } 278 if (k.charAt(k.length() - 1) == TEXT_DELIMITER) { 279 k = k.substring(0, k.length() - 1); 280 } 281 } 282 k = CmsStringUtil.substitute(k, "\"\"", "\""); 284 return k; 285 } 286 287 294 private static String getPreferredDelimiter(String csvData) { 295 296 String bestMatch = ""; 297 int bestMatchCount = 0; 298 for (int i = 0; i < DELIMITERS.length; i++) { 300 int currentCount = csvData.split(DELIMITERS[i]).length; 301 if (currentCount > bestMatchCount) { 302 bestMatch = DELIMITERS[i]; 303 bestMatchCount = currentCount; 304 } 305 } 306 return bestMatch; 307 } 308 } 309 | Popular Tags |