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 java.io.IOException;
022
023import org.apache.wiki.WikiSession;
024import org.apache.wiki.util.TextUtil;
025
026/**
027 * Returns or clears the current messages associated with the user's wiki
028 * session. This tag accepts four attributes: <ul> <li><code>action</code> -
029 * if "clear", the messsages will be cleared. Otherwise, this tag will always
030 * print the set of current messages as either a single &lt;p&gt; tag (if there
031 * is only one message) or a bulleted list (if there is more than one).</li>
032 * <li><code>prefix</code> - the string to prepend to the list of errors, if
033 * there are any; default is empty string</li> <li><code>topic</code> - a
034 * collection for messages, for example those associated with a particular web
035 * form. If not suppled, defaults to a generic (non-specific) collection</li>
036 * <li><code>div</code> - the <code>div</code> class to wrap the
037 * messages in; if not supplied, <code>information</code> is assumed</li></ul>
038 * @since 2.3.54
039 */
040public class MessagesTag extends WikiTagBase
041{
042    private static final long   serialVersionUID = 0L;
043
044    private String              m_action         = null;
045
046    private String              m_prefix         = "";
047
048    private String              m_topic          = null;
049
050    private String              m_div            = "information";
051
052    private static final String CLEAR            = "clear";
053
054    public void initTag()
055    {
056        super.initTag();
057        m_action = m_topic = null;
058        m_prefix = "";
059        m_div = "information";
060    }
061
062
063    public void setTopic( String topic )
064    {
065        m_topic = topic;
066    }
067
068    public void setPrefix( String prefix )
069    {
070        m_prefix = prefix;
071    }
072
073    public void setDiv( String div )
074    {
075        m_div = div;
076    }
077
078    public void setAction( String action )
079    {
080        m_action = action.toLowerCase();
081    }
082
083    public final int doWikiStartTag() throws IOException
084    {
085        WikiSession session = m_wikiContext.getWikiSession();
086        if ( CLEAR.equals( m_action ) )
087        {
088            if ( m_topic == null )
089            {
090                session.clearMessages();
091            }
092            else
093            {
094                session.clearMessages( m_topic );
095            }
096        }
097        else
098        {
099            String[] messages = ( m_topic == null ) ? session.getMessages() : session.getMessages( m_topic );
100            if ( messages.length > 0 )
101            {
102                StringBuilder sb = new StringBuilder();
103                if ( messages.length == 1 )
104                {
105                    sb.append( "<div class=\"" + m_div + "\">" + m_prefix + TextUtil.replaceEntities(messages[0]) + "</div>" );
106                }
107                else
108                {
109                    sb.append( "<div class=\"" + m_div + "\">" + m_prefix );
110                    sb.append( "<ul>" );
111                    for( int i = 0; i < messages.length; i++ )
112                    {
113                        sb.append( "<li>" + TextUtil.replaceEntities(messages[i]) + "</li>" );
114                    }
115                    sb.append( "</ul></div>" );
116                }
117                pageContext.getOut().println( sb.toString() );
118            }
119        }
120        return SKIP_BODY;
121    }
122}