1 17 package org.pentaho.core.util; 18 19 import java.util.HashMap ; 20 import java.util.Iterator ; 21 import java.util.List ; 22 import java.util.Map ; 23 24 import org.dom4j.Node; 25 import org.pentaho.core.session.IPentahoSession; 26 import org.pentaho.messages.util.LocaleHelper; 27 28 public class XForm { 29 30 public static final int TYPE_RADIO = 1; 31 32 public static final int TYPE_SELECT = 2; 33 34 public static final int TYPE_LIST = 3; 35 36 public static final int TYPE_LIST_MULTI = 4; 37 38 public static final int TYPE_CHECK_MULTI = 5; 39 40 public static final int TYPE_CHECK_MULTI_SCROLL = 6; 41 42 public static final int TYPE_CHECK_MULTI_SCROLL_2_COLUMN = 7; 43 44 public static final int TYPE_CHECK_MULTI_SCROLL_3_COLUMN = 8; 45 46 public static final int TYPE_CHECK_MULTI_SCROLL_4_COLUMN = 9; 47 48 public static final int TYPE_TEXT = 10; 49 50 public static final int OUTPUT_XFORM = 1; 51 52 public static final int OUTPUT_HTML = 2; 53 54 public static final int OUTPUT_HTML_PAGE = 3; 55 56 public static String transformSnippet(Node xForm, IPentahoSession session) { 57 58 return transformSnippet(xForm.asXML(), null, session); 59 60 } 61 62 public static String transformSnippet(String xFormSnippet, String method, IPentahoSession session) { 63 64 try { 65 StringBuffer xForm = null; 66 67 xForm = new StringBuffer ().append("<?xml version=\"1.0\" encoding=\"" + LocaleHelper.getSystemEncoding() + "\" ?>") .append("<pho:snippet xmlns:xf=\"http://www.w3.org/2002/xforms\" xmlns:pho=\"http://www.w3.org/1999/homl\">") .append(xFormSnippet).append("</pho:snippet>"); 71 String html = transform(xForm.toString(), method, session); 72 73 int pos1 = html.indexOf("<form name=\"pentaho-form\""); int pos2 = html.indexOf("enctype=\"application/x-www-form-urlencoded\">", pos1); if (pos2 > 0) { 78 html = html.substring(pos2 + 44); 79 pos2 = html.indexOf("</form>"); if (pos2 > 0) { 81 html = html.substring(0, pos2); 82 } 83 } 84 85 return html; 86 } catch (Exception ex) { 87 } 89 90 return null; 91 92 } 93 94 public static String transform(String xForm, String method, IPentahoSession session) { 95 96 try { 97 HashMap parameters = new HashMap (); 98 if (method != null) { 99 parameters.put("form-method", method); } else { 101 parameters.put("form-method", "GET"); } 103 return XmlHelper.transformXml("html4.xsl", null, xForm, null, session).toString(); } catch (Exception ex) { 105 } 106 107 return null; 108 109 } 110 111 public static void createXFormHeader(String formName, StringBuffer xformHeader) { 112 113 xformHeader.append("<head>") .append("<link rel=\"stylesheet\" type=\"text/css\" HREF=\"/pentaho-style/active/default.css\" />") .append("<xf:model id=\"").append(formName).append("\">") .append("<xf:instance>"); 118 } 119 120 public static void completeXFormHeader(String formName, StringBuffer xformHeader) { 121 122 xformHeader.append("</xf:instance>") .append("<xf:submission action=\"\" separator=\"&\" method=\"urlencoded-get\" id=\"").append(formName).append("\" />") .append("</xf:model>") .append("</head>"); 127 } 128 129 public static void createXFormSubmit(String formName, StringBuffer xformBody, String buttonText) { 130 131 xformBody.append("<xf:submit id=\"").append(formName).append("\" submission=\"").append(formName).append("\">") .append("<xf:label>").append(buttonText).append("</xf:label>") .append("</xf:submit>"); 135 } 136 137 public static String completeXForm(int outputType, String formName, StringBuffer xformHeader, StringBuffer xformBody, IPentahoSession session) { 138 xformHeader.append("</xf:instance>") .append("<xf:submission action=\"\" separator=\"&\" method=\"urlencoded-get\" id=\"").append(formName).append("\" />") .append("</xf:model>") .append("</head>"); 143 if (outputType == OUTPUT_XFORM) { 144 xformHeader.append(xformBody); 145 return xformHeader.toString(); 146 } else if (outputType == OUTPUT_HTML) { 147 xformHeader.append("<body dir=\"").append(LocaleHelper.getTextDirection()).append("\">"); xformHeader.append(xformBody); 149 xformHeader.append("</body>"); return transformSnippet(xformHeader.toString(), "GET", session); } else if (outputType == OUTPUT_HTML_PAGE) { 152 StringBuffer xForm = new StringBuffer (); 153 xForm.append("<html xmlns=\"http://www.w3.org/2002/06/xhtml2\" xmlns:xf=\"http://www.w3.org/2002/xforms\" xmlns:pho=\"http://www.w3.org/2002/xhoml\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">"); if (xformBody.indexOf("{xform-header}") > -1) { String header = xformHeader.toString(); 156 header = header.replaceFirst("<head>", ""); header = header.replaceFirst("</head>", ""); String tmp = xformBody.toString(); 159 tmp = tmp.replaceFirst("\\{xform-header\\}", header); String html = transform(tmp, "GET", session); return html; 162 } else { 163 xForm.append(xformHeader); 164 xForm.append(xformBody); 165 xForm.append("</html>"); 167 String html = transform(xForm.toString(), "GET", session); return "<html><body dir=\"" + LocaleHelper.getTextDirection() + "\">" + html + "</body></html>"; } 170 171 } else { 172 return null; 173 } 174 175 } 176 177 public static void createXFormControl(String fieldName, Object defaultValues, String formName, StringBuffer xformHeader, StringBuffer xformBody, boolean visible) { 178 179 181 if (xformHeader.length() == 0) { 182 createXFormHeader(formName, xformHeader); 184 } 185 186 setDefaultValues(fieldName, defaultValues, xformHeader); 187 188 if (visible) { 189 xformBody.append("<xf:input model=\"").append(formName).append("\" id=\"").append(fieldName).append("\" ref=\"").append(fieldName).append("\"></xf:input>"); } 191 192 } 193 194 private static void setDefaultValues(String fieldName, Object defaultValues, StringBuffer xformHeader) { 195 196 xformHeader.append("<data xmlns=\"\">"); if (defaultValues instanceof String ) { 198 xformHeader.append("<").append(fieldName).append(">").append(XmlHelper.encode((String ) defaultValues)).append("</").append(fieldName).append(">"); } else if (defaultValues instanceof String []) { 200 String values[] = (String []) defaultValues; 201 for (int i = 0; i < values.length; i++) { 202 xformHeader.append("<").append(fieldName).append(">").append( XmlHelper.encode(values[i])).append("</").append(fieldName).append(">"); } 204 } else if (defaultValues instanceof Object []) { 205 Object values[] = (String []) defaultValues; 206 for (int i = 0; i < values.length; i++) { 207 xformHeader.append("<").append(fieldName).append(">").append(XmlHelper.encode(values[i].toString())).append("</").append(fieldName).append(">"); } 209 } else if (defaultValues == null) { 210 xformHeader.append("<").append(fieldName).append("></").append(fieldName).append(">"); } else { 212 xformHeader.append("<").append(fieldName).append(">").append(XmlHelper.encode(defaultValues.toString())).append("</").append(fieldName).append(">"); } 214 215 xformHeader.append("</data>"); 217 } 218 219 public static void createXFormControl(int type, String fieldName, Object defaultValues, List values, Map displayNames, String formName, StringBuffer xformHeader, StringBuffer xformBody) { 220 221 if (values == null) { 222 return; 223 } 224 226 if (xformHeader.length() == 0) { 227 createXFormHeader(formName, xformHeader); 229 } 230 231 if (values.size() == 1) { 233 defaultValues = XmlHelper.encode(values.get(0).toString()); 234 } 235 236 setDefaultValues(fieldName, defaultValues, xformHeader); 237 238 String appearance = ""; if (type == TYPE_TEXT ) { 240 xformBody.append("<xf:input model=\"").append(formName).append("\" id=\"").append(fieldName).append("\" ref=\"").append(fieldName).append("\"></xf:input>"); } 242 else if (type == TYPE_RADIO || type == TYPE_SELECT || type == TYPE_LIST) { 243 switch (type) { 244 case TYPE_RADIO: 245 appearance = "appearance=\"full\"";break; case TYPE_SELECT: 247 appearance = "";break; case TYPE_LIST: 249 appearance = "appearance=\"compact\"";break; } 251 xformBody.append("<xf:select1 ").append(appearance).append(" model=\"").append(formName).append("\" id=\"").append(fieldName).append("\" ref=\"").append(fieldName).append("\">"); Iterator listIterator = values.iterator(); 253 while (listIterator.hasNext()) { 254 String value = XmlHelper.encode(listIterator.next().toString()); 255 String displayValue = (displayNames != null) ? XmlHelper.encode((String ) displayNames.get(value)) : value; 256 if (displayValue == null) { 257 displayValue = value; 258 } 259 xformBody.append("<xf:item><xf:label>").append(displayValue).append("</xf:label><xf:value>").append(value).append("</xf:value></xf:item>"); } 261 xformBody.append("</xf:select1>"); } 263 else if (type == TYPE_LIST_MULTI || type == TYPE_CHECK_MULTI || type == TYPE_CHECK_MULTI_SCROLL || type == TYPE_CHECK_MULTI_SCROLL_2_COLUMN || type == TYPE_CHECK_MULTI_SCROLL_3_COLUMN || type == TYPE_CHECK_MULTI_SCROLL_4_COLUMN) { 264 switch (type) { 265 case TYPE_CHECK_MULTI: 266 appearance = "appearance=\"full\"";break; case TYPE_LIST_MULTI: 268 appearance = "appearance=\"compact\"";break; case TYPE_CHECK_MULTI_SCROLL: 270 appearance = "appearance=\"full-scroll\" columns=\"1\"";break; case TYPE_CHECK_MULTI_SCROLL_2_COLUMN: 272 appearance = "appearance=\"full-scroll\" columns=\"2\"";break; case TYPE_CHECK_MULTI_SCROLL_3_COLUMN: 274 appearance = "appearance=\"full-scroll\" columns=\"3\"";break; case TYPE_CHECK_MULTI_SCROLL_4_COLUMN: 276 appearance = "appearance=\"full-scroll\" columns=\"4\"";break; } 278 xformBody.append("<xf:select ").append(appearance).append(" model=\"").append(formName).append("\" id=\"").append(fieldName).append("\" ref=\"").append(fieldName).append("\">"); Iterator listIterator = values.iterator(); 280 while (listIterator.hasNext()) { 281 String value = XmlHelper.encode(listIterator.next().toString()); 282 String displayValue = (displayNames != null) ? XmlHelper.encode((String ) displayNames.get(value)) : value; 283 if (displayValue == null) { 284 displayValue = value; 285 } 286 xformBody.append("<xf:item><xf:label>").append(displayValue).append("</xf:label><xf:value>").append(value).append("</xf:value></xf:item>"); } 288 xformBody.append("</xf:select>"); } 290 291 } 292 293 } 294 | Popular Tags |