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
020package org.apache.wiki.event;
021
022import org.apache.wiki.api.filters.BasicPageFilter;
023import org.apache.wiki.api.exceptions.FilterException;
024
025import org.apache.wiki.WikiContext;
026import java.util.Properties;
027
028/**
029  * Fires WikiPageEvents for page events.
030  * <p>
031  * Adding a PageEventFilter to the FilterManager will automatically
032  * attach an event delegate with the WikiEventManager to provide for
033  * firing and listener management. All that remains is then adding
034  * the listener to the filter via the WikiEventManager. This is quite
035  * simple:
036  * </p>
037  * <pre>
038  *    PageEventFilter filter = new PageEventFilter();
039  *    engine.getFilterManager().addPageFilter(filter,5000);
040  *    // attach listener to filter
041  *    WikiEventManager.addWikiEventListener(filter,listener);
042  * </pre>
043  * <p>
044  * This class provides convenience methods for adding and removing
045  * WikiEventListeners.
046  * </p>
047  *
048  * @see org.apache.wiki.event.WikiEventManager
049  */
050public class PageEventFilter extends BasicPageFilter
051{
052
053    /**
054      * Called whenever a new PageFilter is instantiated and reset.
055      */
056    public void initialize( Properties properties )
057            throws FilterException
058    {
059        //
060    }
061
062    /**
063      * This method is called whenever a page has been loaded from the provider,
064      * but not yet been sent through the TranslatorReader.  Note that you cannot
065      * do HTML translation here, because TranslatorReader is likely to escape it.
066      *
067      * @param wikiContext The current wikicontext.
068      * @param content     WikiMarkup.
069      */
070    public String preTranslate( WikiContext wikiContext, String content )
071            throws FilterException
072    {
073        fireEvent( WikiPageEvent.PRE_TRANSLATE, wikiContext );
074        return content;
075    }
076
077
078    /**
079      * This method is called after a page has been fed through the TranslatorReader,
080      * so anything you are seeing here is translated content.  If you want to
081      * do any of your own WikiMarkup2HTML translation, do it here.
082      */
083    public String postTranslate( WikiContext wikiContext, String htmlContent )
084            throws FilterException
085    {
086        fireEvent( WikiPageEvent.POST_TRANSLATE, wikiContext );
087        return htmlContent;
088    }
089
090
091    /**
092      * This method is called before the page has been saved to the PageProvider.
093      */
094    public String preSave( WikiContext wikiContext, String content )
095            throws FilterException
096    {
097        fireEvent( WikiPageEvent.PRE_SAVE, wikiContext );
098        return content;
099    }
100
101
102    /**
103      * This method is called after the page has been successfully saved.
104      * If the saving fails for any reason, then this method will not
105      * be called.
106      * <p>
107      * Since the result is discarded from this method, this is only useful
108      * for things like counters, etc.
109      */
110    public void postSave( WikiContext wikiContext, String content )
111            throws FilterException
112    {
113        fireEvent( WikiPageEvent.POST_SAVE, wikiContext );
114    }
115
116
117    // events processing .......................................................
118
119
120    /**
121     *  Registers a WikiEventListener with this instance.
122     *  This is a convenience method.
123     *
124     * @param listener the event listener
125     */
126    public final synchronized void addWikiEventListener( WikiEventListener listener )
127    {
128        WikiEventManager.addWikiEventListener( this, listener );
129    }
130
131    /**
132     *  Un-registers a WikiEventListener with this instance.
133     *  This is a convenience method.
134     *
135     * @param listener the event listener
136     */
137    public final synchronized void removeWikiEventListener( WikiEventListener listener )
138    {
139        WikiEventManager.removeWikiEventListener( this, listener );
140    }
141
142    /**
143     *  Fires a WikiPageEvent of the provided type and page name
144     *  to all registered listeners. Only <tt>PAGE_LOCK</tt> and
145     *  <tt>PAGE_UNLOCK</tt> event types will fire an event; other
146     *  event types are ignored.
147     *
148     * @see org.apache.wiki.event.WikiPageEvent
149     * @param type      the WikiPageEvent type to be fired.
150     * @param context   the WikiContext of the event.
151     */
152    protected final void fireEvent( int type, WikiContext context )
153    {
154        if ( WikiEventManager.isListening(this) && WikiPageEvent.isValidType(type) )
155        {
156            WikiPageEvent event = new WikiPageEvent(
157                    context.getEngine(),
158                    type,
159                    context.getPage().getName());
160            WikiEventManager.fireEvent(this,event);
161        }
162    }
163
164} // end org.apache.wiki.event.PageEventFilter