package com.inexas.jspwikiplugins; import java.sql.*; import java.util.*; import com.ecyrd.jspwiki.*; import com.ecyrd.jspwiki.plugin.*; /** * Yet another hit count plugin for JSPWiki. A database is used and is fully * configurable through properties in the jspwiki.properties. You should * include something like this in the * * # HitCounter plugin * com.inexas.jspwikiplugins.HitCounter.DbDriver=org.hsqldb.jdbcDriver * com.inexas.jspwikiplugins.HitCounter.DbUrl=jdbc:hsqldb:mem:processlab * com.inexas.jspwikiplugins.HitCounter.DbUser=sa * com.inexas.jspwikiplugins.HitCounter.DbPassword= * com.inexas.jspwikiplugins.HitCounter.TestTableSql=SELECT count(*) FROM hitCount * com.inexas.jspwikiplugins.HitCounter.CreateTableSql=CREATE TABLE hitCount(pageKey VARCHAR PRIMARY KEY,pageHits INT NOT NULL) * com.inexas.jspwikiplugins.HitCounter.ReadHitCountSql=SELECT pageHits FROM hitCount WHERE pageKey=? * com.inexas.jspwikiplugins.HitCounter.InsertHitCountSql=INSERT INTO hitCount(pageKey,pageHits)VALUES(?,?) * com.inexas.jspwikiplugins.HitCounter.UpdateHitCountSql=UPDATE hitCount SET pageHits=? WHERE pageKey=? * * @author Keith Whittingham * $Revision: 1.3 $ */ @SuppressWarnings("unchecked") public class HitCounter implements WikiPlugin { private Connection connection; private String readHitCountSql, insertHitCountSql, updateHitCountSql; private boolean hide; private WikiContext context; private Map parameters; /** Used for unit tests in place of WikiContext */ static Map testWikiContext; /** * This method is called each time a wiki page is shown. * * @return the HTML to display */ public String execute(WikiContext wikiContext, Map pluginParameters) throws PluginException { try { this.context = wikiContext; this.parameters = pluginParameters; initialize(); // Create the key for this page... final String key; if(wikiContext == null) { // It's a unit test.. key = testWikiContext.get("key"); } else { // We're live final String contextName = wikiContext.getEngine().getApplicationName(); final String pageName = wikiContext.getPage().getName(); key = contextName + "::" + pageName; } // Read the current hit count value... final int hitCount; final PreparedStatement readPs = connection.prepareStatement(readHitCountSql); readPs.setString(1, key); final ResultSet rs = readPs.executeQuery(); if(rs.next()) { // Count exists, increment it... hitCount = rs.getInt(1) + 1; final PreparedStatement updatePs = connection.prepareStatement(updateHitCountSql); updatePs.setInt(1, hitCount); updatePs.setString(2, key); updatePs.executeUpdate(); updatePs.close(); } else { // Hit count doesn't exist yet, create a new one... hitCount = 1; final PreparedStatement createPs = connection.prepareStatement(insertHitCountSql); createPs.setString(1, key); createPs.setInt(2, hitCount); createPs.executeUpdate(); createPs.close(); } readPs.close(); return hide ? "" : Integer.toString(hitCount); } catch(final Exception e) { if(connection != null) { try { connection.close(); } catch(final SQLException e1) { // Ignore it } connection = null; } return e.getClass().getName() + ": " + e.getMessage(); } } private void initialize() throws Exception { // If the connection is null we'll reload everything.... if(connection == null) { // Create a connection... final String driver = getConfig("com.inexas.jspwikiplugins.HitCounter.DbDriver"); final String url = getConfig("com.inexas.jspwikiplugins.HitCounter.DbUrl"); final String user = getConfig("com.inexas.jspwikiplugins.HitCounter.DbUser"); final String password = getConfig("com.inexas.jspwikiplugins.HitCounter.DbPassword"); Class.forName(driver); connection = DriverManager.getConnection(url, user, password); // Load the SQL strings final String testTable = getConfig("com.inexas.jspwikiplugins.HitCounter.TestTableSql"); final String createTable = getConfig("com.inexas.jspwikiplugins.HitCounter.CreateTableSql"); readHitCountSql = getConfig("com.inexas.jspwikiplugins.HitCounter.ReadHitCountSql"); insertHitCountSql = getConfig("com.inexas.jspwikiplugins.HitCounter.InsertHitCountSql"); updateHitCountSql = getConfig("com.inexas.jspwikiplugins.HitCounter.UpdateHitCountSql"); // Check the DB table exists, if not create it... final Statement statement = connection.createStatement(); try { statement.execute(testTable); } catch(final Exception e) { // Test failed, try and create the table... statement.execute(createTable); } finally { statement.close(); } // See if the user wants to hide the counter... hide = parameters.containsKey("hide"); } } private String getConfig(String key) throws Exception { final String result; if(context == null) { // It's a unit test... result = testWikiContext.get(key); } else { // We're live.. result = context.getEngine().getWikiProperties().getProperty(key); } if(result == null) { throw new Exception("Cannot find parameter in jspwiki.properties: " + key); } return result; } }