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    }