001: /**
002: * Copyright (c) 2003-2007, David A. Czarnecki
003: * All rights reserved.
004: *
005: * Redistribution and use in source and binary forms, with or without
006: * modification, are permitted provided that the following conditions are met:
007: *
008: * Redistributions of source code must retain the above copyright notice, this list of conditions and the
009: * following disclaimer.
010: * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the
011: * following disclaimer in the documentation and/or other materials provided with the distribution.
012: * Neither the name of "David A. Czarnecki" and "blojsom" nor the names of its contributors may be used to
013: * endorse or promote products derived from this software without specific prior written permission.
014: * Products derived from this software may not be called "blojsom", nor may "blojsom" appear in their name,
015: * without prior written permission of David A. Czarnecki.
016: *
017: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
018: * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
019: * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
020: * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
021: * EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
022: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
023: * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
024: * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
025: * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
026: * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
027: * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
028: * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
029: * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
030: */package org.blojsom.plugin.statistics;
031:
032: import org.blojsom.blog.Blog;
033: import org.blojsom.blog.Entry;
034: import org.blojsom.plugin.Plugin;
035: import org.blojsom.plugin.PluginException;
036: import org.blojsom.util.BlojsomUtils;
037:
038: import javax.servlet.http.HttpServletRequest;
039: import javax.servlet.http.HttpServletResponse;
040: import java.util.Map;
041: import java.util.StringTokenizer;
042:
043: /**
044: * Word Count plugin.
045: *
046: * @author David Czarnecki
047: * @since blojsom 3.0
048: * @version $Id: WordCountPlugin.java,v 1.2 2007/01/17 02:35:14 czarneckid Exp $
049: */
050: public class WordCountPlugin implements Plugin {
051:
052: public static final String WORD_COUNT_PLUGIN_HELPER = "WORD_COUNT_PLUGIN_HELPER";
053: public static final String BLOJSOM_PLUGIN_WORD_COUNT_METADATA = "blojsom-plugin-word-count";
054:
055: /**
056: * Default constructor.
057: */
058: public WordCountPlugin() {
059: }
060:
061: /**
062: * Initialize this plugin. This method only called when the plugin is instantiated.
063: *
064: * @param servletConfig Servlet config object for the plugin to retrieve any initialization parameters
065: * @param blojsomConfiguration {@link org.blojsom.blog.BlojsomConfiguration} information
066: * @throws org.blojsom.plugin.PluginException
067: * If there is an error initializing the plugin
068: */
069: public void init() throws PluginException {
070: }
071:
072: /**
073: * Process the blog entries
074: *
075: * @param httpServletRequest Request
076: * @param httpServletResponse Response
077: * @param blog {@link Blog} instance
078: * @param context Context
079: * @param entries Blog entries retrieved for the particular request
080: * @return Modified set of blog entries
081: * @throws PluginException If there is an error processing the blog entries
082: */
083: public Entry[] process(HttpServletRequest httpServletRequest,
084: HttpServletResponse httpServletResponse, Blog blog,
085: Map context, Entry[] entries) throws PluginException {
086: for (int i = 0; i < entries.length; i++) {
087: Entry entry = entries[i];
088: Map entryMetaData = entry.getMetaData();
089:
090: if (entry.getDescription() == null) {
091: entryMetaData.put(BLOJSOM_PLUGIN_WORD_COUNT_METADATA,
092: new Integer(0));
093: } else {
094: String entryWithoutTags = entry.getDescription();
095: entryWithoutTags = entryWithoutTags.replaceAll(
096: "\\<.*?\\>", "");
097: StringTokenizer tokenizer = new StringTokenizer(
098: entryWithoutTags);
099: entryMetaData.put(BLOJSOM_PLUGIN_WORD_COUNT_METADATA,
100: new Integer(tokenizer.countTokens()));
101: }
102:
103: entry.setMetaData(entryMetaData);
104: }
105:
106: context.put(WORD_COUNT_PLUGIN_HELPER, new WordCountHelper());
107:
108: return entries;
109: }
110:
111: /**
112: * Perform any cleanup for the plugin. Called after {@link #process}.
113: *
114: * @throws org.blojsom.plugin.PluginException
115: * If there is an error performing cleanup for this plugin
116: */
117: public void cleanup() throws PluginException {
118: }
119:
120: /**
121: * Called when BlojsomServlet is taken out of service
122: *
123: * @throws org.blojsom.plugin.PluginException
124: * If there is an error in finalizing this plugin
125: */
126: public void destroy() throws PluginException {
127: }
128:
129: /**
130: * Class to handle word count for text in templates
131: */
132: public class WordCountHelper {
133:
134: /**
135: * Count the number of words in a piece of text
136: *
137: * @param text Text
138: * @return # of words in text, 0 if text is <code>null</code> or blank
139: */
140: public Integer countWords(String text) {
141: if (BlojsomUtils.checkNullOrBlank(text)) {
142: return new Integer(0);
143: } else {
144: String textWithoutTokens = text.replaceAll("\\<.*?\\>",
145: "");
146: StringTokenizer tokenizer = new StringTokenizer(
147: textWithoutTokens);
148:
149: return new Integer(tokenizer.countTokens());
150: }
151: }
152: }
153: }
|