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.HashMap;
023    import java.util.Map;
024    
025    import javax.servlet.ServletException;
026    import javax.servlet.jsp.JspException;
027    
028    import org.apache.log4j.Logger;
029    import org.apache.wiki.WikiContext;
030    import org.apache.wiki.api.exceptions.ProviderException;
031    
032    
033    /**
034     *  Is used as a "super include" tag, which can include the proper context
035     *  based on the wikicontext.
036     *
037     *  @since 2.2
038     */
039    public class ContentTag extends WikiTagBase {
040    
041        private static final long serialVersionUID = 0L;
042        private static final Logger log = Logger.getLogger( ContentTag.class );
043        
044        private Map<String, String> m_mappings = new HashMap<String, String>();
045    
046        /**
047         *  Set the template for the VIEW context.
048         *  
049         *  @param s The template name.
050         */
051        public void setView( String s )
052        {
053            m_mappings.put( WikiContext.VIEW, s );
054        }
055    
056        /**
057         *  Set the template for the DIFF context.
058         *  
059         *  @param s The template name.
060         */
061        public void setDiff( String s )
062        {
063            m_mappings.put( WikiContext.DIFF, s );
064        }
065    
066        /**
067         *  Set the template for the INFO context.
068         *  
069         *  @param s The template name.
070         */
071        public void setInfo( String s )
072        {
073            m_mappings.put( WikiContext.INFO, s );
074        }
075    
076        /**
077         *  Set the template for the PREVIEW context.
078         *  
079         *  @param s The template name.
080         */
081        public void setPreview( String s )
082        {
083            m_mappings.put( WikiContext.PREVIEW, s );
084        }
085    
086        /**
087         *  Set the template for the CONFLICT context.
088         *  
089         *  @param s The template name.
090         */
091        public void setConflict( String s )
092        {
093            m_mappings.put( WikiContext.CONFLICT, s );
094        }
095    
096        /**
097         *  Set the template for the FIND context.
098         *  
099         *  @param s The template name.
100         */
101        public void setFind( String s )
102        {
103            m_mappings.put( WikiContext.FIND, s );
104        }
105    
106        /**
107         *  Set the template for the PREFS context.
108         *  
109         *  @param s The template name.
110         */
111        public void setPrefs( String s )
112        {
113            m_mappings.put( WikiContext.PREFS, s );
114        }
115    
116        /**
117         *  Set the template for the ERROR context.
118         *  
119         *  @param s The template name.
120         */
121        public void setError( String s )
122        {
123            m_mappings.put( WikiContext.ERROR, s );
124        }
125    
126        /**
127         *  Set the template for the EDIT context.
128         *  
129         *  @param s The template name.
130         */
131        public void setEdit( String s )
132        {
133            m_mappings.put( WikiContext.EDIT, s );
134        }
135    
136        /**
137         *  Set the template for the COMMENT context.
138         *  
139         *  @param s The template name.
140         */
141        public void setComment( String s )
142        {
143            m_mappings.put( WikiContext.COMMENT, s );
144        }
145    
146        /**
147         *  {@inheritDoc}
148         */
149        public final int doWikiStartTag()
150            throws IOException,
151                   ProviderException
152        {
153            return SKIP_BODY;
154        }
155    
156        /**
157         *  {@inheritDoc}
158         */
159        public final int doEndTag()
160            throws JspException
161        {
162            try
163            {
164                // Check the overridden templates first
165                String requestContext = m_wikiContext.getRequestContext();
166                String contentTemplate = m_mappings.get( requestContext );
167    
168                // If not found, use the defaults
169                if ( contentTemplate == null )
170                {
171                    contentTemplate = m_wikiContext.getContentTemplate();
172                }
173                
174                // If still no, something fishy is going on
175                if( contentTemplate == null )
176                {
177                    throw new JspException("This template uses <wiki:Content/> in an unsupported context: " + requestContext );
178                }
179    
180                String page = m_wikiContext.getEngine().getTemplateManager().findJSP( pageContext,
181                                                                                      m_wikiContext.getTemplate(),
182                                                                                      contentTemplate );
183                pageContext.include( page );
184            }
185            catch( ServletException e )
186            {
187                log.warn( "Including failed, got a servlet exception from sub-page. "+
188                          "Rethrowing the exception to the JSP engine.", e );
189                throw new JspException( e.getMessage() );
190            }
191            catch( IOException e )
192            {
193                log.warn( "I/O exception - probably the connection was broken. "+
194                          "Rethrowing the exception to the JSP engine.", e );
195                throw new JspException( e.getMessage() );
196            }
197    
198            return EVAL_PAGE;
199        }
200    }