001 /* 002 Licensed to the Apache Software Foundation (ASF) under one 003 or more contributor license agreements. See the NOTICE file 004 distributed with this work for additional information 005 regarding copyright ownership. The ASF licenses this file 006 to you under the Apache License, Version 2.0 (the 007 "License"); you may not use this file except in compliance 008 with the License. You may obtain a copy of the License at 009 010 http://www.apache.org/licenses/LICENSE-2.0 011 012 Unless required by applicable law or agreed to in writing, 013 software distributed under the License is distributed on an 014 "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 015 KIND, either express or implied. See the License for the 016 specific language governing permissions and limitations 017 under the License. 018 */ 019 package org.apache.wiki.tags; 020 021 import java.io.IOException; 022 import java.util.Map; 023 024 import javax.servlet.jsp.JspException; 025 import javax.servlet.jsp.tagext.BodyContent; 026 027 import org.apache.log4j.Logger; 028 import org.apache.wiki.WikiEngine; 029 import org.apache.wiki.api.engine.PluginManager; 030 import org.apache.wiki.api.exceptions.PluginException; 031 032 /** 033 * Inserts any Wiki plugin. The body of the tag becomes then 034 * the body for the plugin. 035 * <P><B>Attributes</B></P> 036 * <UL> 037 * <LI>plugin - name of the plugin you want to insert. 038 * <LI>args - An argument string for the tag. 039 * </UL> 040 * 041 * @since 2.0 042 */ 043 public class PluginTag 044 extends WikiBodyTag 045 { 046 private static final long serialVersionUID = 0L; 047 private static final Logger log = Logger.getLogger( PluginTag.class ); 048 049 private String m_plugin; 050 private String m_args; 051 052 private boolean m_evaluated = false; 053 054 /** 055 * {@inheritDoc} 056 */ 057 @Override 058 public void release() 059 { 060 super.release(); 061 m_plugin = m_args = null; 062 m_evaluated = false; 063 } 064 065 /** 066 * Set the name of the plugin to execute. 067 * 068 * @param p Name of the plugin. 069 */ 070 public void setPlugin( String p ) 071 { 072 m_plugin = p; 073 } 074 075 /** 076 * Set the argument string to the plugin. 077 * 078 * @param a Arguments string. 079 */ 080 public void setArgs( String a ) 081 { 082 m_args = a; 083 } 084 085 /** 086 * {@inheritDoc} 087 */ 088 @Override 089 public int doWikiStartTag() throws JspException, IOException 090 { 091 m_evaluated = false; 092 return EVAL_BODY_BUFFERED; 093 } 094 095 private String executePlugin( String plugin, String args, String body ) 096 throws PluginException, IOException 097 { 098 WikiEngine engine = m_wikiContext.getEngine(); 099 PluginManager pm = engine.getPluginManager(); 100 101 m_evaluated = true; 102 103 Map<String, String> argmap = pm.parseArgs( args ); 104 105 if( body != null ) 106 { 107 argmap.put( "_body", body ); 108 } 109 110 String result = pm.execute( m_wikiContext, plugin, argmap ); 111 112 return result; 113 } 114 115 /** 116 * {@inheritDoc} 117 */ 118 @Override 119 public int doEndTag() 120 throws JspException 121 { 122 if( !m_evaluated ) 123 { 124 try 125 { 126 pageContext.getOut().write( executePlugin( m_plugin, m_args, null ) ); 127 } 128 catch( Exception e ) 129 { 130 log.error( "Failed to insert plugin", e ); 131 throw new JspException( "Tag failed, check logs: "+e.getMessage() ); 132 } 133 } 134 return EVAL_PAGE; 135 } 136 137 /** 138 * {@inheritDoc} 139 */ 140 @Override 141 public int doAfterBody() 142 throws JspException 143 { 144 try 145 { 146 BodyContent bc = getBodyContent(); 147 148 getPreviousOut().write( executePlugin( m_plugin, m_args, (bc != null) ? bc.getString() : null) ); 149 } 150 catch( Exception e ) 151 { 152 log.error( "Failed to insert plugin", e ); 153 throw new JspException( "Tag failed, check logs: "+e.getMessage() ); 154 } 155 156 return SKIP_BODY; 157 } 158 }