2006-04-20  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.3.104
        
        * Tiny beautification: the attachment URLs no longer have %2F
        but a slash.  Reported by Mikkel Troest.
        
        * LockReaper and RSSThread actually start now; we were calling the
        setDaemon() in a wrong place.  Reported by Mikkel Troest.
        
        * Removed a dumb auth statement from SandBox. Thanks to
        Murray Altheim.

2006-04-19  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.3.103
        
        * Great URL mixup fix: we're now using %20 to encode spaces
        instead of "+".  This is because of
        http://issues.apache.org/bugzilla/show_bug.cgi?id=39278.
        In addition, we're moving away from using TextUtil.urlEncode().
        This fix should by the way also fix plenty of issues with
        non-latin1 page names.
        
        * All JSPWiki daemon threads are now, well, official daemon
        threads, so they should not hold up any exit.  This should fix
        an issue with Tomcat not quitting properly.

        * When login failed, you would get the URLEncoded page name
        instead of plain text.
        
        * If the java.security.policy is already set, makes a sanity
        check and tries to find also the keystore file in the same directory.
        If it's not there, prints out a warning to the log.  Otherwise,
        there's no way to know about this: Java itself won't mention
        this at all - it would just fail silently when instantiating
        permissions.  Boo hiss!

2006-04-17  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.3.102
        
        * DavServlet was not properly reading UTF-8 file names
        
        * CachingProvider was calling cancelUpdate() accidentally
        when it wasn't supposed to.
        
        * BreadCrumbsTag default icon is now "," instead of ">", since
        it was not a) proper XHTML, and b) it was confusing people.
        Reported by Dirk Fredericx et al.
        
        * DefaultURLConstructor was still assuming all URIs are in
        Latin1 instead of relying on the request encoding.  This would
        cause problems with non-Latin1 page names (even when using UTF-8).
        Reported and fixed by Mikkel Troest.
        
        * 2.3.101
        
        * Upgraded to OSCache 2.3.1 to fix some issues with stability
        
        * VariableManager is now slightly faster.
        
        * VariableManager no longer outputs HTML (due to the new
        rendering system which thinks that HTML is dangerous).
        
        * WebContainerAuthorizer is now a bit more verbose if
        there is no internet connection and it cannot find local
        DTDs.  It also throws a InternalWikiExcepton instead of
        a generic RuntimeException or a NullPointerException... 
        
        * I don't know why, but SpamFilter.Host was a public class;
        made it private for now...
        
        * JSPWikiMarkupParser now caches the outlink image, and
        does not generate it new each time.  This gives us roughly
        a 2% saving on each rendering...  Oh, the things you
        learn when you run a profiler against your app!
        
        * Added plenty'o'javadocs to parser/rendering routines.
        
        * Tiny cleanups and tweaks all around; mostly concerning
        allocating proper size StringBuffers to avoid resizing
        overhead.
        
        * CachingAttachmentProvider no longer outputs HTML when
        asked about the cache size.
        
        * CachingProvider would fail to call Cache.cancelUpdate()
        in some certain rare conditions.  Over time on a busy wiki
        they would accumulate and hang all the HTTP responder 
        threads.
        
        * VersioningFileProvider was a bit relaxed about closing
        streams in error situations.  Now handles them properly.
        
        * RenderingManager cleaned up a lot; new parameter
        jspwiki.renderingManager.capacity added.  Also the
        renderingManager.useCache is now gone; set the capacity
        to zero to turn off caching.
        
        * WikiServletFilter is now a bit more tolerant towards
        Exceptions - it actually restores the NDC now...
        
        * Rename.jsp had an extraneous encodeName(), causing
        page rename failing if it was renamed to anything outside
        the ASCII range.  Fix contributed by Mikkel Troest.
        
        * TestHttpServletRequest now implements the required
        extra methods for the newest servlet API, so it can be
        compiled in newer environments.

2006-04-13  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.3.100

        * Fixed BugOptimizeFileUtil.copyContents.  FileUtil ops
        are now way faster.  Thanks to Kees Kuip!

        * Typo fixed in BasicSearchProvider; thanks to Chuck Smith.

2006-04-12  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.3.99
        
        * Variables in plugin parameters and body are now expanded.
        e.g. [{SamplePlugin text='{$jspwiki.baseurl}'}]
        
        * Added missing accessKey parameter to LinkTag.  Reported
        by Dirk Fredericx. 

2006-04-10  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.3.98
        
        * Killed extra <param> tag definition from jspwiki.tld; it was
        there twice.
        
        * AuthorizationManager.resolvePrincipal() no longer dies if JAAS
        is not in use and someone still tries to set an Acl.
        
        * WikiSecurityEvent now uses Jakarta Lang ArrayUtils.  Hooray
        for code reuse!
        
        * SpamFilter rewritten so that it can use the usual format of
        a blacklist; default is to use SpamFilterWordList/blacklist.txt,
        but you can control it with a filter parameter "blacklist".
        
        * Both CachingAttachmentProvider and CachingProvider had issues
        in case the underlying provider would fail, and might hang.
        
        * LinkTag was not properly parsing the Param tag in case you just
        specified a context.
        
        * Fixed a huge bunch of Javascript and CSS issues from Dirk
        Fredericx.  Fixes BugV2.3.90SomeJavascriptBugfixes.
        
        * InfoContent.jsp was behaving erratically with attachments;
        e.g. the version history was missing altogether.  Thanks to DF!

2006-04-10  Erik Bunn  <Erik.Bunn@basen.net>

        * 2.3.97
        
        * Fixed PageRenamer.renamePage(): pages referring to renamed page
        are now looked up before that information is destroyed. Makes 
        updating referring pages much easier.

2006-04-09  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.3.96

        * Split the wikipages to corepages and documentation.  We
        now generate two zip files into the binary distro:
        JSPWiki-doc.zip, which contains all the javadocs, plain-text
        documentation and documentation-related wikipages, and
        JSPWiki-corepages.zip, which contains the pages which are
        necessary for JSPWiki to run.  This should make it easier
        for people to get going.  The file which determines which
        pages belong to the "corepages" set is under src/webdocs/.corepages
        
        * Added patch from Mikkel Troest to fix an attachment delete issue.
        
        * Added patch from Lars Orta to create a HTML report for all
        JUnit tests.

2006-04-05  Erik Bunn  <Erik.Bunn@basen.net>

        * 2.3.95
        
        * Added missing call to super.initTag in LinkTag.initTag
        
        * 2.3.94
        
        * Added initTag() to all tags extending WikiTagBase, and
        release() to all extending regular tag support classes.
        (Switched release() to initTag() in WikiLinkTag, accordingly.)

        * Added release() to WikiLinkTag to clear page etc. from cached
        tags. This caused the wrong page name to be used in certain uses
        of LinkTag.

2006-04-03  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.3.93
        
        * RenderingManager would hang if rendering would fail.  This
        might explain some hangs.
        
        * With relation to the above: JSPWikiMarkupParser is now protected
        against lines which are too long (the PushBackReader would
        overflow).  Interestingly, this and the above bug were exposed
        by a spammer advertising mobile ringtones with a really, really,
        really long line and lots of links.
        
        * Added "jspwiki.security" to turn off jspwiki security model.
        Allowed values are "jaas" (default) to use built-in JAAS security
        model, or "container" to use the old 2.2 model.  Please note
        that using "container" does not yet disable any UI functionality.

2006-04-02  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.3.92
        
        * Fixed BIG issue with LinkTag: it did not clean its parameters
        properly in case it was pooled.  Added initTag() method to
        WikiTagBase.  Reported by Terry Steichen; found by Frank Fischer.

2006-03-29  Andrew Jaquith <andrew AT freshcookies DOT org>

        * 2.3.91
        
        * Enhancement: Added a new PagePermission target "update" that 
        serves as a shorthand for "edit the text on the page" AND 
        "upload files". The "edit" target, meanwhile, has been changed 
        to mean ONLY "edit the text on the page." The default policy file 
        now states that anonymous and asserted users can edit all pages 
        (but they cannot upload files). Authenticated users can, by default, 
        modify all pages (i.e., edit AND upload).
        
        * Bugfix: Fixed PolicyLoader so that there are no import dependencies on
        private Sun classes for PolicyFile and Configuration (JAAS). Instead,
        we read the appropriate security provider properties from the JVM and 
        instantiate the classes using Class.forName().newInstance. This is MUCH 
        cleaner and portable, and it *should* enable JSPWiki to work on WebSphere, 
        Resin and other containers that use non-Sun JDKs, JAAS configuration 
        implementations or J2SE PolicyFile implementations. As fixes go, 
        this is a good'un. If you have been having trouble making JSPWiki work
        on combinations other than Sun JDK + Tomcat, you should give this
        version a try.
        
        * BugFix: Added a new PermissionCollection implementation that
        fixes a subtle corner-case bug with the security policy file.
        If only the JSPWiki AllPermission was granted to a particular group
        (i.e., the grant block did not specify any other permissions), the 
        implied WikiPermissions and PagePermissions were NOT inferred as 
        they should have been.
        
        * Bugfix: Found and killed an NPE in TextUtil that was causing NewGroups.jsp
        to fail.
        
        * Minor changes to test security policy file.
        
2006-03-22  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.3.90
        
        * Fixes BugTemplateManagerRESOURCESTYLESHEETNok
        
        * Adds a new resource request type RESOURCE_INLINECSS at
        the request of Dirk Fredericx.
        
        * Added the necessary include to INLINECSS to commonheader.jsp
        
        * WikiEngine.getViewURL() is now null-protected.  Some
        templates were actually using it, but code wasn't working
        as expected.
        
        * Added patch from Kalle Kivimaa to flush the referring
        rendered pages if page started to exist.
        
        * Tabs for UserPreferences did not work due to a slight
        mistake in previous patch...
        
2006-03-22  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.3.89
        
        * Bug fix: in certain cases DefaultURLConstructor would get
        a null name and have a seizure.  Thanks to Terry Steichen.
        
        * Incorporated patch from Chuck Smith to support multiple
        editors.
        
        * Bug fix: BugDefaultTemplateViolatesJSPSpecification.

2006-03-20  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.3.88

        * Previews are now fixed.  We no longer use pageContext.forward()
        but we send an honest, hardworking redirect (and store the 
        edited text in the session).

        * Ditto for PageModified.

2006-03-16  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.3.87

        * Bug fix: XmlUserDatabase would default to the distro
        user database in /WEB-INF/ if the user-set database was not
        found.  However, this made it practically impossible to
        bootstrap a new user database, as you needed to create the
        file by hand...
        
        * Bug fix: Page attributes were not available, if the page
        data was saved by ReferenceManager.  Now ReferenceManager
        also caches the page data under $workDir.  This should
        resolve quite a few problems relating to user groups
        not being valid until they are modified, etc.
        
        * Made the ACCESS_DENIED event an INFO level event, simply
        because my mailbox started to fill with JSPWiki ACCESS_DENIED
        events (they are generated in a bit too chatty fashion).
        
        * DefaultURLConstructor now gets Delete.jsp as well
        
        * Mucked about in InfoContent.jsp to fix a problem with
        it actually sending the wrong context...  Credit to 
        Terry Steichen.

2006-03-07  Erik Bunn  <Erik.Bunn@basen.net>

        * src/webdocs/templates/default/InfoContent.jsp: Moved delete 
        forms into single td blocks. Fixes weird rendering problem 
        that sometimes caused delete tr to be invisible in firefox.

2006-02-23  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.3.86
        
        * Removed HttpUtil.getBaseURL().  It just did not work,
        and was causing major pains with people.  However:
        
        * Got rid of <wiki:BaseURL/> from the default template.  Now,
        if you specify jspwiki.referenceStyle=relative, you should
        be getting relative URLs everywhere, if possible.  This was
        a major change, so there might still be bugs related to this.
        To be precise, you are likely to get absolute paths, but 
        with no hostname (this depends on your URLConstructor).
        
        * LinkTag gained a new parameter: templatefile (which is a
        shortcut to point at a file in the current template)
        
        * Added missing Param tag in the jspwiki.tld
        
        * Bug fix: Attachments would generate an illegal id for
        headings.  Removed the "/" and replaced it with "_".
        
        * Deprecated RSSCoffeeCupImageTag.  No point in coding for
        a single platform.  It will be removed in 2.6...
        
        * Added a new RSS feed icon.
        
        * Fixed problem with LinkTag forgetting to close anchor
        (reported by many people, sorry I totally missed this).

2006-02-28  Andrew Jaquith <andrew AT freshcookies DOT org>

        * 2.3.85
        
        * Added an informational logging message to PolicyLoader
        that makes it clear when JSPWiki can't install its security
        policy because another one is already in use.
        Credit: Terry Steichen
        
        * Bug fix: PermissionTag didn't recognize the new root-like
        AllPermission. It now accepts it as an argument to the
        "permission" attribute (the first letter is lowercase). Thus, 
        <wiki:Permission permission="allPermission"> will evaluate
        the tag body if the current user posseses AllPermission for
        the wiki; if not, the contents will be skipped.
        Credit: Terry Steichen
        
2006-02-26  Andrew Jaquith <andrew AT freshcookies DOT org>

        * 2.3.84
        
        * Cosmetic: added NewGroup.jsp and Login.jsp as "special page"
        references in jspwiki.properties. This prevents these pages
        from displaying the name "Main" at odd times.
        
        * Bug fix: eliminated that annoying "User 'null' has started
        editing this page...." bug. Embarassingly dumb error.
        
        * Bug fix: in WikiSession class, wrapped cached WikiSessions
        with WeakRefererences to allow garbage collection when user's
        HttpSession expires. 
        
        * Enhancement: added a static method sessions() to WikiSession
        that counts the number of active wiki sessions. Added a
        simple wiki plugin, SessionsPlugin, that returns the same.
        Slight re-organization of WikiSession (static methods now 
        at bottom). Sample usage: 
        
        There are [{INSERT SessionsPlugin}] active wiki sessions
         
2006-02-25  Andrew Jaquith <andrew AT freshcookies DOT org>

        * 2.3.83
        
        * The jspwiki.policy file now includes a sample 'Admin' group
        that demonstrates how to grant administrative privileges
        (AllPermission). It is *not* enabled by default.
        
        * Bug fix: Authenticated users belonging to wiki groups were
        erroneously seeing the group name, not their full names, added
        as authors to comments and pages. WikiSession was not checking
        for GroupPrincipals in several places. This has been fixed. 
        Credit: Janne Jalkanen
        
        * Bug fix: Group principals are now only injected if a user
        has successfully authenticated.
        
        * Enhancement: build.properties and jspwiki.properties now
        support configuration of a log4j-based security log. The
        default name is security.log. Use it to view error conditions
        or more detailed trace information about login/logout events,
        authorization decisions and more. To provide this capability,
        WikiSecurityEvent constructors were modified to add log entries
        to the Log4J Logger "SecurityLog".
        
        * AuthenticationManager and AuthorizationManager gain support
        for wiki security events: login/logout, and access granted/denied,
        respectively. These classes also were lightly re-organized;
        the classes themselves, and all of their methods, were made final.
        
        * All add/removeWikiEventListener() methods, in all classes,
        are now synchronized.
        
        * Due to the addition of logout events to WikiSecurityEvent,
        the method AuthenticationManager.logout() is no longer static.
        As a result, Logout.jsp changed slightly.

2006-02-23  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.3.82

        * BreadcrumbsTag.doWikiStartTag() is no longer final.
        I don't understand why it was final in the first place...
        
        * Tiny refactoring: moved Event routines to a 
        new com.ecyrd.jspwiki.event package.  No functionality
        changes today.

2006-02-21  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.3.81
        
        * Bug fix: BugPreformattedTextDoesntWorkAnyMore
        
        * Bug fix: BugPleaseMakePaperclipPicsConfigurableJustLikeOutlinks by
        making the "jspwiki.translatorReader.useAttachmentImage" available. 
        Set to "false" to turn paperclip images disappear.
        
        * Bug fix: page deletion would screw up Refmgr internal databases,
        and not serialize on disk.
        
        * Bug fix: BugTableOfContentsCausesHeapdump
        
        * Bug fix: BugTimingErrorInVersioningFileProvider.getPageProviderString
        (Thanks to BobKerns!)
        
        * Tinkered around a bit more with RefMgr, hoping to fix these
        "disappearing references" -issues.

        * Bug fix: BugStrangePageNameLogic (Fixed by changing
        MarkupParser.cleanLink() to a far more efficient version.  It's a whole
        lotta faster, too.)
        
        * Bug fix: If the local entity resolver cannot resolve the entities,
        it now reverts to default operation (instead of dying with an NPE).
        
        * Added a bunch of Javascript issues from Dirk Fredericx.  Thanks, man!

2006-02-21  Andrew Jaquith <andrew AT freshcookies DOT org>

        * 2.3.80
        
        * Bug fix: Granting default permissions to wiki groups in the jspwiki.policy
        security policy file is now supported. To do this, AuthenticationManager
        injects 'GroupPrincipal' tokens into the wiki session's Subject at
        login time. GroupPrincipals are also dynamically injected into the 
        appropriate sessions when groups are created or changed -- this means 
        that users do not need to log out in order to see the effect of group
        membership changes on default policies. This is a rather clever bit of
        programming if I do say so myself.
        
        * Enhancement/API change: to support dynamic GroupPrincipal injection,
        the core jspwiki package receives a new top-level class WikiEvent,
        a subclass auth.WikiSecurityEvent, and a listener class
        WikiEventListener. GroupManager and the Group interface gain a new
        method to register listeners (addWikiEventListener()), and a 
        corresponding method for removal (removeWikiEventListener()). 
        DefaultGroupManager and DefaultGroup fire security events to these 
        listeners whenever wiki groups are added, changed or deleted.
        
        * Enhancement: the JSPWiki security policy now supports permission grants
        to wiki group principals (GroupPrincipal). In addition, a new Permission class,
        auth.permissions.AllPermission, grants administrative rights to specific wikis
        (or all, with the wildcard). The combination of these two enhancements means
        that wiki groups can now possess administrative rights. See the security policy
        for a sample grant block.
        
        * Deprecation: the built-in Role.ADMIN enum has been eliminated. Use
        com.ecyrd.jspwiki.auth.GroupPrincipal in jspwiki.properties instead.
        
        * Deprecation: the jspwiki.properties property 'jspwiki.admin.user' is 
        now irrelevant because all administrative grants are handled exclusively
        via the policy file.
        
        * Bug fix: added a "local entity resolver" to WebContainerAuthorizer
        to prevent the need to call out to the network for the webapp 2.3 DTD
        when parsing web.xml. Also, refactored the parsing logic to use the JDom
        SAX parser (and XPath) instead of JAXP. Added new directory etc/dtd;
        this is copied to tests/etc/WEB-INF at test-time, and also into the WAR.
        Credit: Marc Patteet
        
        * Bug fix: patched WikiSession to treat null messages as empty strings.
        Credit: Dan Frankowski.
        
        * Build.xml now uses its own security policy file for testing rather than
        the production version in etc. The build file also copies the webapp 2.3
        DTD to the WAR.
        
2006-02-21  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.3.79.  Moved to new apartment, now back on coding
        track...
        
        * WikiEngine.deletePage() is now protected against trying to
        delete pages that don't exist.
        
        * FileSystemProvider did not delete associated metadata files
        during deletePage().
        
        * ReferenceManagerTest is now a lot more careful about not leaving
        a corrupted refmgr.ser file behind.  Unfortunately, this exposed
        a consistent bug somewhere...
        
        * Some tests tweaks and iterations.

2006-02-12  Andrew Jaquith <andrew AT freshcookies DOT org>

        * 2.3.78
        
        * Pulled JSP scriptlet code that stashes WikiContexts into
        into the WikiContext method hasAccess().
        
        * Bug fix: added "temporary" fix to WikiContext.hasAccess()
        to redirect users to the login page, rather than send a 
        "forbidden" error, for authenticated users failing to access a
        page. This resolves a case where access to pages fail "open" due to
        WikiServletFilter's response wrapping.
        
        * Bug fix: modified the way WikiSession.getUserPrincipal()
        parses Principal objects that was causing this method to 
        return either "full name" or "wiki name" principals,
        seemingly randomly. The method is now guaranteed to return
        a "full name" principal for users who have logged in.
        
2006-02-09  Erik Bunn  <Erik.Bunn@basen.net>

        * 2.3.77
        
        * Added option jspwiki.renderingManager.useCache to properties;
        set to false to prevent RenderingManager from caching DOM trees.

2006-02-04  Andrew Jaquith <andrew AT freshcookies DOT org>

        * 2.3.76
        
        * Bug fix: changed behavior of AuthorizationManager
        to prevent privilege escalation with Asserted users.
        The method AuthorizationManager.hasRoleOrPrincipal() now
        ALWAYS returns false when the user isn't authenticated, AND
        the principal/role being queried isn't a built-in role like
        Anonymous, Asserted etc. Thus, to gain access to pages that
        name a specific user, that user is now REQUIRED to log in.
        Ditto for groups he or she belongs to. The exception is
        for ACLs that contain built-in roles; e.g., "allow Asserted
        users to view" is allowed. Adjusted several unit tests
        and created a new web unit test to verify.
        
        NOTE: a consequence of this change is that ALCs that
        specify "ALLOW Guest" **will not work** any longer (because
        Guest is a principal, not a built-in role). Please use
        "ALLOW Anonymous" instead.

        * Bug fix: build.xml's web unit tests were not guaranteeing
        use of XMLUserDatabase for non-JDBC tests. If built with
        a jspwiki.properties.tmpl that specified the JDBC database,
        this caused certain web unit tests to fail. We now force
        the user database implementation for all web unit tests.
        
        * Bug fix: Ebu's 2.3.75 fix had the undesirable side
        effect of hosing all relative URLs (while fixing all of
        the absolute ones). WikiContext has been reverted to
        its previous state. The real culprit turns out to
        be in DefaultURLConstructor.doReplacement(). We have
        added a web unit test suite to test for absolute URLs,
        and also for relative URLs (these are manipulated in
        jspwiki.properties prior to deployment of the test WARs).
        
        * WebContainerAuthorizer now throws a RuntimeException
        if it cannot somehow parse the web.xml. This isn't ideal,
        but it's better than ignoring the error. Credit: J?rgen Weber.
        
        * Removed unused imports and unreferenced objects in
        multiple classes. This does not affect functionality.
        
        * Removed obsolete "useOldAuth" refs from test
        jspwiki.properties.
        
        * Many Javadoc tweaks and additional comments.

2006-02-02  Erik Bunn  <Erik.Bunn@basen.net>

        * 2.3.75 
        
        * Fixed WikiContext.getURL(...) test for absolute reference style.

2006-01-29  Andrew Jaquith <andrew AT freshcookies DOT org>

        * 2.3.74
        
        * Web unit test scripts gain 3 more tests, which verify that
        JSPWiki users can 1) create new pages (no ACL), 2) create new pages
        with unrestricted view permissions and 3) create new
        pages with restricted view permissions.

        * Slightly tweaked WikiContext to make hasAccess() more 
        flexible; redirection-on-failure can optionally be turned
        off. Removed WikiContext.REGISTER; it is obsolete. Also,
        removed WikiPermission.REGISTER target; please use EDIT_PROFILE
        instead.
        
        * WikiServletFilter now takes responsibility for setting
        Log4J NDC logging contexts. It also now takes care of WikiSession
        message cleanup. All top-level JSPs changed (very) slightly,
        and are simpler, as a result.
        
        * Bug fix: CommentContent.jsp now defaults to the "Add Comment"
        tab. Credit: Dirk Frederickx.
       
        * Bug fix: quick2Top and quick2Bottom markers no longer have
        an annoying underline. Credit: Dirk Frederickx.
        
        * Bug fix: inlined images were not being displayed due to the
        attachment not being considered in PagePermission.implies().
        We now discard the attachment name completely when constructing
        PagePermissions, which means that a page's permissions now 
        ALWAYS imply the same permission on its attachments, and vice-versa.
        
        * Bug fix: LoginContent's error message now correctly displays
        a "you don't have access to page __(foo)__" if the user
        needs to log in.
        
        * Bug fix: test version of userdatabase.xml modified to include
        dummy created/lastModified timestamps. The lack thereof was
        creating scary (but entirely harmless) messages in jspwiki.log.
        
        * Bug fix: added WikiPermission "*", "login" to jspwiki.policy.
        It should have been there previously...
        
        * Bug fix: changed WikiServletFilterMappings to explicitly
        list URL patterns, rather than the wildcard (/*). This fixes
        the infamous "disappearing images" problem with Tomcat 4.1.
        Also removed Register.jsp as protected resource, since it
        vanished a long time ago anyhow.
                
2006-01-23  Erik Bunn  <Erik.Bunn@basen.net>

        * 2.3.73
        
        * Added ParamTag (provide name-value pairs to enclosing
        ParamHandler tag) and ParamHandler (capability to accept
        contained name-value pairs). 
        
        * Modified LinkTag to implement ParamHandler and accept
        body content. The purpose is to support linking to custom
        JSPs with any parameters.
        
2006-01-22  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.3.72
        
        * Changed WikiContext.checkAccess() to return a boolean, so
        that JSP pages can actually check whether they should return
        from processing or not.  This should fix a number of strange
        bugs.
        
        * Renamed WikiContext.checkAccess() to WikiContext.hasAccess()
        to reflect its new role.
        
        * Added TabTag and TabbedSectionTag, which cleaned up the default
        templates *enormously*.  Thanks heaps to Dirk Fredericx!
        
        * Added some extra safeties to URL Constructors to make sure the
        proper encoding is being used in UTF-8.
        
        * The Ant war-task did not properly place jspwiki.jks in the
        WAR file, causing problems if the keystore was somewhere else
        than in the default location.

2006-01-16  Andrew Jaquith <andrew AT freshcookies DOT org>

        * 2.3.71
        
        * Weblogentry-related CSS are now less fugly.
        
2006-01-14  Janne Jalkanen <jalkanen@ecyrd.com>

        * DefaultPermissions.txt is now gone.  Thanks to Frank Fischer.

2006-01-13  Andrew Jaquith <andrew AT freshcookies DOT org>

        * 2.3.70
        
        * Tweaks to web unit tests to make auto-deploy scripts
        work with Tomcat 4.1.
        
        * Bug fix: XMLUserDatbase was dying horribly in
        certain cases with WAR deployments.
        
        * Added more 'create wiki group' unit tests
        
2006-01-11  Andrew Jaquith <andrew AT freshcookies DOT org>

        * 2.3.69
        
        * Minor tweaks to web unit tests; they now use the same
        test user and password as the unit tests. Small adjiustments
        to JDBC setup scripts to inject test users into database
        at setup time.
        
        * Added 'create wiki group' web unit test
        
2006-01-10  Andrew Jaquith <andrew AT freshcookies DOT org>

        * 2.3.68
        
        * We now have basic web unit tests, courtesy of the integration
        of JWebUnit into build.xml and tests/etc/webtests.xml.
        Four jars were added to the 'lib' dir for testing. Web unit
        testing simulates a browser's experience and verifies that
        the following test cases run properly:
        - Anonymous viewing (Main and About pages)
        - Setting asserted name via cookies
        - Creating user profiles
        - Logging in to JSPWiki using a password
        Four combinations are explicitly tested: custom and container
        authentication, each of these with both the XML and JDBC user
        database types. Note to developers: the Ant task
        "webtests" should be part of your test plan. Learn, love
        and embrace JWebUnit. It's easy to express test cases
        with it, and we will (no doubt) be creating more test cases
        as we go... see examples in package com.ecyrd.jspwiki.web.
        
        * Rules for accessing UserPreferences in container-mananged
        environments have been relaxed significantly: users do not
        have to be logged in to edit preferences or their profiles.
        Instead, unauthenticated users attempting to create a profile
        receive a polite error message directing them to log in first.
        If the container shares user data with JSPWiki, the profile
        will be saved, and the user will as a result be registered
        with the container.
        
        * UserDatabase interface receives one new method:
        isSharedWithContainer(), to permit JSPWiki to serve
        as a web container user registrar (see previous bullet).
        Also, jspwiki.properties receives a new property: 
          jspwiki.userdatabase.isSharedWithContainer
        which defaults to false. Only JDBCUserDatabase uses it now. 
          
        * UserCheckTag gains an extra status type: "setPassword"
        which identifies whether users are allowed to change their
        JSPWiki passwords. For custom-auth configurations and
        container-auth configurations with shared user databases,
        this will be true. For most container auth scenarios (i.e.,
        where user data is not shared), this will be false.
        
        * WikiPermission receives a new permission type, "editProfile"
        that is better aligned with the streamlined profile pages
        introduced in 2.3.48; "registerUser" is officially deprecated
        and will be completely eliminated in a future build. To
        register users, you MUST add the "editProfile" permission
        for each required Role, otherwise the profile tab will be blank.
        I am sorry about this -- but I promise this will absolutely be
        the last change we make to the policy grammar prior to 
        official release. See the sample jspwiki.properties.
        
        * Bug fix: UserDatabase contract now specifies that setting
        created/modified timestamps is now the responsibility of
        the implementation, and is no longer done by UserManager.

        * Bug fix: email field on profile form now obeys the docs:
        is is now, in fact, optional, and won't prevent profile
        saving if omitted.
        
        * Bug fix: PreferencesContent's tab highlighting works better,
        if not perfectly. Credit: Dirk Frederickx.
        
        * Bug fix: etc/db was erroneously (if harmlessly) being
        included in WAR builds.
        
        * JBoss login-config.xml JAAS sample snippet appended to
        jspwiki.jaas. Credit: Milt Taylor.

2006-01-10  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.3.67
        
        * XHTMLToWikiTranslator now supports <strong> and <em>
        
        * XHTMLToWikiTranslator now supports different URL Constructors
        (which makes FCK run again)
        
        * Fix for BugRSSHasInvalidDccreatorProperty (well, not really
        a fix, but it should play nicer with aggregators).
        
        * Refactored XHTMLToWikiTranslator tests - they were actually
        not working at all... Shame on me for not noticing earlier.

2006-01-07  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.3.66
        
        * WikiEngine now checks whether a page has changed before
        committing it.  This should help reduce all the empty changes
        that people do when they just click "save" in panic.
        
        * InputValidator now accepts email addresses of the form
        "firstname.lastname@something" and "name+extension@something".
        
        * Added a tiny sanity check in WikiServletFilter
        
        * Added EditFindReplaceHelp which was missing...

2006-01-05  Andrew Jaquith <andrew AT freshcookies DOT org>

        * 2.3.65
		
        * Bug fix: XMLUserDatabase now commits using proper UTF-8.
          It was not doing so previously, in spite of an XML header that 
          suggested otherwise. 
		  
        * Bug fix: InputValidator's validate() was rejecting
          null or blank strings as invalid. This is incorrect
          behavior, and these values now validate. Note that the
          validateNotNull() method should be used if checking for
          blank/null strings is required.
		  
        * JDBCUserDatabase gets basic support for inserting
          an "initial role" row into a admin-defined roles table.
          This is designed to enable JSPWiki to serve as an 
          enrollment mechanism for container-managed users, in 
          those cases where the container and JSPWiki share
          user information. A future set of commits will include 
          adjustments to WikiPermission, UserManager and
          UserPreferences to support the UI aspects of container 
          enrollment functionality. We do *not* envison broader 
          role management capabilities for JDBCUserDatabase, 
          other than just this initial role row insert support.  

2006-01-02  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.3.64
        
        * Fixed a relatively serious bug which was caused by 
        FormSet doing a very selective remove() on its parameters;
        this was relying on the fact that the FormSet parameters
        are not stored (which was true on the old TranslatorReader).
        The new RenderingManager stores the parsed parameter arrays,
        which means that plugins Shall Not Modify their parameters,
        or risk getting the same data back again the next time.
        (However, if the page data expires, then you shall get the
        original parameters.)  I am not sure whether this is good
        behaviour...
        
        In effect, this fixes problems with jspwiki.org bug reporting
        system.

2006-01-01  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.3.63
        
        * Fixed a number of failing tests (table and refmgr)
        
        * Fixed table of contents generating faulty section
        references for percent-encoded headings.

2005-12-30  Erik Bunn  <ebu@memecry.net>

        * 2.3.62

        * Modified AttachmentServlet, LinkTag, InfoContent.jsp to fix
        attachment revision upload bug. 

2005-12-21  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.3.61

        * Quick fix from Dirk: table sorting works again.
        
        * Favourites menu looks a bit better now.
        
        * Added link to the Favourites menu in the UserPreferences.

        * Bug fix: trying to upload a new revision of an attachment
        resulted in a broken directory structure.  This is still
        buggy, you can't upload a new revision of a file.
        
        * Did some tweaking of the jspwiki.css to make it a bit
        more accessible (the link underlines are back, and you
        can now actually read the titles, if you made the array
        sortable).

2005-12-20  Erik Bunn  <Erik.Bunn@basen.net>

        * Modified jspwiki-common.js: overriding Array prototype
        potentially breaks 3rd party scripts using arrays as maps.
        Use ExtArray, instead.

2005-12-19  Andrew Jaquith <arjaquith@mindspring.com>

        * 2.3.60 aka the "Neat and Tidy" release
         
        * Complete, radical overhaul of the standard CSS jspwiki.css.
          It is organized (!) and significantly trimmed back from its
          former sprawling self. Note the new <div> classes "error"
          "information" and "warning". These have been substituted into
          one-timer classes like "versionnote". The styles, overall,
          have had most of the rough edges rubbed out... not perfect
          but it's a start -- not all of Dirk's recommendations made
          it in.
          
        * Tweaked PageActions by substituting page up/down icons for
          webdings. Also, comment permissions are checked instead
          of assuming edit (credit: Benedikt Rausch).
        
        * Adjusted table generation routines in JSPWikiMarkupParser
          and ListLocksPlugin to inject class="odd" attributes
          into generated table rows. LLP also gives tables 
          the style "wikitable" and now emits XHTML-compliant markup.
        
        * Added attribute "div" to <wiki:Messages> tag to allow
          messages to be neatly wrapped. Default class is "information".
          This required minor tweaks to several JSPs.
          
        * Turned LeftMenuFooter into a blank page, which makes the left
          menu area nicer and cleaner. The default did nothing but display
          referring pages, which we already know how to do via the
          PageContent tabs. Less clutter, mo' better!
          
        * LeftMenu.jsp and LeftMenuFooter.jsp are laid to rest, with honors.
        
        * Commented out the <resource-ref> in web.xml for jdbc/UserDatabase;
          it isn't on by default anyway, and it was causing JBoss to emit
          a harmless (but annoying) error messages (credit: Milt Taylor).
          
2005-12-19  Erik Bunn  <ebu@basen.net>

        * 2.3.59

        * Bug fix: reordered AttachmentServlet to get rid of an
        HttpServletRequest reader/input stream access error when running
        under Jetty. The Multipart library in the servlet fetched the
        input, WikiEngine.createContext() attempted to modify it, and 
        Jetty, being strict about this, threw an exception.	

2005-12-17  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.3.58
        
        * Bug fix: Comment preview no longer views double
        
        * Bug fix: Comment preview no longer loses author/link
        information.

2005-12-14  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.3.57
        
        * Just improved some output coming from the AttachmentServlet.
        
        * Fixed a few instances of still using Category instead of
        Logger.

2005-12-13  Andrew Jaquith <arjaquith@mindspring.com>

        * 2.3.56
        
        * Lots of cleanup to the top-level JSP pages: all of
          the permission-checking is now in a new WikiContext
          method called checkAccess(HttpServletResponse).
          The workflow now goes like this: if a non-authenticated
          user tries to access an unauthorized page, he or she is
          redirected to the login page. If already logged in,
          JSPWiki returns a standard 403 (forbidden) code. We
          will likely use a nicer error page in the future.
          LoginError.txt goes away; it is not needed any more.
        
        * User profile save operations now have *actual* input
          validation, courtesy of InputValidator. The email 
          address is checked for conformance, and the other 
          fields (except password) are checked for nasty
          characters like angle brackets. Yes, yes, we know...
          what took us so long? There's more to do but it's a
          good start.
          
        * UserProfile.jsp gets some clever scriptlet hackery
          via the 'tab' parameter to activate (or preserve)
          a particular tab. This fixes the "disappearing profile"
          issue during save operations.
        
        * WikiSession receives a series of new methods for
          stashing, retrieving and clearing UI messages. These
          are used primarily for auth-related messages but
          are generic. All of the JSP pages that previously
          stashed "msg" objects in the HttpSession now use these
          methods. A companion JSP tag <wiki:Messages> makes
          printing messages dead-simple.
          
        * AuthManager's logout() method resets the entire HTTP
          session, like it used to.
          
        * UserManager validation routines were moved into new UI
          class InputValidator; additional refactorings including
          the new validation classes and WikiSession messages.
          
        * XMLUserDatabase now relies on its own cheap-and-cheerful
          DOM writing routine. Errors using the standard J2SE
          TRAX APIs were previously causing the users not to be
          written to disk.
          
        * Fixed several failing auth.* tests.

2005-12-12  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.3.55
        
        * ReferringPagesPlugin and the like now also have the "include"
        -parameter.
        
        * Preview was showing things twice (missing return -statement
        in Edit.jsp... oops.)

2005-12-10  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.3.54
        
        * AttachmentServlet no longer throws an exception with
        overzealous clients.

2005-12-09  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.3.53
        
        * Unknown file types would cause an exception when generating
        enclosures in RSS feed.
        
        * Wiki page RSS feeds are now a bit more descriptive.
        
        * Removed extra attributes for EditorTag from jspwiki.tld.
        
        * AuthenticationManager now uses less invasive logging levels
        if someone typos their username...  Less email for me, hooray!
        
        * DiffLinkTag has now some small NPE protection... Fixes
        symptoms, not cause.
        
        * RSS now also supports ETags.
        
        * Fixed an issue with Javascript - HighlightWord would sometimes
        die (thanks Dirk!)

2005-12-07  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.3.52
        
        * Removed some extra crud from jspwiki.css.
        
        * Removed extra quotes from LinkTag.  Oops...
        
        * Fixed an issue with Diff.jsp (page names were not recorded,
        if you changed from it).
        
        * Hopefully fixed an issue with IE and leftmenu disappearing.

        * 2.3.51
        
        * Added "accesskey" parameter to LinkTag.  Thanks to Gregor
        Hagedorn!
        
        * InfoContent.jsp would fail if there was only one
        version of a page.  Thanks to Dirk for pointing this out!

2005-12-06  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.3.50 alpha.
        
        * Added collapsebox from BrushedTemplate.  Also synced
        some search stuff from Brushed.
        
        * TableOfContents are now collapsable.
        
        * Moved the layout around a bit - actions are now a part of
        Header.jsp and Footer.jsp.  This allows us to do a slightly
        nicer layout, I think.

2005-12-04  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.3.49
        
        * Added LinkTag at the request of Gregor Hagedorn.  It
        does pretty much everything.  Adding documentation later...
        This class also needs some serious working so that the 
        functionality could be offered to other classes as well
        (such as the Image plugin).
        
        * Hopefully fixed the "my username is null" -problem, which
        would occur, if you were both logged in and had a cookie.
        
        * Added a patch from Matt Luker to allow numbering in 
        TableOfContents.
        
        * InterWiki links are now also checked for image inlining.
        Merry Christmas :)
        
        * FCK.jsp had two elements reversed.  Thanks Dirk Fredericx!
        
        * Diffs now use code from BrushedTemplate by Dirk.
        
        * WikiServletFilter was letting only US-ASCII through - oops...
        
        * WikiForms can now handle UTF-8.
        
        * TableOfContentsPlugin font size was set accidentally to zero
        in jspwiki.css.  WTF?
        
        * Reworked the jolly old "include correct CSS based on browser"
        to be a proper Javascript method call.

2005-11-29  Andrew Jaquith <arjaquith@mindspring.com>

        * 2.3.48
        
        * Major refactoring of UserPreferences.jsp. The separate
          registration page is now *gone* and merged into the
          prefs page. The prefs page itself now has tabs -- 
          one for the user profile, and one for prefs. This
          means we can relax a few of the security assumptions
          at the JSP level, since they are already baked into
          the core UserManager APIs. (Addresses Dirk's requests.)
        
        * Setting the user name via cookies is back!
        
        * The security policy was loosened to allow anonymous
          users to edit their pref. WikiPermission "EditPreferences"
          has been broadened in meaning to include prefs AND
          profiles, while "RegisterUser" means simply the ability
          to create a profile. RegisterUser will *probably* vanish
          or be renamed in the near future.
          
        * SpecialPage REGISTER now points to UserPreferences.jsp
        
        * UserPreferences now implements a caching scheme for user
          profiles that downstream classes like UserProfileTag
          need. Also, UserPreferences gets a second password
          (confirmation) field. UserManager receives additional
          validation logic for processing same.
          Everybody's happy, but especially Dirk.
          
        * Bugfix for XMLUserDatabase that caused funny auth
          problems if the jspwiki.properties userdatabase prop
          was commented out. (Credit: Janne)
        
        * Favorites/PageActions get context-sensitive 
          "Log in" "Logout" and "Create group" links.
         
        * Build.xml gets some stub code for HTTP/web unit testing.
          There aren't any tests just yet, but we do have a
          snappy Tomcat auto-deploy mechanism now.
          
        * Thanks to the magic of XyleScope, the default
          jspwiki.css gets some small tweaks to make the overall
          styles a bit more aesthetically pleasing and consistent.
          
        * "You are anonymous" discreetly disappears.
        
        * Temporary bugfix for infinite-redirection loop issue with
          Login.jsp... introduces another one...
          
        * This release introduces a known bugs: a "redirect loop"
          occurs when using container-managed auth and accessing
          a forbidden page. This will be fixed in my next
          checkin.

2005-11-27  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * 2.3.47
        
        * Added "type" parameter to IncludeResourcesTag.  This allows you
        now to include multiple types of resources in different places.
        
        * Quite a few top-level JSPs had the old EditorManager package,
        oops.
        
        * Added quite a lot of stuff from BrushedTemplate, including
        collapsible lists, sortable tables, etc.
        
2005-11-26  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * 2.3.46

        * Reworked EditContent.jsp to account for changes in editor
        system.

        * Variable content is now escaped before shown.  Thanks to
        Gregor Hagedorn for pointing this out.

        * Added new package: module, containing ModuleManager and
        WikiModuleInfo classes.

        * Added WikiContext.findContext() to make life a bit easier
        for template writers.
        
        * Moved TemplateManager to new package: ui.

        * Added etc/ini/jspwiki_module.xml to contain some defaults.

        * Added WikiServletFilter and the ability for plugins, etc to
        request an injection of things in the header.  This is done by
        adding <wiki:InsertResources> in commonheader.jsp.  It inserts
        a particularly formatted comment in the header, which is then
        replaced by WikiServletFilter.  A plugin may request a script
        or a CSS file by using new methods in TemplateManager. Based
        on ideas and code by Kees Kuip.

        * Removed editors from Java files and put them in JSP files
        under templates/default/editors/.  It's now possible for a template
        to override any editor, or to use any editor they like.  It
        should also make editors pluggable components.

        * Continuing template rework.  Reworked EditorTag, removed 
        EditorAreaTag. Added RequestResourceTag and InsertResourcesTag.

2005-11-22  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * 2.3.45 aka "The Great Template Break"
        
        * Added serialVersionUID to most classes that were missing it.
        
        * Added EditorManager class.  It's currently somewhat dummy,
        but it should allow fully pluginizable editors in the future.
        Incidentally, this means that we got rid of EditorAreaTag...
        Sorry - this breaks quite a few templates out there.  But now,
        if you want to create your editor, take a copy of 
        editors/plain.jsp, put it in your own template directory, and
        modify the blazes out of it.
        
        * Got finally rid of the very confusing "text" parameter for
        all editors.  The new parameter name is 
        EditorManager.REQ_EDITEDTEXT.  Note that this may break your
        current configurations.
        
        * Hopefully finally fixed BugHtmlCharEntitiesMishandledInPreview.
        
        * Fixed BugIncorrectServletAPIVersionInREADME.

2005-11-15  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * 2.3.44
        
        * Tiny JSPWikiMarkupParser speed optimizations.
        
        * Added build.xml patch from DaveSB to fix signing issues on 
        Windows.

        * Added patch from DaveSB to support nested plugins.
        
        * Added support in ReferringPagesPlugin for "exclude" -parameter:
        use "exclude='pattern1,pattern2,pattern3'".

2005-11-14  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * 2.3.43
        
        * Fixed HTMLEntitiesAreGettingEscapedByamp and
        BugHtmlCharEntitiesMishandledInPreview.  It was a nasty bug
        in the new rendering engine.

2005-11-03  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * v2.3.42

        * Bold and italic markup are now carried across paragraph
        breaks.  This is a convinience factor - XHTML does not
        allow it, but we store the state.

2005-11-08  Andrew Jaquith  <arjaquith@mindspring.com>

        * v2.3.41
        
        * Fixed a nasty, serious authentication bug introduced
          in 2.3.35 code for checking for cookie changes. Cookie
          changes were triggering "container logins", which
          caused the JAAS Subject to be rebuilt from scratch.
          Instead of blowing away the Subject (and associated 
          WikiSession) at logout time (or when the user's auth
          status changes), the Subject is now preserved for the
          life of the Http Session. In addition, executing
          Logout.jsp no longer invalidates the HTTP session;
          instead, the AuthenticationManager logout() method
          simply resets the Subject's principal set instead.
       
        * Added an invalidate() method to WikiSession that
          resets user wiki session principals when requested
          by AuthManager.logout(). Resetting principals
          means making a user an anonymous guest user.
          Refactored WikiSession's cookie-change detection code.
        
        * All of the *LoginModule classes received
          tweaks to make them work with long-lived
          Subjects. In particular, login modules that 
          inject Role principals now remove less-prileged ones.
          For example, the UserDatabaseLoginModule injects
          Role.AUTHENTICATED upon login; it also explicitly
          removes Role.ANONYMOUS and Role.ASSERTED
          if these are found.
          
        * <wiki:UserCheck> regains the venerable status attribute
          "known", which denotes an authentication status of
          "not anonymous", aka either authenticated or asserted.
          This fixes an issue in the new JSP templates from 2.3.37.
          
        * HttpUtil gets an *even more* reliable fix to
          the BaseURL issue patched in 2.3.40.
          
        * Added "SpecialPage" mappings to WikiEngine for Logout,
          CreateGroup, CreateProfile, EditProfile, and Prefences.
          These map to Logout.jsp, NewGroup.jsp, Register.jsp
          and UserPreferences.jsp (x2).
          
        * Login.jsp, NewGroup.jsp, Register.jsp and
          UserPreferences.jsp all now use ViewTemplate 
          as the master template. This removes the need for
          AdminTemplate.jsp, which was a kludge anyway.
          That means one less template to maintain, and to hack.
          Hooray!
          
        * Favorites.jsp receives the G'day treatment.
        
        * Cookie identities (cookie assertions) are now
          set to the value of the user's full name during
          custom auth login, and when user preferences
          are initially set (Register.jsp) and after
          user registration (UserPreferences.jsp).
          Previously, we used the WikiName. However, the
          full name is what's returned first by WikiSession's
          getUserPrincipal() method, so we are now consistent
          with that. This should partly resolve the issue JohnV
          reported about user names "jumping around" between
          wiki names, full names and login names. (But there
          is still one more bug out there...)
          
        * Fixed compilation errors in Rename.jsp, and added
          back code to hide rename fields on InfoContent.jsp
          for users who aren't entitled to see them. This
          had regressed a few revisions ago...
        
2005-11-03  Andrew Jaquith  <arjaquith@mindspring.com>

        * v2.3.40
        
        * Fixed a subtle bug with HttpUtil that was 
          causing BaseURLs to always print as the name
          of the host as known to the web container,
          which in default Tomcat deployments (99%)
          is called "localhost". Rather than rely on
          the fact that the user's HttpServletRequest
          will *actually* return an accurate host name,
          we do a quick, one-time host name resolution
          lookup just to make sure.
          
        * Added WikiContext-to-*Content template mappings 
          for the login and "create group" contexts. Added
          wiki contexts for both.
        
        * Corrected potetial bug with WikiSession's 
          getStatus() method. It now delegates to isAnonymous(),
          as it should.
        
        * WikiContext's getURL() method now defaults to
          HttpUtil's method of building the base URL from user
          session request information, rather than from 
          jspwiki.baseURL. We do this so that JSPWiki will
          work nicely with HTTPS sessions. This method is 
          transparent to downstream JSP tags like EditLink; 
          they get HTTP compatibility "for free". If the
          associated HTTPServletRequest is null, we default 
          to the old method of looking up getBaseURL() from
          WikiEngine.
          
        * NewGroup.jsp and Login.jsp now put their content
          pages inside of AdminTemplate, which means they are
          wrapped with standard headers and footers. Note that
          LoginForm may be look a bit ugly until we get a few
          kinks worked out.

2005-11-03  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * v2.3.39
        
        * Default RSS version is now 2.0
        
        * Cleaned some ambiguities in the CSS file
        
        * Moved the app and company logos into a separate div of their
        own to make layout easier.
        
        * Enabled personal favourites in the Favorites.jsp
        
        * General cleanup and poking around in the CSS

2005-11-02  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * v2.3.38

        * Added missing search-replace Javascript code
        
        * Added missing AttachmentTab.jsp to default template.

        * NB: While most of the code comes from BrushedTemplate, I'm
        cleaning it up a bit - it's not XHTML compliant, for example.

2005-10-31  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * v2.3.37
        
        * Bug fix: RSS feeds no longer generate &amp;quot; whenever there
        is a quote (") in the stream.
        
        * Rearranged some code relating to search and reference managing;
        hopefully squashing some hard-to-find bugs.
        
        * Bug fix: safeGetParameter() is now deprecated, as createContext()
        now does the proper request.setCharacterEncoding() as per Servlet
        API 2.3.  Fixes BugClobberedUTF8InWikiBody.  Thanks to Chris Wilson
        and msb0b!
        
        * Mass commit of new default template code, based on the
        BrushedTemplate from Dirk Frederix.  Note that this thing is
        probably pretty broken, so please be careful.

2005-10-25  Andrew Jaquith <arjaquith@mindspring.com>

        * v2.3.36
        
        * Cosmetic fix: cookie-asserted identities containing spaces were 
          passing enclosing double-quotes on to the LoginModule, which had
          the effect of "scare-quoting" the user's name. The offending
          quotes are now snipped if detected, in HttpUtil.
          
        * Added a bang (!) to a particular line in XMLUserDatabase
          that was causing a spurious error message.
          (Credit: John Volkar)
          
        * Changed JDBC init tests so that they use column and table
          mappings from tests/etc/jspwiki.properties, not 
          jspwiki.properties. This was confusing the JDBCUserDatabaseTest
          class big-time, when custom mappings were used. Also,
          added JDBC test properties to the various test/etc templates.
          
        * Added an optional property 'jspwiki.userdatabase.hashPrefix'
          that tells JDBCUserDatabase whether or not to prepend
          its hash algorithm to the password hash (e.g., {SHA}).
          This should increase compatibility with certain 
          third-party applications that might wish to share the
          user database, such as Tomcat.
          
        * Fixed a NPE in JDBCUserDatabase that was triggered by
          a user editing a profile, but electing not to change the
          password. It now exhibits correct behavoir: no password
          means "use the old one", just like with XMLUserDatabase.
          
        * Added 'drop user' to the Postgres and Mckoi database
          scripts; it was causing an error in some cases.

2005-10-22  Andrew Jaquith <arjaquith@mindspring.com>

        * v2.3.35
        
        * Fixed issue in that prevented users checking the
          'remember me' box Comment.jsp from seeing their identity
          assertion reflected in the WikiSession. This feature
          now works as it should. Reworked a WikiSession method,
          and added a WikiSessionTest unit test. WikiSession now
          senses when the 'asserted' user cookie in the user's
          session appears, changes, or disappears.
          
        * Clarified the logic in WikiSession.isAnonymous() for 
          determining when a user is considered "anonymous". This 
          will be the case when any of these conditions are true,
          as evaluted in this order:
          - The session's Principal set contains Role.ANONYMOUS
          - The session's Principal set contains WikiPrincipal.GUEST
          - The Principal returned by WikiSession.getUserPrincipal()
            evaluates to an IP address
          WikiSession includes a new, fast method for determining 
          whether a string represents an IP address. The previous
          technique was totally b0rked. These are the sorts of things
          one discovers when writing unit tests...
          
        * Fixed minor issue with AbstractUserDatabase that
          inadvertently introduced a bug into the way users
          are found (or not). This was causing AuthorizationManager's
          resolvePrincipal() method to fail in certain cases.
        
2005-10-22  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * v2.3.34

        * Did a general sweep of a bunch of classes to make
        sure they use TextUtil.getStringProperty() instead of
        Properties.getProperty().  Also fixed 
        BugTextUtil.parseIntParameterFailsInCaseOfTrailingBanks
        to get rid of all space-related issues in jspwiki.properties.

		* No longer generates empty <b/> -elements for markup "____".
		The parser is now smart enough to check if a markup would
		result in something that would not be recommended in XHTML 1.0.
		Fixes BugEmptyMarkupDoesntWorkForBoldAndItalic.
		
		* RSS 2.0 and Atom feeds no longer double-encode ampersands.  
		Oops. :)
		
		* PageModified.jsp now properly escape XHTML markup.
		
		* JSPWiki Auth tests are run now only if "jspwiki.tests.auth"
		system property is set.  This helps everyone that is using
		Eclipse...
		
		* Bug fix: exclamation marks are no longer doubled.

2005-10-19  Andrew Jaquith <arjaquith@mindspring.com>

        * v2.3.33
        
        * Initial JDBC support for storing user profiles has
          landed. See the build.xml file for details on
          configuring unit testing with JDBC. See also the
          Javadoc for com.ecyrd.jspwiki.auth.user.JDBCUserDatabase.

        * Changed VariableManager and BaseURLTag to use a new 
          makeBaseURL method in HTTPUtil so that HTTPS-related 
          URLs are generated correctly. This partially supercedes
          the WikiEngine.getBaseURL method, but the changes are
          completely transparent to the <wiki:BaseURL> 
          and <wiki:Variable> tags. So you shouldn't notice any
          differences unless using HTTPS.
          
        * Several small Javadoc fixes.

2005-10-17  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * 2.3.32
        
        * Changed the way TableOfContents is created - it
        no longer creates a nested list.  Thanks to Gregory
        Pentz and Gregor Hagedorn.

2005-10-16  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * 2.3.31
        
        * Bug fix: JSPWikiMarkupParser was not calling
        link text mutators at all, so ReferringPagesPlugin
        (among others) were ignoring maxlength.
        
        * Bug fix: WikiRenderer did not set context properly,
        which killed TableOfContents plugin.

        * Improved RSS generation for blogs: now it's also
        possible to set the channel title, description, language
        and author by using the SET directive.

        * 2.3.30
        
        * Removed dependencies of TranslatorReader from a number
        of classes.
        
        * Added new "VersioningProvider" interface to fix a
        serious problem with page info listings.  Based on an
        idea by Kees Kuip.  A Provider can now declare it
        supports VersioningProvider if it wants to be able
        to support pageExists( name, version).  Yes, it's
        a kludge, but it does speed up things considerably
        until we refactor the entire provider interface.

2005-10-09  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * v2.3.29
        
        * Security fix: it was possible to inject javascript
        using CSS.  Reported by Martijn Brinkers.
        
        * Bug fix: In certain cases, }}} would loop forever.
        
        * CachingProvider should now be a bit smarter about
        refreshing metadata.
        
        * Added patch from Kees Kuip to cache the file properties
        in VersioningFileProvider, providing faster performance.
        
        * Rearranged quite a lot of code in URL providers to fix
        a bunch of problems.  Unfortunately, it also means that
        URLs are no longer relative at all; they're always absolute,
        but they don't always include the host name (depending
        on the setting with jspwiki.referenceStyle).

2005-10-09  Andrew Jaquith <arjaquith@mindspring.com>

        * v2.3.28
        
        * For once, no public auth API changes! 
        
        * CMA and custom authentication JSPs re-factored
          so that they use the same "special page" for
          logins: Login.jsp. This makes for much cleaner
          JSP code; for example, LeftMenu.jsp no longer needs
          conditional logic for Login.jsp v. LoginRedirect.jsp.
        
        * The web.xml file's constrained resources for CMA
          expanded to include NewGroup.jsp, Upload.jsp
          and Login.jsp. Constraint for LoginRedirect.jsp
          removed (the page no longer exists). The login
          form for CMA now uses the same as for custom 
          auth (LoginForm.jsp).
          
        * WebContainerAuthorizer now tests for Login.jsp
          constraints rather than LoginRedirect.jsp
          when determining whether CMA is used.
          WebContainerAuthorizerTest changed accordingly.
          
        * Security fix: Authorization algorithm fixed to prevent
          privilege escalation with asserted Principals when
          wiki page contains ACL. Authorization now checks to
          make sure the security allows the requested permission
          /in addition to/ matching the user's principals
          with those in the ACL. This meant we needed to
          add PagePermission "*:Group*", "edit" entries
          to the Authenticated policy block.
        
        * Bug fix: AuthenticationManager no longer flushes
          Principals during custom logins. This was hosing
          user sessions if the user failed to log in.
          
        * Bug fix: AuthorizationManagerTest's testGetRoles()
          method no longer b0rks.
        
        * Bug fix: default/LoginContent.jsp whitespace goof.
        
        * Bug fix: both custom and container successful
          logins set the user cookie, like they should.
          (Credit: John Volkar)
          
        * Bug fix: group creation page (NewGroup.jsp)
          checks for previous existence of group before
          saving, and gives user chance to change the
          name if it does.
          
        * Bug fix: NewGroup.jsp no longer triggers the
          'direct access to login form' error when
          CMA is used. This is due to the refactoring
          mentioned above.
        
2005-10-03  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * v2.3.27

        * Bug fix: RenderingManager would cache old versions on
        top of new ones.

        * Bug fix: CheckVersionTag would cause unnecessary page
        rendering.  Reported by Kees Kuip.

        * Switched most of the code to use the new RenderingManager
        to find problems with the code.

2005-10-02  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * 2.3.26

        * Restored the the Ant "guitests" target, who had gone MIA
        accidentally.

        * Added (and modified a bit) a patch from Kees Kuip which
        allows plugin writers to just specify properties in the plugin
        archive itself.

        * Added TemplateManager.listSkins(), which lists any and all
        skins from templates/<yourtemplate>/skins/

2005-09-28  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * 2.3.25

        * Added ReferredPagesPlugin from Dirk Fredericx.

2005-09-27  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * v2.3.24

        * IncludeTag now prints an error to the screen instead of
        a NPE when the template file in question does not exist.

        * CheckRequestContextTag now supports an extended parameter
        list: <wiki:CheckRequestContext context='view|info|edit'>
        evaluates its body, if the current context matches ANY of
        the contexts.  It also supports negation with !, i.e.
        <wiki:CheckRequestContext context='!view'> evaluates the
        body in every context but "view".

        * JSPWikiMarkupParser is now a lot more XHTML compliant,
        thanks to Gregor Hagedorn.

        * RSS Generator Thread now has a proper name.

        * Moved TranslatorReader.Heading to com.ecyrd.jspwiki.parser.
        This should not really cause any compatibility issues.
        
        * Moved HeadingListener to com.ecyrd.jspwiki.parser

        * Added two new methods from John Volkar to ReferenceManager.

2005-09-26  Erik Bunn  <Erik.Bunn@memecry.net>

        * Added CookieTag. See the class for documentation.
        Intended for custom JSPWiki installations, mostly useful for
        doing conditional logic based on e.g. a custom preferences cookie.

2005-09-24  Andrew Jaquith <arjaquith@mindspring.com>

        * 2.3.23
        
        * WikiContext, WikiSession and the auth.login.* login
          modules gain significantly enhanced debugging code.
          Changing Log4J settings in jspwiki.properties
          to DEBUG will dump a large amount of information
          about user session IDs and Principal creation
          activities.
        
        * In the continued spirit of clowing-back little-used methods
          that clutter the API, WikiContext's setHttpRequest() method
          goes the way of the dodo bird. It was used by WikiEngine,
          and only in one place, and it was redundant to boot.

2005-09-19  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * 2.3.22
        
        * Added patch from John Volkar to: 
        
        * Puts a catch block in DifferenceManager in case 
  		an underlying provider throws.

		* Adds some unit tests

		* Handles whitespace "better" (see the tests), words and 
		whitespace are both elements that get diffed.  Whitespace 
  		edits show up in the diff output. (This is an interesting point of 
  		debate, after bruising battles whitespace in wiki-text is 
  		significant and deserves to be diffed. Consider two lines '* foo' 
  		and ' * foo')

		* Adds a optional property 
        'jspwiki.contextualDiffProvider.unchangedContextLimit" that 
  		is the number of *elements* to be emitted before and after 
  		each change. (element=word or space or newline, so if you 
 		want ~50 'words' of leading context set the limit to 100)
  		This defaults to a huge number, so it essentially doesn't
  		serve as much of a limit (Preserves a 1 word change in 10 
  		pages by default returns the whole 10 pages.)

2005-09-17  Andrew Jaquith <arjaquith@mindspring.com>

        * 2.3.21

        * Added a simple web test plan to docs.
        
        * WikiPermission gains support for wiki namespaces.
          This introduces what I hope is the "final" tweak 
          required to jspwiki.policy. The WikiPermission syntax
          ...WikiPermission "*", "registerUser";
          replaces the previous format. The wiki name may contain
          wildcards. This change was made to support wiki farms. 
          See the WikiPermission Javadoc for more details.

        * PagePermission constructor WikiPage(String,WikiPage,String)
          eliminated in favor of WikiPage(WikiPage,String) because
          wiki name is now carried inside WikiPage. This means
          we don't need to pass the wiki name into the constructor,
          which is nice and simple. This change was propagated 
          to 8 other classes and about a half-dozen top-level JSPs.

        * Fixed return values in various WikiContext/WikiSession
          get*Principal methods so that they return
          WikiSession.GUEST if not otherwise set. This removes
          neeed to check for nulls in calling code.
          (Credit: John Volkar)
          
        * Assitional WikiSession/WikiContext cleanup:
          Fixed bug preventing initial HttpRequest 'login'. 
          Removed public WikiSession.isUnknown(); was only used
          by one caller. Also, reduced visibility of 
          WikiSession.isContainerStatusChanged() to protected.
          Bug fix: added Role.ALL to guestSession(). 
          
        * Rename.jsp now checks for the rename permission
          before actually undertaking the action. 
          InfoContent.jsp now checks for the same permission 
          also when rendering the info page UI for renaming.
          
        * Bugfix for NPE in PagePermission.
        
        * Much cleanup of web.xml, and tweaked the Ant script
          to use this during tests (reduces maintenance).

        * build.xml slightly refactored to better account
          for using signed JARs during test runs.
          Certain static files (web.xml/policy/jaas/jks)
          in tests/etc eliminated in favor of dynamic files
          copied from etc at test-time. This means we only
          have to maintain one version of each file, instead of two.
        
        * WebContainerAuthorizer includes an improved heuristic
          for detecting CMA. Instead of looking for specific 
          role names contrained to Register.jsp, Delete.jsp
          and UserPreferences.jsp, we just look for ANY role.
          This means you can use your container's preferred
          role names, instead forcing you to use "Admin" 
          and "Authenticated".
        
        * DefaultGroupManager.getRoles() returns an array of
          Group[] (downcasted to Principal[] by interface.
          This should make 'instanceof' checks easier.
          (Credit: John Volkar)
        
        * Bugfix for Register.jsp so that authenticated users
          who already have profiles are always redirected to
          EditPreferences. This wasn't a security risk 
          but it was non-intuitive.
        
        * Replaced that old Wiki.jsp favorite, the "looped config"
          message, with something more appropriate to 2.3.
          
        * Weblog plugin now accepts additional parameter for 
          customizing the date format. It also tries to extract 
          the "headline" of the blog and puts it at the top of the 
          entry section.
    
        * Tweaks to Ant script to better encapsulate Jar-signing 
          operations. Also, test-prep activities more automated.

2005-09-16  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * v2.3.20

        * Both default ShortURLConstructors now check if the NONE
        -context already has some parameters.  Requested by 
        Erik Bunn.

        * PageLock is now serializable.  This should reduce some
        warnings on some containers.

        * Forms are now XHTML conformant instead of HTML 4.01.

2005-09-16  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * v2.3.19.
        
        * Fixed the rest of the new renderer tests, and turned
        the new renderer on by default.  You can now turn it off
        with "jspwiki.newRenderingEngine=false" in your property
        file.

        * FormInput now also accepts XHTML-like "checked=checked".
        Suggested by Murray Altheim.

        * Added patch from Erik Bunn to allow clean compilation
        on JDK 5.0.

        * Included patch from JohnV to add time and date format
        parameters to RecentChangesPlugin.

        * Incorporated even more patches from Patrik to fix
        some problems with tests targets and diff noise.  Thanks
        a heap!

        * Added patch from Patrik Woodworth to fix tests
        compilation failing due to jar file signing.

2005-09-09  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * v2.3.18

        * Two patches from Patrick Woodworth to fix broken URL
        in jspwiki.tld and compilation directives.  This removes
        the jar-optimized target and makes it an option for
        build.properties.
        
        * Fixed problem with ReferenceManager: unmodifiable
        maps were not updated at unserialization time.  Reported
        by JohnV.
        
        * Removing misc debug code from auth.
        
        * Moved to StopWatch() instead of System.currentTimeMillis()
        in all places ;-)

2005-09-07  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * v2.3.17

        * Massive import of patches from 2.2.33.

        * Added two new methods in ReferenceManager to facilitate
        LinkIndexPlugin.

        * Added patch from Joerg Luedecker to fix a problem
        with pages deleted not affecting RefMgr.

        * Added a small note to the ShortURLConstructor: do NOT
        use without baseURL.

        * Fixes BugAttachFilesEvenIfPageDoesNotExist.  It is
        no longer possible to upload a file if the page does
        not exist.

        * Install.jsp was Tomcat-specific.  Fixes
        BugInstall.jspDoesNotCompileOnWebLogic8.1.  Reported by
        JoachimMaes.

        * Fixed BugAttachmentWithHashCannotBeViewed by replacing
        now all illegal character values during upload.

        * Undid change for 
        BugShortViewURLConstructorAndShortURLConstructorProblems -
        it apparently broke quite a lot of stuff.

        * Changed to OSCache 2.2.1 to protect against a pretty
        nasty memory leak.

        * Added generic null protection to CachingProvider, and
        also protected against spurious input in RCSFileProvider
        as a stopgap measure to some probable scaling issues.

        * It was possible to get the authentication master password
        by inserting simply it on a page as a variable.  Oops.
        The master password is now saved under a different name
        (jspwiki-s.auth.masterPassword), which may break existing
        installations.  Also added a check in the VariableManager
        to prevent reporting of that variable.
        Reported by Trevor Yann.

        * Bug fix: Attachments might get looping forever, if the page did
        not exist.  Fixes 
        BugHasAttachmentsAndAttachmentsIteratorTagsWhenPageDoesntExist

        * Bug fix: You can now set the 'checked' attribute of checkboxes
 		in WikiForms with the parameter 'checked=true'.  Reported by JohnV.

        * Bug fix: BugWrongRecognitionOfWikiWords.  A CamelCase
        WikiWord would not be escaped correctly, if the word would
        have two capital letters.

        * Bug fix: BugShortViewURLConstructorAndShortURLConstructorProblems
        ShortViewURLConstructor did not have a default prefix.
        Reported by Olaf Kock.

        * Added patch from Patrick Woodworth to fix a FIXME in javadoc
        creation.

2005-08-20  Andrew Jaquith <arjaquith@mindspring.com>

        * v2.3.16
        
        * This release introduces a number of changes to the AAA
          (package auth.*) APIs. If you have created custom top-level
          templates, they will break. However, the changes are not 
          major. Regular template JSPs like *Content.jsp should 
          work without requiring changes.
          
        * jspwiki.policy has changed. The PagePermission syntax
          ....PagePermission "mywiki:Group*", "edit";
          replaces the previous format, and adds support for wiki
          name spaces. Either the wiki name or the page name
          may contain wildcards. This change was made to support wiki
          farms. See the PagePermission Javadoc for more details.
          You should update your policy files accordingly, since
          the change will "probably" break your existing policies.
        
        * AuthenticationManager supports named admin user in
          jspwiki.properties: jspwiki.admin.user
          
        * AuthenticationManager public methods have changed:
            a. public boolean login(HttpServletRequest)
               replaces boolean loginContainer(WikiContext)
            b. public boolean login(WikiSession, String, String)
               replaces boolean loginCustom( String, String, HttpServletRequest)
              
        * AuthorizationManager public methods have changed:
            a. checkPermission(WikiSession, Permission)
               replaces checkPermission(WikiContext, Permission)
            b. isUserInRole(WikiSession, Principal)
               replaces isUserInRole(WikiContext, Subject, Principal)
            c. new getRoles() method returns Principal[]; delegates
               to GroupManager and Authorizer and returns union
            d. public method getAuthorizer() changed to protected access
          
        * Authorizer public methods have changed:
            a. isUserInRole(WikiSession, Principal)
               replaces isUserInRole(WikiContext, Subject, Principal)
            b. new getRoles() method returns Principal[]
          These changes were propagated to WebContainerAuthorizer,
          GroupManager and DefaultGroupManager.
          
        * GroupManager public methods have changed:
           a. Enumeration members() removed.
          
        * WikiPrincipal adds static inner Comparator class
          for sorting arrays of Principals.
           
        * WikiContext public methods have changed:
           a. void setHttpRequest(HttpServletRequest) changed to protected access
           b. void setWikiSession(WikiSession) removed.
            
        * WikiSession was refactored to allow independence from WikiContext.
          Public GUEST_SESSION static instance eliminated in favor 
          of public static factory method guestSesssion().

        * UserManager get/setUserProfile(WikiSession...) replaces same
          methods with WikiContext parameter. 
           
        * PagePermission now includes a wiki namespace. Syntax
          is wiki:pagename. Wildcards are allowed as prefixes or
          suffixes for either part.
              
        * WikiPermission now accepts a "login" target
         
        * LeftMenu slightly tweaked
        
        * PreferencesContent.jsp for default template now displays 
          roles and groups user possesses.
          
        * <wiki:UserProfile property="roles"> will print the user's
          current set of group and role memberships, nicely sorted.
          Pretty nifty.
          
        * Many, many unit test changes.

2005-08-20  Andrew Jaquith <arjaquith@mindspring.com>

        * Minor changes to TestAuthorizer, AuthorizationManagerTest 
        and build.xml to correct test failures in AuthorizationManagerTest.
        This also fixes XMLRPC test failures. No version bump.

2005-08-19  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * 2.3.15
        
        * The "Wow, instead of sleep you can code and chat on
        IRC thanks to WiFi on airplanes" -release.

        * Added patch from Mark Rawlings to get rid of Javascript
        errors in cssinclude.js

        * Added support for generating Atom 1.0 feeds.  There
        is still a bit of a problem in generating proper Atom
        ID's, as our metadata storage does not work too well.

2005-08-16  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * v2.3.14

        * Fixed plugin and variable evaluation policy: because 
        using clone() on the entire DOM tree is very expensive,
        what we do is that we store new, specific elements 
        PluginContent and VariableContent into the DOM tree,
        which at evaluation time produce the actual content.

        * v2.3.13
        
        * RenderingManager cache did not work correctly, because
        it was relying in WikiContext.getPage() to get the page
        under which things should be cached.  Of course, if the 
        wiki template includes any other page using IncludePageTag,
        the context is always the same, and therefore the cache
        is never valid.  Fixed this by adding a new getRealPage()
        in WikiContext, which should always point at the real page
       	which is being rendered.
       	
       	* Added some simple profiling/stopwatch code to rendering.
       	You can now see the speed results by setting the WikiEngine
       	log level to DEBUG.

        * Fixed CamelCase parsing.  There are still a few
        inconsistencies between old TranslatorReader and the new
        JSPWikiMarkupParser.

2005-08-14  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * v2.3.12

        * Even more tweaks.  It is now possible to test the new
        rendering engine by setting "jspwiki.newRenderingEngine" to true
        in your jspwiki.properties (this will be gone in near future;
        it really is for testing only).  Note, however, that CamelCase
        does not currently work.

        * Some more tweaks of the new renderer.  isExternalLink()
        is now about 3x faster than it was before (it was the biggest
        bottleneck so far).  Still not usable (lists don't work).
        
        * Change test property files to use BasicSearchProvider
        (Lucene startup was taking too much time), and TestAuthorizer
        (WebContainerAuthorizer takes about a second to start each
        time). 

2005-08-13  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * Did a mass commit of the new rendering engine.  It is
        not enabled yet, but I wanted to save the code to a very
        safe place :-).  Please look at the code in the new parser
        and render -packages.  There is still time to change the
        API...  (No version bump; there is no changes in JSPWiki
        functionality with this).

2005-08-12  Andrew Jaquith <arjaquith@mindspring.com>

        * 2.3.11
        
        * Changed WebContainerAuthorizer to auto-detect whether
          web container authorization is used; it does this by looking
          for certain constraints in web.xml. The effect of this change
          is to make the out-of-the box configuration default to
          custom authentication. Also, changing to container auth
          is now very easy -- just uncomment the constraints and
          JSPWiki will know what to do without needing to fiddle
          with jspwiki.properties. Added a unit test and
          tests/WEB-INF/web.xml sample file also.
          
        * Added new "super-template" for administrative pages:
          AdminTemplate.jsp. This is a peer of ViewTemplate and
          EditTemplate, and is used by the registration and
          user preferences pages.
        
        * Loosened the default security policy to permit edits
          by anonymous uses. This is good for getting up and
          running, but a bad idea for Internet-facing wikis.
          The adminstrator is suitably forewarned in the policy file.
          
        * Added an initialize() method to the Authorizer interface.
          We probably needed one anyway, and the tweaks to
          WebContainerAuthorizer forced the issue.
          
        * Minor tweak to LeftMenu to replace the geeky 
          "you are authenticated/asserted" messages with something 
          more friendly.

2005-08-11  Erik Bunn  <Erik.Bunn@basen.net>

        * Added WikiPage.getAttributes().
        This will be useful for external code that wants to 
        display page attributes; for example, a hypothetical "MetaData.jsp"
        that would allow editing of page attributes without content-inlined
        [{SET...}] tags. 

2005-08-07  Andrew Jaquith <arjaquith@mindspring.com>

        * 2.3.10
        
        * Major fixes to the authentication and authorization codebase.
        Most outstanding issues with the prior commits have been resolved;
        it should be ready for prime time.
        
        * JSPWiki now installs a default Java 2 security policy and JAAS
        login configuration, which allows JSPWiki AAA to work "out of the box"
        without additional customization. Admnistrators can override these
        defaults using the standard policy/JAAS system properties if desired.
        
        * UserPreferences.jsp has been significantly tweaked. It also includes
        support for standard <template>/PreferencesContent.jsp template pages.
        
        * Registration.jsp is a new JSP for registering new users. Includes
        support for standard <template>/RegisterContent.jsp template pages.
        
        * NewGroup.jsp is a new JSP for creating wiki groups. By default,
        the group is pre-populated with the current user's wiki name.
        In addition, by default group members are allowed to edit
        its membership. Includes support for standard 
        <template>/GroupContent.jsp template pages.
        
        * UserProfile class now includes timestamps for creation and
        modification times. XMLUserDatabase time-stamps profiles
        when they are created and saved.
        
        * UserManager changed significantly to support improvements
        to the AAA code.
        
        * JSP tag <wiki:UserProfile> now includes additional properties
        for modified/created times and new properties "exists" and "new"
        which evaluate the tag body if the user has already been
        registered (or not).
        
        * JSP tag <wiki:UserCheck> includes additional properties to return
        vallues that allow certain aspects of the AAA configuration
        to be queried.
        
        * AAA code now tested using container authentication/authorization
        in addition to JSPWiki's custom auth. Note that the registration
        and user preference pages work slightly differently in each case.
        
2005-07-26  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * 2.3.9

        * A bunch of miscallaneous fixes to WebDAV to get paths
        to function correctly.

2005-07-26  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * 2.3.8

        * Merged in fixes from 2.2.29.

        * Bug fix: Attachments might get looping forever, if the page did
        not exist.  Fixes 
        BugHasAttachmentsAndAttachmentsIteratorTagsWhenPageDoesntExist

        * Bug fix: You can now set the 'checked' attribute of checkboxes
 		in WikiForms with the parameter 'checked=true'.  Reported by JohnV.

        * Bug fix: BugWrongRecognitionOfWikiWords.  A CamelCase
        WikiWord would not be escaped correctly, if the word would
        have two capital letters.

        * Bug fix: BugShortViewURLConstructorAndShortURLConstructorProblems
        ShortViewURLConstructor did not have a default prefix.
        Reported by Olaf Kock.

        * Enabled also the attach URL for WebDAV.  You can now
        browse the full range of attachments at <yoururl>/attach/
        using a DAV client.

2005-07-21  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * 2.3.7
        
        * DAV service now offers again the HTML rendered versions of
        pages under /dav/html/
        
        * DAV service now has a two-level structure: pages starting with
        "a" are in a subdirectory called "a", etc.
        
        * Some minor auth refactoring.

2005-07-17  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * 2.3.6
        
        * Added a bunch of refactorings (including new UserManager class)
        
        * AuthenticationManager now attempts to find the jspwiki.jaas
        and jspwiki.policy files on its own, if the user does not
        specify them.  JAAS and Java 1.4 suck in this regard - it
        requires all sorts of trickery with the config files and
        startup scripts to use built-in authentication.  It makes
        life very difficult for anyone who deploys the app, as they
        must have detailed command-line knowledge.  Not to mention the
        fact that it makes life hard for the developer as well, as they
        provide no way to do this programmatically...

2005-07-15  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * 2.3.5

        * Refactored about 300 minor warnings (unused code,
        assignment errors, etc)

        * Consolidated routines from FileUtil14.class to
        FileUtil.class - JSPWiki now requires 1.4, so we can just
        remove any specifics.

2005-07-03  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * 2.3.4

        * Bug fix: Doing two empty searches in a row would cause the
        search_highlight.js to loop and kill the browser.
        Reported by HolgerHoffst?tte.
        
        * Bug fix: Empty or non-Lucene compliant searches would throw
        a NullPointerException. Reported by HolgerHoffst?tte.
        Fixes BugSearchAlwaysThrowsNPE.
        
        * Bug fix: It was impossible to use the InsertPage plugin to
        insert the same page twice on a page.  Reported by Murray
        Altheim (I think - this was not entered in the bug reporting
        system).
        
        * Upgraded to Lucene 1.4.3.
        
        * Removed "sign" from build targets to allow decent builds 
        for now.
        
        * Both short url providers now heed the url prefix always...
        
2005-06-30  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * 2.3.3

        * Mass merge of JSPWIKI_ARJ_BRANCH
        
        * Added Andrew Jaquith's authentication code, replacing the
        old system completely.  This is likely to break everything.
        The merge was not as smooth as I would've liked, so THIS
        VERSION DOES NOT WORK - IT COMPILES, BUT DO NOT USE IT FOR
        ANYTHING ELSE THAN HACKING.

2005-06-23  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * 2.3.2

        * Merged in JSPWIKI_2_2_BRANCH
        
        * RSS 2.0 and enclosures support to rss.jsp.
        
        * Removed dead code.

2005-06-23  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * 2.3.1

        * Refactoring of FilterManager: now uses XPath and JDOM to parse
        XML files...
        
        * Tiny patch from ajbanck: UserManager no longer complains loudly
        if something is not a group.
        
        * Patch from Joerg Luedecker to delete pages from referencemanager
        if they're renamed.

2005-06-20  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * 2.3.0.

        * Included the page rename patch from a number of people. Thanks
        heaps to Chris Lisle, John Volkar, Joerg Luedeker!

        * Branched off JSPWiki 2.2 development to its own branch,
        this is now the 2.3 development.

2005-06-19  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * v2.2.26

        * Added partial fix for 
        BugReadingOfVariableNotWorkingForOlderVersions.  This is a deep
        bug.

        * Added patch from Joerg Luedeker to fix 
        BugDeleteFailsIfPageHasAttachmens.
        
        * PageManager didn't correctly return page text if the
        page was externally modified (I can't understand how this
        could've worked earlier...)  This killed an unit test or two.

        * Renamed methods in Search API to be a bit more consistent.
        Thanks to ajbanck for the suggestion.
  
        * ReferenceManager should now notice deleted pages.
        
        * rss.jsp now returns a 404, if the RSS generation is disabled.
        
        * Bug fix: BugApplicationNameBeGarbledIfThereAreChineseCharactersInIt
        Install.jsp is now smart enough to mangle the input so that
        it can be put inside an Latin1 properties file.  Thanks to
        Dengber for the fix.
        
        * Bug fix: BugPageAddedToSearchQueueMultipleTimes. Thanks to
        ajbanck.

2005-06-16  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * v2.2.25
        
        * Bug fix: LuceneSearchProvider misspelled the default
        search provider name, causing exceptions at startup...

        * Bug fix: Page names are now also added in the Lucene
        index in their canonical form, not just beautified form.
        Suggested by Michael Smith.

        * Bug fix: there were some concurrency issues whenever
        iterating through the entire list of pages (causing 
        ConcurrentModificationExceptions).  Fixed by returning
        a clone of the array in the CachingProvider.

        * v2.2.24

        * Added Arent-Jan Banck's patch to support attachment
        searching.  I also changed the SearchProvider API (it's
        not been released in a stable version) slightly - no
        need to send the text all the way; let the provider worry
        about it.

        * BasicSearchProvider now searches attachment names
        as well.

        * LuceneSearchProvider now indexes attachment names and
        certain text-based attachments as well.  Currently plain
        text, XML, .ini and HTML files are indexed.  This will
        change to a better system, once someone figures out how
        to do proper Lucene Analyzers.

2005-06-14  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * v2.2.23

        * Quite a lot more WebDAV refactoring; it works now
        again.  Still having problems with UTF-8 page names...
        HTML fetching does not work at the moment either.

2005-06-13  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * v2.2.22

        * Broke the WebDAV API for now; I'm changing to a new
        model to make additions easier.

        * Bug fix: SearchManager didn't behave nicely; there was
        a circular reference between it and ReferenceManager.
        LuceneSearchProvider now does not start indexing until
        PageManager is surely up and running.  Reported by
        ajbanck.

2005-06-12  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * v2.2.21

        * Enabled normal Lucene query language if you're using
        the LuceneSearchProvider.  This, incidentally, also helps
        a lot if you're using any other language than English, since
        we now use the same Analyzer for queries than for parsing
        (which would account to quite a few problems in the past).
        Unfortunately, I had to break FastSearch (does anyone use it)?

        * Moved searching into com.ecyrd.jspwiki.search package,
        thanks to an excellent patch from Arent-Jan Banck.

2005-06-09  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * v2.2.20.

        * Small bug fix to PluginTag: it should now work on page
        refreshes.

2005-06-08  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * v2.2.19.

        * Bug fix: BugPluginTagNotWritingOutput

        * Bug fix: BugJspwiki.tldEmptyTag

        * Bug fix: BugWikiTranslateTagShouldTrimLeadingSpacesOfFirstSentence

2005-06-06  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * 2.2.18.

        * Ebu added a bug fix for oldauth (please specify here...)

        * Fixed two bugs with Install.jsp:
        BugInstall.jspDoesNotHandleWindowsPathsWell by adding a simple
        windows path converter (should work also well with UNC paths),
        and BugInstall.jspDoesNotProvideDefaultBaseURL by commenting
        out the baseURL parameter in jspwiki.properties.tmpl.

2005-05-18  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * 2.2.17

        * The HTML fragment identifiers generated for each heading
        are now XHTML compliant (no more entities).  Unfortunately,
        this makes them look like crap, but this method should work
        for CJK languages (unlike dropping non-USASCII).
        
        * Bug fix: HTML fragment identifiers didn't work on pages
        with non-USASCII names.
        
        * 2.2.16

        * Major fix to ISO-8859-1 - it didn't work almost at all
        if you used anything else but the DefaultURLConstructor - 
        especially attachments didn't work.

2005-05-18  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * 2.2.15
        
        * Bug fix: BugReferenceManagerDoesNotFindSingularReferences
        should now finally be fixed.
        
        * Fix of a fix of a bug fix: We no longer generate <a name="foo">
        tags for headings - instead, we generate an unique "id" for
        each heading.
        
        * Added "overflow: auto" to <pre> tags in jspwiki.css...
        That makes bug reports far, far more readable.

2005-05-15  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * 2.1.14

        * Somewhere above Pakistan or Afghanistan...
        
        * EditorArea has now an id: "editorarea".  It also has now
        a class "editorarea", simply because "text" was not really
        very descriptive.  Thanks to, err, someone, for this -
        I seem to have been very eager in deleting my email...
        
        * Bug fix: No more DAV NPEs with certain systems.  Patch
        thanks to someone - sorry, I forgot...
        
        * Bug fix: no longer throws ConcurrentModificationException
        in certain conditions upon startup.
        
        * Bug fix: InsertPage now detects circular references and it
        is no longer possible to DoS a wiki by including a page in
        itself.
        
        * Bug fix: Odd pages of format "/foo" are now catched and no
        longer throw horrendous exceptions.
        
        * Fix of a bug fix: The changed heading anchor generation in
        2.2.13 caused plenty of grief to a lot of people working with
        CSS - instead of an empty tag we now generate an empty tag
        pair. <a name="foo"></a> instead of <a name="foo"/>.  It seems
        that the latter confuses quite a few parsers, even though it's
        valid XHTML.

2005-05-06  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * 2.2.13

        * Bug fix: Empty links no longer generate warnings.
        
        * The non-existing page links are now generated without the
        annoying underline as a proper hyperlink.  You'll probably
        want to copy the link code from jspwiki.css...
        
        * Bug fix: Headings now generate the link anchor at zero
        length, so that they should no longer confuse people who
        write CSS.

2005-05-05  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * 2.2.12
        
        * Bug fix: FCK editing now disables plugins and filters 
        properly.
        
        * Bug fix: search hilighting didn't work.

        * JSPWiki is now a WebDAV Class-1 server.  The support is not
        yet complete, nor are we completely Class-1 compliant, but
        you can now browse your JSPWiki repository by pointing at your
        $baseurl/dav/.  Attachment support is forthcoming, as soon
        as I figure out what's the best approach.  Authoring support
        will also be enabled soon.
        
        (To enable this functionality, check out the new web.xml).

2005-05-02  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * 2.2.11.

        * Incorporated the FCK editor for WYSIWYG editing, as well
        as the XHTML import functionality from Sebastian Baltes.
        Thanks heaps!
        
        This is an experimental feature: you need to turn it explicitly
        on with "jspwiki.editor=FCK" in your jspwiki.properties,
        and also uncomment the <script> tag in EditTemplate.jsp.  The
        editor is known to fail or behave really strangely on occasion,
        and many of the functionalities do not simply work (like
        image insertion), so I'm disabling quite a lot of work for now.
        Check out scripts/fckconfig.js and scripts/fckstyles.xml for
        examples.
        
        The WYSIWYG editor will remain an experimental feature for now.
        
        You need to install FCKEditor yourself into scripts/fckeditor.

2005-04-29  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * 2.2.10.

        * Added patch from Sebastian Baltes to fix issues with style
        embedding: %%(color:rgb(1,2,3)) would not work.

2005-04-24  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * v2.2.9.

        * Added missing attribute of PageDate: format to jspwiki.tld.
        Oops... This one had been missing for quite some time.
        
        * Changed the default template somewhat.

        * UnusedPagesPlugin no longer inlines images.

        * v2.2.8

        * Added 'class="body"' to default template body, as per
        BugCSSClassForViewTemplate.jspBodyTag

        * Added "link" to Comment.jsp; this should be a lot
        smarter now about if you want to use comment functionality
        for the weblog.

        * Hopefully fixed preview issues with IE by rewriting
        Preview code (it no longer relies on javascript:back(), but
        it POSTs back to Edit.jsp).  Fixes 
        BugUsingSSLWithMicrosoftInternetExplorerV6SpoilsPreviewFunction.
        Hopefully.

        * Added EditorAreaTag.

        * Oops, %% would sometimes end in StackEmptyException;
        teaches me to read javadocs.

2005-04-23  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * v2.2.7
        
        * Fixed many issues with ~-escaping.  It should now work with
        practically all WikiMarkup; you should be able to escape
        anything.  Fixes Bug Back Slashes In Http String In A File
        Causes File Not To Load, Bug Line Breaks In The Middle Of Text.

        * Fixed some issues with %%-style generation: it now looks
        at the rest of the line, and if it contains material, it will
        emit a <span> instead of a <div>.  This should make it 
        intuitively pretty logical.  This should fix quite a many
        complaints relating to styles, including
        BugLineBreaksWithCSSFormating (partial), BugCSSInTables

2005-04-22  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * v2.2.6.

        * Added ShortViewURLConstructor and move all 
        URLConstructors to the url-package.  This makes it
        possible to have short URLs *and* protect the access
        to particular JSPs...

2005-04-21  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * v2.2.5

        * You can now choose which Lucene analyzer to use
        with "jspwiki.lucene.analyzer".  Choose it according
        to the primary language of the wiki.
        
        * Lucene can now recover, if the index was locked
        when JSPWiki was shut down.

2005-04-20  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * v2.2.4.
        
        * Bug fix: TableOfContents plugin now properly calculates
        the page variables.
        
        * Bug fix: Deleted pages are no longer shown in the
        RecentChanges listings.

        * v2.2.3
        
        * Added some sanity checks to the startup concerning
        the work directory.

2005-04-19  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * v2.2.2.

        * CachingProvider does now a bit more sanity checks
        with the Lucene directory; this was a source of confusion
        for some people.  It's also more verbose.

2005-04-18  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * v2.2.1.

        * Bug fix: RSS generation no longer does double encoding.

        * Bug fix: CachingProvider would not notice new files.

2005-04-17  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * v2.2.0-beta.  Yay!  I don't know whether this version is really
        ripe, but we just HAVE to get it out at some point.

        * Fixed a small off-by-one error in SpamFilter.

2005-04-16  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * v2.1.167

        * Enhanced SpamFilter to have a local ban list.  Also added the
        ability to do edit choke monitoring: any host doing too many
        edits/minute will get added to ban list.

2005-04-14  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * v2.1.166

        * Removed header.jsp from default template (it was not used)
        
        * Added "Page feed" section to default template/info.

        * FeedDiscoveryTag now shows all page feeds properly.

        * Page-specific RSS feeds now work (add &mode=wiki to the rss.jsp
        url).

2005-04-11  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * v2.1.165

        * Added classes/oscache.properties (otherwise OSCache tags won't
        work).

        * Added the new RSS Generator.  Fixes BugRSSFeedWrongDC.

2005-04-10  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * v2.1.164
        
        * Fixed NPE in UserPreferences.jsp when auth was not being used.

        * Default template now has "noindex,nofollow" on old versions.
        This is one way to combat spam.

        * Refactoring: Removed all references to Category, replaced with
        Logger.  Also cleaned away a number of compiler warnings in tests.

        * v2.1.163
        
        * Attachment deletion works now as well.

        * BreadcrumbsTag.FixedQueue is now static.  This should help with
        some serialization issues.  Reported by many people, forgotten by
        me.

        * UTF-8 attachment names would fail (again).  Thanks to Stephan
        Schiessling.

2005-04-07  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * v2.1.162
        
        * Bug fix: Long values in filter.xml would cause truncation.
        Patch from Mario.  Fixes BugLargeValuesTruncatedInFilters.xml.

        * Bug fix: DefaultURLConstructor would append both & and ? to
        parameters, causing confusion.  Reported by Jake Vogelaar.

2005-04-06  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * v2.1.161

        * Refactored TraditionalDiffProvider to be more JSPWiki coding
        guidelines compliant.

        * Added a functional ContextualDiffProvider (thanks to Henning
        Schmiedehausen).

        * CachingAttachmentProvider now empties the cache in case the
        attachment is deleted.  Reported by Raghavan Srinivasa.

2005-04-05  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * Fixed BugCommentBoxStyle.

        * v2.1.160
        
        * Removed the Expires-header from AttachmentServlet for now;
        checking if that helps with BugStaleAttachments.

2005-04-04  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * v2.1.159
        
        * Added some patches to tests to make sure they all run on systems
        that don't use Latin1 as default... Contributed by Henning
        Schmiedehausen.
        
        * TextUtil.urlEncode() & urlDecode() no longer assume that the
        platform default encoding is Latin1.  Contributed by Henning
        Schmiedehausen.

        * Removed dependancy on the bmsi difference package, as it was GPL
        (oops).  I don't know how I missed that, but the dependency is
        gone now.  Replaced with the Jakarta JRCS-diff package.  Suggested
        and contributed by Henning Schmiedehausen.
        
        * Removed DifferenceEngine and moved the entire diff code into its
        own package.  Contributed by John Volkar.

2005-04-03  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * v2.1.158

        * Deletion of entire pages works now.  Make sure your Delete.jsp
        is protected!

        * Added password protection to Install.jsp

2005-04-02  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * v2.1.157

        * Added patch from Henning P. Schmiedehausen to fix some issues
        with the CachingProvider negCache.

2005-03-31  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * Removed some extra imports.  Getting back to speed in
        development...

2005-03-11  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * Added favicon and the corresponding thingy to commonheader.jsp.
        I got tired of seeing 404s from all stupid browsers...

2005-03-09  Erik Bunn <ebu@memecry.net>

        * Added empty array check to FileUtil14.getThrowingMethod()

2005-03-09  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * v2.1.156

        * Disabled all auth tests.  In fact, for the first time, all tests
        now run (on my platform, there are still some char coding issues
        on some others.  Stupid me.)

        * Added page deletion support to WikiEngine.

        * Major refactoring of both CachingProvider (=speed!) and
        VersioningFileProvider(=now actually supports deleting versions of
        a page).

2005-03-07  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * Fixed issues with a number of tests.
        
        * Added the "Search" plugin.
        
        * Some bug fixes and sanity checks to ReferenceManager.
        
        * Turned off old auth code by default.  Set the property
        "jspwiki.auth.useOldAuth" to "true" in your jspwiki.properties if
        you want to keep using it.

2005-03-04  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * v2.1.155

        * Continued reworking of CachingProvider to provide an
        optimized result.  There are plenty of nasty dependencies
        there... However, I did get most tests to run.

2005-03-02  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * v2.1.154
        
        * Fixed a bunch of tests that were broken by 2.1.152.
        
        * RepositoryModifiedException now has a new constructor
        with the page name as well.

        * MAJOR change to CachingProvider: it was getting a bit too
        unwieldy to debug, so I changed it to completely use OSCache.
        This should hopefully help the caching issues somewhat (I just
        hope I didn't do any major damage...)

        * WikiPage is now Comparable.

2005-03-01  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * v2.1.153

        * Added Install.jsp for a simple installation.

2005-02-26  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * v2.1.152

        * AbstractReferralPlugin now also supports parameters like
        "before" and "after", so you can have much better control over
        what you do.  Thanks to Foster Schucker for the patch.
        
        * Fixed plenty of failing tests (including the annoying "Cannot
        start managers: null).  I think I kinda like Eclipse, now that I'm
        getting used to it.

        * Bug fix: When using ISO-8859-1, attachment URLs would still
        contain the "%2F".  JSPWiki should now work nicely when a page
        name contains a slash.  Fixes BugURLEncoderEncodesAlsoForImages.
        
        * Bug fix: CachingProvider would lose metadata on save. Reported
        by Andrew Jaquith.

2005-02-22  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * v2.1.151

        * ShortURLConstructor now works in all cases except special pages.
        
        * v2.1.150
        
        * RSSGenerator now has a bit more verbose RSS generation for
        attachments.
        
        * Worked a bit more on ShortURLConstructor.  Now the different
        other URLs work, but there are issues when generating relative
        URLs.

2005-02-19  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * v2.1.149

        * New Editortag and corresponding JSP pages now fix
        BugCommentPreviewDeletesAllComments.

        * EditorTag now is much smarter than before: you can do things
        like put your own editing commands inside the body - the EditorTag
        just adds all the required pieces.

2005-02-15  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * v2.1.148
        
        * Oops, didn't quite fix the problems; the extra <script> tag
        turned out to be useful after all... Fixes
        BugCantFindJSPWIKI_MAC.CSS.
        
2005-02-13  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * v2.1.147

        * Fixed problem with an extra <script> tag inside cssinclude.js

        * Removed several unused imports (testing out Eclipse, now that it
        seems that it has proper emacs-like indenting - now I just need a
        ChangeLog-plugin...

2005-01-31  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * v2.1.146.

        * Added ShortURLConstructor, though it does not work...  Except
        for VIEW.

        * Added BaseURL tag (just to make things a bit easier for template
        writers).

2005-01-28  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * v2.1.145.

        * createContext() now prevents non-wikinames to be created.  This
        may fix a bunch of potential problems.

        * FilterManager.addPageFilter() now does a bit of a sanity check.

2005-01-26  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * v2.1.144.

        * Oops, LinkToTag used accidentally ATTACH instead of VIEW...

2005-01-25  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * v2.1.143.

        * PingWeblogsComFilter now actually accepts a parameter where to
        ping.

        * All tags and code were moved to the new standard.

        * Had a major revelation and moved the URL generation subroutines
        from WikiEngine to WikiContext.  This had to be done or else there
        would be no way to change how the URLs are generated in different
        contexts, such as RSS generation or XML-RPC.  This also means
        WikiEngine.getViewURL() is now deprecated (please use
        WikiContext.getViewURL(), WikiContext.getURL()) instead.

        * Added 304 check to atom.jsp as well.

2005-01-23  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * v2.1.142.

        * Added 304 check to rss.jsp

        * Implemented IdeaGetWikiInstanceByServletContext by (I lost the
        email, sorry)

        * v2.1.141.

        * You may now set the URLConstructor instance by using
        jspwiki.urlConstructor parameter.

        * rss.jsp had a typo and would not compile, oops...

        * Almost all hard-coded references to URLs are now handled by an
        URLGenerator instance.

        * All instances of ServletRequest.getRemoteHost() were replaced
        with getRemoteAddr() - this means that you no longer get the host
        names in the logs.  On the other hand, this should be a lot faster
        if your dns is slow.

        * Bug fix: Context variables were essentially ignored in
        VariableManager.

2005-01-22  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * v2.1.140.

        * JSPwiki now supports the Google initiative wiki/blog spam
        reduction by using rel="nofollow" for any links outside the wiki.
        Set "jspwiki.translatorReader.useRelNofollow" to "true" to enable
        this.

        * TranslatorReader now completely uses the new URL generation
        scheme.

        * RSS generation now uses absolute URLs regardless of the setting
        of jspwiki.referenceStyle.  It also uses the new URL generation
        scheme.

        * InsertPage plugin now has a "default" attribute.

2005-01-18  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * v2.1.139.

        * Oops: forgot to set the servlet-mapping to conform to the new
        URI scheme: the URL pattern should be "/attach/*", not
        "/attach"...

        * v2.1.138.

        * Fixed BugErrorInDefaultJspwiki.css (reported by Per).

        * Added patch to RCSFileProvider and FileUtil to close down a
        bunch of processes that should fix
        BugTooManyFilesOpenWhenUsingRCS.  Contributed by Claas Ruschmeyer.

        * Added new parameter: jspwiki.referenceStyle.  This may be set to
        "absolute" or "relative", depending on whether you want to have
        absolute or relative URLs.  It does not yet work on every link
        construct, but it will...  This change also introduced a new
        interface, URLConstructor, which will be pluginizable later on.
        Hopefully it is versatile enough, but so far, please consider it
        internal.  This change may have broken a lot of things, but it
        does pave way for short urls.

2005-01-15  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * TableOfContents -plugin now has a title as well...

2005-01-11  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * v2.1.137

        * Added parameters "submit", "preview" and "cancel" to EditorTag
        (so you can localize it).

2005-01-10  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * Added styles for the TableOfContents plugin in the default
        jspwiki.css.

        * Added a "center" style in the default jspwiki.css (which is
        smart enough to center tables as well on most browsers).

        * v2.1.136

        * InfoContent.jsp no longer uses scriptlets to determine previous
        and next versions; instead, two new tags "PreviousVersionTag" and
        "NextVersionTag" have been implemented.  This will make migration
        a lot easier when you can delete intermediate versions (or help a
        lot if you want to do a SubVersionProvider...)  The tags need to
        be hooked up to the version history before they're useful,
        though...

        * DiffLinkTag now understands a magical version number "current"
        to refer to the current version.

        * Bug fix: BugIncludeTagUsesDefaultTagOnly should now be fixed
        with a fix to the ContentTag.

        * CheckVersionTag now supports two additional modes: "notfirst",
        and "first".

        * CachingProvider cache consistency checks are now in seconds, not
        milliseconds (which was a stupid idea anyway).

2005-01-08  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * BugReportHandler ignores now _body (oops) :)

        * v2.1.135

        * Should fix the spurious problem people had trying to attach
        files with non-ascii names to pages that also had non-ascii names,
        aka
        BugThrowsAnExceptionWhenTryingToAttachAFileToAPageWithAFancyNameUTF8.

        * AttachmentServlet now responds with error codes.

        * Attachment urls are now in the form /attach/foo/bar.txt.  This
        has several advantages, mostly because all files now look like
        they were served natively.  Note that the web.xml file has changed
        to reflect this.  Of course, the old urls still work.

        * Nested lists now generate proper XHTML code.  This removes all
        known XHTML bugs (but I'm sure there are still some).  The default
        TextFormattingRules page now validates.

2005-01-07  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * v2.1.134

        * Removed LoginBox from the default template in anticipation of
        the Great Reorg.

        * TableOfContents plugin no longer gets confused if a heading
        contains HTML escapable characters, such as quotes, <-signs or
        ampersands.

        * Added new parameter to TableOfContents: "title".

        * Added ContentTag for *really* simple templating.  Also modified
        WikiTemplates tutorial and the default template.

2005-01-06  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * v2.1.133

        * Added a fix for BugNamedAnchors - the section anchors are now
        properly handled, if they contain non-USASCII characters.

2005-01-05  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * v2.1.132.

        * Now transmits the _body parameter from FormOutput plugin to the
        actual plugin taking care of the form submission.  Suggested by
        John Volkar.

2005-01-04  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * v2.1.131.

        * Added more intelligence so that <p> tags do not enclose divs,
        hrs, and pres.  This makes many more pages validate as XHTML.
        Unfortunately, nested lists still fail XHTML validator - and many
        browsers render them wrong, if it's compliant.  Annoying.

2005-01-03  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * v2.1.130.  (It's amazing what you can do when you're on a long
        train trip...)

        * Rewrote header.jsp to include proper scripts, and renamed it to
        "commonheader.jsp".

        * Moved the default scripts from templates/default to /scripts.
        This allows easier access from different templates.

        * RSSImageLinkTag now has proper alt-tag.

        * The IncludeTag now attempts to find the included page from the
        default template, if it can't find it from the current template.
        This essentially allows you to just copy the "ViewTemplate.jsp"
        file (and the CSS files) into a new subdirectory for really simple
        templating.

        * The default template now validates as XHTML 1.0 Transitional.
        (Though there are some pages on which validation still fails, most
        notably TextFormattingRules - we're working on it... :)

        * TranslatorReader now emits a lot more XHTML-compatible code.
        The paragraph handling was faulty on many occasions, mostly
        resulting in block-level elements to be put inside paragraphs (big
        no-no).

        * TemplateManager now works (sorta).  All JSP files now use it to
        figure out how templates work.  This has the nice side effect that
        if a template file is missing, JSPWiki will use the default
        template file for that.

2005-01-02  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * v2.1.129.

        * Added EditorTag, which replaces the entire <textarea> -thingy
        from EditContet.jsp.  It's still a bit skeletonish, and needs
        things like localizability and the ability to change how the
        textarea looks, for example.

2004-12-31  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * Bug fix: The internal context is now created with the proper
        name when referring to using plural forms.

2004-12-31  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * Added a slight delay to Lucene update thread to make sure it is
        not conflicting with the rest of the startup.

        * Now compiles under JDK 1.5.0 (there's an odd dependency I didn't
        have time to look at, so I had to add "-source 1.4" to build.xml).

2004-12-29  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.1.128

        * WeblogPlugin is now an InitializablePlugin.

        * Added the InitializablePlugin interface, which can be
        implemented by plugins if they require any calling during startup.
        By default plugins are not called during JSPWiki init to make it a
        bit faster.

2004-12-12  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * v2.1.127

        * Fixed IndexPlugin so that it no longer overflows with large page
        names.  A long-time annoyance, but something easy to do on a
        flight to Tokyo... :-).  I also added some new CSS to handle how
        it looks (and made the whole thing output proper XHTML code.)

        * RecentChangesPlugin (and incidentally, all referrer plugins as
        well) now heed jspwiki.beautifyTitle.  Patch from Foster Schucker
        (thanks!)

        * Doublewhoops, forgot to add a proper import to the FormOpen,
        causing a compilation error.  Arg!  Sorry, everyone!

2004-12-10  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * v2.1.126

        * Whoops, FormOpen was in wrong package.

2004-12-09  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * v2.1.125

        * Bug fix: Addressing inside editor is now done with names instead
        of numbers (oops, a really, really old fixme :).  This and the
        other one reported (and patched) by Uli Heller.

        * Bug fix: Javascript error with Preview.

2004-12-01  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * v2.1.124

        * Some shuffling of auth-related classes...

        * Added protection against faulty cookies that could result in a
        number of ways.  Reported by many people.  Fixes
        BugUserProfileErrorWhenRetrievingACookieWithAnEmptyUsername.

2004-11-23  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * v2.1.123.

        * RCSFileProvider would sometimes throw a NPE.  Fixed.
        
        * Fixed BugXSSVulnerabilityInSearch.jsp by making sure Search.jsp
        applies entity replacement at the proper place.  Reported by
        Jeremy Bae.

2004-11-18  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * v2.1.122.

        * Fixed the web.xml security constraints to something more useful.
        Suggested by Andrew Jaquith.

2004-11-15  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * v2.1.121.

        * Fixed two instances of "&" not being encoded properly in
        CalendarTag.  Fixes bug "BugAmpersandNotEncodedProperly".

2004-11-14  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * v2.1.120

        * Added BugReportHandler.

        * Added the WikiForms system in the CVS.  It has been slightly
        changed from the WikiForms as submitted by ebu.  Documentation to
        follow (it'll be faster if someone volunteers it :).

        * It's now possible to use SET to copy variables.
        [{SET var1='{$var2}'}].  Suggested by Reinhard Engel.

2004-11-09  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * v2.1.119

        * Now should compile on JDK 1.5.  Thanks to Dan Johnson.

2004-11-06  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * v2.1.118

        * Improved attachment error handling (check UploadTemplate.jsp)

        * It is now possible to limit the size of the attachments that are
        uploaded by using the "jspwiki.attachments.maxsize" property.

        * The attachment servlet now uses the workdir to put temporary
        files in instead of the java.io.tmpdir.  This is to facilitate
        some ISPs which do not allow you to access a temporary directory.
        Thanks to Mike Lippold.

        * Removed extra parameters from jspwiki.tld - I thought I had done
        it so I ignored bug reports about this.  Oops.  Sorry.  *sheepish
        grin*.

2004-11-02  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * v2.1.117

        * Patch from Paul Wagland to fix issues with Lucene and
        CachingProvider (it would not notice external modifications of
        pages).  Thanks!

2004-10-28  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * v2.1.116

        * Added patch to fix WikiDatabase initialization problems.  Thanks
        to Steffen Stundzig!

        * XMLRPC and InsertPage now also check for page permissions.
        Since there is no way to do XML-RPC user auth (at the moment),
        XML-RPC always assumes the user is a "Guest".

2004-10-14  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * v2.1.115

        * NamedGroup now works.  Some refactoring of Login.jsp to make it
        more usable.

2004-10-12  Erik Bunn  <Erik.Bunn@memecry.net>

        * v2.1.114
        
        * Refactoring: added getInstance(ServletConfig,Properties) to
        provide WikiEngine with external property set. Useful mainly in
        administration of multiple webapps that use JSPWiki.

2004-10-10  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * v2.1.113

        * Bug fix: 304 check in AttachmentServlet was wrong.  Reported by
        Yogesh Patel.

2004-10-09  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * v2.1.112

        * Developers be aware: FilterManager now throws a lot more
        exceptions...  So does WikiEngine.saveText().

        * VariableManager now also outputs variables from the HTTP Session
        and the Servlet Request Parameters (assuming they are Strings.)

        * VariableManager has now a new variable: $pagefilters, which
        lists all the filters currently in use.

        * Added FilterException and RedirectException.  Filters can now
        throw a RedirectException upon preSave() and postSave() to change
        the place to which the user is redirected after an edit.  Also
        changed the PageFilter interface to match.

        * Added SpamFilter

2004-09-25  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * v2.1.111

        * Added TableOfContents plugin.

        * Now recognizes all official IANA URI types correctly as
        external links.

2004-09-24  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * v2.1.110

        * Added the JSPWiki logo to the default distribution.

        * Reworked the default template a bit - there were some brainfarts
        in it, causing it to fail on more picky browsers like Safari.

        * ReferenceManager serialization is now slightly faster.

2004-09-19  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.1.109

        * RCSFileProvider now sets the sizes when asked for page history,
        making it a lot faster.

        * Moved get/setSize() to WikiPage.

        * v2.1.108

        * CachingProvider now also caches page history.  This helps the
        history generation from the really slow providers like
        RCSProvider.

        * ReferenceManager now serializes its status on disk at every
        save, and returns it at startup.  This provides *significant*
        speedup at JSPWiki start.

2004-08-30  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * v2.1.107

        * Oof... Apparently java.net.URLEncoder *does* use the default
        platform encoding.  Fixed it to use either UTF-8 or ISO-8859-1 to
        make all scandic tests also run on OSX (which defaults to Mac
        Roman, duh).  Also fixed the tests so that they are now full
        US-ASCII instead of Latin-1.

2004-08-05  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * v2.1.106.

        * Added documentation for WeblogPlugin and WeblogEntryPlugin.

        * PluginTag now also accepts body content, which gets translated
        to the "_body" content of the plugin.  Thanks to Foster Schucker
        for the initial code.

2004-08-03  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * v2.1.105

        * Added Killer's patch for BasicAttachmentProvider - it now
        actually deletes attachments.

2004-07-16  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.1.104

        * DefaultPermissions now has a variable: "defaultpermissions",
        which is used to read the permissions in.  The permissions of the
        actual page "DefaultPermissions", and the actual default
        permissions are now thus separate.  See the DefaultPermissions
        page in the distribution for more information.

        * Added set/getLoginName() to UserProfile.

        * Added documentation for the three new tags.

2004-06-27  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * v2.1.103

        * Major additions to FindContent.jsp - got rid of most of the
        scriptlets.  Added three new tags to the soup as well, so you
        can now write around your searchstuff with those.  It is remotely
        possible that old search code breaks now.

        * v2.1.102

        * Added ebu's patch against NPEs in UserManager.

2004-06-13  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * v2.1.101

        * Added "debug" parameter to all plugins.  This is recognized by
        the JSPWiki engine itself, and if the parameter is specified as
        "true", JSPWiki will automatically output all parameters and the
        stack trace to the page itself, if there is an exception.
        Suggested by Foster Schucker.

2004-06-10  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.1.100
        
        * All WikiProviders now take WikiEngine as one of the arguments to
        the constructor.  I'm sorry, but this does break all 3rd party
        providers... The change is really simple, though; and for good
        reason.

        * Added new property: jspwiki.workDir.  This is used in the future
        for all kinds of caching and other events.  At the moment, only
        Lucene uses it.

        * Included Mahlen Morris' patch for Apache Lucene -enabled search.
        It's FAAAST.  Thanks!

        * Bug fix: Direct URIs in text would cause a failure, if they
        contained wikimarkup.

2004-06-03  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * Corrected DTD URI in web.xml.  Thanks to Lance Bader.

2004-06-03  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * v2.1.99.

        * Fixed a long-standing problem with hyperlinks inside headers
        causing strange behaviour with generated section names.  Reported
        by Foster Schucker.

2004-05-16  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * v2.1.98.

        * Removed all HTML generation from TranslatorReader into
        HTMLRenderer, and added TextRenderer.

2004-05-14  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.1.97.

        * Added preliminary support for the Atom blog API.  It still does
        not yet completely work, however.

2004-05-13  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * Denounce plugin no longer fails on null user-agent.

        * v2.1.96.

        * Added new FeedDiscoveryTag, deprecated RSSLinkTag.

        * Added atom.jsp to support the 0.3 version of Atom.  The Atom
        feed attempts to figure out the blog name from a page variable
        called "blogname".

2004-05-03  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * v2.1.95.

        * Implemented rest of the MetaWeblogAPI routines.  They are
        completely untested yet.

2004-04-09  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.1.94.

        * Now default template links to jspwiki.org EditPageHelp in case
        the page is missing.  Suggested by SebastianPetzelberger.

2004-03-31  Erik Bunn  <ebu@spamicide.basen.net>

        * v2.1.93
        
        * Modified UserManager, UserDatabase, WikiDatabase: UserProfile
        objects are now ultimately produced by the UserDatabase implementation.
        By plugging in a different implementation, you can e.g. construct users
        from a database.

2004-01-21  Erik Bunn  <ebu@spamicide.basen.net>

	* v2.1.92

	* Modified all IteratorTag classes to use WikiContext.clone()
	instead of creating a new one. This preserves the context info.

2004-01-15  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.1.91.

        * Plugin errors are now logged as INFO level for convinience.
        Getting a zillion emails every time someone mistypes a plugin name
        is NOT good.

2004-01-13  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.1.90.

2004-01-12  Erik Bunn  <ebu@spamicide.basen.net>

	* Added UserManager.getUserDatabase(), getAuthenticator().
	These are useful for external user providers.

	* Added WikiGroup.clearMembers(). 

2003-12-04  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.1.89.

        * Made WikiDatabase.initDataBase() and WikiDatabase.updateGroup()
        protected at Killer's request. 

2003-11-22  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.1.88.

        * Implemented a completely new PageFilter initialization
        system. Please see the new PageFilters page in the documentation.
        NB: The Filter interface did not change, but any setup
        instructions did.

2003-11-07  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.1.87.

        * Changed the default template to have a better structure w/
        respect to the cssinclude.js script.

2003-11-06  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.1.86.

        * Added the "section" parameter to InsertPage plugin.  Requested
        by John Volkar.

2003-10-20  Erik Bunn  <ebu@spamicide.basen.net>

        * v2.1.85
        
        * Added CreatePermission, and support for it in WikiPermission,
        Edit.jsp.

        * Modified Login.jsp functionality slightly, to support a 'msg'
        context variable for displaying a friendly message. (This could
        be changed to include a WikiPage, perhaps.)

2003-10-19  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.1.84.

        * Removed the unused "comment" parameter from Edit.jsp, since we
        now have the "Comment.jsp" for that kind of stuff.

        * Saving from preview page works now.  Also, added a link for
        "keep editing" and "cancel" so that it's more user-friendly now.
        Note that they the content preview "Save" is a CSS hack, and the
        content preview "Keep editing" is a Javascript hack, so they might
        not always work.  The modifications required only changes to the
        "default" template, so anyone who has their own template needs to
        check out how it's done.

        * v2.1.83.

        * All plugins use now log4j Logger instead of Category.

        * Added WeblogArchivePlugin.

2003-10-15  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.1.82.

        * Tentative changes in CachingProvider to solve the "externally
        modified repository"-problem.

        * v2.1.81.

        * Some tiny refactoring of the TranslatorReader; also enhanced
        WikiEngine javadocs a bit.

        * Small fix to deal with named anchor links (they accidentally
        encoded the '#' as well.) 

2003-10-14  Erik Bunn <ebu at iki dot fi>

        * v2.1.80
	 	
        * Modified VariableManager and VariableTag: they now search for
        page metadata after everything else fails. Using the [{SET
        foo="bar"}] syntax on a WikiPage, you can examine the variable
        with [{$foo}] on the page, or using the Variable tag in your
        templates.

2003-10-13  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.1.79.

        * Incorporated multiply nested list patch from MurrayG.  Thanks!

2003-10-10  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.1.78.

        * Headings now generate a named anchor.  This enables things like
        page contents.  The current scheme is
        '#section-<pagename>-<heading>', where both the <pagename> and
        <heading> are WikiNames.  The WikiName of the heading is done in
        exactly the same way as with normal WikiPages.  For more
        information, see NamedHeadings in the jspwiki_samplepages.zip.
        Suggested by Paul Downes.

2003-10-10   Erik Bunn <ebu at iki dot fi>

        * v2.1.77

        * Modified CachingProvider to notify engine of external changes
        to wikipages. Fixed tests; external modification tests should now
        work.

2003-10-06  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.1.76.

        * Implemented deleteVersion() for VersioningFileProvider.
        However, there's still a critical bug in it.

        * Added built-in properties so that certain settings can also be
        fetched internally.

        * Added "redirect" capacity: Any page can contain now a 
        [{SET redirect=http://foo.bar.com}] and automatically be
        redirected to anywhere.  This essentially duplicates the
        functionality of "jspwiki.specialPage" -setting, but in an
        user-controllable manner.

        * Added "alias" capacity: you can now put a [{SET alias=PageName}]
        on a page and it will be redirected on view to some other page.

2003-10-01  Erik Bunn  <ebu at iki dot fi>

        * Modified WikiDatabase: removed hard-coding of 'members' attr name,
        fixed _members to members.
        
        * Modified AuthorizationManager: jspwiki.authorizer property no longer
        required, uses PageAuthorizer by default.
        
        * Moved PageAuthorizer to com.ecyrd.jspwiki.auth.modules.

2003-10-01  Erik Bunn  <ebu at iki dot fi>

        * v2.1.75

        * Modified order of UserManager and ReferenceManager
        init in WikiEngine.initialize(). This was relevant to
        custom manager implementations.

        * Modified AuthorizationManager to look for property
        jspwiki.authorizer and load a WikiAuthorizer dynamically.

2003-09-29  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.1.74.

        * Bug fix: RCSFileProvider would erroneusly report fetching as
        failed in certain rare conditions.

        * ReferenceManager now keeps its lists sorted.  This has the
        effect of having backlink lists (referred-by), Unreferenced pages,
        etc.  sorted as well.  Requested by John Volkar.

        * Fixed problem with plain style URIs not being terminated at
        EOL.

2003-09-28  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.1.73.

        * RCSFileProvider and FileSystemProvider now support page
        deletion.  The top-level management interface is still missing,
        though.

2003-09-27  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.1.72.

        * Added TemplateManager.

        * Administrators now need to be authenticated (duh).

        * Fixed group formation; it is still a bit clunky but it works now.

2003-09-22  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * ant javadoc now creates usage information as well.

2003-09-18  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.1.71.

        * Oops, using container-based authentication got you in wrong
        groups. Fixed.

        * Added permission checking for attachments as well.  New
        permission called "upload".

        * Attachment image URL now uses baseURL.  Reported by Niilo Neuvo.

2003-09-14  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.1.70.

        * Added variable "requestcontext".  Requested by Francois Parlant.

        * Slight changes to auth code; authentication via cookie no longer
        considered trustworthy =). 

        * Fixed some failing auth tests.

        * v2.1.69.

        * Hopefully finally fixed problems with RefMgr and english
        plurals. 

2003-09-09  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.1.68.

        * Added the print stylesheet from Philip van Bogaert to the
        default template.

2003-09-07  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.1.67.

        * Fixed also a couple of ReferenceManager bugs relating to plural
        page names.  However, a couple of small problems still remain.

        * BasicAttachmentProvider no longer fails if there are extraneous
        directories in the attachment repository.  Reported by someone
        whom I can't recall...

        * Fixed a bunch of failing tests to conform with the actual code
        base.

        * v2.1.66.

        * WeblogPlugin now displays all entries, if parameter "days" is
        set to "all".

2003-09-04  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.1.65.

        * WeblogPlugin now beautifies the entry author name.

2003-09-02  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.1.64.

        * Added two new variables: $attachmentProvider and
        $attachmentProviderDescription to match the pageprovider ones.
        
        * Fixed problem with AclImpl returning late - if we use implies()
        we must return at the first matching check.

        * Added CachingAttachmentProvider.  It is activated by setting the
        jspwiki.usePageCache property, the same as with CachingProvider.
        Suggested by Niilo Neuvo.

2003-09-01  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.1.63.

        * CachingProvider now makes an educated guess about page
        existence, which should speed things up quite a lot on systems
        that have slower providers.  Suggested by Niilo Neuvo.

2003-08-31  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.1.62.

        * rss.jsp now supports OSCache.

2003-08-29  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.1.61.

        * AttachmentServlet now checks the If-Modified-Since -header from
        the browser, and returns a 304 (HTTP_NOT_MODIFIED) if the
        attachment has not been modified.  Contributed by Aiko Mastboom.

2003-08-26  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.1.60.

        * Enabled <rtexprvalue> for all Calendar attributes.  Requested by
        FrancoisParlant.
        
2003-08-25  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.1.59.

        * Added the concept of an administrator.  Code exists, but is
        still subject to bugs in the group code.  Use
        "jspwiki.auth.administrator" to set the group/username who is the
        administrator; default is "AdminGroup".

        * v2.1.58.

        * InsertPage plugin now supports "class" parameter.

        * WeblogPlugin now also supports the "page" parameter.

2003-08-24  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.1.57.

        * Error.jsp now shows the root cause instead of the JspException.
        This should make the error messages a bit more comprehensible
        without dipping into the log files.

        * PermissionTag was amended to work with the new permission
        system. 

        * Added Delete.jsp and added preliminary support to page removal.
        Doesn't work yet, though.

        * CachingProvider now bypasses its own search method, if the
        provider implements the FastSearch interface.  This interface
        defines no methods.  Those providers where searching can be done
        very efficiently should benefit a lot from this. Requested by
        Sulka Haro.

2003-08-19  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.1.56.

        * Fixed a problem where special pages (Search.jsp,
        UserPreferences.jsp) had always "Main" as their title.
        Incidentally, the solution also allows you to localize the search
        and preferences page names.  See jspwiki.properties for more
        information.  Reported by Niilo Neuvo.

        * v2.1.55.

        * ReferenceManager is now a PageFilter.

2003-08-13  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.1.54.

        * Fixed (hopefully) problem with IE 5.22 on OSX, which would
        upload a file with 0x0D0A added to the front of the filename.
        Reported by Xiaan.
        
2003-07-17  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.1.53.

        * Added VotePlugin as an experiment.  Don't use it for anything
        real. 

2003-07-15  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.1.52
        
        * Integrated the OSCache from OpenSymphony group.  Currently the
        only one that uses it is the CachingProvider, but I'd expect to do
        more soon.

2003-07-08  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.1.51.

        * WebLogPlugin now attempts to guess the number of comments on the
        comment page, and displays them with the "Comments?" text.  It
        also appends the number of comments to the URL, so that the user's
        browser would show that the link contents have changed since last
        visit. 

2003-07-07  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.1.50.

        * InsertPageTag now only calls pageExists() OR getPage(),
        depending on the situation.  This should speed up performance a
        bit.  Reported by Mark Griffith.

        * Bug fix: Comment.jsp would transform HTML entities one time too
        many :-).

2003-07-06  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.1.49.

        * PageTypeTag now recognizes also weblog entries.

        * v2.1.48.

        * It is now possible to set the cache consistency checks for
        CachingProvider. 

        * v2.1.47.

        * It is now possible to set the "remember" -flag to Comment.jsp,
        who will then write the author info to a cookie.  The default
        template shows you how.

2003-07-05  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.1.46.

        * Added comment functionality and CommentLinkTag.

        * WeblogPlugin now generates a separate <div> around the entry
        itself.  This should make it a bit easier to create your own
        layouts.  Note that the CSS class names were also changed - check
        out the default template jspwiki.css to see the new names!  (I am
        bravely changing them because I assume nobody else is using
        JSPWiki for blogging =).  Comments now also open in a separate
        frame.

        * Split the default EditTemplate into two parts: EditContent and
        CommentContent, since they're slightly different.  You might want
        to take a look at it, since you might want to take some ideas into
        your own template.

        * Rewrote parts of the access control system - each permission now
        has to implement implies().

        * Added CommentPermission.

        * v2.1.45.

        * Added some new search engines to Denounce.

        * Upgraded to log4j 1.2.8, even though it is about twice the size
        of 1.1.3.  This should make life easier to people who are doing
        embedding work, for example.  Transition from Category to Logger
        is happening...

2003-07-03  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * Changed default "has this page been changed" -check interval in
        CachingProvider to 30 seconds, because there were some issues in
        high-load situations when using a shorter interval.  Also removed
        some non-functional code.

2003-07-02  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.1.44.

        * Added rest of usergroup support.  Whee!

2003-06-27  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.1.43.

        * Rudimentary group support added for the three constant groups:
        All, Named and Known.  Others should work, too, but currently
        there is no proper way to add groups.

2003-06-26  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.1.42.

        * Added patch to list attachments too when asking for links using
        the listLinks() method for XML-RPC.  Patch kindly donated by
        Christopher Lenz.

2003-06-24  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.1.41.

        * Now parses hyperlinks correctly if you have enabled CamelCase.

2003-06-23  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.1.40.

        * Added Denounce plugin.

2003-06-14  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.1.39.

        * Added maxEntries parameter to the WeblogPlugin.

        * Author name is now shown with the blog entry.

        * Bug fix: we didn't set the author on edit, but used the previous
        author.  Oops =).

2003-06-10  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.1.38.

        * Added %%-commands for styles.  %%classname will use the given
        class as defined in the CSS file; %%( CSS-data ) will use the
        given CSS style.

        * v2.1.37.

        * Added "template" -parameter to LinkToTag, so you can now
        generate links directly using a template.

        * Added InsertPage plugin from Scott Hurlbert.  Thanks, Scott!

2003-06-09  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.1.36.

        * Added parameter "entrytext" to WeblogEntryPlugin.

        * Added "NewBlogEntry.jsp", since on a multi-user weblog you would
        very easily get conflicts with people editing the same page.
        Also, if you had an old version in the cache, clicking on "New
        entry" would cause the entry to go to an old date.

2003-06-07  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.1.35.

        * If CamelCase links have been set on, then straight URLs are now
        linked, too.  This makes JSPWiki behaviour similar to all other
        WikiEngines that support traditional linking.

2003-06-05  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.1.34.

        * It is now possible to define the location of the
        jspwiki.properties file through a servlet init parameter.  See
        samplepages.zip and the page "MultipleWikis".

2003-06-04  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.1.33.

        * The property file was not closed after it was opened.  This
        tended to cause some problems with WebLogic.  Reported by Mark
        Griffith. 

2003-06-03  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.1.32.

        * Moved around some tests in their proper places.

        * Changed the build system somewhat: There is now a
        "build.properties" -file which allows you to customize the
        compilation somewhat.  This should help those that are developing
        on Windows-based systems, since paths can now be set up correctly
        automatically.  As an example, I've included a
        build.properties.win for Windows-machines, and build.properties
        for non-Windows machines.  Suggested by originally by someone
        whose name I can't recall, and I seem to have lost the mail :-/.

        * v2.1.31.

        * Added "exists" -attribute back to UserCheckTag, since it seems
        pointless to break down perfectly good templates.  However, it's
        use is strongly deprecated, and it is converted on-the-fly to an
        equivalent "status" -attribute.

        * Moved all default template CSS definitions to jspwiki.css, as
        per the example in the mrg template.  However, the
        browser-specific files have been kept as well. Duh.  In retrospect
        it is obvious that you can have more than one stylesheet file defined
        per page. :-)

2003-06-01  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.1.30.

        * CalendarTag enhanced: You can now use monthurlformat parameter
        to determine where the month-text should go to.  Use "%d" within
        this instance to get the month length.

        * CalendarTag enhanced: You can now use "%p" to signify the
        current page name in any of the parameters.

        * v2.1.29.

        * Added to WikiAuthenticator interface: It is now theoretically
        possible to change passwords as well (though there is no
        support within JSP for that).

        * UserManager now handles logins/logouts properly.  We now have
        fully functional login/logout functionality!

        * Creating a WikiContext with WikiEngine.createContext() now
        actually throws an exception if it sees that WikiEngine has not
        been configured correctly.  This hopefully removes a bunch of
        NullPointerExceptions and other nasties that occurred when the
        jspwiki.properties file was not correct.
        
        Unfortunately the error messages are still not very informative,
        but as long as we create the WikiEngine in the jspInit(), then we
        have to do it like this...  Any exceptions thrown there get
        ignored by Tomcat.

        * Deprecated away a bunch of methods from WikiEngine, most notably
        saveText( String, String ).  Also, findWikiClass() is gone (moved
        to ClassUtil).

        * VariableManager now recognizes two new variables (or constants,
        depends on your point of view): "username" and "loginstatus".

        * Added new PriorityList class.

        * Added new "util" -package.

        * Added ClassUtil class so that it is easier to handle class
        information.  Among other things, this replaces
        WikiEngine.findWikiClass().

        * UserCheckTag modified: It now has a parameter "status" instead
        of the old "exists", and it has been considerably enhanced in
        use.  The old "exists=true" is now replaced with "status=known",
        and "exists=false" is "status=unknown".  There are also other
        options available.

        * v2.1.28.

        * Mental note: when you say "cvs commit", see which directory
        you're in.

        * There is now a general saving/loading filtering
        functionality. See the new "filters" package.  It does not still
        have all of the usability that would be nice, but it should be
        ready for testing.

2003-05-31  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.1.27.

        * UserManager was slightly confused about what kind of
        authentication is preferable over what.  Fixed now so that if you
        have done container-based authentication, you will actually be
        logged in with proper username =).

        * v2.1.26.

        * Added Release.getVersionString() for those who are annoyed at
        having to recompile their JSP pages each time they install a new
        version (like me).

        * Made the default templates a bit more XHTML compliant.  There
        are still some oddities left, though.

        * "{{{ }}}" now emit <span style="..."> when inlined.  This allows
        you to write inlined code that does not do any translation.
        Thanks to Lars Schmidt-Thieme.

        * Paragraph generation (the infamous <p> -tag) is now XHTML
        compatible.

        * A bunch of XHTML changes, thanks to an extremely high-quality
        patch from Lars Schmidt-Thieme.  A lot of the plugins and tags now
        work better.

        * v2.1.25.

        * CachingProvider now caches saved page modification dates
        correctly. 

        * CachingProvider can now also detect deleted pages, and signals
        PageManager correctly in this case.

2003-05-29  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.1.24.

        * CheckLockTag would sometimes throw a NullPointerException.
        Reported by Romeo Disca. 

2003-05-26  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.1.23.

        * out.png is now correctly transparent, thanks to Paul Downes.

        * CachingProvider can now detect if the page has been modified
        externally.

        * rss.jsp is now a part of the main distribution.  It is however,
        very weblog-specific right now, and shares a bit too much code
        with the RSSGenerator.

        * RSS generator now outputs the diffs as well, so you can see what
        actually changed and what did not.

2003-05-22  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.1.22.

        * RSS generator now also displays whether the file that was
        changed was a wikipage or an attachment.

        * Fixed attachment URL generation: RSSGenerator would generate
        faulty URLs, and practically no routine did URL encoding.  Oops.
        Reported by Stefan Riss. 

2003-05-20  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.1.21.

        * Preview.jsp didn't compile, oops.

        * FileSystemProvider now stores author information as well.  This
        addresses the most-often heard FAQ: "Why is the author information
        not shown?".  To do this and not interfere with RCSFileProvider
        and VersioningFileProvider, I created a new class,
        AbstractFileProvider which stores no metadata, but all file-based
        providers now extend from it.

2003-05-19  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.1.20.

        * As an example, it is now possible to determine the template on a
        per-page basis by setting something like this on the page:
        
        [{SET jspwiki.templateDir=myTemplate}]
        
        However, at the moment the existence of the template directory is
        not checked, so it is possible to refer to templates that do not
        exist and get an empty page in return.

        Also CamelCase expansion can now be turned off on a page-by-page
        basis.
        
        * TranslatorReader now understands the SET directive.  It is thus
        now possible to set arbitrary attributes for pages which get
        stored in the WikiPage.

2003-05-18  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.1.19.

        * PageManager is now better protected against null page names.

        * Mass commit of authorization code.

2003-05-13  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.1.18.

        * WeblogPlugin should be now quite a lot faster determining which
        pages are blog entries.  I had to do this because my own weblog
        was getting unbearably slow.

        * v2.1.17.

        * Oops, wikiContext was accidentally changed to pageContext in
        Edit.jsp.  Reported by Erik Bunn. 

2003-05-11  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.1.16.

        * Added TemplateDir tag, so that templates can now figure out
        which template they belong to. 

2003-05-09  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.1.15.

        * Reduced common code in main JSP files by combining the most
        commonly used methods into WikiEngine.createContext().

2003-05-08  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.1.14.

        * Added the search_highlight script as suggested by Santiago
        Gala.  After a search when you go to a page, you will see all of
        the search terms highlighted, as defined in the CSS file.  If you
        have your own template, add the following to the ViewTemplate.jsp
        file: 
        
        <script src="templates/default/search_highlight.js"
        type="text/javascript"></script>
        
        And do not forget to copy the search_highlight.js file to your
        template.

2003-05-07  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.1.13.

        * RCSFileProvider no longer relies on garbage collection to close
        Process streams.  This may have some effect on the "leaking file
        handles" problem on Linux.  Testing...

2003-04-16  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.1.12.

        * Now JSP pages are protected against empty page names.

2003-04-13  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.1.11.

        * Checked a huge amount of authorization code, mostly reworked
        from JSPWIKI_AUTH_BRANCH.  Still missing: authenticators (that is,
        things interface with UserManager and manage passwords) and some
        fine-grainedness in handling things.

        * Error.jsp is now a lot more verbose about the kind of errors it
        finds. 

        * v2.1.10.

        * A mass import of the more stable parts of the new authentication
        system.  Most notably, there are now new packages for access
        control lists (com.ecyrd.jspwiki.acl) and permissions.  However,
        note that mostly everything does NOT work now - even tests don't
        compile because of some missing files.

2003-04-12  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * A few fixes to default template to be more XHTML compliant.

        * v2.1.9.

        * CachingProvider now also provides information on how many pages
        are currently in cache and how big they are.

        * TranslatorReader now outputs all tags in lowercase to be
        XHTML-compliant. 

2003-04-11  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.1.8.

        * CheckLockTag was a bit inconsistent: if the page was locked by
        the current user, it would of course always be "locked".  This
        means that the value of "unlocked" was essentially useless for
        Edit pages.  I added a new value for "mode": "owned".  Reported by
        Rajesh Raheja.

2003-04-10  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.1.7.

        * Added preliminary support for the MetaWeblog API.  The endpoint
        is the same endpoint that is used by the normal wiki RPC API.
        Currently only newPost and newMediaObject are supported.

2003-04-09  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * Added "style", "border", and "class" -attributes to the Image
        plugin.  Suggested by Foster Schucker.

        * v2.1.6.

2003-04-08  Erik Bunn  <Erik.Bunn@no_spam.ecyrd.com>

        * Modified FileSystemProvider, CachingProvider; added 
        SearchMatcher. CachingProvider now uses cached pages when
        searching. Both the cache and SearchMatcher can still be 
        improved a lot...

2003-04-07  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.1.5.

        * All plugins should now generate valid XHTML.

2003-04-06  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.1.4.

        * Added Image plugin, which allows one to have more fine layout
        control over images.  Suggested by many people, but the code base
        is all new.

        * RecentChangesPlugin now understands about baseURL (oops).  It is
        also now XHTML-compliant.

2003-04-04  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.1.3.

        * WebLogPlugin did not check if comments were disabled.

        * Added the CalendarTag patch for changing months from RoyW.

2003-04-03  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * Demoted log messages in IncludeTag to WARN level from FATAL.  It
        seems that including can fail on so many occasions that it does
        not make sens to call them as FATAL.  Reported by John Volkar.

        * Added new jspwiki.org home page information to different files.

2003-03-29  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * If the user name was received from container, JSPWiki would get
        confused if it contained spaces.  Reported by Foster Schucker.

        * v2.1.2.

        * The default template is now a bit more XHTML-compliant, but
        there is still a long way to go.  Slowly, slowly...

        * Changed the default template to have a "Go to top" -link at the
        bottom to ease navigation.  Suggested by Paul Downes.

2003-03-28  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * 2.1.1.

        * Added ListLocksPlugin to the default SystemInfo page.

        * Added "Save" button to Preview.  Thanks to Mark Anderson for the
        original code.

2003-03-27  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * Removed a bunch of extra imports to clean up the code a bit.
        Thanks to John Volkar for pointing these out.

2003-03-25  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * Branched off 2.1.0 development series.
        
2003-03-23  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * 2.0.36.  Stable 2.0!  YAY!

        * All of the tags are now documented.

        * Changed slightly DifferenceEngine code to output cleaner html.

        * BreadcrumbsTag did not work correctly with a load-balanced
        Resin.  Should work now. 

2003-03-11  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * Added some more documentation on tags.

        * default template changed slightly: cssinclude.js no longer uses
        the <noscript>-tag, and all of the tags were made lower-case for
        future XHTML compliancy.

2003-03-09  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * Started to write in the documentation of the different tags.

2003-03-08  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.0.35.

        * Bug fix: Preview would lose edits with Internet Explorer, IF you
        had authentication enabled.  Reported by John Volkar.  Fix by
        Torsten Hildebrandt.

        * Bug fix: XML-RPC code no longer lists attachments when asked for
        recent changes.  This would cause problems with multiple XML-RPC
        clients, since they would not know what was a page and what was
        not.  Reported by Steven Noels.

2003-03-02  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.0.34.

        * Just a tiny little code cleanup, binary should not have
        changed.  (There were a few places where magic numbers were used
        instead of WikiPageProvider.LATEST_VERSION).

        * JSPWiki license is now the GNU Lesser General Public License, so
        that people who want to embed JSPWiki as a part of their products,
        can do so.  It also makes it quite a lot easier to use third-party
        libraries. 

2003-03-01  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.0.33.

        * FileSystemProvider should now be a bit more verbose in case the
        page directory is not found.  This should help those who like to
        end their property entries with spaces :-).

        * BreadcrumbsTag had an off-by-one error: if you set the trail to
        be 10 in size, it would show only 9.  Patch contributed by Ken
        Liu.

2003-02-22  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.0.32.

        * AttachmentServlet now should work with UTF-8 filenames.
        Suggested by Torsten Hildebrandt.

        * UploadTemplate.jsp now always uses UTF-8 when submitting the
        form.  Also did slight changes to the outlook.

2003-02-21  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * Removed PageHeader.jsp from the default template since it was
        not used anywhere.  Reported by George Fairbanks.

        * Added new out.png from George Fairbanks, adding transparency.

        * BreadcrumbsTag now extends the correct class, so that it should
        no longer output an extra "</a>".  Reported by Santiago Gala.

2003-02-20  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.0.31.

        * Also added a bunch of tests.

        * '/' in a link is now recognized to form an attachment link.

        * Worked on some attachment-referencemanager related bugs.  Now
        attachments are recognized and reference better in some cases, but
        problems still remain:  If you create a link to an attachment
        first, but create the attachment later, the reference lists may
        not notice this.  This is a subtle problem.

2003-02-19  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.0.30.

        * Foster Schucker sent some patches so that CalendarTag looks
        better on Netscape 4.  Thanks!

2003-02-17  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.0.29.

        * Fixed a couple of small problems: WikiContext.COMMENT was
        missing, and a small change in EditTemplate.jsp allows Konqueror
        3.1 to work correctly with sites using UTF-8.

2003-02-14  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.0.28.

        * Incorporated "unterminated plugin causes OutOfMemoryException"
        fix from Torsten Hildebrandt.

        * Added new attachment icons from Paul Downes.  Thanks heaps!

        * Fixed split imports in Edit.jsp for better compatibility.
        Reported by Wouter.

        * Attachments version history is now sorted in correct order.
        Reported by Wouter. 

2003-02-12  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * Checked in a bunch of tests from Torsten Hildebrandt.  Most of
        them fail, which is not a good thing, but I haven't checked them
        thoroughly yet.

2003-02-08  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.0.27.

        * ListLocksPlugin now properly closes table.  Reported by Michael
        Gentry. 

2003-02-06  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * Small addition: The preferences cookie now expires in 1001 days
        instead of 90 days.  It turned out to be too fast.

2003-02-05  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.0.26.

        * Bug fix: BasicAttachmentProvider still didn't migrate correctly
        from earlier versions.  Sigh...  Patch provided by Torsten
        Hildebrandt.

        * Added Jason Pell's MultipartRequestLibrary v1.30b3, which should
        fix plenty of problems related with uploads.

2003-02-01  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.0.25.

        * BasicAttachmentProvider should now properly migrate from earlier
        versions of JSPWiki 2.0 beta.

        * Bug fix: downloading attachments that have non-ascii names
        should work now.  Uploading does not still work, because of bugs
        in httpmultipartrequest library.  Reported by Torsten
        Hildebrandt.  In addition UploadTemplate.jsp now explicitly
        specifies ISO-8859-1 encoding, which seems to work with Mozilla.

        * Bug fix: '}' inside plugins no longer stops parsing.  Reported
        by William Morgan, fix courtesy of Torsten Hildebrandt.
        
        * v2.0.24.

        * CalendarTag is now smarter and can adapt itself to the date.

        * Bug fix: WeblogPlugin would prefer the local parameter instead
        of the one given in HTTP parameters to decide how many days should
        be shown.

        * Bug fix: WeblogPlugin would sort entries wrong on month
        threshold.  Reported by Ebu.

2003-01-31  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.0.23.
        
        * WikiSecurityException is now in correct package.  Sorry, no
        other updates at this time.

2003-01-21  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.0.22.

        * Added ListLocksPlugin for admins.

        * v2.0.21.

        * Added a JDK1.4 -specific version of the input encoding detector
        to FileUtil.  This also means that JSPWiki can no longer be
        compiled using a 1.3 compiler anymore.  It will run on 1.3 systems
        however, unless something is amiss.

2003-01-19  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.0.20.
	
        * Fixed a couple of Windows tests failing.  This unfortunately
	means that all attachments are now renamed in a bit of a different
	way (a -dir) is attached to the attachment name.  You will need to
	change your old attachment names (mv attachment/
	attachment-dir/).  However, there is a built-in migration code,
	but you still should to the change.

        * v2.0.19.

        * Broke WikiAttachmentProvider as well with deletePage() and
        deleteVersion().

        * Added Breadcrumbs tag from Ken Liu.  The default template now
        also includes it.

        * v2.0.18.

        * Broke WikiPageProvider by adding deletePage() and
        deleteVersion() methods.

        * Fixed a multitude of bugs in the tests, courtesy of Torsten
        Hildebrandt.  For example, "ant guitests" should work now.

2003-01-17  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.0.17.

        * Plugin parsing is now stopped at }] instead of ].  Suggested by
        Alain Ravet and several other persons.

2003-01-14  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.0.16.

        * Changed the WikiPageProvider and WikiAttachmentProvider
        interfaces: getVersionHistory() should now always return a List
        instead of Collection.  All providers did this anyway, but for
        some strange reason I never remembered to update the return type.
        Logically a List is correct, since the result needs to be ordered.
        Sorry to everyone whose custom provider broke!

        * CachingProvider now checks the cache first when called with
        pageExists().  Suggested by Sulka Haro.

        * Removed a couple of deprecated methods from WikiEngine.

2003-01-12  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.0.15.

        * Added new variable "uptime", and WikiEngine.getStartTime().

2003-01-11  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.0.14.

        * SearchResultIteratorTag would crash if you hit "reload".  This
        was because the counter would never get reset between two
        consecutive refreshes, and Tomcat 4 pools tags.

2003-01-10  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.0.13.

        * WeblogPlugin and CalendarTag enhanced to work even better
        together: WeblogPlugin supports now the 'startDate' parameter,
        whereas CalendarTag supports an 'urlformat' parameter.

        * WikiContext now stores the incoming HTTP request as well.  This
        allows you to write plugins that can read the HTTP parameters as
        well, for example.  Please see the note in
        WikiContext.getHttpParameter(). 

2003-01-08  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * Added CalendarTag.  It's still in its very infancy, so it might
        not be very useful to others.

2003-01-05  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.0.12.

        * Diff.jsp did not use the templateDir property correctly.  Oops.
        Reported by Robert McGovern.

        * Added Expires, Last-Modified, and Cache-Control headers to
        Edit.jsp responses - this should allow certain versions of
        Internet Explorer to use Preview correctly.  Suggested by Richard
        Donkin.

        * Implemented page "locking".  When you now start to edit a page,
        the page is marked as being under editing, and the next guy will
        get a warning about that.  To facilitate this, Edit.jsp was
        changed.  Also, check out the new tags in "EditTemplate.jsp", and
        note also that the "Cancel" is now a button instead of a link.
        Suggested by Olli Lounela.

2003-01-03  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * Wrote some new documentation into sample wikipages.

        * v2.0.11.

        * All boolean type properties in jspwiki.properties recognize now
        "on" and "yes" as "true" as well.

        * It is now possible to allow raw HTML on WikiPages.  Beware, this
        is a very dangerous option, since it will allow people OTHER THAN
        THE ADMINISTRATOR to make wikis that can hurt users.  Requested
        (very loudly and many times :-) by Alain Ravet.

        * v2.0.10.

        * WeblogPlugin changed entry formats.  Beware, if you've been
        using it so far. 

        * WikiPage now implements Cloneable.  I have no idea why.

2002-12-29  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.0.9.

        * Added permalinks to WeblogPlugin.

        * IndexPlugin enhanced to have parameters "include" and "exclude",
        which can be used to include or exclude pages using standard glob
        wild card expressions (*, ?, etc).

2002-12-28  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.0.8.

        * Bug fix: VersioningFileProvider would mangle old versions of a
        page if they were in UTF-8 format.  Reported by Torsten
        Hildebrandt. 

2002-12-18  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.0.7.

        * Added new title beautifier code from Torsten Hildebrandt.  It's
        a bit different from what we used to have, but it does now less
        mistakes.  :-).

2002-12-16  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.0.6 - The I Should Really Be Sleeping But Let's See If Killer
        Can Keep Up With This Pace With His Debian Packages -release.

        * Inspiration continues.  Now ReferenceManager also understands
        about attachments, so they can now be cross-referenced, be on
        unused or undefined pages, etc.

2002-12-15  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.0.5.

        * RecentChanges now displays also changed attachments.  This added
        some new APIs in WikiAttachmentProvider and AttachmentManager.

        * v2.0.4.

        * Bug fix: Restoring previous versions from archive did not work.

        * Bug fix: Attempting to upload a non-existing file would cause a
        crash.  Reported by Alain Ravet and Paul Downes.

2002-12-14  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.0.3.

        * Bug fix: previewing a new page with a footnote would cause a
        crash. 

        * Added WikiAttachments page to the samplepage distro.
        
        * Redirected all references to Wiki.jsp or Edit.jsp through
        WikiEngine for future configurability.  Requested by Bart
        Selders.

        * Running tests now puts test pages into /tmp/testrepository.  Too
        many false alerts due to wrong files in /tmp/...

        * v2.0.2.

        * Bug fix: JSPWiki no longer dies horribly with OutOfMemoryError
        if preformatted code blocks ({{{ }}}) are not closed properly.
        We simply forgot to check for EOF :-).  Reported by Erik Bunn.

        * Bug fix: CamelCase is no longer recognized inside {{{ }}}
        blocks. Reported by Torsten Hildebrandt.

2002-12-11  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.0.1.

        * Attachments are now sent back using Content-Disposition: inline
        instead of Content-Disposition: attachment.  This means that they
        should now be opened automatically by browsers.  Suggested by
        Torsten Hildebrandt.

        * Interwiki references that lead out of the wiki are now also
        tagged with the outlink image.  Reported by Alain Ravet.

        * Outlink images are now on by default.

2002-12-09  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v2.0.0-alpha.

        * Fixed WikiEngine.beautifyTitle() to work better with acronyms.

        * Moved GoRankAggregator and GoDiagram plugins into their own,
        separate project. 

2002-12-09  Erik Bunn  <Erik.Bunn@spamicide.basen.net>

        * v1.9.50.
        
        * Fixed null reference bug in AttachmentManager when no
        manager specified in jspwiki.properties.
        
        * Added Error.jsp, which displays the message of an 
        exception using DisplayMessage.jsp (in templates).
        Added Error.jsp as error page of all top level jsp's.

2002-12-08  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v1.9.49.

        * All referral plugins (UnusedPages,UndefinedPages, and
        ReferringPagesPlugin) now support a parameter "separator", which
        basically contains the wiki markup that should be used to separate
        the entires.  Suggested by Jeremy Cowgar.

2002-12-08  Erik Bunn  <Erik.Bunn@spamicide.basen.net>

        * Modified exception classes to inherit WikiException
        (with the exception of InternalWikiException =).
        
        * Added SecurityException in preparation for auth merge.

2002-12-07  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v1.9.48.

        * Tiny little tweaks to attachments all around.

        * PageInfo is now attachment-aware, so you can view older
        versions, etc. using the standard PageInfo link.

        * If an attachment is an image, then it is automatically inlined.

        * It is now possible to link to attachments as if they were normal
        Wiki pages.  From the page itself, just use [attachment name],
        from other pages, use [ParentPage/attachment name].

        * v1.9.47.

        * CamelCase links now finally work (or at least all tests run).
        Thanks to Joonas Iivonen for inspiration, and listening my
        incoherent explanation about the problem. :-)

        * List items (*, #) are now closed properly as per XHTML spec.
        We still have paragraphs to go, but otherwise we're nearly XHTML
        compliant. 

2002-12-06  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v1.9.46.

        * Major import of all attachments code.  This version is actually
        able to upload/download attachments, but I wouldn't use this for
        any real production.  The structure may change and you may face a
        difficult process to migrate your old attachments to a new
        system.  

        * Added attachment_big.png, thanks to Tero Tiittanen.

        * v1.9.45.

        * Many changes to GoRankAggregator, which you probably won't care
        about. 

        * Added fix for JBoss and pure WAR-file deployment from Xyvind
        Lxkling.

2002-12-05  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v1.9.44.

        * CamelCase detection changed yet again.  However, this will still
        fail when you write wikimarkup right next to it: For example
        __CamelCase__ will result into something totally strange, much
        like *CamelCase to start a line.  Using whitespace should work,
        though...  __ CamelCase __ should be quite okay.

2002-12-04  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v1.9.43.

        * Bug fix: TranslatorReader did not properly closed down the <img>
        -tags, as per XHTML specification.  Let's see how many old
        browsers break this time... :-)

        * Bug fix: Preformatted text was not properly closed down if the
        user forgot all about it.  Reported by Bob Schulze.

        * Bug fix: Preformatted text ({{{) no longer allows you to input
        HTML.  Reported by Bob Schulze.

        * New option: jspwiki.translatorReader.useOutlinkImage allows you
        to mark all outgoing links with a small picture.  Thanks to Teemu
        HirsimBB??dki for providing with the idea and the image.  Look for
        images/out.png, if you want to change it.

2002-12-01  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * GoRankAggregator now also supports 'egfurl' parameter, which
        fetches country-specific ranking data from persons.  Quite
        kludgish at the moment.

        * Hopefully fixed GoRankAggregator to allow multiple persons of
        the same rank.

2002-11-29  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * Added GoRankAggregator.  Most of you don't probably care.  (I
        probably should make these a separate distribution or something.)
        I won't even bother to bump the version number for this one.

2002-11-26  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v1.9.42.

        * Fixed a near-fatal bug in UserPreferences.jsp - we wrote the
        page contents into the stream and then did a redirect.  Oops.

        * Radical change warning: If you are running a Wiki with that has
        authentication turned on, note that from now on the username set
        in UserPreferences is the one that gets put in page change
        history, not the name the user used to authenticate himself.  This
        was done so that it would be easier to maintain a wiki that has
        only a single username/password combination and still track the
        users.   I believe this is more in line with WikiNature.
        
        You can still see the name the user used to authenticate in the
        log file that JSPWiki generates.

        * v1.9.41.

        * Fixed EditTemplate.jsp to show the link to EditPageHelp in a
        manner consistent with other edit links.

        * EditLinkTag would crash if the page it was referring to did not
        exist.  Reported by Torsten Hildebrand.

        * Fixed camelcase patch from Jeff Phillips - thanks Jeff!

2002-11-24  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v1.9.40.

        * Instead of doing ServletContext.getRealPath("/") we now use the
        ServletContext itself as an unique key when creating a
        WikiEngine.  This should resolve problems when running JSPWiki
        straight from a WAR file.  Reported by Oyvind Loekling.

        * Added plenty of code for attachments.  Storing and retrieving
        works, as well as listing.  However, uploading still has some
        problems. 

2002-11-20  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v1.9.39.

        * DiffLink now fails gracefully if page does not exist.  Reported
        by Jeremy C.
        
        * Fixed ~ -escaping of CamelCase links.

        * Added patch from Kabe Robichaux to fix a problem with older RCS
        programs that do not support the -z flag.

        * v1.9.38.

        * The "&" translation now occurs _before_ other entities, which no
        longer causes all quotes to be transformed back into "&quot;"
        while you're editing a page.

        * Integrated camelcase patch from Jeff Phillips.  It is now nearly
        working - a couple more tests should go through first.

2002-11-11  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v1.9.37.

        * <BR/> is now <BR />, in order not to confuse some older
        browsers.

2002-11-09  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v1.9.36.

        * GoDiagram now uses PNG images.  It also now honors the baseURL
        setting.

        * Tables now close the <TD> tag correctly with </TD>, thanks to
        the new TranslatorReader architecture.  Reported by Andreas
        Rozek.

        * "&" is now translated into "&amp;" when editing, so that you can
        actually input HTML entities and they stay like that when going
        into storage.  Reported by Erik Bunn and others.

        * Tilde (~) now escapes bars in tables.

        * v1.9.35.

        * GoDiagram is now a bit more tolerant towards the kind of markup
        it accepts.

        * Bug fix: godiagram was off-by-one towards the side of the
        board.  Reported by Paavo Pietarila.

2002-11-08  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * We now output <BR/> instead of <BR>.  Slowly working towards
        full XHTML :-).

        * Several small bugfixes: ([[ not working, single {'s getting
        destroyed, etc.)

        * Removed clear=all from HR, added \\\ to do a <br clear=all>.  HR
        looked quite odd.

        * ":" after the first no longer breaks description lists.        

        * v1.9.34.

        * ---- aka HR tag now adds 'clear=all' attribute to accommodate
        aligned images, such as the ones produced by GoDiagram.

        * GoDiagram now works.

2002-11-07  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v1.9.33.

        * New plugin: GoDiagram.

        * A couple of bugfixes: some EOL issues in multi-line plugins.

2002-11-07  Erik Bunn  <Erik.Bunn@nospam.memecry.net>

        * Added plugin execution disabling, and disabled 
        their execution during the initial reference manager scan.
        This is mainly important in wiki's with lots of complex custom
        plugins.
        
2002-11-07  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v1.9.32.

        * True multiline plugins that no longer conflict with WikiMarkup
        are now available!  Yay!

        * MAJOR breakdown!  Rewrote practically everything in
        TranslatorReader: it is now fully stream-based instead of
        line-based, which makes many things quite a lot easier.  It should
        also be quite a lot faster than before.  
        
        CamelCase links are TOTALLY broken in this revision, since the
        stream-based system makes it a bit difficult to run the regexp on
        them.  We'll see how to get them back running again.
        
        Do NOT use this revision for any production work... We have many
        tests that still fail!

2002-11-06  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v1.9.31.

        * More attachment support.  Still not functional, but at least now
        you can see where we're going.

        * Fixed support for multiline plugins.

2002-11-01  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v1.9.30.

        * The INSERT is no longer required to signify plugins.  It is
        recommended, but not required.  This at the request of many people
        who are using an insane amount of plugins :-).

        * New plugin: Counter.

        * Added support to VariableManager to display Context Variables.

        * Added Wiki Context Variables.  These exist solely in the
        WikiContext class, and allow you to define transient variables on
        a pageview basis.

        * Added a patch to allow multiline plugins from ebu.
        Unfortunately, this does not work fully yet - newlines in the
        middle of arguments break stuff.

2002-10-29  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v1.9.29.

        * Added a new property: "jspwiki.frontPage".  This allows you to
        easily change the default page name from "Main" into something
        else.  This is important if you're doing localized installations,
        for example.

2002-10-23  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v1.9.28.

        * Just incorporated a bit more attachment stuff.  Also fixed the
        problem of AttachmentManager complaining at startup, if no
        attachmentProvider was defined.

2002-09-30  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v1.9.27.

        * CamelCase links can now be stopped from occurring by prepending
        it with '~'.  ~CamelCase results in "CamelCase", not a link to a
        page called CamelCase.  '~' will from now on be a generic negator
        tool for all sorts of purposes.

2002-09-29  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v1.9.26.

        * Added the ability to restore older versions of pages relatively
        trivially.  This is done by going viewing the old version via
        PageInfo, then clicking on "Restore this version".  You'll be
        presented with a edit view to the page.
        
        Note: this facility has changed the default template, too, so if
        you have made your own templates, you probably want to modify them
        too to allow this facility.

2002-09-17  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v1.9.25.

        * Viewing of old versions would not show the "this is version XX"
        -banner because of an unclosed JSP comment.  Oops.

        * PageInfo now shows "no versions" if there is no version history
        available instead of an empty string.

        * HistoryIteratorTag would fail if there was no version history
        (like when you were moving from FileSystemProvider to
        RCSFileProvider).  Now fixed.

        * CachingProvider now checks if the requested version is cached,
        and not only when the version is marked as latest.  Combined with
        the new template system, this bug caused CachingProvider to
        effectively ignore its own cache.

        * ---- aka HR is now <HR /> as per XHTML spec.

2002-09-15  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v1.9.24.

        * Exceptions from plugins is now clearly separated from WikiEngine
        internals.  Suggested by Niilo Neuvo.

2002-09-08  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * JSPWiki repository should now have anonymous CVS access.
        Everything should now work.

        * v1.9.23.

        * Bug fix: no longer crashes if baseURL is not defined.  Reported
        by Alain Ravet.

        * Fixed a problem when trying to escape '[' character using '[['.

2002-09-07  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v1.9.22.

        * SearchResult uses now "WikiPage" instead of a String to the page
        name.  Heed this, if you have your own implementation of a
        provider.

        * VariableTag now has a "default" attribute which gets invoked if
        the variable in question does not exist.

        * The top right search box didn't work - now it does.

        * You can now limit the number of hits a search returns - see
        FindContent.jsp and the maxItems parameter of SearchResultIterator
        tag.

        * Search.jsp also tagified.

        * UserPreferences now directs you back to the prefs page instead
        of Wiki.jsp.

        * UserPreferences now check the validity of the given username,
        and will turn it into a valid WikiName.

        * UserPreferences.jsp is now also tagified (to some extent
        anyway) and should now work.

2002-09-03  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v1.9.21

        * Bug fix: Two plugins on the same line would not always work as
        expected.  I had to rewrite the entire
        TranslatorReader.insertHyperLinks() method... As a nice side
        effect, it's now like five times faster than before. :-)
        
        * Added a simple WeblogPlugin and an accompanying
        WeblogEntryPlugin.

        * It is now possible to add jspwiki.properties properties as
        WikiVariables. 

        * Documented WikiVariables.

2002-09-02  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * Added new tag "Plugin", which allows you to run any JSPWiki
        plugin from a JSP page directly.

        * Fixed the last failing RCSFileProvider test case.

2002-09-01  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v1.9.20.

        * Added a new variable system, including an all-new
        VariableManager.  For example, "applicationname" tag was removed
        as obsolete.  You may add variables using a [{$foobar}] -notation
        on wiki pages, and with the wiki:Variable tag on the JSP pages.
        
        * PageModified.jsp and Preview.jsp are now included in the new
        template system.
        
        * SystemInfo.jsp is now removed.  A page called "SystemInfo" is
        taking its place.

        * Creating new pages should work now again.
        
        * Edit.jsp should no longer crash.  It's also been delegated
        properly into EditTemplate.jsp.

        * Added jspwiki.templateDir property.

        * Fixed PageInfo display - it now actually generates correct
        links. 

        * Fixed DiffLinkTag to actually generate correct links.

2002-08-29  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v1.9.19.

        * Plenty of changes to the JSP pages: created 8 new tags, shuffled
        things around.  Everything is still broken, but doc/Templates.txt
        should explain what we're about to do.

2002-08-19  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v1.9.18.

        * Moved stuff around, as plural forms of page names were not
        considered to exist by many of the internal routines, confusing
        UndefinedPages for example.  Found by Leigh Dodds.

2002-08-18  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v1.9.17.

        * All of the pages should now work.

        * Added Translate tag for writing Wiki content directly from the
        page.

        * Non-existing pages would crash both Wiki.jsp and Edit.jsp.  Now
        fixed.  Reported by Alain Ravet.

        * v1.9.16.

        * ViewTemplate.jsp is now done totally in tags.

        * Diff.jsp is now done totally in tags.

        * Added new tags: CheckVersion, InsertDiff, PageExists,
        PageVersion, PageDate.

2002-08-17  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v1.9.15.

        * Added a couple of new tags.

        * Moved all CSS files and cssinclude.js into the templates/default
        directory.

        * Split Edit.jsp and PageInfo.jsp into a scriptlet page, and a
        HTML template.  Some pages still do not work yet.

2002-08-16  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v1.9.14.

        * Moved the current view templates to templates/defaults.  This
        probably broke quite a lot of stuff...

2002-08-09  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v1.9.13.

        * JSPWiki now writes a better separator to log when it starts to
        make it easier to see new log entires.  Suggested by Mikael
        Honkala.

2002-08-01  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v1.9.12.

        * Added PageInfoLink tag.

2002-07-31  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v1.9.11.

        * Even more JSP tags added, including a new "Permission" tag.

2002-07-25  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v1.9.10.
        
        * Forgot to call link mutators with CamelCase links.  This caused
        CamelCase links disappearing from things like "Referenced by"
        -list.  Reported by Alain Ravet.

        * Added ';term:def' to TextFormattingRules for definition lists.
        This incidentally also allows you to make comments into someone
        else's text, if you use an empty 'term' (;:<Comment here>).

2002-07-24  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>
        
        * v1.9.9.

        * Moved LeftMenu, LeftMenuFooter, PageHeader into templates/.

        * Added new WikiPages: PageIndex, EditPageHelp.

        * Moved Edit.jsp embedded help into a WikiPage called
        "EditPageHelp".

        * Bug fix: In rare occasions VersioningFileProvider would not
        return correct page information.

        * More JSP tags implemented.

        * Added new plugin "IndexPlugin", by Alain Ravet.

2002-07-23  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v1.9.8. (The afternoon version.)

        * Changed the default Edit.jsp background to something else, since
        so many people are running with the default.  I told you it was
        ugly - I am not sure the new version is any better :-).

        * Moved ViewTemplate.jsp into templates/

        * Added AuthorTag.

        * v1.9.7.

        * Links to existing pages inside image links now generate an
        automatic link to that page.  Suggested by Alain Ravet.

2002-07-22  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v1.9.6.

        * Started the (painful) move to JSP tags.  Sigh.  I couldn't
        really figure out a better way - unfortunately we now have to
        stand with the performance penalty that JSP tags give us.  This
        includes new WikiTagBase class, which contains some helpers.

        * Split Wiki.jsp into Wiki.jsp and ViewTemplate.jsp.  All HTML
        code should go to the latter one.

        * Incorporated fix from 1.8.2: UserProfiles might be broken on
        some containers.  Reported by Kalle Kivimaa.

        * Incorporated fix from 1.8.2: new page diffs are now shown
        properly.  Reported by Niilo Neuvo.

2002-07-11  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v1.9.5.

        * Fixed problem with RSS generating illegal XML in certain cases
        (& and < were not translated to entities properly).

        * Fixed problem with plugin output getting translated by
        reordering the translator routines.  This may break many things,
        so please be careful.  Reported by Niilo Neuvo.

2002-07-07  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v1.9.4.

        * Fixed problem with VersioningFileProvider failing if the
        corresponding history file was not located.  This might have been
        an issue while upgrading from FileSystemProvider to
        VersioningFileProvider.

        * Moved some heavier stuff from tests to package "stresstests" to
        make running unit tests faster. 

2002-07-04  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v1.9.3

        * Fixed a serious problem with CamelCase links screwing up if you
        had more than two links on the same line.

2002-07-01  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v1.9.2

        * JSPWiki now supports traditional, CamelCase (or InterCapping)
        WikiLinks without square brackets.  However, this feature is
        turned off by default, so you'll have to edit the correct property
        in the jspwiki.properties file.

2002-06-30  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v1.9.1

        * Changed WikiEngine initialization so that it would better
        integrate with servlets and/or standalone systems.  However, this
        does not yet work as-expected, if you're using it, you'll see all
        sorts of annoying NullPointerExceptions if things go wrong.

        * Moved some of the functionality from WikiEngine into a new
        PageManager class.

        * Integrated some initial parts of the attachment package from
        ebu.  Does not work yet, though.

        * Did some code cleanup: We now have a proper WikiException (with
        our own exceptions extending from it).  There is now also a new
        WikiProvider interface, which WikiPageProvider and
        AttachmentProvider extend from.

        * You should no longer set CachingProvider directly, but to use
        jspwiki.usePageCache instead.  I did this change since in many bug
        reports it turned out that practically nobody was using the page
        cache - presumably because nobody knew about it :-).

2002-06-25  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * Branched off 1.9.x, which is to be 2.0.  This means that it's
        quite likely that anything from CVS is no longer functioning =).

        * You can now specify the used page provider without the package
        name in the jspwiki.properties file.

        * Major change: All WikiPageProviders now live in their own, neat
        little package.  This means that all jspwiki property files just
        broke, unfortunately.

2002-06-20  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v1.8.0.

        * A second property: jspwiki.matchEnglishPlurals automatically
        allows you to consider "Thing" and "Things" the same word.
        Unfortunately, it's not perfect (it can't tell the difference
        between SandBox and SandBoxes, for example).

        * PageHeader.jsp now splits the title into separate words, if the
        correct property is set in jspwiki.properties.  Suggested by
        Steven Owens.

        * PageModified.jsp now does word wrapping.  It's still not
        beautiful, but it works.

        * Links starting with "file:" are now recognized as external
        links, not interwiki links anymore.

        * InterWiki links no longer go through URLEncoder, because URL
        encoding removes things like slashes.  Which is annoying, and
        probably not you want.  You'll just now have to be more careful
        when writing InterWiki links.  Reported by GarethSB.

2002-06-09  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v1.7.10.

        * Added new property: jspwiki.plugin.searchPath, which allows you
        to add any package name for searching plugins.  Suggested by Niilo
        Neuvo.

        * RSS feed was fixed - we now also add the <items> list.  Changed
        also the dc:contributor field to use the rdf:Description element
        rather than the direct name, since it would not work with all RSS
        aggregators.

        * Wiki.jsp now displays the XML sign for easy subscription to the
        RSS feed.  We also display the Radio coffee mug for easy
        subscription for Radio Userland users (though this is untested,
        could any Radio folks test it, please?)

        * We now support RSS autodiscovery, as per the proposed standard
        at
        http://diveintomark.org/archives/2002/06/02.html#important_change_to_the_link_tag.

2002-06-03  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * Oops, compiling broke on some systems due to undeclared
        exceptions.

2002-06-01  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * Feature: WikiEngine now remembers the ServletContext it was
        initialized with, and you can get it via
        WikiEngine.getServletContext().  Requested by Niilo Neuvo.

2002-05-31  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * Bug fix: in case the specified page directory does not exist,
        FileSystemProvider now throws an FileNotFoundException.  Suggested
        by Niilo Neuvo.

2002-05-22  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v1.7.9.

        * Hooray - JSPWiki is no longer dependant on RCS in any form.  We
        now have an internal diff routine courtesy of BMSI.  This means
        that on Windows you can just use the VersioningFileProvider and
        you no longer need to do anything with the RCS.

2002-05-19  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * UserPreferences now allows you to clear the preferences.
        Suggested by Robert McGovern, who kindly sent me a patch for it.

2002-05-11  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v1.7.8.

        * Added CurrentTimePlugin, which allows you to tell the server
        time.  Added documentation to JSPWikiPlugins, and also a sample to
        RecentChanges.

        * PluginManager also now understands quoted parameters, i.e. if
        you enclose a parameter value in single quotes ('), you can use
        spaces and other annoying creatures inside the parameter
        values. This is very handy for the CurrentTimePlugin.

        * PluginManager no longer needs the full package name, if the
        plugin is a JSPWiki-supplied plugin.  We first try with the class
        name as given, then prepend "com.ecyrd.jspwiki.plugin" and try
        again.  This should make putting plugins on your own page a bit
        simpler.

2002-05-09  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * Added temporary fix for misbehaving, nested #'s and *'s.
        However, this is not a real fix, it just prevents the system from
        going all wonky.  Reported by Mahlen Morris.

        * Fixed problem with XML-RPC interface method listLinks()
        generating incorrect HREF attribute for nonexistant links.
        Reported by Mahlen Morris.

2002-05-07  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v1.7.7.

        * Bug fix: UTF-8 version of XML-RPC client missed
        getRecentChanges() totally.  Apparently nobody was using it =).

        * Bug fix: RPC.getRecentChanges() would accidentally use local
        time instead of UTC.  Oops.  Found by Mahlen Morris.

2002-04-19  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v1.7.6.

        * RSS feed is now richer.  I also added MANY settings to
        jspwiki.properties, all starting with "jspwiki.rss".  It should
        allow you to configure pretty much everything related to the RSS
        feed.

2002-04-18  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * RSS feed is now generated in the proper directory.  If you're not
        running WikiEngine as a servlet, then the value of the "user.dir"
        system property (the current working directory) is used.

        * v1.7.5.

        * Added an initial stab at an RSS feed.  Currently it just lists
        the changed pages, but perhaps in the near future it can do more
        complex stuff.

2002-04-14  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v1.7.4.

        * UserPreferences is now a lot more tolerant towards UTF-8
        characters.

        * Everything rebuilt to survive a null author information.

        * The text for inline images is now interpreted as a hyperlink, if
        it starts with the usual http:, ftp:, mailto:, etc.  Suggested by
        Alain Ravet.

2002-03-27  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v1.7.3.

        * Added capability to set your user name via UserPreferences
        page.  This data is stored as a cookie in your browser.

2002-03-25  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v1.7.2.

        * When a page is saved, it gets now automatically normalized.
        This normalizing means that all pages will now end with a newline
        (some browsers send a newline and some don't), and also that ALL
        line breaks are now marked with \r\n (CRLF, MS-DOS style).  Why
        with that obsolete style?  Well, HTTP standard uses CRLF all
        around, and most of the current JSPWiki installations use CRLF in
        all of the files.  Also, most UNIX tools are smart enough to
        understand CRLF, whereas not all Windows tools understand plain
        CR (Mac style) or plain LF.  Using CRLF should make installing
        this upgrade totally visible to most users.
        
        Having said that, this has not been tested very many times,
        obviously.  Use with care :-).

2002-03-22  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v1.7.1.

        * Edit.jsp had a javascript error, pointing at a wrong form.  It
        was not fatal, it did not affect the user in any real way, other
        than being an annoyance.

        * DifferenceEngine no longer crashes if it gets empty lines from
        diff. 

2002-03-21  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * Added preview capability to Edit.jsp.  Suggested by many
        people.

        * Added Preview.jsp.  This is still a very simple preview, which
        does not allow you to do a direct publish.

2002-03-16  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v1.7.0.  Finally :-).

2002-03-10  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * Added VersioningFileProvider.  The VersioningFileProvider is
        STRICTLY ALPHA.  DO NOT USE IT FOR ANY REAL PROJECT.  But please,
        do test it :-).

        * v1.6.13-cvs.

        * getRecentChanges() XML-RPC method now hopefully does UTC
        conversion correctly.

        * Search.jsp now offers to search on Google as well after giving
        you the results.

        * Added plenty of documentation about the XML-RPC interface to the
        distribution.

        * Footnotes are now unique across Wiki.  This is accomplished by
        adding the page name to the anchor name.  Suggested by Mahlen
        Morris.

2002-03-07  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * Edit.jsp text editor now knows how to adjust its own width
        according to browser window width, if your browser knows CSS.
        Thanks to Matthew Simoneau for the tip.

        * Included a new version of xmlrpc.jar: this version just has the
        default charset set to "UTF-8" instead of ISO-Latin-1.

        * RPCServlet now takes two initParams: "handler" to point at the
        class that is used to handle the XML-RPC call, and "prefix" to
        determine the XML-RPC command prefix.  We use these to start both
        the UTF-8 and strict XML-RPC handlers from web.xml.

        * Added AbstractRPCHandler and RPCHandlerUTF8 classes so that we
        can now also serve XML-RPC using UTF-8 :-).

2002-02-25  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * XML-RPC listLinks now returns a the type as a string.  Suggested
        by Mahlen Morris.

        * XML-RPC listLinks now returns an extra parameter: href.  This
        contains the actual link text from the HTML page itself.
        Suggested by Mahlen Morris.

        * InterWiki references are now also added to the link of external
        links returned by listLinks().  They are returned as entire URLs,
        resulting from resolving the reference.

2002-02-24  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v1.6.12-beta.

        * Added XML-RPC command "listLinks".

        * Did some code reorganization: New class DifferenceEngine now
        handles all diffs.  This was done in preparation for internal diff
        handling.  Also, LinkCollector is now a class of its own.

        * XML-RPC Command prefix is now "wiki" instead of "jspwiki".

2002-02-23  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * XML-RPC interface no longer relies on overloading of method
        names: All versioned versions have now "Version" appended.
        Suggested by Les Orchard.

        * XML-RPC interface now returns an error code of 1, if the
        requested page does not exist.  Suggested by Les Orchard.

        * Bug fix: Now tables should finally work with Mozilla.

        * Added Google search as an Interwiki link.

        * Diff.jsp now shows if there has been no difference.

        * Bug fix: Interwiki links were cleaned accidentally.

2002-02-21  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * Ebu rearranged web.xml to work with Tomcat 4.0, but forgot to
        mention it here.

        * Added some more default InterWiki references (TWiki,
        MeatballWiki, Wikipedia).

2002-02-15  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * PageInfo and Edit now also include PageHeader.jsp.  Suggested by
        Kim Holviala.

        * v1.6.11-beta.

        * XML-RPC interface now supports a new method:
        getRPCVersionSupported(), which returns which version of API we
        support.  This is currently 1.

        * Fixed <TT> support: it is now actually possible to write
        multiple lines using {{ and }}, much like it is with '' and __.
        Suggested by Sesh Jalagam.

        * Rewrote table support.  The TranslatorReader engine is now a lot
        smarter about things than it used to be, and now it does not
        matter how you use the table marker, as long as it's the first
        character on the line.

2002-02-14  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * Bug fix: RCSFileProvider could hang in certain operations,
        especially with long revision histories.  A JUnit test was added
        for this.

2002-02-10  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v1.6.10-cvs

        * XML-RPC interface now hopefully gives out the modification time
        in UTC, before it used the local timezone.

2002-02-09  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * Unused and undefined pages are now sorted.  Suggested by Mikael
        Honkala.

        * Using the table directive now causes an explicit "BORDER=1" to
        be output to support older browsers.  Also, reworked some of the
        stylesheets so that IE and Konqueror at least look the same now.
        Mozilla is still having problems with THEAD stylesheets.

2002-02-06  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v1.6.9-cvs

        * Added support for tables.  Sanna VBBB??dBBB??dtBBB??dinen finally managed to
        convince me to add them, by pointing out some real deficiences in
        the preformatted-text style tables =).

        * TextUtil.replaceString() would trash replacements of lengths of
        two or more.  Oops.

        * XML-RPC interface now goes around the UTF-8 problem by giving
        out Base64-encoded UTF-8 data as page data, and expects all page
        names to be strings encoded using URL encoding with UTF-8 text.
        This is regardless of the actual encoding used by the JSPWiki
        engine.

        * ReferringPagesPlugin now has extra parameter: "extras", which
        can be used to note how many pages are still left with references
        to this particular page.

        * Fixed a serious bug in CachingProvider, which caused null values
        to be added to the internal page collection.  Thanks to Mahlen
        Morris for pointing it out.

        * New class: InternalWikiException which gets thrown in case
        something really fishy and serious is going on inside Wiki.

2002-02-03  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * Fixed a slow routine in TranslatorReader, shaving off roughly
        10% of translation time.  Construction Exceptions is truly heavy.

2002-01-30  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v1.6.8-cvs

        * CachingProvider was iterating through the wrong collection.
        This might fix the NullPointerExceptions that have been coming
        around lately.

2002-01-28  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v1.6.7-cvs

        * Added new RPC API: getPageInfo( string page ), and getPageInfo(
        string page, int version ).  Also, the struct returned by
        getRecentChanges() and getPageInfo() got enhanced.

        * Wiki.jsp now shows the info on old versions properly: before it
        would show data pertaining to the current version, even if viewing
        an older version.

        * WikiPageProvider interface reworked slightly: Both getPageInfo()
        and getPageText() now need the version parameter.  Versionless
        methods are no longer supported (use LATEST_VERSION as a special
        tag for version to get the latest.)  I did this to simplify the
        API so that there would be less methods to implement.

        * RCSFileProvider can now fetch information on old pages
        correctly. 

2002-01-27  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v1.6.6-cvs.

        * Added XML-RPC call system.  See the com.ecyrd.jspwiki.xmlrpc
        package for more information.

        * Error output from RCS commands is now visible in the log.

        * Diff.jsp now has links to the actual page and the Page Info.

        * Some more refactoring inside WikiEngine: removed redundant
        code.

        * Refactored TranslatorReader to be more modular.  Provided hooks
        into the internals, so that links can now be read on-the-fly.

        * WikiEngine.getInstance() is now protected against multiple
        concurrent invocations.  This should help with startup issues.

2002-01-25  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * CachingProvider now provides some protection against
        concurrency, but it is known to fail at occasion.

        * Fixed a NullPointerException in Wiki.jsp, if the page did not
        exist.

        * Changed bottom line ordering in Wiki.jsp so that it takes less
        vertical screen space.

2002-01-20  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * SystemInfo.jsp page enhanced with new features.

        * v1.6.5-cvs

        * The WikiPageProvider interface has been enhanced with new
        methods.

        * CachingProvider reworked.  The getAllPages() now keeps its own
        cache, so that it can return the required pages without going
        through the actual provider.  This should speed things up a lot.
        A real solution is, however required.

2002-01-13  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * Added CachingProvider, inspired by Chris Brooking (though in a
        far simpler form).

        * v1.6.4-cvs.

        * RecentChanges list now displays author info.

        * All referral plugins (UnusedPages, UndefinedPages,
        ReferringPages) now recognize a "maxwidth" parameter, which can be
        used to limit the size of the written links.  This is very useful
        in the context of putting an automatic referral list to the
        LeftMenu, which might otherwise grow too wide.  The default
        LeftMenuFooter now reflects this.

        * Added the ability to modify the written link to the
        TranslatorReader by hooking in a StringTransmutator callback.

2002-01-10  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * PageModified.jsp wouldn't compile - I forgot to update the new
        location for TextUtil.replaceString().  Oops.

2002-01-09  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * SystemInfo.jsp now shows the used character encoding as well.

2002-01-07  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v1.6.3-beta.
        
        * Changed my email address.

        * Slightly changed ebu's hack to colorize diffs to work on all
        browsers, even those that are CSS-challenged.  Instead of
        DIV-tags and CSS-files, we now rely on tables.

        * Possibly fixed a problem with Win2k and RCS by rewriting the
        regular expression used to fetch the author name.  Thanks to Sesh
        Jalagam for the tip.

2002-01-06  Erik Bunn  <Erik.Bunn@nospam.memecry.net>

        * Fixed bug in referrals; when removing links to non-existant
        pages, unused pages no longer shows the removed link.

2001-12-13  Erik Bunn  <Erik.Bunn@nospam.memecry.net>

        * Initial hack to make diffs prettier implemented. Relies
        on CSS, uses lots of DIV tags, and the mac/ie css'es haven't
        been tested. 

2001-12-04  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * cssinclude.js now also sets some basic LINK elements: "start"
        refers to a page called "Main", "help" directs you to
        TextFormattingRules, and "search" takes you to Search.jsp.  The
        bad thing is that now the page names are pretty much fixed.

2001-12-03  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v1.6.2-cvs.

        * Wiki.jsp now has a direct link from the last change date to the
        latest change.

        * PageInfo.jsp can now display differences between a previous
        version and the current version.

        * Diff.jsp now handles requests for current version as well.

2001-12-01  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v1.6.1-cvs.

        * Removed last traces of JSP tags.

        * Changed plugin parameter marker to WHERE instead of WITH.

2001-11-25  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * Added new property: jspwiki.baseURL to define protection against
        URL rewriting gateways.  Requested by Kim Holviala.

        * Added the entire plugin system, making many JSP pages obsolete.
        New classes include PluginManager, taking care of the plugins.

        * Added com.ecyrd.jspwiki.plugin package with new plugin classes:
        RecentChangesPlugin, UnusedPagesPlugin, UndefinedPagesPlugin,
        ReferringPagesPlugin.

2001-11-23  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * Moved TranslatorReader.replaceString() to TextUtil, since it is
        a more logical place.

2001-11-23  Erik Bunn  <Erik.Bunn@nospam.memecry.net>

        * Added ReferenceManager and utilizing features. JSPWiki can
        now keep track of unused and undefined pages, and of pages 
        referring to a given page. Initial version, very unoptimized.
        See ReferenceManager.java and UnusedPages.jsp.

2001-11-20  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * Now replaces HTML entities correctly also in getText().  Thanks
        to Kim Holviala for pointing this one out.

        * This is release v1.6.0.

        * Quotes in HTML text is now escaped using &quot;

2001-11-18  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v1.5.8.

        * Fixed problem with UTF-8 decoding trashing a variable.  Thanks
        to Chris Brooking.

        * Searching in UTF-8 files now works.

2001-11-14  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * TranslatorReader now takes a Reader instead of BufferedReader.

        * Reworked some of the internals of WikiEngine and
        TranslatorReader, making them easier to read.

        * v1.5.7-beta.

        * Incorporated fix from Chris Brooking for the URL encoding, a
        workaround for JDK bug #4257115.

2001-11-11  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v1.5.6

        * Added NDC for all major JSP pages to make them simpler to
        debug. 

        * All pages now also export the META Content-Type information to
        support older browsers.

        * Possibly fixed a problem with readContents() throwing an
        IOException: "invalid mark" by increasing buffer size.

        * RCS commands now inherit the parent environment.  This might
        help with some Windows-related issues.

2001-11-08  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * Prevent robots from caching Edit, Diff, PageInfo and
        PageModified - not much point in caching those, really.

        * v1.5.5-beta.

        * Bug fix: Starting a new page no longer results as 'null' as the
        initial text.  Oops.

2001-11-07  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v1.5.4

        * Now FileSystemProvider and RCSFileProvider default back to
        ISO-8859-1 if the data is obviously not UTF-8.  This makes
        upgrading much easier.

        * Oops, diff forgot to use the chosen character encoding, and
        would assume ISO-8859-1.

2001-11-06  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v1.5.3

        * Bug fix: the RCSFileProvider used UTC instead of local time.
        Now fixed.  If you've changed the logcommands in
        jspwiki.properties, check the new format, or you'll be burned.

        * JSPWiki can now handle also non-ISO-8859-1 charsets.  Check
        README for more info.  Thanks to  Chris Brooking for the initial
        code.  This is a heavy-duty change - most of the JSP pages were
        affected, since they need to decode the page names in a new way.

        * v1.5.2

        * For browsers that do not support CSS, Wiki.jsp now also uses
        explicit FONT when displaying version information.

        * Empty list items could cause crashes in parsing.  Now fixed,
        thanks to Mikael Honkala for reporting this.

        * Oops, it was possible to put Javascript inside external or image
        links.  Now fixed - all quotes inside link names are URLEncoded.

2001-11-04  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>
        
        * v1.5.1
        
        * Added WikiEngine.saveText( String, String, HttpServletRequest )
        so that it can get the author information from the request.  The
        old API is still supported.

        * WikiPageProvider interface changed: putPageText() now takes a
        WikiPage as an extra argument.

        * RCSFileProvider can now save and retrieve author info as well.

        * Anchor types (i.e. hyperlinks) now have classes so that you can
        redecorate them in the CSS files.  See the CSS files for more
        info.

        * DTD caused Mozilla to slip into standards-compliant mode.  Fixed
        top-margins in jspwiki_ie.css.

        * Added document type declarations to all JSP files.

2001-11-02  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * This is R3, v1.5.0

        * Rewrote README.

        * The distribution archive now contains a separate archive for all
        sample wiki pages to help you bootstrap your own Wiki.

        * Added JSPWikiTips page to the sample wiki pages collection.

        * Removed the authentication scheme from web.xml - out-of-box
        JSPWiki now allows access to anyone.

        * Default, out-of-the-box Page Provider is now
        FileSystemProvider.  This should make building your first Wiki a
        bit simpler.

        * Added file commands to jspwiki.properties.  Also, removed
        references to my own email address - I kept getting plenty of
        automatic email from people trying to set up their own Wiki :-).

        * Removed index.html and rewrote web.xml to automatically grab all
        directory accesses to Wiki.jsp.

        * We now use pageContext.forward() to go to the PageModified.jsp
        when a concurrent modification occurs, instead of using redirect.
        Thanks to Chris Brooking for this hint.

        * Slight cosmetical changes in jspwiki_ns.css

        * Added comments around Javascript code in cssinclude.js to better
        live with old browsers.

2001-11-01  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * Bumped version to 1.4.3-cvs.

        * There is now a sample entry in jspwiki.properties demonstrating
        how to make a direct link to the page editor by using InterWiki
        linking.  [Edit:Main] redirects you to the page where you can edit
        the Main page.

        * LeftMenu.jsp now reads its contents dynamically from a Wiki page
        called "LeftMenu".  Thanks to Mikael Honkala for this idea.

2001-10-30  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * Bumped version to 1.4.2-cvs.

        * Wiki.jsp changed with respect to handling of old page versions.
        It no longer displays the "edit current version".

        * TextFormattingRules now has plenty of more explanations.

        * Added support for arbitrary letters in WikiNames.  Now it's
        possible to use any character set.

        * Added support for links within a document ("footnotes").  Use
        [#1] to create a footnote and [1] to link to it.

        * Empty links no longer generate a hyperlink.

        * FileSystemProvider and RCSFileProvider now know how to handle
        WikiNames that contain illegal characters.  At the moment they use
        simply the java.net.URLEncoder class to make the conversion.

        * Added wrap="virtual" to Edit.jsp textarea element to make it
        also wrap on NS4.

2001-10-25  Erik Bunn  <Erik.Bunn@nospam.memecry.net>

        * Added the capability to view older versions of a WikiPage. 
        The functionality is accessed from PageInfo.jsp. Wiki.jsp
        is affected, as well, and WikiEngine.java has new methods
        (but no actual new functionality).        

2001-10-21  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * This is R2 - v1.4.0.

        * Rewrote the included sample pages.

2001-10-20  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * build.xml can now generate javadocs to docs/javadoc.

        * Edit.jsp now has explains headings, too (thanks Matti).

        * Changed the versioning so that whenever you check out a CVS
        copy, you get vX.Y.Z-cvs as the version string.  This was done to
        separate the development version from the actual release version.

        * Added the list of image inline link patterns to SystemInfo.jsp.

2001-10-18  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v1.3.3 - not released.

        * You can now have multiline list items if you prepend each
        additional line with a space.

        * Added the ability to specify multiple patterns determining which
        images are inlined and which are not.  See jspwiki.properties for
        more information.

2001-10-16  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * All external links ending with .png are now inlined as images.
        This is an experiment to see if it actually works.  Don't expect
        it to last.

        * Page names can now contain _ and . as well.

        * Added some cosmetical changes to the JSP pages.

2001-10-06  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * Release v1.3.1 - first official release.

        * Clarified build system.

        * All files should now contain copyright.

        * Added plenty of javadoc commentary.

2001-10-02  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * Bold and italic information is now carried across line and
        paragraph breaks.

2001-09-30  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * Added cssinclude.js and three browser-dependent stylesheet
        files.  Also, all jsp files now include the cssinclude.js.

2001-08-25  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * Removed a debug statement, some cosmetical changes.

        * v1.3.0

        * Added jspwiki.applicationName property, and support into
        WikiEngine.

        * Added SystemInfo.jsp

        * Added interWiki functionality.  Now you can define links in
        'jspwiki.properties' where a link of the form [WikiXX:PageName]
        should point to.

2001-08-13  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v1.2.0

        * WikiEngine now behaves much better if a provider cannot be
        instantiated.

        * Added rudimentary support for version history in a multitude of
        places.

2001-08-13  Janne Jalkanen  <jalkanen@nospam.kosh.ecyrd.com>

        * Wiki.jsp displayed null date if page did not exist.

2001-07-23  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * v1.1.2

        * Search engine interface is now cleaner.

        * Separated actual Wiki page serving from the WikiEngine and hid
        it under the WikiPageProvider interface.

2001-07-20  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * Realm name is now "JSPWiki editor" instead of "Basic
        Authentication Area" or whatever stupid it was.

2001-07-19  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * Conversion of {{ is now fixed - it no longer transforms {{{ into
        {<TT> in certain cases.  Also, multiple {{{s are now handled
        gracefully.

        * v1.1.1

2001-07-18  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * Added a Search box to the header of each page.

        * HTML entities are now replaced correctly in PageModified.jsp to
        prevent arbitrary HTML tags.

        * Added support for <TT> tag with {{text}}.

2001-07-16  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * Couldn't edit new pages, oops.

2001-07-15    <Janne.Jalkanen@nospam.regex.fi>

        * Added rudimentary page locking.

2001-07-14  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * Appearance of the jsp pages is now slightly more convergent.

        * Improved search engine to accept exclusion/inclusion a la
        Google.  Scoring now works, too.

        * Added ordered lists (#).

        * Horizontal ruler is now four dashes instead of three to comply
        with the Wiki standard.

2001-07-13  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * Added jspwiki.specialPage.XXX redirection.  You can now name
        special pages that get referred to whichever JSP page you want.
        For example, you can always refer to RecentChanges.jsp in your
        Wiki code by using [RecentChanges], with the following property
        set: 
        
        jspwiki.specialPage.RecentChanges = RecentChanges.jsp

        * v1.0.5

2001-07-10  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * Removed SkipHTMLIterator because it was a bad idea.  No
        InterCapped hyperlinks are available.

        * Fixed tests so that they now actually run.  This required a new
        constructor for WikiEngine.

2001-07-09  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * TranslatorWriter.cleanLink() now removes all non-letters and
        non-numbers from the link name so that you can use all sorts of
        punctuation inside a link name.

        * Implemented RecentChanges list by writing RecentChanges.jsp.
        Wiki.jsp also redirects all requests to a page called
        'RecentChanges' to RecentChanges.jsp.

2001-07-06  Janne Jalkanen  <Janne.Jalkanen@nospam.ecyrd.com>

        * Added configuration at etc/jspwiki.properties.

        * Added this file.

