Index: src/com/ecyrd/jspwiki/VariableManager.java =================================================================== RCS file: /p/cvs/JSPWiki/src/com/ecyrd/jspwiki/VariableManager.java,v retrieving revision 1.30 diff -u -r1.30 VariableManager.java --- src/com/ecyrd/jspwiki/VariableManager.java 26 Aug 2007 17:15:18 -0000 1.30 +++ src/com/ecyrd/jspwiki/VariableManager.java 26 Dec 2007 19:34:45 -0000 @@ -19,6 +19,8 @@ */ package com.ecyrd.jspwiki; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; import java.security.Principal; import java.util.Date; import java.util.Iterator; @@ -40,7 +42,120 @@ */ public class VariableManager { - //private static Logger log = Logger.getLogger( VariableManager.class ); + private class SystemVariables{ + private WikiContext context; + public SystemVariables(WikiContext context) + { + this.context=context; + } + public String var_pagename(){ + return context.getPage().getName(); + } + public String var_applicationname(){ + return context.getEngine().getApplicationName(); + } + public String var_jspwikiversion(){ + return Release.getVersionString(); + } + public String var_encoding(){ + return context.getEngine().getContentEncoding(); + } + public String var_totalpages(){ + return Integer.toString(context.getEngine().getPageCount()); + } + public String var_pageprovider(){ + return context.getEngine().getCurrentProvider(); + } + public String var_pageproviderdescription(){ + return context.getEngine().getCurrentProviderInfo(); + } + public String var_attachmentprovider(){ + WikiProvider p = context.getEngine().getAttachmentManager().getCurrentProvider(); + return (p != null) ? p.getClass().getName() : "-"; + } + public String var_attachmentproviderdescription(){ + WikiProvider p = context.getEngine().getAttachmentManager().getCurrentProvider(); + + return (p != null) ? p.getProviderInfo() : "-"; + } + public String var_interwikilinks(){ + StringBuffer res = new StringBuffer(); + + for( Iterator i = context.getEngine().getAllInterWikiLinks().iterator(); i.hasNext(); ) + { + if( res.length() > 0 ) res.append(", "); + String link = (String) i.next(); + res.append( link ); + res.append( " --> " ); + res.append( context.getEngine().getInterWikiURL(link) ); + } + return res.toString(); + } + public String var_inlinedimages(){ + StringBuffer res = new StringBuffer(); + + for( Iterator i = context.getEngine().getAllInlinedImagePatterns().iterator(); i.hasNext(); ) + { + if( res.length() > 0 ) res.append(", "); + + String ptrn = (String) i.next(); + res.append(ptrn); + } + + return res.toString(); + } + public String var_pluginpath(){ + String s = context.getEngine().getPluginSearchPath(); + + return (s == null) ? "-" : s; + } + public String var_baseurl(){ + return context.getEngine().getBaseURL(); + } + public String var_uptime(){ + Date now = new Date(); + long secondsRunning = (now.getTime() - context.getEngine().getStartTime().getTime())/1000L; + + long seconds = secondsRunning % 60; + long minutes = (secondsRunning /= 60) % 60; + long hours = (secondsRunning /= 60) % 24; + long days = secondsRunning /= 24; + + return days+"d, "+hours+"h "+minutes+"m "+seconds+"s"; + } + public String var_loginstatus(){ + WikiSession session = context.getWikiSession(); + return session.getStatus(); + } + public String var_username(){ + Principal wup = context.getCurrentUser(); + + return wup != null ? wup.getName() : "not logged in"; + } + public String var_requestcontext(){ + return context.getRequestContext(); + } + public String var_pagefilters(){ + List filters = context.getEngine().getFilterManager().getFilterList(); + StringBuffer sb = new StringBuffer(); + + for( Iterator i = filters.iterator(); i.hasNext(); ) + { + PageFilter pf = (PageFilter)i.next(); + String f = pf.getClass().getName(); + + if( pf instanceof InternalModule ) + continue; + + if( sb.length() > 0 ) sb.append(", "); + sb.append( f ); + } + + return sb.toString(); + } + } + + //private static Logger log = Logger.getLogger( VariableManager.class ); // FIXME: These are probably obsolete. public static final String VAR_ERROR = "error"; @@ -215,8 +330,6 @@ * @throws IllegalArgumentException If the name is somehow broken. * @throws NoSuchVariableException If a variable is not known. */ - // FIXME: Currently a bit complicated. Perhaps should use reflection - // or something to make an easy way of doing stuff. public String getValue( WikiContext context, String varName ) throws IllegalArgumentException, @@ -236,133 +349,21 @@ if( name.equals(THE_BIG_NO_NO_LIST[i]) ) return ""; // FIXME: Should this be something different? } - - if( name.equals("pagename") ) - { - return context.getPage().getName(); - } - else if( name.equals("applicationname") ) - { - return context.getEngine().getApplicationName(); - } - else if( name.equals("jspwikiversion") ) - { - return Release.getVersionString(); - } - else if( name.equals("encoding") ) - { - return context.getEngine().getContentEncoding(); - } - else if( name.equals("totalpages") ) - { - return Integer.toString(context.getEngine().getPageCount()); - } - else if( name.equals("pageprovider") ) - { - return context.getEngine().getCurrentProvider(); - } - else if( name.equals("pageproviderdescription") ) - { - return context.getEngine().getCurrentProviderInfo(); - } - else if( name.equals("attachmentprovider") ) - { - WikiProvider p = context.getEngine().getAttachmentManager().getCurrentProvider(); - return (p != null) ? p.getClass().getName() : "-"; - } - else if( name.equals("attachmentproviderdescription") ) - { - WikiProvider p = context.getEngine().getAttachmentManager().getCurrentProvider(); - - return (p != null) ? p.getProviderInfo() : "-"; - } - else if( name.equals("interwikilinks") ) - { - StringBuffer res = new StringBuffer(); - - for( Iterator i = context.getEngine().getAllInterWikiLinks().iterator(); i.hasNext(); ) - { - if( res.length() > 0 ) res.append(", "); - String link = (String) i.next(); - res.append( link ); - res.append( " --> " ); - res.append( context.getEngine().getInterWikiURL(link) ); - } - return res.toString(); - } - else if( name.equals("inlinedimages") ) - { - StringBuffer res = new StringBuffer(); - - for( Iterator i = context.getEngine().getAllInlinedImagePatterns().iterator(); i.hasNext(); ) - { - if( res.length() > 0 ) res.append(", "); - - String ptrn = (String) i.next(); - res.append(ptrn); - } - - return res.toString(); - } - else if( name.equals("pluginpath") ) - { - String s = context.getEngine().getPluginSearchPath(); - - return (s == null) ? "-" : s; - } - else if( name.equals("baseurl") ) - { - return context.getEngine().getBaseURL(); - } - else if( name.equals("uptime") ) - { - Date now = new Date(); - long secondsRunning = (now.getTime() - context.getEngine().getStartTime().getTime())/1000L; - - long seconds = secondsRunning % 60; - long minutes = (secondsRunning /= 60) % 60; - long hours = (secondsRunning /= 60) % 24; - long days = secondsRunning /= 24; - - return days+"d, "+hours+"h "+minutes+"m "+seconds+"s"; - } - else if( name.equals("loginstatus") ) - { - WikiSession session = context.getWikiSession(); - return session.getStatus(); - } - else if( name.equals("username") ) - { - Principal wup = context.getCurrentUser(); - - return wup != null ? wup.getName() : "not logged in"; - } - else if( name.equals("requestcontext") ) - { - return context.getRequestContext(); - } - else if( name.equals("pagefilters") ) + try { - List filters = context.getEngine().getFilterManager().getFilterList(); - StringBuffer sb = new StringBuffer(); - - for( Iterator i = filters.iterator(); i.hasNext(); ) - { - PageFilter pf = (PageFilter)i.next(); - String f = pf.getClass().getName(); - - if( pf instanceof InternalModule ) - continue; - - if( sb.length() > 0 ) sb.append(", "); - sb.append( f ); - } - - return sb.toString(); + //Using reflection to get system variables adding a new system variable + //now only invloves createing a new method in the SystemVariables class + //with a name starting with var_. Example: + // public String var_mysysvar(){ + // return "Hello World"; + // } + SystemVariables sysvars = new SystemVariables(context); + Method sysvar_method = sysvars.getClass().getMethod("var_"+name, null); + return (String)sysvar_method.invoke(sysvars, null); } - else + //It is not a system var. Time to handle the other cases. + catch (NoSuchMethodException e1) { - // // Check if such a context variable exists, // returning its string representation. // @@ -429,5 +430,10 @@ throw new NoSuchVariableException( "No variable "+varName+" defined." ); } + //If something scary happens return a empty string + catch (SecurityException e){} + catch (IllegalAccessException e){} + catch (InvocationTargetException e){} + return ""; } }