    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 */
    019package org.apache.wiki.tags;
    020
    021import org.apache.logging.log4j.LogManager;
    022import org.apache.logging.log4j.Logger;
    023import org.apache.wiki.api.core.Engine;
    024import org.apache.wiki.api.exceptions.PluginException;
    025import org.apache.wiki.plugin.PluginManager;
    026
    027import javax.servlet.jsp.JspException;
    028import javax.servlet.jsp.tagext.BodyContent;
    029import java.io.IOException;
    030import java.util.Map;
    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 */
    043public class PluginTag
    044    extends WikiBodyTag
    045{
    046    private static final long serialVersionUID = 0L;
    047    private static final Logger LOG = LogManager.getLogger( PluginTag.class );
    048
    049    private String m_plugin;
    050    private String m_args;
    051
    052    private boolean m_evaluated;
    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( final 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( final 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( final String plugin, final String args, final String body ) throws PluginException, IOException {
    096        final Engine engine = m_wikiContext.getEngine();
    097        final PluginManager pm  = engine.getManager( PluginManager.class );
    098
    099        m_evaluated = true;
    100
    101        final Map<String, String> argmap = pm.parseArgs( args );
    102
    103        if( body != null )
    104        {
    105            argmap.put( "_body", body );
    106        }
    107
    108        return pm.execute( m_wikiContext, plugin, argmap );
    109    }
    110
    111    /**
    112     *  {@inheritDoc}
    113     */
    114    @Override
    115    public int doEndTag()
    116        throws JspException
    117    {
    118        if( !m_evaluated )
    119        {
    120            try
    121            {
    122                pageContext.getOut().write( executePlugin( m_plugin, m_args, null ) );
    123            }
    124            catch( final Exception e )
    125            {
    126                LOG.error( "Failed to insert plugin", e );
    127                throw new JspException( "Tag failed, check logs: "+e.getMessage() );
    128            }
    129        }
    130        return EVAL_PAGE;
    131    }
    132
    133    /**
    134     *  {@inheritDoc}
    135     */
    136    @Override
    137    public int doAfterBody()
    138        throws JspException
    139    {
    140        try
    141        {
    142            final BodyContent bc = getBodyContent();
    143
    144            getPreviousOut().write( executePlugin( m_plugin, m_args, (bc != null) ? bc.getString() : null) );
    145        }
    146        catch( final Exception e )
    147        {
    148            LOG.error( "Failed to insert plugin", e );
    149            throw new JspException( "Tag failed, check logs: "+e.getMessage() );
    150        }
    151
    152        return SKIP_BODY;
    153    }
    154}