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.plugin;
020
021 import java.text.MessageFormat;
022 import java.util.Collection;
023 import java.util.Map;
024 import java.util.ResourceBundle;
025
026 import org.apache.log4j.Logger;
027 import org.apache.wiki.ReferenceManager;
028 import org.apache.wiki.WikiContext;
029 import org.apache.wiki.WikiPage;
030 import org.apache.wiki.api.exceptions.PluginException;
031 import org.apache.wiki.api.plugin.WikiPlugin;
032 import org.apache.wiki.preferences.Preferences;
033 import org.apache.wiki.util.TextUtil;
034
035 /**
036 * Displays the pages referring to the current page.
037 *
038 * Parameters:
039 * <ul>
040 * <li><b>max</b> - How many items to show.</li>
041 * <li><b>extras</b> - How to announce extras.</li>
042 * <li><b>page</b> - Which page to get the table of contents from.</li>
043 * </ul>
044 *
045 * From AbstractReferralPlugin:
046 * <ul>
047 * <li><b>separator</b> - How to separate generated links; default is a wikitext line break,
048 * producing a vertical list.</li>
049 * <li><b>maxwidth</b> - maximum width, in chars, of generated links.</li>
050 * </ul>
051 */
052 public class ReferringPagesPlugin
053 extends AbstractReferralPlugin
054 {
055 private static Logger log = Logger.getLogger( ReferringPagesPlugin.class );
056
057 /** Parameter name for setting the maximum items to show. Value is <tt>{@value}</tt>. */
058 public static final String PARAM_MAX = "max";
059
060 /** Parameter name for setting the text to show when the maximum items is overruled.
061 * Value is <tt>{@value}</tt>.
062 */
063 public static final String PARAM_EXTRAS = "extras";
064
065 /**
066 * Parameter name for choosing the page. Value is <tt>{@value}</tt>.
067 */
068 public static final String PARAM_PAGE = "page";
069
070 /**
071 * {@inheritDoc}
072 */
073 public String execute( WikiContext context, Map<String, String> params )
074 throws PluginException
075 {
076 ReferenceManager refmgr = context.getEngine().getReferenceManager();
077 String pageName = params.get( PARAM_PAGE );
078 ResourceBundle rb = Preferences.getBundle( context, WikiPlugin.CORE_PLUGINS_RESOURCEBUNDLE );
079
080 StringBuffer result = new StringBuffer( 256 );
081
082 if( pageName == null )
083 {
084 pageName = context.getPage().getName();
085 }
086
087 WikiPage page = context.getEngine().getPage( pageName );
088
089 if( page != null )
090 {
091 Collection links = refmgr.findReferrers( page.getName() );
092 String wikitext = "";
093
094 super.initialize( context, params );
095
096 int items = TextUtil.parseIntParameter( params.get( PARAM_MAX ), ALL_ITEMS );
097 String extras = params.get( PARAM_EXTRAS );
098 if( extras == null )
099 {
100 extras = rb.getString("referringpagesplugin.more");
101 }
102
103 if( log.isDebugEnabled() )
104 log.debug( "Fetching referring pages for "+page.getName()+
105 " with a max of "+items);
106
107 if( links != null && links.size() > 0 )
108 {
109 links = filterAndSortCollection( links );
110 wikitext = wikitizeCollection( links, m_separator, items );
111
112 result.append( makeHTML( context, wikitext ) );
113
114 if( items < links.size() && items > 0 )
115 {
116 Object[] args = { "" + ( links.size() - items) };
117 extras = MessageFormat.format(extras, args);
118
119 result.append( "<br />" );
120 result.append( "<a class='morelink' href='"+context.getURL( WikiContext.INFO, page.getName() )+"' ");
121 result.append( ">"+extras+"</a><br />");
122 }
123 }
124
125 //
126 // If nothing was left after filtering or during search
127 //
128 if (links == null || links.size() == 0)
129 {
130 wikitext = rb.getString("referringpagesplugin.nobody");
131
132 result.append( makeHTML( context, wikitext ) );
133 }
134 else
135 {
136 if( m_show.equals( PARAM_SHOW_VALUE_COUNT ) )
137 {
138 result = new StringBuffer();
139 result.append( links.size() );
140 if( m_lastModified )
141 {
142 result.append( " (" + m_dateFormat.format( m_dateLastModified ) + ")" );
143 }
144 }
145 }
146
147 return result.toString();
148 }
149
150 return "";
151 }
152
153 }