| 1 16 17 package org.pentaho.core.util; 18 19 import java.text.NumberFormat ; 20 import java.util.ArrayList ; 21 import java.util.Iterator ; 22 import java.util.List ; 23 import java.util.Set ; 24 25 import javax.servlet.http.HttpServletRequest ; 26 import javax.servlet.http.HttpSession ; 27 28 import org.pentaho.core.connection.IPentahoResultSet; 29 import org.pentaho.core.runtime.IRuntimeContext; 30 import org.pentaho.core.session.IPentahoSession; 31 import org.pentaho.core.session.PentahoHttpSession; 32 import org.pentaho.core.solution.ActionResource; 33 import org.pentaho.core.solution.IActionResource; 34 import org.pentaho.core.system.PentahoMessenger; 35 import org.pentaho.core.system.PentahoSystem; 36 import org.pentaho.messages.Messages; 37 import org.pentaho.messages.util.LocaleHelper; 38 import org.pentaho.util.VersionHelper; 39 40 public class UIUtil implements IUITemplater { 41 public static final String HTML_MIME_TYPE = "text/html"; 43 public static final String TEXT_MIME_TYPE = "text/plain"; 45 public static final int MAX_RESULT_THRESHOLD = 100; 46 47 public String processTemplate( String template, String title, String content, IPentahoSession session ) { 48 49 template = processTemplate( template, title, session ); 50 template = template.replaceFirst( "\\{content\\}", content ); 52 return template; 53 } 54 55 public String processTemplate( String template, String title, IPentahoSession session ) { 56 57 template = template.replaceAll( "\\{title\\}", title ); template = template.replaceAll( "\\{home\\}", Messages.getString("UI.USER_HOME") ); template = template.replaceAll( "\\{navigate\\}", Messages.getString("UI.USER_NAVIGATE") ); template = template.replaceAll( "\\{solutions\\}", Messages.getString("UI.USER_SOLUTIONS") ); template = template.replaceAll( "\\{file-cache\\}", Messages.getString("UI.USER_FILE_CACHE") ); template = template.replaceAll( "\\{new-content\\}", Messages.getString("UI.USER_NEW_CONTENT") ); 64 template = template.replaceAll( "\\{admin\\}", Messages.getString("UI.USER_ADMIN") ); template = template.replaceAll( "\\{about\\}", Messages.getString("UI.USER_ABOUT") ); template = template.replaceAll( "\\{pentaho.org\\}", Messages.getString("UI.USER_PENTAHO.ORG") ); template = template.replaceAll( "\\{close\\}", Messages.getString("UI.USER_CLOSE") ); template = template.replaceAll( "\\{forums\\}", Messages.getString("UI.USER_FORUMS") ); template = template.replaceAll( "\\{demos\\}", Messages.getString("UI.USER_DEMOS") ); template = template.replaceAll( "\\{downloads\\}", Messages.getString("UI.USER_DOWNLOADS") ); template = template.replaceAll( "\\{charset\\}", LocaleHelper.getSystemEncoding() ); template = template.replaceAll( "\\{text-direction\\}", LocaleHelper.getTextDirection() ); template = template.replaceAll( "\\{logout\\}", Messages.getString("UI.USER_LOGOUT") ); template = template.replaceAll( "\\{portal\\}", Messages.getString("UI.USER_PORTAL") ); 76 template = template.replaceAll( "\\{system\\}", PentahoSystem.getSystemName() ); template = template.replaceAll( "\\{version\\}", "V"+VersionHelper.getVersion()+" build "+VersionHelper.getBuild() ); template = template.replaceAll( "\\{isLoggedIn\\}", session.isAuthenticated() ? "true" : "false" ); template = template.replaceAll( "\\{background-alert\\}", session.getBackgroundExecutionAlert() ? "true" : "false" ); template = template.replaceAll( "\\{header-content\\}", "" ); template = template.replaceAll( "\\{body-tag\\}", "" ); 83 return template; 84 } 85 86 public String getTemplate( String templateName, IPentahoSession session ) { 87 88 ActionResource resource = new ActionResource( "", IActionResource.SOLUTION_FILE_RESOURCE, "text/xml", "system/custom/" + templateName ); 90 String template = null; 91 try { 92 template = PentahoSystem.getSolutionRepository(session).getResourceAsString( resource ); 93 } catch (Throwable t) { 94 } 95 96 if( template == null ) { 97 return Messages.getString( "UI.ERROR_0001_BAD_TEMPLATE", resource.getAddress() ); } else { 99 return template; 100 } 101 } 102 103 public String [] breakTemplate( String templateName, String title, IPentahoSession session ) { 104 String template = getTemplate( templateName, session ); 105 return breakTemplateString( template, title, session ); 106 } 107 108 public String [] breakTemplateString( String template, String title, IPentahoSession session ) { 109 String token = "{content}"; template = processTemplate( template, title, session ); 111 int index = template.indexOf( token ); 112 if( index == -1 ) { 113 return new String [] {template}; 114 } else { 115 String sections[] = new String [2]; 116 sections[0] = template.substring( 0, index ); 117 sections[1] = template.substring( index + token.length() ); 118 return sections; 119 } 120 } 121 122 public static IPentahoSession getPentahoSession(HttpServletRequest request) { 123 124 HttpSession session = request.getSession(); 125 IPentahoSession userSession = (IPentahoSession) session.getAttribute("pentaho-session"); LocaleHelper.setLocale(request.getLocale()); 127 if (userSession != null) { 128 return userSession; 129 } 130 userSession = new PentahoHttpSession(request.getRemoteUser(), request.getSession(), request.getLocale()); 131 LocaleHelper.setLocale(request.getLocale()); 132 133 session.setAttribute("pentaho-session", userSession); return userSession; 135 } 136 137 public static void formatErrorMessage(String mimeType, String title, String message, StringBuffer messageBuffer) { 138 ArrayList messages = new ArrayList (1); 139 messages.add(message); 140 formatErrorMessage(mimeType, title, messages, messageBuffer); 141 } 142 143 public static String getFirstError(List messages) { 144 String errorStart = PentahoMessenger.getUserString("ERROR"); int pos = errorStart.indexOf('{'); 146 if (pos != -1) { 147 errorStart = errorStart.substring(0, pos); 148 } 149 Iterator messageIterator = messages.iterator(); 150 while (messageIterator.hasNext()) { 151 String message = (String ) messageIterator.next(); 152 if (message.indexOf(errorStart) == 0) { 153 return message; 154 } 155 } 156 return null; 157 } 158 159 public static void formatErrorMessage(String mimeType, String title, List messages, StringBuffer messageBuffer) { 160 if ("text/html".equals(mimeType)) { messageBuffer.append("<html><head><title>") .append(Messages.getString("UIUtil.USER_START_ACTION")) .append("</title><link rel=\"stylesheet\" type=\"text/css\" HREF=\"/pentaho-style/active/default.css\"></head>") .append("<body dir=\"").append(LocaleHelper.getTextDirection()).append("\"><table cellspacing=\"10\"><tr><td class=\"portlet-section\" colspan=\"3\">") .append(title).append("<hr size=\"1\"/></td></tr><tr><td class=\"portlet-font\" valign=\"top\">"); Iterator messageIterator = messages.iterator(); 168 String errorStart = PentahoMessenger.getUserString("ERROR"); int pos = errorStart.indexOf('{'); 170 if (pos != -1) { 171 errorStart = errorStart.substring(0, pos); 172 } 173 String firstMessage = getFirstError(messages); 174 if (firstMessage != null) { 175 messageBuffer.append("<span style=\"color:red\">").append(firstMessage).append("</span><p/>"); } 177 messageIterator = messages.iterator(); 178 while (messageIterator.hasNext()) { 179 messageBuffer.append((String ) messageIterator.next()).append("<br/>"); } 181 messageBuffer.append("</td></tr></table><p>"); messageBuffer.append( " " + Messages.getString("UIUtil.USER_SERVER_VERSION", VersionHelper.getVersion(), VersionHelper.getBuild()) ); messageBuffer.append("</body></html>"); } else { 185 } 187 188 } 189 190 public static void formatFailureMessage(String mimeType, IRuntimeContext context, StringBuffer messageBuffer, List defaultMessages) { 191 192 194 if ((context == null) && (defaultMessages == null)) { 195 formatErrorMessage(mimeType, Messages.getString("UIUtil.ERROR_0001_REQUEST_FAILED"), Messages.getString("UIUtil.ERROR_0002_COULD_NOT_PROCESS"), messageBuffer); } else { 198 List theMessages = (context == null) ? defaultMessages : context.getMessages(); 199 formatErrorMessage(mimeType, "Failed", theMessages, messageBuffer); } 205 } 206 207 public static void formatFailureMessage(String mimeType, IRuntimeContext context, StringBuffer messageBuffer) { 208 formatFailureMessage(mimeType, context, messageBuffer, null); 209 } 210 211 public static void formatResultSetAsHTMLRows( IPentahoResultSet resultSet, StringBuffer messageBuffer ) { 212 boolean hasColumnHeaders = false; 213 boolean hasRowHeaders = false; 214 Object [][] columnHeaders = null; 215 Object [][] rowHeaders = null; 216 if (resultSet.getMetaData() != null) { 217 columnHeaders = resultSet.getMetaData().getColumnHeaders(); 218 rowHeaders = resultSet.getMetaData().getRowHeaders(); 219 hasColumnHeaders = columnHeaders != null; 220 hasRowHeaders = rowHeaders != null; 221 if (hasColumnHeaders) { 222 for (int row = 0; row < columnHeaders.length; row++) { 223 messageBuffer.append("<tr>"); if (hasRowHeaders) { 225 for (int indent = 0; indent < rowHeaders[0].length; indent++) { 226 messageBuffer.append("<th></th>"); } 228 } 229 for (int column = 0; column < columnHeaders[row].length; column++) { 230 messageBuffer.append("<th>").append(columnHeaders[row][column]).append("</th>"); } 232 messageBuffer.append("</tr>"); } 234 } 235 236 } 237 Object [] dataRow = resultSet.next(); 238 int currentRow = 0; 239 while (dataRow != null && currentRow < MAX_RESULT_THRESHOLD) { 240 messageBuffer.append("<tr>"); if (hasRowHeaders) { 242 for (int rowHeaderCol = rowHeaders[currentRow].length - 1; rowHeaderCol >= 0; rowHeaderCol--) { 243 messageBuffer.append("<th>").append(rowHeaders[currentRow][rowHeaderCol].toString()).append("</th>"); } 245 } 246 NumberFormat nf = NumberFormat.getInstance(); 247 for (int column = 0; column < dataRow.length; column++) { 248 if (dataRow[column] != null) { 249 Object value = dataRow[column]; 250 if (value instanceof Number ) { 251 Number numVal = (Number )value; 252 value = nf.format(numVal); 253 messageBuffer.append("<td align=\"right\">").append(value.toString()).append("</td>"); } else { 255 messageBuffer.append("<td>").append(value.toString()).append("</td>"); } 257 } else { 258 messageBuffer.append("<td>---</td>"); } 260 } 261 messageBuffer.append("</tr>"); dataRow = resultSet.next(); 263 currentRow++; 264 } 265 } 266 267 public static void formatSuccessMessage(String mimeType, IRuntimeContext context, StringBuffer messageBuffer, boolean doMessages) { 268 formatSuccessMessage( mimeType, context, messageBuffer, doMessages, true ); 269 } 270 271 public static void formatSuccessMessage(String mimeType, IRuntimeContext context, StringBuffer messageBuffer, boolean doMessages, boolean doWrapper) { 272 273 if (context == null) { 274 formatFailureMessage(mimeType, context, messageBuffer); 276 } else if (mimeType.equalsIgnoreCase(HTML_MIME_TYPE)) { 277 if( doWrapper ) { 279 messageBuffer.append("<html><head><title>") .append(Messages.getString("UIUtil.USER_START_ACTION")) .append("</title><link rel=\"stylesheet\" type=\"text/css\" HREF=\"/pentaho-style/active/default.css\"></head>") .append("<body dir=\"").append(LocaleHelper.getTextDirection()).append("\"><table cellspacing=\"10\"><tr><td class=\"portlet-section\" colspan=\"3\">") .append(Messages.getString("UIUtil.USER_ACTION_SUCCESSFUL")) .append("<hr size=\"1\"/></td></tr><tr><td class=\"portlet-font\" valign=\"top\">"); } 286 287 Set outputNames = context.getOutputNames(); 289 Iterator outputNameIterator = outputNames.iterator(); 290 while (outputNameIterator.hasNext()) { 291 String outputName = (String ) outputNameIterator.next(); 292 Object value = context.getOutputParameter(outputName).getValue(); 293 if (value == null) { 294 value = ""; } else if (value instanceof IPentahoResultSet) { 296 formatResultSetAsHTMLRows( (IPentahoResultSet)value, messageBuffer ); 297 } else { 298 if( doWrapper ) { 299 messageBuffer.append(outputName).append("="); } 301 messageBuffer.append(value.toString()); 302 if( doWrapper ) { 303 messageBuffer.append("<br/>"); } 305 } 306 } 307 if (doMessages) { 308 if( doWrapper ) { 309 messageBuffer.append("<p><br size=\"1\">"); } 311 List messages = context.getMessages(); 312 Iterator messageIterator = messages.iterator(); 313 while (messageIterator.hasNext()) { 314 messageBuffer.append((String ) messageIterator.next()); 315 if( doWrapper ) { 316 messageBuffer.append("<br/>"); } 318 } 319 } 320 321 if( doWrapper ) { 322 messageBuffer.append("</td></tr></table></body></html>"); } 324 } else if (mimeType.equalsIgnoreCase(TEXT_MIME_TYPE)) { 325 messageBuffer.append(Messages.getString("UIUtil.USER_START_ACTION" + "\n")) .append(Messages.getString("UIUtil.USER_ACTION_SUCCESSFUL" + "\n")); 328 Set outputNames = context.getOutputNames(); 330 Iterator outputNameIterator = outputNames.iterator(); 331 while (outputNameIterator.hasNext()) { 332 String outputName = (String ) outputNameIterator.next(); 333 Object value = context.getOutputParameter(outputName).getValue(); 334 if (value == null) { 335 value = ""; } else if (value instanceof IPentahoResultSet) { 337 IPentahoResultSet resultSet = (IPentahoResultSet) value; 338 Object [][] columnHeaders = resultSet.getMetaData().getColumnHeaders(); 339 Object [][] rowHeaders = resultSet.getMetaData().getRowHeaders(); 340 boolean hasColumnHeaders = columnHeaders != null; 341 boolean hasRowHeaders = rowHeaders != null; 342 if (hasColumnHeaders) { 343 for (int row = 0; row < columnHeaders.length; row++) { 344 for (int column = 0; column < columnHeaders[row].length; column++) { 345 if (hasRowHeaders) { 346 for (int indent = 0; indent < rowHeaders[0].length; indent++) { 347 messageBuffer.append("\t"); } 349 } 350 messageBuffer.append(columnHeaders[row][column]).append("\t"); } 352 messageBuffer.append("\n"); } 354 } 355 int headerRow = 0; 356 Object [] dataRow = resultSet.next(); 357 int currentRow = 0; 358 while (dataRow != null && currentRow < MAX_RESULT_THRESHOLD) { 359 if (hasRowHeaders) { 360 for (int rowHeaderCol = 0; rowHeaderCol < rowHeaders[headerRow].length; rowHeaderCol++) { 361 messageBuffer.append(rowHeaders[headerRow][rowHeaderCol].toString()).append("\t"); } 363 } 364 for (int column = 0; column < dataRow.length; column++) { 365 messageBuffer.append(dataRow[column].toString()).append("\t"); } 367 dataRow = resultSet.next(); 368 currentRow++; 369 } 370 } else { 371 messageBuffer.append(outputName).append("=").append(value.toString()).append("\n"); } 373 } 374 if (doMessages) { 375 List messages = context.getMessages(); 376 Iterator messageIterator = messages.iterator(); 377 while (messageIterator.hasNext()) { 378 messageBuffer.append((String ) messageIterator.next()).append("\n"); } 380 } 381 } 382 } 383 } 384 | Popular Tags |