1 31 32 package org.opencms.jsp; 33 34 import org.opencms.file.CmsObject; 35 import org.opencms.file.CmsRequestContext; 36 import org.opencms.flex.CmsFlexController; 37 import org.opencms.jsp.parse.A_CmsConfiguredHtmlParser; 38 import org.opencms.main.CmsException; 39 import org.opencms.main.CmsLog; 40 import org.opencms.util.CmsStringUtil; 41 42 import java.io.PrintWriter ; 43 import java.io.StringWriter ; 44 import java.util.Iterator ; 45 import java.util.List ; 46 47 import javax.servlet.ServletRequest ; 48 import javax.servlet.jsp.JspException ; 49 import javax.servlet.jsp.PageContext ; 50 import javax.servlet.jsp.tagext.BodyTagSupport ; 51 52 import org.apache.commons.logging.Log; 53 54 import org.htmlparser.util.ParserException; 55 56 67 public class CmsJspTagParse extends BodyTagSupport { 68 69 73 public static final String ATT_VISITOR_CLASS = "parserClass"; 74 75 76 private static final Log LOG = CmsLog.getLog(CmsJspTagParse.class); 77 78 79 private static final long serialVersionUID = -6541745426202242240L; 80 81 82 public static final String TAG_NAME = "parse"; 83 84 85 private String m_configuredParserClassname; 86 87 88 private List m_noAutoCloseTags; 89 90 91 private String m_param = ""; 92 93 98 public int doEndTag() throws JspException { 99 100 ServletRequest req = pageContext.getRequest(); 101 A_CmsConfiguredHtmlParser parser; 102 103 if (CmsFlexController.isCmsRequest(req)) { 105 String content = ""; 106 try { 107 if (CmsStringUtil.isEmpty(m_configuredParserClassname)) { 108 if (LOG.isErrorEnabled()) { 109 LOG.error(Messages.get().getBundle().key( 110 Messages.GUI_ERR_TAG_ATTRIBUTE_MISSING_2, 111 new Object [] {TAG_NAME, ATT_VISITOR_CLASS})); 112 } 113 114 } 115 try { 118 Class cl = Class.forName(m_configuredParserClassname); 120 Object instance = cl.newInstance(); 122 parser = (A_CmsConfiguredHtmlParser)instance; 124 parser.setParam(m_param); 125 CmsFlexController controller = CmsFlexController.getController(req); 127 CmsObject cms = controller.getCmsObject(); 128 parser.setCmsObject(cms); 129 content = parseTagAction(getBodyContent().getString(), pageContext, parser); 130 131 } catch (Exception e) { 132 if (LOG.isErrorEnabled()) { 133 LOG.error(Messages.get().getBundle().key( 134 Messages.GUI_ERR_TAG_ATTRIBUTE_INVALID_3, 135 new Object [] {TAG_NAME, ATT_VISITOR_CLASS, A_CmsConfiguredHtmlParser.class.getName()}), e); 136 } 137 e.printStackTrace(System.err); 138 } 139 140 } finally { 141 try { 142 getBodyContent().clear(); 143 getBodyContent().print(content); 144 getBodyContent().writeOut(pageContext.getOut()); 145 release(); 148 149 } catch (Exception ex) { 150 release(); 151 if (LOG.isErrorEnabled()) { 152 LOG.error(Messages.get().getBundle().key(Messages.ERR_PROCESS_TAG_1, TAG_NAME), ex); 153 } 154 throw new JspException (ex); 156 } 157 158 } 159 160 } 161 return EVAL_PAGE; 162 } 163 164 174 public String getNoAutoCloseTags() { 175 176 StringBuffer result = new StringBuffer (); 177 if (m_noAutoCloseTags != null & m_noAutoCloseTags.size() > 0) { 178 Iterator it = m_noAutoCloseTags.iterator(); 179 while (it.hasNext()) { 180 result.append(it.next()).append(','); 181 } 182 } 183 return result.toString(); 184 } 185 186 192 public String getParam() { 193 194 return m_param; 195 } 196 197 204 public String getParserClass() { 205 206 return m_configuredParserClassname; 207 } 208 209 225 public String parseTagAction(String content, PageContext context, A_CmsConfiguredHtmlParser parser) { 226 227 String result = null; 228 CmsRequestContext cmsContext = CmsFlexController.getCmsObject(context.getRequest()).getRequestContext(); 229 230 if (parser == null) { 231 if (LOG.isErrorEnabled()) { 232 LOG.error(Messages.get().getBundle(cmsContext.getLocale()).key( 233 Messages.GUI_ERR_TAG_ATTRIBUTE_MISSING_2, 234 new Object [] {TAG_NAME, ATT_VISITOR_CLASS})); 235 } 236 result = content; 237 } else { 238 239 String encoding = cmsContext.getEncoding(); 240 try { 241 result = parser.doParse(content, encoding, this.m_noAutoCloseTags); 242 243 } catch (ParserException pex) { 244 245 if (LOG.isErrorEnabled()) { 246 LOG.error(Messages.get().getBundle(cmsContext.getLocale()).key( 247 Messages.ERR_PROCESS_TAG_1, 248 new Object [] {TAG_NAME}), pex); 249 } 250 StringWriter stackTrace = new StringWriter (); 251 PrintWriter writer = new PrintWriter (new StringWriter ()); 252 StringBuffer msg = new StringBuffer ("<!--\n").append(pex.getLocalizedMessage()).append("\n"); 253 pex.printStackTrace(writer); 254 msg.append(stackTrace.toString()).append("\n-->"); 255 result = msg.toString(); 256 } catch (CmsException cmex) { 257 if (LOG.isErrorEnabled()) { 258 LOG.error(Messages.get().getBundle(cmsContext.getLocale()).key( 259 Messages.ERR_PROCESS_TAG_1, 260 new Object [] {TAG_NAME}), cmex); 261 } 262 StringWriter stackTrace = new StringWriter (); 263 PrintWriter writer = new PrintWriter (new StringWriter ()); 264 StringBuffer msg = new StringBuffer ("<!--\n").append(cmex.getLocalizedMessage()).append("\n"); 265 cmex.printStackTrace(writer); 266 msg.append(stackTrace.toString()).append("\n-->"); 267 result = msg.toString(); 268 } 269 270 } 271 return result; 272 } 273 274 277 public void release() { 278 279 m_configuredParserClassname = null; 280 m_param = null; 281 super.release(); 282 } 283 284 293 public void setNoAutoCloseTags(String noAutoCloseTagList) { 294 295 m_noAutoCloseTags = CmsStringUtil.splitAsList(noAutoCloseTagList, ','); 296 297 } 298 299 305 public void setParam(String param) { 306 307 m_param = param; 308 } 309 310 318 public void setParserClass(String parserClass) { 319 320 m_configuredParserClassname = parserClass; 321 } 322 } 323 | Popular Tags |