001: /*
002: JSPWiki - a JSP-based WikiWiki clone.
003:
004: Copyright (C) 2002 Janne Jalkanen (Janne.Jalkanen@iki.fi)
005:
006: This program is free software; you can redistribute it and/or modify
007: it under the terms of the GNU Lesser General Public License as published by
008: the Free Software Foundation; either version 2.1 of the License, or
009: (at your option) any later version.
010:
011: This program is distributed in the hope that it will be useful,
012: but WITHOUT ANY WARRANTY; without even the implied warranty of
013: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
014: GNU Lesser General Public License for more details.
015:
016: You should have received a copy of the GNU Lesser General Public License
017: along with this program; if not, write to the Free Software
018: Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
019: */
020: package com.ecyrd.jspwiki.plugin;
021:
022: import com.ecyrd.jspwiki.*;
023: import com.ecyrd.jspwiki.providers.ProviderException;
024: import org.apache.log4j.Logger;
025:
026: import java.text.SimpleDateFormat;
027: import java.util.*;
028:
029: /**
030: * Builds a simple weblog.
031: *
032: * @since 1.9.21
033: */
034: public class WeblogEntryPlugin implements WikiPlugin {
035: private static Logger log = Logger
036: .getLogger(WeblogEntryPlugin.class);
037:
038: public static final int MAX_BLOG_ENTRIES = 10000; // Just a precaution.
039:
040: public static final String PARAM_ENTRYTEXT = "entrytext";
041: /**
042: * Optional parameter: page that actually contains the blog.
043: * This lets us provide a "new entry" link for a blog page
044: * somewhere else than on the page itself.
045: */
046: // "page" for uniform naming with WeblogPlugin...
047: public static final String PARAM_BLOGNAME = "page";
048:
049: public String getNewEntryPage(WikiEngine engine, String blogName)
050: throws ProviderException {
051: SimpleDateFormat fmt = new SimpleDateFormat(
052: WeblogPlugin.DEFAULT_DATEFORMAT);
053: String today = fmt.format(new Date());
054:
055: int entryNum = findFreeEntry(engine.getPageManager(), blogName,
056: today);
057:
058: String blogPage = WeblogPlugin.makeEntryPage(blogName, today,
059: "" + entryNum);
060:
061: return blogPage;
062: }
063:
064: public String execute(WikiContext context, Map params)
065: throws PluginException {
066: ResourceBundle rb = context
067: .getBundle(WikiPlugin.CORE_PLUGINS_RESOURCEBUNDLE);
068:
069: String weblogName = (String) params.get(PARAM_BLOGNAME);
070: if (weblogName == null) {
071: weblogName = context.getPage().getName();
072: }
073: WikiEngine engine = context.getEngine();
074:
075: StringBuffer sb = new StringBuffer();
076:
077: String entryText = (String) params.get(PARAM_ENTRYTEXT);
078: if (entryText == null)
079: entryText = rb.getString("weblogentryplugin.newentry");
080:
081: String url = context.getURL(WikiContext.NONE,
082: "NewBlogEntry.jsp", "page="
083: + engine.encodeName(weblogName));
084:
085: sb.append("<a href=\"" + url + "\">" + entryText + "</a>");
086:
087: return sb.toString();
088: }
089:
090: private int findFreeEntry(PageManager mgr, String baseName,
091: String date) throws ProviderException {
092: Collection everyone = mgr.getAllPages();
093: int max = 0;
094:
095: String startString = WeblogPlugin.makeEntryPage(baseName, date,
096: "");
097:
098: for (Iterator i = everyone.iterator(); i.hasNext();) {
099: WikiPage p = (WikiPage) i.next();
100:
101: if (p.getName().startsWith(startString)) {
102: try {
103: String probableId = p.getName().substring(
104: startString.length());
105:
106: int id = Integer.parseInt(probableId);
107:
108: if (id > max) {
109: max = id;
110: }
111: } catch (NumberFormatException e) {
112: log.debug("Was not a log entry: " + p.getName());
113: }
114: }
115: }
116:
117: //
118: // Find the first page that has no page lock.
119: //
120: int idx = max + 1;
121:
122: while (idx < MAX_BLOG_ENTRIES) {
123: WikiPage page = new WikiPage(mgr.getEngine(), WeblogPlugin
124: .makeEntryPage(baseName, date, Integer
125: .toString(idx)));
126: PageLock lock = mgr.getCurrentLock(page);
127:
128: if (lock == null) {
129: break;
130: }
131:
132: idx++;
133: }
134:
135: return idx;
136: }
137:
138: }
|