in jspwiki-main/src/main/java/org/apache/wiki/plugin/PageViewPlugin.java [289:452]
public String execute( final Context context, final Map< String, String > params ) throws PluginException {
final Engine engine = context.getEngine();
final Page page = context.getPage();
String result = STR_EMPTY;
if( page != null ) {
// get parameters
final String pagename = page.getName();
String count = params.get( PARAM_COUNT );
final String show = params.get( PARAM_SHOW );
int entries = TextUtil.parseIntParameter( params.get( PARAM_MAX_ENTRIES ), Integer.MAX_VALUE );
final int max = TextUtil.parseIntParameter( params.get( PARAM_MAX_COUNT ), Integer.MAX_VALUE );
final int min = TextUtil.parseIntParameter( params.get( PARAM_MIN_COUNT ), Integer.MIN_VALUE );
final String sort = params.get( PARAM_SORT );
final String body = params.get( DefaultPluginManager.PARAM_BODY );
final Pattern[] exclude = compileGlobs( PARAM_EXCLUDE, params.get( PARAM_EXCLUDE ) );
final Pattern[] include = compileGlobs( PARAM_INCLUDE, params.get( PARAM_INCLUDE ) );
final Pattern[] refer = compileGlobs( PARAM_REFER, params.get( PARAM_REFER ) );
final PatternMatcher matcher = (null != exclude || null != include || null != refer) ? new Perl5Matcher() : null;
boolean increment = false;
// increment counter?
if( STR_YES.equals( count ) ) {
increment = true;
} else {
count = null;
}
// default increment counter?
if( ( show == null || STR_NONE.equals( show ) ) && count == null ) {
increment = true;
}
// filter on referring pages?
Collection< String > referrers = null;
if( refer != null ) {
final ReferenceManager refManager = engine.getManager( ReferenceManager.class );
for( final String name : refManager.findCreated() ) {
boolean use = false;
for( int n = 0; !use && n < refer.length; n++ ) {
use = matcher.matches( name, refer[ n ] );
}
if( use ) {
final Collection< String > refs = engine.getManager( ReferenceManager.class ).findReferrers( name );
if( refs != null && !refs.isEmpty() ) {
if( referrers == null ) {
referrers = new HashSet<>();
}
referrers.addAll( refs );
}
}
}
}
synchronized( this ) {
Counter counter = m_counters.get( pagename );
// only count in view mode, keep storage values in sync
if( increment && ContextEnum.PAGE_VIEW.getRequestContext().equalsIgnoreCase( context.getRequestContext() ) ) {
if( counter == null ) {
counter = new Counter();
m_counters.put( pagename, counter );
}
counter.increment();
m_storage.setProperty( pagename, counter.toString() );
m_dirty = true;
}
if( show == null || STR_NONE.equals( show ) ) {
// nothing to show
} else if( PARAM_COUNT.equals( show ) ) {
// show page count
if( counter == null ) {
counter = new Counter();
m_counters.put( pagename, counter );
m_storage.setProperty( pagename, counter.toString() );
m_dirty = true;
}
result = counter.toString();
} else if( body != null && !body.isEmpty() && STR_LIST.equals( show ) ) {
// show list of counts
String header = STR_EMPTY;
String line = body;
String footer = STR_EMPTY;
int start = body.indexOf( STR_SEPARATOR );
// split body into header, line, footer on ---- separator
if( 0 < start ) {
header = body.substring( 0, start );
start = skipWhitespace( start + STR_SEPARATOR.length(), body );
int end = body.indexOf( STR_SEPARATOR, start );
if( start >= end ) {
line = body.substring( start );
} else {
line = body.substring( start, end );
end = skipWhitespace( end + STR_SEPARATOR.length(), body );
footer = body.substring( end );
}
}
// sort on name or count?
Map< String, Counter > sorted = m_counters;
if( PARAM_COUNT.equals( sort ) ) {
sorted = new TreeMap<>( m_compareCountDescending );
sorted.putAll( m_counters );
}
// build a messagebuffer with the list in wiki markup
final StringBuffer buf = new StringBuffer( header );
final MessageFormat fmt = new MessageFormat( line );
final Object[] args = new Object[] { pagename, STR_EMPTY, STR_EMPTY };
final Iterator< Entry< String, Counter > > iter = sorted.entrySet().iterator();
while( 0 < entries && iter.hasNext() ) {
final Entry< String, Counter > entry = iter.next();
final String name = entry.getKey();
// check minimum/maximum count
final int value = entry.getValue().getValue();
boolean use = min <= value && value <= max;
// did we specify a refer-to page?
if( use && referrers != null ) {
use = referrers.contains( name );
}
// did we specify what pages to include?
if( use && include != null ) {
use = false;
for( int n = 0; !use && n < include.length; n++ ) {
use = matcher.matches( name, include[ n ] );
}
}
// did we specify what pages to exclude?
if( use && null != exclude ) {
for( int n = 0; use && n < exclude.length; n++ ) {
use = !matcher.matches( name, exclude[ n ] );
}
}
if( use ) {
args[ 1 ] = engine.getManager( RenderingManager.class ).beautifyTitle( name );
args[ 2 ] = entry.getValue();
fmt.format( args, buf, null );
entries--;
}
}
buf.append( footer );
// let the engine render the list
result = engine.getManager( RenderingManager.class ).textToHTML( context, buf.toString() );
}
}
}
return result;
}