2012-01-25  Harry Metske <metskem@apache.org>

        * 2.8.5-svn-10
        
        * the decision was made to candidate 2.8 for graduation instead of 3.0, this is the first wave

        * package rename com.ecyrd.jspwiki => org.apache.wiki
        
        * moved a couple of (test) classes to other packages
        
        * add copyright templates to some test sources
        
        * remove remaining author tags 

2012-01-14  Juan Pablo Santos (juanpablo AT apache DOT org)

        * no version bump
        * corrected failing unit tests: 17 of them were locale dependant (test assertions assumed 
          english locale), so TestEngine enforces it when building mock requests
        * RCSFileProvider tests are executed only if RCS is detected in path.

2011-09-20  Florian Holeczek <florianh@apache.org>

        * no version bump
        * modified jspwiki-checkstyle.xml to be compatible with CheckStyle 5.x
        * corrected a few things CheckStyle was nagging about

2011-09-20  Harry Metske <metskem@apache.org>

        * 2.8.5-svn-9
        
        * moved security manager check for JSPWIKI-705 from SessionMonitor to WikiServletFilter, and 
           make it a log message instead of an exception.

2011-09-18  Harry Metske <metskem@apache.org>

        * 2.8.5-svn-8
        
        * fixed JSPWIKI-705 (Log a clear hint to a running security manager).

2011-08-07  Harry Metske <metskem@apache.org>

        * 2.8.5-svn-7
        
        * fixed JSPWIKI-699 (JBoss complaining about jspwiki.tld and oscache.tld).
        
2011-04-03  Harry Metske <metskem@apache.org>

        * 2.8.5-svn-6
        
        * fixed JSPWIKI-688 (Poor performance of CreoleToJSPWikiTranslator), thanks to Jelmer Kuperus.
        
2011-01-24  Harry Metske <metskem@apache.org>

        * 2.8.5-svn-5
        
        * Extended the list of lucene searchable file suffixes, we now do 
           ".txt", ".ini", ".xml", ".html", "htm", ".mm", ".htm", ".xhtml", ".java", ".c", ".cpp",
            ".php", ".asm", ".sh",  ".properties", ".kml", ".gpx", ".loc"

2010-12-12  Harry Metske <metskem@apache.org>

        * 2.8.5-svn-4
        
        * JSPWIKI-671: WikiPageRenameEvent not fired during page rename.

2010-12-05 Dirk Frederickx <brushed@apache.org>

        * v2.8.5-svn-3

        * JSPWIKI-667: Fixed Scorebar issue in Google Chrome. (workaround js error)
        
        * JSPWIKI-675: Fixed Unicode support in quickEdit (javascript regexp)

        * JSPWIKI-674: Fixed support for nested tabbed sections

2010-09-30  Harry Metske <metskem@apache.org>

        * 2.8.5-svn-2
        
        * JSPWIKI-664 SpecialPage renamed, but wikipages not changed.
        Changed all references to "FindPage" into "Search" .

2010-08-29  Harry Metske <metskem@apache.org>

        * 2.8.5-svn-1
        
        * JSPWIKI-660 Support external properties in WikiEngine (idea from John McKinney)
          You can now override individual properties in jspwiki.properties using standard
          Java System properties.
          
       * fixed the jspwiki.policy file name lookup in AuthenticationManager
        
2010-05-08  Harry Metske <metskem@apache.org>

        * 2.8.4-svn-12
        
        * JSPWIKI-392 and JSPWIKI-442 invalid asserted usernames
        
        * JSPWIKI-649 CachingProvider.deleteVersion leaves a stale m_historyCache
        
2010-04-23  Dirk Frederickx <brushed@apache.org>

        * 2.8.4-svn-11
        
        * JSPWIKI-627: Login and MyPrefs buttons not properly aligned
        in Chrome and Safari.

2010-04-08  Harry Metske <metskem@apache.org>

        * 2.8.4-svn-10
        
        * JSPWIKI-644: NPE after page externally modified, reported by Fabian Haupt.

2010-02-21  Janne Jalkanen <jalkanen@apache.org>

        * 2.8.4-svn-9

        * JSPWIKI-637: Fix for zh_CN translation, thanks to David Gao.

2010-01-31  Harry Metske <metskem@apache.org>

        * 2.8.4-svn-8
        
        * JSPWIKI-633: TextUtil.replaceEntities done multiple times, reported by Stefan Bohn.
        
2010-01-20  Janne Jalkanen <jalkanen@apache.org>

        * 2.8.4-svn-7
        
        * Improved exporter to also export from a FileSystemProvider repo without actually
        loading the WikiEngine.
        
2009-12-23 Harry Metske <metskem@apache.org>

        * 2.8.4-svn-6
        
         * JSPWIKI-621: check last fileseparator on config page, duplicate of JSPWIKI-424,
            reported by Rolf Schumacher. 

2009-12-15 Harry Metske <metskem@apache.org>

        * 2.8.4-svn-5
        
         * JSPWIKI-619: Include geronimo-web.xml in JSPWiki.war (reported by Jurgen Weber) 
         * JSPWIKI-618: Allow Administrators to override attachment.maxsize  (reported by Jurgen Weber) 

2009-12-06 Harry Metske <metskem@apache.org>

        * 2.8.4-svn-4
        
         * JSPWIKI-617: Attachments unsearchable after renaming a page 

2009-11-24  Janne Jalkanen <jalkanen@apache.org>

        * 2.8.4-svn-3
        
        * Fixed export to deal better with broken repositories: automatic renaming
        of case-conflicts (on systems where they are possible).
        
        * Export now properly exports in lower-case.
        
2009-11-23  Janne Jalkanen <jalkanen@apache.org>

        * 2.8.4-svn-2
        
        * Added export script (export.sh); disabled attachment export for now to test
        proper exporting.
        
2009-11-21 Harry Metske <metskem@apache.org>

        * 2.8.4-svn-1
        
         * JSPWIKI-612: fix UserManagement.jsp 's option in user select box 
         (I like to add the name of the person who discovered this bug, but
         the codepage ISO8859-1 doesn't allow that)
       
2009-09-26 Dirk Frederickx <brushed@apache.org>

        * 2.8.3-svn-19
        
         * JSPWIKI-591: # sign behind headlines is now hidden on the printed wiki page
       
        
2009-09-06 Harry Metske <metskem@apache.org>

        * 2.8.3-svn-18
        
        * JSPWIKI-597: Upgrade yuicompressor from 2.3.3 to 2.4.2 to solve 
        RuntimeExceptions when using OpenJDK.
        
                
2009-08-30 Harry Metske <metskem@apache.org>

        * 2.8.3-svn-17
                
        * Introduced the new PageViewPlugin written by Andre van Dalen.
        This plugin counts page views and presents the statistics on page views
        See http://www.jspwiki.org/wiki/PageViewPlugin for the complete
        documentation.
        
        * Minor javadoc error in WikiSecurityException
        
        * Commented out log4j logger stmt in jspwiki.properties.tmpl causing duplicate
        log entries during tests
        
2009-08-30 Dirk Frederickx <brushed@apache.org>

        * 2.8.3-svn-16
                
        * JSPWIKI-577: tabbed sections with many tabs with long names will float the 
        tabs to a next line. Fixed the 'jumping' behavior of clicking this wide tabs,
        which was caused by a superfluous bottom-border css style.

        * Open/Close of collapsible boxes is now only possible by clicking the +/- icon.
        Any clicks on the header-bar will not change the status of the 
        collapsible box anymore. E.G. in the Info tab, when looking at page 
        differences between 2 versions, you can now click the version drop-downs
        without changing the status of the collapsible box.

        * Implemented the standard css overflow treatment of the 'diff' body. Horizontal 
        scroll-bars will only be shown when looking at wide content.
        This is the same overflow treatment as the page content.

        
2009-08-25 Dirk Frederickx <brushed@apache.org>

        * 2.8.3-svn-15
        
        * JSPWIKI-580: Fixing the quirky handling of the textarea selection range
        in IEx browsers.

2009-08-23 Dirk Frederickx <brushed@apache.org>

        * 2.8.3-svn-14

        * JSPWIKI-480. Small improvement on Attachment sorting.
        Not using the attribute 'jspwiki:sortvalue' to allow sorting of 
        date values, both in attachment and info tabs.

        * JSPWIKI-574. Redirect from UserPreferences.jsp hangs when null.
        (which is the case eg after subsequent log in) 

        * JSPWIKI-590. Use relative paths to link the javascript routines.
        Avoid the use of getContextPath(), as the URL may have been rewritten
        external to jspwiki. (reported by Florian) 
        This fix only resolves the references to javascript routines.
        

2009-08-19 Harry Metske <metskem@apache.org>

        * 2.8.3-svn-13

        * Changed Exporter's dateformat to JSR-170's required ISO 8601 format 

2009-08-19 Dirk Frederickx <brushed@apache.org>

        * 2.8.3-svn-12

        * JSPWIKI-576. Styles of section [Edit] links fixed for IE.

        * JSPWIKI-585: Scrollbars on wide-pages fixed for FF and Safari (overflow-y:hidden) and IE.
        
        * JSPWIKI-383, JSPWIKI-481: Support redirecting back to special pages such as 
        the Search page, Workflow page.
                
        
2009-08-03 Dirk Frederickx <brushed@apache.org>

        * 2.8.3-svn-11

        * JSPWIKI-581   Fixing %%sortable, with strange side-effects when sorting table columns
        with strings. (detected by Stefan Bohn)
        

2009-06-07 Harry Metske <metskem@apache.org>

        * 2.8.3-svn-10

        * JSPWIKI-568  jspwiki.propertyfile cannot be defined as system property
        You can now specify a Java System Property jspwiki.propertyfile to specify
        the location of jspwiki.properties (thanks to Piotr Tarnowski) 

2009-06-03 Harry Metske <metskem@apache.org>

        * 2.8.3-svn-9

        * JSPWIKI-569  added Brazilian Portuguese translation, thanks to Paulo Amaral 

2009-05-29 Harry Metske <metskem@apache.org>

        * 2.8.3-svn-8

        * JSPWIKI-564  Comment Editor populated by Preview from another wikipage,
        reported by Jeff Allen.
        The Comment.jsp now always clears the EDITED_TEXT from the session.

2009-05-12 Harry Metske <metskem@apache.org>

        * 2.8.3-svn-7

        * JSPWIKI-526 Allow administrators to select the Comparator 
           used for sorting page lists by name, thanks to Greg Kable
        
2009-05-11 Dirk Frederickx <dirk.frederickx@apache.org>

        * 2.8.3-svn-6

        * JSPWIKI-532 %%columns didn't work properly when the first child element was
        a DOM text element.
        

2009-04-23 Harry Metske <metskem@apache.org>

        * 2.8.3-svn-5

        * JSPWIKI-523 Change TableOfContentsPlugin so it generates (more) relative links
        so it properly displays when used in EditHelpPage (reported by Stefan Bohn.
        
        * Added two (dummy) methods to TestJDBCDataSource so it also compiles with JDK 6

2008-04-04  Janne Jalkanen <jalkanen@apache.org>

        * 2.8.3-svn-4
        
        * Improved WatchDog thread dump code so that it does not generate two 
        log events for every hung thread.  Instead, all hung thread events are now
        generated as a single log event.  Also, thread dumps are now sent
        at DEBUG level, since they are not errors per se.
        
2009-04-07 Andrew Jaquith <ajaquith AT apache DOT org>

        * 2.8.3-svn-3
        
        * Added a (String,Throwable) constructor to WikiException and WikiSecurityException,
        and refactored the code so that it is used in preference to the (String) constructor
        where appropriate. This allows more verbose errors (and better troubleshooting)
        because the underlying cause of wrapped Exceptions can now be seen. Added
        some additional stack dumps to the WikiEngine initialization code so that odd
        fatal errors will be printed in server logs. This change has been forward-ported
        to the (3.0) trunk.
        
        * Added support in WikiCallbackHandler for HttpRequestCallback and
        WikiEngineCallback. This means LoginModules used for JSPWiki integrated
        (custom) authentication can now access the WikiEngine and the HTTP request.
        Thanks to Lou Peters and many, many others for bringing this issue to my
        attention. Please test this function! This change has been forward-ported to
        the (3.0) trunk. 
        
        * As a result of the additional callback support for LoginModules used with
        integrated authentication, AuthenticationManager gains a new method,
        login(WikiSession,HttpServletRequest,String,String). Please use this instead
        of login(WikiSession,String,String), which is now deprecated. This change
        has been forward-ported to the (3.0) trunk.
        
2009-04-05 Harry Metske <metskem@apache.org>

        * 2.8.3-svn-2

        * added some code to Watchdog so that the stacktrace is dumped in case of 
           a timeout, we dump stacktraces of all threads if the debuglevel is
           INFO or higher
        
2008-04-04  Janne Jalkanen <jalkanen@apache.org>

        * 2.8.3-svn-1
        
        * JSPWIKI-391: FCK editor ruins the anchors inside the page
        
        * JSPWIKI-493: FCK editor adds newlines before and after text 
        formatted as "code"

2009-03-20 Harry Metske <metskem@apache.org>

        * 2.8.2-svn-15

        * JSPWIKI-487 don't show deleted and renamed pages in the breadcrumbs
           reported by Bruno Peeters
        
2009-03-19  Andrew Jaquith <ajaquith AT apache DOT org>

        * 2.8.2-svn-14

        * Fixed bug in XMLUserDatabase that was preventing UIDs from being
        saved, which generated tons of NPEs afterwards. Added unit tests
        to check for correct saving of UIDs. Tightened input filtering on
        user profile fields to prohibit more characters.
        
2008-02-15  Harry Metske <metskem@apache.org>

        * 2.8.2-svn-13
        
        * JSPWIKI-503 - InsertPage plugin carries dashes from section
         breaks into output, thanks to Jonathan Sobel
         Also added an extra JUnit test for this.
        
2008-02-14  Harry Metske <metskem@apache.org>

        * 2.8.2-svn-12
        
        * JSPWIKI-466 - FileSystemProviderTest r�cksichtslos empties java.io.tmpdir
        
2008-02-12  Janne Jalkanen <jalkanen@apache.org>

        * 2.8.2-svn-11
        
        * JSPWIKI-500: Spam containing only deletions is no longer sent
        to Akismet.

2009-02-09  Harry Metske <metskem@apache.org>

        * 2.8.2-svn-10
        
        * JSPWIKI-496 RecentChangesPlugin should filter pages

2009-02-06  Harry Metske <metskem@apache.org>

        * 2.8.2-svn-9
        
        * JSPWIKI-477 Renamed pages are no longer in the Lucene index

2009-02-03  Dirk Frederickx <dirk.frederickx@gmail.org>

        * 2.8.2-svn-8
        
        * JSPWIKI-480, sorting on timestamps (modified date) in
        the Attachement tab and the Info tab was not always working,
        as timeformats are depending on the user-preferences.
        An invisible javascript parsable timeformat attribute is now 
        added to the tables, independent of the user-preferred timeformat.
        This attribute is used by the js sorting routines.


2009-02-02  Dirk Frederickx <dirk.frederickx@gmail.org>

        * 2.8.2-svn-7
        
        * JSPWIKI-491, Icons in list of attachements were only shown when the
        attachment type was lower-case

        * JSPWIKI-486 Always show the information table, also in case there is 
        only one version of the page.
        
 
2009-01-23  Harry Metske <metskem@apache.org>

        * 2.8.2-svn-6
        
        * JSPWIKI-472, userdatabase.xml corrupted on EBCDIC platforms by CryptoUtil
 
2009-01-21  Andrew Jaquith <ajaquith AT apache DOT org>

        * 2.8.2-svn-5

        * [JSPWIKI-473] Fixed bug that was causing role checks using custom
        Authorizers to fail. AuthenticationManager was not calling
        Authorizer.isInRole(WikiSession, Principal), as it should have.
        In addition to fixing the bug, we also now include a special test case
        to verify that custom Authorizers work properly. Thanks to Steve
        Dahl for reporting this issue.

2008-12-19 Harry Metske <metskem@apache.org>

        * 2.8.2-svn-4
        
        * JSPWIKI-451 Russian translation, thanks to Andrew Rikhlivsky

2008-12-03  Janne Jalkanen <jalkanen@apache.org>

        * 2.8.2-svn-3

        * [JSPWIKI-454] Added the first version of 
        com.ecyrd.jspwiki.content.Exporter

2008-12-03  Janne Jalkanen <jalkanen@apache.org>

        * 2.8.2-svn-2
        
        * [JSPWIKI-444] Wysiwyg editors (such as FCK) no longer duplicate
        the permalink anchors.

2008-11-29  Dirk Frederickx <dirk.frederickx@gmail.com>

        * 2.8.2-svn-1
        
        * [JSPWIKI-288] CSS fix for the rendering of hash-links.
 
2008-11-21  Janne Jalkanen <jalkanen@apache.org>

        * 2.8.1, first release candidate build.

2008-11-21 Harry Metske <metskem@apache.org>

        * 2.8.1-svn-16
        
        * JSPWIKI-407: applied zh_CN patch from Hubert Chang

2008-11-18  Harry Metske <metskem@apache.org>

        * 2.8.1-svn-15
         
        * JSPWIKI-415: Favorites not displayed properly when blank in userName, reported by Trevor Harrison
          Backport from 3.0 to 2.8 on request of Erik Bunn.
          Added 2 JUnit tests for InsertPage plugin
  
2008-11-15  Dirk Frederickx <dirk.frederickx@gmail.com>

        * 2.8.1-svn-14
         
        * Illegal characters removed from jspwiki-common.js causing the YUI 
        compressor to fail.
  
 2008-11-15  Janne Jalkanen <jalkanen@apache.org>

        * 2.8.1-svn-13
        
        * [JSPWIKI-428]: WeblogPlugin was not properly finding the page title
        due to misshapen regexp.
        
        * [JSPWIKI-407]: Added Italian translation of corepages, thanks to Luca
        Gilardoni. 

2008-11-13  Dirk Frederickx <dirk.frederickx@gmail.com>

        * 2.8.1-svn-12
        
        * [JSPWIKI-381] fixed a bug with periodicially refreshed sneak-preview
        while in section-edit mode. When section-edit was active,
        linefeeds were inserted at every sneak-prev refresh.
        
        * [JSPWIKI-384] Filter js-scripts from input fields and cookies.
        (xss vulnerability)
        

2008-11-06  Janne Jalkanen <jalkanen@apache.org>

        * 2.8.1-svn-11

        * Added doc/Translating.txt as a guide for people who want to create
        translations.  
        
        * Added ant "i18n-check" target as an interface
        to TranslationsCheck (no need to get geeky running a Java class).

2008-11-06  Andrew Jaquith <ajaquith AT apache DOT org>

        * 2.8.1-svn-10

        * [JSPWIKI-345]: Upgraded freshcookies-security to 0.60, which fixes an issue
        causing generic (non-class-specific) Principal entries in security policies
        to be ignored.

2008-11-06  Janne Jalkanen <jalkanen@apache.org>

        * 2.8.1-svn-9

        * [JSPWIKI-416]: French translation and corepages from Olivier Descout

2008-11-05  Juan Pablo Santos <juanpablo.santos@gmail.com>

        * [JSPWIKI-407]: updated es translation; fixed some HTML entities left behind.
        
2008-11-03  Harry Metske <metskem@apache.org>

        * 2.8.1-svn-8
        
        * JSPWIKI-407: de translation by Florian, including the two timestamps in 
           ListLocksPlugin, found by Florian again. 
            
2008-11-04  Janne Jalkanen <jalkanen@apache.org>

        * 2.8.1-svn-7
        
        * [JSPWIKI-411] LuceneSearchProvider no longer stops processing at startup
        if the indexing dies due to non-indexable content.

2008-11-04  Dirk Frederickx <dirk.frederickx@gmail.com>

        * 2.8.1-svn-6
        
        * JSPWIKI-381: Sneak-preview is now refreshed periodically as well as the
        section-list at the left of the screen. 
        
2008-11-03  Dirk Frederickx <dirk.frederickx@gmail.com>

        * 2.8.1-svn-5
        
        * JSPWIKI-408: Hide wide-content on left-menu and leftmenu-footer.
        
        * JSPWIKI-403: Pagination links now show a pointer cursor at hover.        

2008-11-03  Janne Jalkanen <jalkanen@apache.org>

        * Finnish localization updated (no version bump):

2008-11-03  Harry Metske <metskem@apache.org>

        * 2.8.1-svn-4
        
        * JSPWIKI-407: Unlocalized messages and times in user, group and attachment
           management, reported by Olivier Descout (Forbidden.html not fixed yet)   

        * Finnish localization updated.

2008-11-02  Janne Jalkanen <jalkanen@apache.org>

        * 2.8.1-svn-3
        
        * [JSPWIKI-288] Each heading now has an anchor link after it.
        Thanks to Christian Helmbold for the idea.
        
2008-10-31  Harry Metske <harry.metske@gmail.com>

        * 2.8.1-svn-2
        
        * [JSPWIKI-406] Renaming a page back to the old name
           destroys text changes of the page, thanks to Stefan Bohn.
        * changed two annoying log.error's to log.warn's 
        
2008-10-21  Janne Jalkanen <jalkanen@apache.org>

        * 2.8.1-svn-1
        
        * [JSPWIKI-348] OC4J compatibility, thanks to Lutz Tietze.
        
        * [JSPWIKI-389] Wrong mixed quotes in SecurityConfig.jsp corrected.
        
        * [JSPWIKI-138] rss.jsp now caches the produced XML in a custom
          cache, resulting in *very* fast operation.

2008-10-17  Janne Jalkanen <jalkanen@apache.org>

        * 2.8.0-rc-2.

        * JSPWIKI-400: Chinese core pages were corrupted.

2008-10-14  Janne Jalkanen <jalkanen@apache.org>

        * 2.8.0-beta-21
        
        * [JSPWIKI-398] Pages with spaces in them caused erratic rename
        behaviour by renaming all the links on the page.

2008-10-14  Andrew Jaquith <ajaquith AT apache DOT org>

        * 2.8.0-beta-20

        * [JSPWIKI-313] ShortURLConstructor was not creating URLs for the LOGIN
        context correctly. We now check for this context specifically.

2008-10-13  Andrew Jaquith <ajaquith AT apache DOT org>

        * 2.8.0-beta-19

        * [JSPWiki-342] Resolved issue by removing outdated doc files.

        * [JSPWIKI-345] Added unit tests for testing single user policies. Confirmed bug
        and workaround but did not fix root cause (freshcookies-security bug).

2008-10-06  Dirk Frederickx <dirk.frederickx@gmail.com>

        * 2.8.0-beta-18

        * [JSPWIKI-395] One more xhtml issue in plain.jsp. Not what you'd expected ;-)
 
         
2008-10-05  Dirk Frederickx <dirk.frederickx@gmail.com>

        * 2.8.0-beta-17

        * [JSPWIKI-395] Few fixes to improve xhtml compliance.
        (txs to the wonderful tools of Andrew ;-)
        

2008-10-05  Harry Metske <harry.metske@gmail.com>

        * Updated LICENSE and NOTICE file quite a couple of resources (most of them Apache licensed)
        
        * a few minor updates to Compiling.txt, UPGRADING and ReleaseNotes

2008-10-05  Dirk Frederickx <dirk.frederickx@gmail.com>

        * Updated LICENSE and NOTICE file for javascript related resources. (no version step-up)

2008-10-01  Andrew Jaquith <ajaquith AT apache DOT org>

        * 2.8.0-beta-16

        * [JSPWIKI-386] Custom LoginModules were not being configured correctly.
        Thanks to Peter Hormanns for reporting this.

2008-10-01  Dirk Frederickx <dirk.frederickx@gmail.com>

        * 2.8.0-beta-15
        
        * [JSPWIKI-327] Few more tweaks to stabilize the 'back' button handling after a search.
        
        
2008-09-30  Dirk Frederickx <dirk.frederickx@gmail.com>

        * 2.8.0-beta-14
        
        * [JSPWIKI-327] Going back to the search page now remembers the last search query.
        The query and selected pagination-page is stored in the #hash of the url.
        
        
2008-09-30  Janne Jalkanen <jalkanen@apache.org>

        * Oops, Dutch corepages had overwritten the English corepages,
        so restored both English ones and created a dir for Dutch.

2008-09-29  Dirk Frederickx <dirk.frederickx@gmail.com>

        * 2.8.0-beta-13
        
        * [JSPWIKI-385] Header lines are now cleared 'left' so that comment-boxes 
        can appear side by side with !!!header lines. 
        
        * [JSPWIKI-380] Fix backspace handling of the plain editor.

2008-09-29  Janne Jalkanen <jalkanen@apache.org>

        * 2.8.0-beta-12
        
        * [JSPWIKI-387] Fixed a number of quotes on Install.jsp.

2008-09-27  Harry Metske <harry.metske@gmail.com>

        * 2.8.0-beta-11
        
        * added Dutch corepages

2008-09-24  Juan Pablo Santos <juanpablo.santos@apache.org>

        * 2.8.0-beta-10
        
        * added spanish corepages
        
        * [JSPWIKI 343] Go through all built-in wikipages and make sure all of the 
        documentation in those is ok for 2.8.0. Applied only for en and es corepages.
        
2008-09-24  Janne Jalkanen <jalkanen@apache.org>

        * 2.8.0-beta-9
        
        * [JSPWIKI-368] Fixed issue with multiple preferences cookies
        appearing if the web app was installed to the root.  Thanks
        to Florian for finding this!

2008-09-21  Janne Jalkanen <jalkanen@apache.org>

        * 2.8.0-beta-8
        
        * [JSPWIKI-373] Fixed issue with sign button giving a fixed date.
        Unfortunately the format is fixed.  Thanks to Stefan Bohn for 
        a fix.

2008-09-21  Janne Jalkanen <jalkanen@apache.org>

        * 2.8.0-beta-7
        
        * [JSPWIKI-379] TranslateTag now properly does a deep
        clone of the WikiContext, so that you no longer can get
        ACLs instantiated just by previewing a page.
        
2008-09-20  Janne Jalkanen <jalkanen@apache.org>

        * 2.8.0-beta-6
        
        * [JSPWIKI-231] Brought Italian and Chinese translations up to
        par.
        
        * Added Chinese corepages, thanks to David Gao.

2008-09-18  Harry Metske <harry.metske@gmail.com>

        * 2.8.0-beta-5  JSPWIKI-231: update the latest de localisation, patch from Florian

2008-09-18  Harry Metske <harry.metske@gmail.com>

        * 2.8.0-beta-4  JSPWIKI-263: DOC change to the README file
        
2008-09-18  Andrew Jaquith <ajaquith AT apache DOT org>

        * 2.8.0-beta-3
        
        * One lonely Javadoc tweak.

2008-09-18  Janne Jalkanen <jalkanen@apache.org>

        * 2.8.0-beta-2
        
        * Fixed the failing unit tests for PageRenamer.
        
2008-09-05  Janne Jalkanen <jalkanen@apache.org>

        * 2.8.0-beta-1

2008-09-03 Dirk Frederickx <dirk.frederickx@gmail.com>

        * 2.7.0-alpha-37
        
        * [JSPWIKI-369] SneakPreview was broken when no SectionEdit was turned off.

        * [JSPWIKI-370] Remove 'vertical-align' css rule to prevent printing errors,
        as reported by Terry Steichen.
        
        * Few small fixes on the Accordion style.
 
2008-09-02  Juan Pablo Santos <juanpablo.santos@gmail.com>

        * Updated spanish translation (CoreResources_es + default_es properties)
        
2008-08-31  Janne Jalkanen <jalkanen@apache.org>

        * 2.7.0-alpha-36
        
        * [JSPWIKI-366]: changenote was lost in commenting previews. Also, FCK
        was not showing the changenote field.
        
2008-08-31  Harry Metske <harry.metske@gmail.com>

        * 2.7.0-alpha-35
        
        * JSPWIKI-364:  Info tab presents null string to user (reported by Florian)
        
2008-08-31  Janne Jalkanen <jalkanen@apache.org>

        * 2.7.0-alpha-34
        
        * Commenting now uses the changenote field properly (and we got rid
        of the "Comment by XXX" -functionality.  Therefore, "comment.by" i18n field
        is now unused.
        
        * Renaming now uses symbols instead of English text to put in the changenote
        field.
        
2008-08-30  Harry Metske <harry.metske@gmail.com>

        * 2.7.0-alpha-33
        
        * JSPWIKI-231: update the latest de localisation patch from Florian
        and quite a few corrections to the nl localisation
        
        * Found during debugging that Lucene Indexer was using a bit 
        agressive interval of 1 second for Emptying index queue, lowered to 5 seconds
        Combined with a few textual corrections in WikiBackgroundThread 

2008-08-30  Janne Jalkanen <jalkanen@apache.org>

        * 2.7.0-alpha-32
        
        * JSPWIKI-27: ReferenceManager was not serializing properly when there
        was no page metadata, therefore inadvertently loading old data whenever
        the wiki was restarted. 
        
        * JSPWIKI-333: Thanks to Florian's patch, this annoying language selection
        thing should now be fixed.
        
        * Fixed Finnish localization.
        
        * The suggestion box no longer keeps suggesting wikipages if you start
        inserting a plugin or a variable.
        
        * JSPWIKI-354: Fixed issue with fallback to default template not working.
        
2008-08-30 Dirk Frederickx <dirk.frederickx@gmail.com>

        * 2.7.0-alpha-31
        
        * [JSPWIKI-346] Rename errors are now displayed inside a page-info in screen,
        above the rename section.  Some localization updates are needed.

        New resource:
            prefs.errorprefix.rename=Could not rename the page:&nbsp;

        And the CoreResources rename.* items are updated to remove the text
        "Click "back" on your browser and change the new name.".
        (done for default and .nl properties)

        * [JSPWIKI-289] The edit SuggestionMenu (plain editor only) now also allows 
        to enter a '/' to get a list of attachment links. Moreover, when you open a new link with 
        a '[', by default jspwiki displays the list of attachments of the current page.
 

2008-08-25 Dirk Frederickx <dirk.frederickx@gmail.com>

        * 2.7.0-alpha-30 

        * [JSPWIKI-329] Pagination link for All-entries fixed. Added comments to
        InfoContent.jsp to clear-out obscure pagination counting logic.
 
        * [JSPWIKI-357], [JSPWIKI-358] Wrong section counting when a page contains a TOC.

        * [JSPWIKI-359] Popup when editing page from Quick Navigation Field should only
        appear when no pagename was entered in input field.
        

2008-08-24  Andrew Jaquith <ajaquith AT apache DOT org>

        * 2.7.0-alpha-29

        * Changed method signature for UserProfile.get/setUid() to use Strings rather
        than long integers. Test and XML/JDBC UserDatabase implementations changed
        also. This change was made for forward compatibility with JCR storage in  3.0. 

2008-08-24 Dirk Frederickx <dirk.frederickx@gmail.com>

        * 2.7.0-alpha-28 

        * [JSPWIKI-355] Fixing section-editing bug reported by Harry.
        
        * Saving user-preferences was broken in PreferencesTab.jsp
        

2008-08-24  Harry Metske <harry.metske@gmail.com>

        * 2.7.0-alpha-27
        
        * added my GPG key to KEYS
        
        * minor corrections/additions to UPGRADING
        
        * minor corrections/additions to the selenium readme.txt
        
        * added ${java.home}/../lib/tools.jar to path.tests, set jspwiki.login.throttling=false and some other comments in build.xml
        
        * added firefox-2 browser option (as extra comment) to build.properties
        
        * added new simple ViewPageSource selenium test
        
        * get rid of compile warning in WikiPage and WysiwygEditingRenderer and GroupManager
        
        * compile error in InputValidatorTest
        

2008-08-23 Dirk Frederickx <dirk.frederickx@gmail.com>

        * 2.7.0-alpha-26 

        * [JSPWIKI-333] Fixed side-impact in GroupManager due to new 
        InputValidator constructor.  
        

2008-08-23 Dirk Frederickx <dirk.frederickx@gmail.com>

        * 2.7.0-alpha-25  Template fixes (mainly section editing)

        * The Section-Editing user preference can now also be set via the
        default_jspwiki.properties. By default the preference is turned off.
        
                jspwiki.defaultprefs.template.sectionediting =on
        
        * Small fix to avoid section-editing [edit] link on table of contents titles.
        
        * [JSPWIKI-350] Section-Editing needs to be suppressed in a comment context.
        
        * The change-note input field is suppressed in a comment context as JSPWiki
        auto-generates the change-note for comments. Also added localization in Comment.jsp
        Added new resource to CoreResources.properties.
        
                comment.by=Comment by {0}
                
        * [JSPWIKI-329] Pagination links on the version history were still not correct
        when number of version equals a multiple of 20. Oops.
        
        * [JSPWIKI-309] Various updates of the OrderedList skin, including section editing.
      

2008-08-23 Dirk Frederickx <dirk.frederickx@gmail.com>

        * 2.7.0-alpha-24

        * [JSPWIKI-333] Language selection/deselection was not working correctly
        for some error messages. Refactored the input-validator to use correct locale.


2008-08-20  Andrew Jaquith <ajaquith AT apache DOT org>

        * 2.7.0-alpha-23

        * Changed Stripes test jar to the released 1.5 version (congrats to Tim
        and the team).

2008-08-20  Janne Jalkanen <jalkanen@apache.org>

        * 2.7.0-alpha-22
        
        * JSPWIKI-27: Managed to duplicate this pesky bug from way old times.
        Looks like this was caused by a misread of the OSCache javadocs -
        but I am not sure if the fix causes new problems.
        
        * JSPWIKI-353: Fixed wrong i18n key in PluginManager which showed
        up if the plugin threw an exception.
        
        * JSPWIKI-352: Fixed a long-standing bug with ACLs being leaked
        from one page to another if the InsertPageTag was used.
        
        * Added a KEYS file to the top-level dir.  It would be a good idea
        if all committers added their current GPG keys to it.
        
2008-08-18  Harry Metske <harry.metske@gmail.com>

        * 2.7.0-alpha-21
        
        * [JSPWIKI-349] updated (German) corepages, credits to Florian again
        
2008-08-17  Harry Metske <harry.metske@gmail.com>

        * 2.7.0-alpha-20
        
        * [JSPWIKI-340] updated (english) corepages and README, mostly editorial changes, 
           a brief summary :
        - Java 5.0 is now a requirement for compiling (instead 1.4.2)
        - Servlet API 2.2 is mentioned, is this still enough ? (I haven't checked)
        - Removed dead link to tjworld.net/help/kb/0001_iis6-Tomcat5-JK2.html#conConnector
        - Removed links to JSPWiki 2.2 ,  2.3 and 2.4 documentation

2008-08-16  Janne Jalkanen <jalkanen@apache.org>

        * 2.7.0-alpha-19
        
        * JSPWIKI-315: Fixed issues with upper/lowercase filtering in 
        AttachmentManager
        
        * JSPWIKI-325: Patch from Harry to sort out plugin parameters and their 
        javadocs.
        
        * JSPWIKI-307: Pages with & in their names were not being parsed properly 
        in links.

2008-08-15  Harry Metske <harry.metske@gmail.com>

        * 2.7.0-alpha-18
        
        * [JSPWIKI-339] added German core pages, many thanks to Florian again !

2008-08-14  Harry Metske <harry.metske@gmail.com>

        * 2.7.0-alpha-17
        
        * [JSPWIKI-238] PageRenamer now correctly handles links containing blanks
          Added an additional JUnit test for this, there is stil one failing JUnit test however (attachment handling).
          PageRenamer still needs improvement.
        
2008-08-14  Andrew Jaquith <ajaquith AT apache DOT org>

        * 2.7.0-alpha-16

        * Fixed invalidateSession() method in WikiSession, which was not quite
        fully invalidating sessions.

2008-08-12 Dirk Frederickx <dirk.frederickx@gmail.com>

        * 2.7.0-alpha-15

        * [JSPWIKI-334] IE6/IE7 javascript bug causes section editor to crash.
        JS is now running fine, but the Section Overview box still needs some CSS
        fixes. Ongoing.
        Note: Section Editing only works with the plain editor.
        
 
        * [JSPWIKI-337] Missing localization in WorkflowContent.jsp.

2008-08-12  Harry Metske <harry.metske@gmail.com>

        * 2.7.0-alpha-14
        
        * [JSPWIKI-231] updated de translation, thanks to Florian
        
        * fix for  [JSPWIKI-300] required some extra changes to the JUnit test for the TableOfContents Plugin

2008-08-12 Dirk Frederickx <dirk.frederickx@gmail.com>

        * 2.7.0-alpha-13

        * [JSPWIKI-329] Pagination link was still not correct for the block 21-40.
        Amazing catch from Harry and Florian - txs !
 
 
2008-08-12  Andrew Jaquith <ajaquith AT apache DOT org>

        * 2.7.0-alpha-12

        * Refactored TestEngine so that MockRountrips and other heavier sessions are
        lazily initialized. Also added a property to AuthenticationManager that allows
        login throttling to be switched off (for example, during unit tests). The
        effect of these two changes cuts unit test times [on my machine] from 25 minutes
        down to about 4.5.

        * Removed reference to Stripes MockServletContext in WebContainerAuthorizer.
        It should not have been there.

2008-08-11 Dirk Frederickx <dirk.frederickx@gmail.com>

        * 2.7.0-alpha-11 - various smaller fixes in the default template

        * [JSPWIKI-302] Added the clone function to FCK.jsp. 
        Also added permission checking on the inclusion of the cloned-page.

        * [JSPWIKI-307] Redirection from UserPreferences.jsp doesn't work if "&" is included 
        in the original page name. 

        * [JSPWIKI-300] You can now also add a TableOfContents to your the LeftMenu (or Footer or ...) 
        Although a table of contents is only rendered once on a page; multiple invocations of 
        the plugin will now render an in-page link (#section-TOC) instead of a plain useless text.

        * [JSPWIKI-306] Rendering of rounded corners has been fixed. 
        However, the skin "PlainVanilla 1024x768" has been updated not to use the rounder-corners style anymore.
        This style is not considered part of core jspwiki. (will probably be removed in the future) 
        You can still use it for now (or reactivate it in the skin.js file of the skin)

        * Fixed the Left/Right orientation of Favorites block (with Left Menu) 
        for the Edit and Attachment Upload screens.

        * Made some final fixes and improvements to the SECTION editing feature. 
        It has now become a user-preference, which is by default off. (this preference is only 
        compatible with the plain editor) With section-editing on, you will get [edit] links 
        at each header which allows you to directly edit a particular section of a page. 
        In edting mode, a section overview box is shown in the left-menu allowing to switch 
        between various page section or look at the whole page.
        
        New localisation resources:
          javascript.sectionediting.label=Section Overview
          prefs.user.sectionediting=Section Editing
          prefs.user.sectionediting.text=Enable section editing via ...

        * Some minor improvements on the Accordion style to improve consistent look & feel. 
        Now also the accordion toggles show a blue +/- icon to indicate clickable regions. 
        Also added a %%leftAccordion and %%rightAccordion style, similar to book-tabs.

        * [JSPWIKI-329] the consistency and correctness of the pagination links has been improved
        in the Page Info screens. Now every block (also the first 1..20) show 20 items; 
        the link titles also match with the presented block. 
        The page size are now represented in kB, similar as attachment sizes.
        

2008-08-11 Dirk Frederickx <dirk.frederickx@gmail.com>

        * 2.7.0-alpha-10

        * [JSPWIKI-333] Language cookie is now set to default browser setting 
        when initializing the Preferences. Previously this was not required as long as the  
        user preferences were not modified by the user. Don't know why this stopped working.
        

2008-08-11  Harry Metske <harry.metske@gmail.com>

        * no version bump
        
        * JSPWIKI-319: added extra checking on Attchment Change Notes

2008-08-10  Harry Metske <harry.metske@gmail.com>

        * 2.7.0-alpha-9
        
        * JSPWIKI-320: removed all httpRequest.setCharacterEncoding() calls (except in WikiServletFilter)
        because they were called too late, reported by Clay Atkins
        
2008-08-06  Andrew Jaquith <ajaquith AT apache DOT org>

        * 2.7.0-alpha-8
        
        * JSPWIKI-316: fixed SecurityConfig.jsp so that it compiles, and added
        some sensible checks for the new JAAS scheme.

        * Fixed NPE in RSSImageLinkTag, which erroneously assumes that RSSGenerator
        is always available. However, it might not be if RSS feeds are disabled.
        
        * Fixed broken Ant 'war-tomcat' target.

2008-08-03  Harry Metske <harry.metske@gmail.com>

        * 2.7.0-alpha-7

        * JSPWiki-231: added Italian localisation, thanks to Luca Gilardoni
        
        * changed the schemaLocation in web.xml, reported by Thomas van der Pol
        
2008-08-01  Harry Metske <harry.metske@gmail.com>

        * no version bump
        
        * JSPWIKI-321: remove unmappable chars from 4 sources (causing warnings during build)

        * JSPWIKI-312: small patch to build.xml, quotes around arguments of compressjs,
          reported by Florian Holeczek.

2008-07-31  Harry Metske <harry.metske@gmail.com>

        * no version bump
        
        * JSPWIKI-317: Fixed InvalidDiff in ExternalDiffProvider, thanks to Jan Spitalnik.

2008-07-31  Andrew Jaquith <ajaquith AT apache DOT org>

        * 2.7.0-alpha-6

        * JSPWIKI-326: Fixed NPE in ProfanityFilter.

2008-07-16  Andrew Jaquith <ajaquith AT apache DOT org>

        * 2.7.0-alpha-5
        
        * JSPWIKI-315: added extra checks to AttachmentServlet.
        
2008-07-10  Janne Jalkanen <jalkanen@apache.org>

        * 2.7.0-alpha-4
        
        * Fixed a number of failing unit tests, and also included
        Creole tests.

2008-07-03  Andrew Jaquith <ajaquith AT apache DOT org>

        * 2.7.0-alpha-3

        * Added top-level text document UPGRADING which summarizes
        considerations for upgrading from 2.4 and 2.6. This needs more
        work, especially from the web-tier crew (Dirk et al).
        
        * Made most of the workflow package, except for the
        set/getAttributes methods in the Workflow class, serializable. In the 3.0
        timeframe, the rest of the package will be made serializable, too.
        
        * Added Ant target 'api-diff' which allows arbitrary diffing against
        previous JSPWiki.jar artifacts. It prints a nicely formatted HTML page
        describing public API differences. The report file is
        tests/reports/API-changes.html.
        
        * Upgraded Stripes jar (used in test cases) to 1.5-RC1.

2008-07-02  Janne Jalkanen <jalkanen@apache.org>

        * 2.7.0-alpha-2.  Yes, the last version number was an 
        anxious mistake.  It's really 2.7 alpha, not 2.8 alpha.
        
        * JSPWIKI-61: Added patch from David Au to add FCK 2.6.1
        support.  Please see the following page to enable it:
        
        http://www.jspwiki.org/wiki/HowToManuallyIntegrateFCKEditor

2008-06-30  Janne Jalkanen <jalkanen@apache.org>

        * 2.8.0-alpha-1

        * 2.7.0-svn-52
        
        * JSPWIKI-299: Deleting an attachment from a page which
        had been recently renamed caused an NPE.  Reported by Harry
        Metske.

2008-06-29  Janne Jalkanen <jalkanen@apache.org>

        * Moved all pages from wikipages under wikipages/en, and
        tweaked the build process accordingly.  Also created a basic
        Finnish translation of the CorePages.  The build process
        now creates jspwiki_corepages_en.zip and _fi.zip.

2008-06-19  Janne Jalkanen <jalkanen@apache.org>

        * 2.7.0-svn-51
        
        * JSPWIKI-231: Updated de i18n.
        
2008-06-25 Dirk Frederickx <dirk.frederickx@gmail.com>

        * 2.7.0-svn-50

        * [JSPWIKI-295] Sub tabs on the Admin.jsp didn't work because the
        corresponding tag ID's were containing dot's.
        
2008-06-22 Dirk Frederickx <dirk.frederickx@gmail.com>

        * 2.7.0-svn-49

        * [JSPWIKI-141] I18 properties also fixed in EditGroupContent.jsp
        
        * Included latest favicon.ico of Florian and Harry

2008-06-19  Janne Jalkanen <jalkanen@apache.org>

        * 2.7.0-svn-48
        
        * WikiWizard removed due to it being LGPL.  The following files
        were removed
           * webdocs/applets/wikiwizard.jar
           * webdocs/applets/WiWi-INF/
           * webdocs/scripts/jspwiki-wikiwizard.js
           * src/com/ecyrd/jspwiki/ui/admin/beans/WikiWizardAdminBean  
           
        * [JSPWIKI-231]: Updated de, zh_CN and nl.  Thanks to Florian
        Holeczek, Harry Metske and David Gao!
        
2008-06-19 Dirk Frederickx <dirk.frederickx@gmail.com>

        * No version bump

        * [JSPWIKI-295] Fixed Tabs in Admin.jsp

2008-06-19  Janne Jalkanen <jalkanen@apache.org>

        * 2.7.0-svn-47
        
        * Added support for the Universal Edit Button - 
        universaleditbutton.org.  About 3 mins before launch, even...

2008-06-17 Dirk Frederickx <dirk.frederickx@gmail.com>

        * 2.7.0-svn-46 

        * [JSPWIKI-293] added editor.plain.sneakpreview.title resource

        * [JSPWIKI-294] Faulty i18n in editor toolbar
        
        * [JSPWIKI-280] Scroll bar problem in IE7
        
2008-06-15  Janne Jalkanen <jalkanen@apache.org>

        * 2.7.0-svn-45
        
        * JSPWIKI-208: RSS images are now hidden if RSS is disabled.
        
        * Moved "info.rsspagefeed.title" key from default.properties
        to CoreResources and renamed to "rss.title".

        * Updated Finnish translation.
        
        * JSPWIKI-231: Updated Dutch and German translations.

2008-06-15 Dirk Frederickx <dirk.frederickx@gmail.com>

        * 2.7.0-svn-44 
        
        * Small fixes to plain.jsp to increase ie6 compatibilty.
        Hide the 'tab-completion' and 'smart typing pairs' from IE browsers.

        Added the i18n resource 
           editor.plain.toobar=Toolbar

        * Several IE7 fixes of the category and suggestion popup css.

        * Change the attachement icon to .gif (iso png), so it gets properly rendered on ie6.
        Added a transparent .ico file. (thanks Harry)

2008-06-14  Janne Jalkanen <jalkanen@apache.org>

        * 2.7.0-svn-43
        
        * JSPWIKI-145: jspwiki.applicationName is now cleaned to be a
        proper WikiName.  This is probably a good idea...
        
2008-06-14  Janne Jalkanen <jalkanen@apache.org>

        * 2.7.0-svn-42
        
        * JSPWIKI-185: There should be no more NPEs upon startup.  Improved
        logging as well as added a few null checks.
        
        * Fix: It was impossible to add new users due to an overzealous null check
        in XMLUserDatabase.
        
        * Improved our notification in case you have not yet installed JSPWiki.  Incidentally,
        we're using baseURL to check whether the install process is done, and because of this,
        setting baseURL becomes mandatory.
        
        * JSPWIKI-246: All new (and faster) IndexPlugin as the old one couldn't be
        converted to Apache.
        
        * Updated Finnish translation.
        
        * Added etc/ini/default_jspwiki.properties to hold all sorts of stuff that
        you normally want to enable in jspwiki.properties, but most people don't
        really want to touch.
        
        * JSPWIKI-57: Should resolve NotSerializableExceptions when container
        goes up or down.
        
        * JSPWIKI-292: Comment.jsp didn't compile.  Oops!  Thanks to Harry Metske
        for the patch.
        
2008-06-14 Dirk Frederickx <dirk.frederickx@gmail.com>

        * 2.7.0-svn-41  Many template fixes, added ajaxed edit preview, improved IE6/IE7 compat.
        
        * Fixed [JSPWIKI-275] Incoming and Outgoing link box doesn't work properly anymore. 
        
        * Several fixes of section edit: [JSPWIKI-235], [JSPWIKI-209]

        * [JSPWIKI-278] highlight search queries was handled badly when PRE sections 
        contained HTML elements.

        * [JSPWIKI-280] IE7 had the same scroll bar problem as previously with IE6.  
        Added IE7 specific CSS selector to support IE7. 

        * Fixed [JSPWIKI-259] IE rendering bug for nested collapsable boxes in IE7
        
        * [JSPWIKI-269] Improved handling of collapsible lists, even when a template 
        would not use TabbedSections. The handling of dynamic styles was refactored 
        to make them less intrusive.

        * Fixed [JSPWIKi-285]  Groups.jsp has unterminated string constant.
        Delete resource (not used anymore):
        #group.areyousure=....


        * An AJAX driven sneak-preview has been added to the plain editor. (by default off)
        The user can have immediate feedback of how the wiki-markup is rendered by means of 
        a preview box just below the editor textarea. The preview section is refreshed whenever 
        the user clicks outside the textarea.
        
        * The handling of the plain editor suggestion popup is now also working on IE. 
        Put the mouse inside a [wiki-link] to see the automatic expansion; 
        select a item of the suggestion list and click to insert the link in the editor textarea.
        This also works for attachement links. See [JSPWIKI-289] 

        Update i18n resources:
        #editor.plain.editassist=Edit Assist
        #editor.plain.editassist.title=Toggle Edit Assist buttons
        editor.plain.sneakpreview=Sneak Preview

        * The rendering of popup boxes for e.g. link-suggestion-box, %%tips, %%category. has been improved.

        * Frequently used icons merged in single 'strip' gifs to improve download speed.

        * Refactored 'jspwiki-common.js', which now only contains the core javascript. (8K compressed)
        The additional dynamic styles have been moved to 'jspwiki-commonstyles.js'. (12K compressed) 

        * Clean up of OrderList and Smart skin.   
        
        * Added a few default.nl.properties updates (eg [JSPWIKI-206])


2008-06-13  Andrew Jaquith <ajaquith AT apache DOT org>

        * 2.7.0-svn-40
        
        * Removed TestHttpServletRequest, TestHttpServletResponse,
        TestHttpSession, TestFilterChain, TestFilterConfig,
        TestServletContext in favor of the much-superior Stripes
        mock objects. TestEngine was retrofitted with the Stripes
        mocks and all unit tests were also changed. In particular,
        take note of the TestEngine.newHttpRequest() factory method,
        which should be used to create test request objects.
        
        * Trimmed some unncessary web unit test classes that were
        left behind as crutches in case Selenium didn't work out. 
        
        * Upgraded Selenium-RC jars to 1.0-beta1. Selenium still
        does not work with FireFox 3, unfortunately. :(
        
2008-06-12  Janne Jalkanen <jalkanen@apache.org>

        * 2.7.0-svn-39
        
        * JSPWIKI-191: Favorites.jsp no longer leaks LeftMenu contents
        to unauthorized viewers in UserPreferences.jsp.  Thanks to
        Sergio Gelato.
        
        * JSPWIKI-253: VotePlugin and Vote.jsp are now gone, as they
        were pretty much useless.
        
        * JSPWIKI-206: A no-results search could also fail due to 
        missing permissions.  Updated default.properties / find.noresult
        i18n key to explain better.  Finnish and English updated.
        
2008-06-11  Andrew Jaquith <ajaquith AT apache DOT org>

        * 2.7.0-svn-38
        
        * Web unit tests refactored (yet again) to use an embedded
        Jetty server. This replaces the need to use a separate Tomcat
        server, and *should* always work without any configuration of
        any kind. Please tests this via the Ant 'webtests' target!
        Note that this checkin introduces the TestContainer class, which
        with a little modification (later, please!) could easily be
        used as a stand-alone server. Refactorings are welcome; in
        the meantime, TestContainer should be considered volatile.
        Note also that the Rename Profile web unit tests for the
        container scenarios currently fails; all others run successfully.
        
        * Minor tightening of Map API for Serializer methods; the
        keys are now Strings rather than Serializable. This is a
        dev branch, remember!
        
        * Added Stripes jar in preparation for replacement of
        TestRequest/Response mock objects.

2008-06-09  Janne Jalkanen <jalkanen@apache.org>

        * 2.7.0-svn-37
        
        * JSPWIKI-290: ReferenceManager was not updating the page
        references correctly after a rename.  Fix by Harry Metske.
        
        * Fixed also a number of miscallaneous FindBugs issues.

2008-06-09  Janne Jalkanen <jalkanen@apache.org>

        * 2.7.0-svn-36
        
        * JSPWIKI-14: checkPermissions code in MetaWeblogHandler is now
        functional.
        
        * JSPWIKI-228: Added patch from Alexander Chow to fix a problem
        where multiple headings with the same text were producing illegal
        XML through duplicated ID attributes.
        
        * JSPWIKI-274: Was fixed already in svn-31.
        
        * JSPWIKI-286: Fixed a couple of typos in Finnish localization.
        
        * JSPWIKI-285: Group.jsp had a wrong quote char in English,
        Dutch and German translations.

2008-06-08  Janne Jalkanen <jalkanen@apache.org>

        * 2.7.0-svn-35
        
        * JSPWIKI-283: Ooops.  Copy != Cut.
        
2008-06-07  Janne Jalkanen <jalkanen@apache.org>

        * 2.7.0-svn-34
        
        * JSPWIKI-265: All referrer changes (according to unit tests anyway)
        work now.
        
        * JSPWIKI-30 should now also be resolved.
        
        * JSPWIKI-27: I have a suspicion that implementing WikiPage.equals()
        has caused some interesting issues with attributes being leaked from
        old versions.  Removed equals() for now.
        
        * Some JSPWikiMarkupParser speed optimizations by changing all
        StringBuffers to StringBuilders.

2008-06-07 Dirk Frederickx <dirk.frederickx@gmail.com>

        * 2.7.0-svn-33
        
        * Added favicon.ico, and updated the jspwiki.properties to support *.ico

2008-06-01  Janne Jalkanen <jalkanen@apache.org>

        * 2.7.0-svn-32

        * Password hashes were generated in platform native encoding
        instead of UTF-8.  Oops.
        
        * In general, there have been massive upgrades of Javadocs.

2008-05-31  Janne Jalkanen <jalkanen@apache.org>

        * 2.7.0-svn-31
        
        * Oops, wrong regexp: AttachmentServlet now *really* cleans up
        the filename.
        
        * Added some sanity checks to hopefully address an issue that
        Jim Willeke was having with the parser crashing at odd places. 

2008-05-29  Janne Jalkanen <jalkanen@apache.org>

        * 2.7.0-svn-30
        
        * AttachmentServlet now cleans the uploaded file name, since some
        browsers send the full path as well.
        
2008-05-22  Andrew Jaquith <ajaquith AT apache DOT org>

        * 2.7.0-svn-29
        
        * Checked in three new features for UserProfile and the UserDatabase
        classes. First, profiles can now store arbitrary Serializable objects
        via a new method in UserProfile, getAttributes, that returns a
        Map<Serializable,Serializable> that can be directly manipulated.
        Arbitrary attributes such as user preferences can be added to the
        profile and be guaranteed to be persisted on save. Second, the
        UserProfile now has two methods setLockExpiry(Date)/getLockExpiry
        that allow callers to disable user profiles. These are NOT enforced
        in AuthenticationManager yet. Third, user profile now have a 'uid'
        field that stores a long value for uniquely identifying users.
        Existing profiles without UIDs are automatically upgraded when
        they are loaded by a findBy___() method. The default XML/JDBC
        UserDatabase implementations have been enhanced to support all
        of these new features. If you have custom UserDatabase
        implementations, you should take a look at the new code.
        
        * Miscellaneous and varied Java 5 enhancements (such as for-loops).

2008-05-22 Juan Pablo Santos <juanpablo.santos@gmail.com>

        * 2.7.0-svn-28
        
        * [JSPWIKI-25].  Creating empty pages should not be possible (default
        behaviour). Can be changed by setting jspwiki.allowCreationOfEmptyPages
        to true in jspwiki.properties.
        
        * <i18n-create-template> target in build.xml was creating a wrong i18n 
        directory structure.

2008-05-11  Janne Jalkanen <jalkanen@apache.org>

        * 2.7.0-svn-27
        
        * [JSPWIKI-44].  AuthenticationManager now remembers the last logins
        and slows down repeated access attempts, to a maximum of 20 seconds.

2008-05-11  Janne Jalkanen <jalkanen@apache.org>

        * 2.7.0-svn-26

        * [JSPWIKI-236]: Fixed localization for the different login/edit
        help pages missing.    
        
        * [JSPWIKI-170]: Fixed a few places where the author was appearing
        as "unknown".
        
        Added new i18n key in CoreResources, updated English and Finnish:
        
           * common.unknownauthor
           
        * [JSPWIKI-151]: If sending a password succeeds, it is no longer reported
        as an error.
        
2008-05-18  Dirk Frederickx <dirk.frederickx@gmail.com>

        * 2.7.0-svn-25
        
        * Temporary remove hideable favorites menu as it is incompatible with FCK.
        Final fix to commit later.  The FCK-Editor is now again fully working.
        (Reported by Florian Holeczek)  JSPWIKI-209
        
        * Fixing various IE7 incompatibilities (jspwiki.css)
        Reported by Gavin Goldsmith. 
        

2008-05-14  Andrew Jaquith <ajaquith AT apache DOT org>

        * 2.7.0-svn-24

        * [JSPWIKI-20] Passwords are now salted and hashed per RFC 2307.
        Every password is salted with a 8-byte random salt.

        * The sort-of-secret "share container user accounts with
        JDBCUserDatabase" option has been permanently removed, and
        will not be replaced. This was previously added to make it easier
        for users to add themselves to JDBC-based container realms.
        However, the switch to salted passwords precludes the continued
        use of this option. So it's gone and won't come back.

        * Added a new class CryptoUtil that allows admins to generate
        SSHA password hashes (and verify an existing password given
        a supplied hash) at the command line. See the Javadoc
        for com.ecyrd.jspwiki.util.CryptoUtil for details.

2008-05-11  Janne Jalkanen <jalkanen@apache.org>

        * 2.7.0-svn-23
        
        * [JSPWIKI-265] Referrers are now changed, though the
        functionality is still a bit broken in places.
        
2008-05-11  Janne Jalkanen <jalkanen@apache.org>

        * 2.7.0-svn-22
        
        * [JSPWIKI-260] ReferringPagesPlugin now creates the "more"
        link URL properly.  This also impacts the localization of
        the "referringpagesplugin.more" in PluginResources.
        
        * Moved plugin resources from etc/i18n/com/ecyrd/jspwiki/plugin 
        to etc/i18n/plugin.  Can't remember who suggested this.  Also
        cleaned build.xml to make sure the plugin files are created
        properly.  Can't remember who suggested this, neither can
        I seem to find the JIRA issue...
        
        * [JSPWIKI-224] TranslatorReader now is just a proxy to the
        JSPWikiMarkupParser.  It will be finally gone in 3.0.
        
        * [JSPWIKI-183] PageRenamer no longer chokes if attachments
        are turned off.  Reported by Luca Gilardoni.
        
        * [JSPWIKI-234] Added ISO8601 time formats to default patterns.
        
2008-05-10  Janne Jalkanen <jalkanen@apache.org>

        * 2.7.0-svn-21
        
        * Logincookies are now written with UTF-8 instead of platform
        default encoding.  This should fix issues with users with non-ASCII
        chars sometimes having the wrong UID when their session expires.

2008-05-09  Janne Jalkanen <jalkanen@apache.org>

        * 2.7.0-svn-20
        
        * [JSPWIKI-251]: Removed the old com.ecyrd.jspwiki.PageRenamer
        and replaced it with com.ecyrd.jspwiki.content.PageRenamer, which
        is fully Apache-licensed.
        
        Unfortunately, the new PageRenamer does not support changing
        referring pages yet, error messages are not localized properly,
        etc.  So this is a considerable functionality downgrade until
        we can get a better version made.  Patches gladly accepted!

2008-05-06  Janne Jalkanen <jalkanen@apache.org>

        * 2.7.0-svn-19
        
        * [JSPWIKI-50] Improved performance of RecentChangesPlugin by 
        adding better caching to the CachingAttachmentProvider.  Thanks
        to Harry Metske!

2008-05-05  Janne Jalkanen <jalkanen@apache.org>

        * 2.7.0-svn-18

        * [JSPWIKI-239] jspwiki.cookieAuthorization.expiry is now called
        jspwiki.cookieAuthentication.expiry, because that is correct.  Thanks
        to Florian!

        * 2.7.0-svn-17
        
        * Removed JUG UUID generation libraries to favour the Java
        built-in ones.
        
2008-04-20  Janne Jalkanen <jalkanen@apache.org>

        * 2.7.0-svn-16
        
        * Moved the rest of the PluginResources class into etc/i18n, as
        their old place was confusing people.
        
        * [JSPWIKI-243], [JSPWIKI-244], [JSPWIKI-242], [JSPWIKI-241] Fixed
        a number of issues with plugins not using the proper date/time from
        the locale/preferences.
        
        * [JSPWIKI-245] Removed PluginResources / common.dateformat, and
        created three new time/date format resources in CoreResources:
           * common.dateformat
           * common.timeformat
           * common.datetimeformat

        * 2.7.0-svn-15
        
        * [JSPWIKI-5] FileSystemProvider now properly mangles names of pages which
        start with a dot.  This is done in a fully backwards compatible manner,
        so no changes to the repo is needed.
        
        * [JSPWIKI-100] Added two new parameters to ReferringPagesPlugin,
        UnusedPagesPlugin, ReferredPagesPlugin, and UndefinedPagesPlugin:
        show and showLastModified.  Thanks to Harry Metske for the patch!

        * 2.7.0-svn-14
        
        * [JSPWIKI-165] Patch from Tomasz Szymko to help in nested bullet lists.
        
        * Also updated several files to the Apache license.

2008-04-15 Juan Pablo Santos <juanpablo.santos@gmail.com>

        * 2.7.0-svn-13
        
        * [JSPWIKI-178] Patch from Jorge Ferrer to keep the order of search (WEB-INF
        then classpath then file system) of filters.xml.
        
        * [JSPWIKI-231] Updated es translation and applied patches from Florian 
        Holeczek (de translation) and Harry Metske (nl translation).
        
        * ProfanityFilter minor improvement: profanities are read from a file 
        instead of being hard-coded strings.

2008-04-13  Janne Jalkanen <jalkanen@apache.org>

        * 2.7.0-svn-12
        
        * [JSPWIKI-10] Patch from Harry Metske to make sure 
        VersioningFileProvider and AbstractFileProvider check for
        proper permissions.

2008-04-12  Janne Jalkanen <jalkanen@apache.org>

        * 2.7.0-svn-11
        
        * Improved restart time at the expense of more disk being
        used and the first startup taking a bit longer.
        
        * Acl implementation, permissions and our Principals now
        implement Serializable.  It could be used to improve startup
        time even further, but it will be useful for the future.
        
2008-04-10  Dirk Frederickx <dirk.frederickx@gmail.com>

        * 2.7.0-svn-10 - Javascript fixes for IE
        
        * [JSPWIKI-235] Bugfixes for Section edit handling in IE
        
        * Bugfixes for hide/show Favorites menu on mouse-click/hover.
        

2008-04-09  Dirk Frederickx <dirk.frederickx@gmail.com>

        * 2.7.0-svn-9
        
        * [JSPWIKI-233] Bugfix PreferencesTab.jsp

        * [JSPWIKI-232] Localization of (All) in the Edit Section dropdown.
        Also added localization to the language dropdown

        * [JSPWIKI-234] Added IS8601 date/time pattern to default prefs in JSPWiki.properties

        * Bugfix IE javascript crash on mouse-over handler

2008-04-09  Janne Jalkanen <jalkanen@apache.org>

        * 2.7.0-svn-8
        
        * [JSPWIKI-115]: Refactored VariableManager to use Reflection.
        Thanks to Stephen Solka.
        
        * [JSPWIKI-219]: Building now works if your username has a space.
        
        * [JSPWIKI-222]: Gone are the evil files which lurked into our
        distro file...  
        
        * Hacking attempts at manipulating the version parameter no longer 
        cause a slew of email to the admin...

2008-04-08  Janne Jalkanen <jalkanen@apache.org>

        * 2.7.0-svn-7
        
        * [JSPWIKI-56] Replaced MultiPartLibrary with Apache Commons
        FileUpload library, as MultiPartLibrary was LGPL.

2008-04-05  Dirk Frederickx <dirk.frederickx@gmail.com>

        * 2.7.0-svn-6
        
        * [JSPWIKI-233] Bugfix PreferencesTab.jsp
        
2008-04-05  Dirk Frederickx <dirk.frederickx@gmail.com>

        * 2.7.0-svn-5
        
        * [JSPWIKI-230] Make TimeZone configuration more user-friendly. Adjusted all jsp time-formatting
        to take timezone setting into account. 
        
2008-04-05  Dirk Frederickx <dirk.frederickx@gmail.com>

        * Commit related JIRA id's
        
2008-04-05  Dirk Frederickx <dirk.frederickx@gmail.com>

        * 2.7.0-svn-4
        
        * Refactored JS to support the Edit Suggestion box, so it's now fully based on mootools.
        The entries in the suggestion box are now clickable: the page or attachment link will be
        inserted in the textarea. Also the handling of the | bar inside a link has been improved.

        * [JSPWiki-200] The length of the entries in the Edit Suggestion are truncated to avoid
        overlap with the main body of the edit area.

        * The build script has been updated to use the YUI compressor. It now compresses both 
        javascript and css files. (this replaces the Dojo compressor, which only handled js)
 
        * In the UserPreferences you can now select the preferred language. 
        The default language is based on the user's browsers setting, but a dropdown allows you to 
        select any of the installed languages.
        The PreferencesTab.jsp has been refactored, with help of Juan Pablo Santos Rodriguez.
        All java handling has been moved to TemplateManager.java and Preferences.java.
        
        New i18n resources (already added for .en and .nl) 
            prefs.user.language=Select Language
            prefs.user.timezone.server=[SERVER]
            prefs.user.language.default=[DEFAULT]

        * Added an are-you-sure prompt to the UserPreferences.jsp when leaving the page without saving.

            javascript.prefs.areyousure=Without clicking the Save User Preferences button, \
                 your changes will be lost. Are you sure you want to exit this page?

        * [JSPWIKI-226] "View Page Source" now also displays 'non-latest' page versions

        * Suppress the 'ViewPageSource' in the more menu when the page doesn't exist yet.

        Added missing i18n resource
            actions.rawpage.title=View Page Source

        * Improved the implementation of the 'more menu' to resolve the intermediate screen glitch. 
        When javascript is off, the more menu will now be displayed at the top of the Favorites block,
        when javascript is on, the more menu becomes a mouse-hovered drop-down.
        

        * In the user-preferences, you can position the favorites menu Left or Right.
        Now it is also possible to make the Favorites menu hidden, allowing the body of the page
        to fith the full with of the screen. This should benefit narrow (mobile) devices.
        The favorites menu is still reachable via a mouse-hovered menu.

        Added i18n resources:
             javascript.favs.show="Click to show Favorites"
             javascript.favs.hide="Click to hide Favorites"

        * The javascript initialization parameters have been changed to XHTML META tabs 
        to reduce xss vulnerability. (commonheader.jsp)
        Now username's with embedded single quotes do not crash the js anymore.

        * [JSPWIKI-209] Section editing has been added. (feature original in the BrushedTemplate)
        When a page is editable, each section header gets an additional [edit] label.
        In edit mode, a section drop-down has been added which allows to filter the text-area to the
        section of interest.

        Added i18n resources:
              javascript.quick.edit=[Edit]
              javascript.quick.edit.title=Edit section: {0}
              edit.sections=Sections

        * [JSPWIKI-193] Flawed login.loginhelpmissing text in en, de, nl locales. 
        Fixed for .en, .nl, .de was already fixed. 


2008-03-30  Janne Jalkanen <jalkanen@apache.org>

        * 2.7.0-svn-3
        
        * [JSPWIKI-225] Added patch from Harry Metske to fix a problem
        with password not being shown during installation.
        
        * [JSPWIKI-227] Added patch from Harry Metske to fix problem
        with installation translation in English and Dutch.
        
        * [JSPWIKI-203] Counter plugin now supports both hiding results
        as well as "start" and "increment" options.  Patch mostly from
        Harry Metske.
        
2008-03-31  Andrew Jaquith <ajaquith AT apache DOT org>

        * 2.7.0-svn-2

        * Changed Ant build script to use 1.5 sources and targets.

        * Re-factored the authentication subsystem to remove the need
        for JAAS configuration files. WEB-INF/jspwiki.jaas goes away,
        as does the need for PolicyLoader. Also, responsibilities for web
        authentication move to WikiServletFilter. Authentication is now
        configured via jspwiki.properties -- see that file for details.
        WikiSession API change: getLoginContext() vanishes.

        * The auth.login.*LoginModule classes are mildly re-factored to
        remove any need to have knowledge of how to (or why) to inject
        JSPWiki Role principals. Responsibility for injecting Roles moves
        to WikiSession. JSPWiki can use ANY LoginModule for custom
        authentication now.

        * To support the auth refactoring, we introduce several *temporary*
        new servlet mock objects for unit testing: TestFilterChain, TestFilterConfig,
        TestHttpServletResponse, and TestServletContext. These are "temporary" 
        because they will be replaced by Stripes mock objects later in the
        2.7 release cycle.

2008-03-30  Janne Jalkanen <jalkanen@apache.org>

        * 2.7.0-svn-1
        
        * Removed JDK 1.4 dependency in AdminBeanManager.
        
        * Switched copyright in Release.java to ASF.  Please use
        this file as your reference when changing the boilerplate.

2008-03-29  Janne Jalkanen <jalkanen@apache.org>

        * 2.6.2

2008-03-19  Andrew Jaquith <ajaquith AT apache DOT org>

        * 2.6.2-rc-4

        * Fixed failing Selenium web unit tests so that they run correctly,
        with two exceptions. See tests/etc/selenium/readme.txt; this file
        includes a few notes on how to write Selenium tests so that they
        will run automatically via the Ant "webtests" target.

2008-03-18  Juan Pablo Santos <juanpablo.santos@gmail.com>

        * 2.6.2-rc-3
        
        * [JSPWIKI-214].  Table with id asirra_KnobsTable had two unlocalized 
        strings, added to CoreResources.properties. Detected by Florian Holeczek. 
        
        * [JSPWIKI-215].  Added patches to en, nl, fi and es translations to fix
        a case where HTML markup was being shown.   Detected by Florian Holeczek.
        
        * [JSPWIKI-210].  Updated German localization (still thanks to Florian!)
        
2008-03-16  Janne Jalkanen <jalkanen@apache.org>

        * 2.6.2-rc-2
        
        * Updated Dutch localization, courtesy of Harry Metske.
        
        * 2.6.2-rc-1
        
        * Updated Finnish localization.

2008-03-14  Juan Pablo Santos <juanpablo.santos@gmail.com>

        * 2.6.2-svn-7
        
        * [JSPWIKI-93] and [JSPWIKI-160]. Cleaned up corepages.   
        
        * i18n of Captcha.jsp & Install.jsp, added 50 new items to 
        CoreResources.properties. 
        
2008-03-13  Janne Jalkanen <jalkanen@apache.org>

        * 2.6.2-svn-6
        
        * [JSPWIKI-162].  Attachments can no longer created if the parent
        page does not exist.
        
        * Fixes issue with renaming a non-existant page would destroy the Main
        page.
        
        * [JSPWIKI-188].  Added patch from Florian Holeczek to improve
        logging of MailUtil.
        
        * [JSPWIKI-189].  Added a patch from Florian to improve configurability
        of MailUtil.

2008-03-08  Andrew Jaquith <ajaquith AT apache DOT org>

        * 2.6.2-svn-5
        
        * Tweaks to Javadoc so that they build cleanly. No functionality changes.

2008-03-08  Janne Jalkanen <jalkanen@apache.org>

        * 2.6.2-svn-4
        
        * [JSPWIKI-154].  Removed double entries from CoreResources and made
        sure everyone uses it.
        
        * [JSPWIKI-201].  Added simplified Chinese from David Gao.  Thanks!
        
        * [JSPWIKI-161].  Added TranslationCheck from Florian Holeczek.  Removed
        the MissingTranslations tool, as TranslationCheck does all it did.

2008-3-01  Dirk Frederickx <dirk.frederickx@gmail.com>

        * Minor stylesheet updates (no version bump)
        
        * Leading digits for ordered lists were cut off because padding value was too small.
        (detected by Florian Holeczek)
 
        * Long headings which break into two or more lines had insufficient line-height, so
        they were "squeezed into one another"  (detected by Florian Holeczek)
               

2008-2-24  Andrew Jaquith <ajaquith AT apache DOT org>

        * 2.6.2-svn-3
        
        * Reverted the JSP changes from my last commit so that existing 2.6 deployments
        don't need to reconfigure web.xml. That commit removed the fmt:setBundle tag
        because of the addition of a servlet config parameter in web.xml. The web.xml
        modifications remain, however, so that any new JSPs won't need to use setBundle.
        For 2.8, we will remove the setBundle tags entirely.

2008-2-24  Andrew Jaquith <ajaquith AT apache DOT org>

        * 2.6.2-svn-2

        * [JSPWIKI-195]: Superfluous WEB-INF/i18n directory created during war build.
        Also, several unneeded JARs were also being included.

        * Eliminated the need to hard-code <fmr:setBundle> tags in JSPs by setting
        the web.xml <comtext-param> javax.servlet.jsp.jstl.fmt.localizationContext
        so that it points to templates.default. Removed the setBundle tags from
        all JSPs.

2008-02-10  Janne Jalkanen <jalkanen@apache.org>

        * 2.6.2-svn-1
        
        * [JSPWIKI-171]: Patch for FCK editor and comment problem from
        David Au.
        
        * [JSPWIKI-169]: Fix to allow mail sender from JNDI in addition
        to property file.  Thanks to Dave Wolf.
        
        * [JSPWIKI-177]: Completely overhauled German translation, thanks
        to Florian Holeczek.

2008-02-10  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.6.1 release.

2008-02-03 Dirk Frederickx (dirk.frederickx@gmail.com)

        * 2.6.1-rc-4

        * Dozens of localization fixes for nl [JSPWiki-176] Excellent review by Harry Metske. 
        Many Thanks!
        
2008-02-03 Dirk Frederickx (dirk.frederickx@gmail.com)

        * Small fixes on Dutch localization (nl)  No version update
        
        
2008-02-02 Dirk Frederickx (dirk.frederickx@gmail.com)

        * Added DUTCH localization (nl)
        

2008-02-02  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.6.1-rc-3
        
        * [JSPWIKI-123]: Added German date formats to jspwiki.properties, thanks
        to Florian Holeczek
        
        * [JSPWIKI-173]: Oops, we had a detection routine for illegal XML chars,
        but unfortunately it was outputting the same illegal chars to the as an
        error...

2007-12-10  Andrew Jaquith <ajaquith AT apache DOT org>

        * 2.6.1-rc-2

        * Changed default tests/etc/groupdatabase.xml and tests/etc/userdatabase.xml
        so that they use the platform-independent date formats for creation/modification
        datestamps. Also, fixed a bug in XMLUserDatabase that caused "old" date formats
        to not be converted on startup. Thanks to Harry Metske for reporting this issue.

        * Tiny tweak to Eclipse classpath so that class files are put in build/ and tests/build. 

2008-01-27  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.6.1-rc-1
        
        * [JSPWIKI-166]: Added a default mail sender to ward off an evil NPE.  
        I have a suspicion that things still don't work as documented, but 
        at least there is no NPE anymore.

2008-01-27 Dirk Frederickx (dirk.frederickx@gmail.com)

        * 2.6.1-cvs-11

        * [JSPWiki-137] : Toggle workflow details now also works on FF
        
        * [JSPWiki-123] : The set of user-preference timeformats added to 
        jspwiki.properties.tmpl iso jspwiki.properties.

        
2008-01-26 Dirk Frederickx (dirk.frederickx@gmail.com)

        * [JSPWiki-147] : Slimbox labels were forgotten. (credit Tomasz Szymko)
        Added a new item to default.properties:

            javascript.slimbox.close=Close &#215;
            javascript.slimbox.close.title=Close [Esc]


2008-01-26  Janne Jalkanen <jalkanen@ecyrd.com>

        * [JSPWIKI-146]: We now properly catch the exceptions generated during
        download to avoid dumb error messages.
        
        * [JSPWIKI-102]: Added patch from Harry Metske to fix JNDI mail sending.
        
        * [JSPWIKI-153]: German translation was still talking about usernames
        upon password recovery.
        
        * [JSPWIKI-157]: CoreResources had strings which were not showing
        up properly, but had HTML entities.  Fixed en, fi, de and es.
        
        * Updated Finnish localization.

2008-01-26 Dirk Frederickx (dirk.frederickx@gmail.com)

        * 2.6.1-cvs-10  -- various small i18n issues 

        * [JSPWiki-123] : The set of user-preference timeformats moved to the 
        jspwiki.properties, such that the administrator can easily choose timeformats,
        if needed even localize them.

        * [JSPWiki-137] Toggle details button is now working and i18n'ized in Workflow page
        Added a new item to default.properties:

            workflow.creatUserProfile=New user profile <strong>{2}</strong>

        * [JSPWiki-144] : LoginHelp links to LoginPageHelp in l10n variable
        Added LoginPageHelp to Core wiki pages (copied from jspwiki.org)

        * [JSPWiki-147] : Category title label was not i18N
        Added a new item to default.properties:

            javascript.category.title=Click to show category [{0}] ...

        * [JSPWiki-149] : Edit Group and Delete Group did not fit well in the gui.
        Refactored the EditGroupcontent.jsp and GroupContent.jsp to make the gui more consistent.
  
        * [JSPWIKI-163] Error message when creating a new group to be I18N
        Added a new item to CoreResources.properties:

            newgroup.exists=Group {0} already exists. Try another name.


2008-01-24  Juan Pablo Santos (juanpablo.santos@gmail.com)
        
        * Updated spanish translation with missing entry keys. Switched HTML
        entities to Latin1 equivalent.

2008-01-20  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.6.1-cvs-9
        
        * [JSPWIKI-142]: Typo in default.properties.  Thanks to Florian! (And
        probably the fastest bug fix in JSPWiki history...)
        
        * [JSPWIKI-59]: ReferringPagesPlugin would create the wrong "more..."
        link in fi and de localizations.  Fixed and upgraded en and es localizations.

2008-01-19  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.6.1-cvs-8

        * Oops, there was a JDK 1.5 dependency in AttachmentServlet.  Fixed,
        should again work on 1.4.
        
        * [JSPWIKI-136]: WorkflowContent.jsp had a couple of untranslated strings;
        updated English and Finnish translations.  Reported by Tomasz Szymko.
        
        * [JSPWIKI-135]: ConflictContent had an untranslated string.  Reported by
        Tomasz Szymko (whose name I am *so* going to misspell one day).
        
        * [JSPWIKI-133]: GroupContent.jsp had an untranslated string.  Reported by
        Tomasz Szymko.
        
        * [JSPWIKI-134]: EditGroupContent.jsp had a couple of untranslated strings.
        Reported by Tomasz Szymko.
        
        * [JSPWIKI-132]: FindContent had an untranslated string.  Reported by
        Tomasz Szymko.
        
        * [JSPWIKI-131]: Changed "authenticated" to "authorized" in all built-in
        localizations.  Thanks to Fabian Haupt for en, de and es.
        
        * [JSPWIKI-114]: Fixed issue with VariableManager not checking the parent
        page for variables in case the InsertPage plugin was used.  Thanks to
        Stephen Solka!
        
        * [JSPWIKI-118]: Fixed issue with FCK editor not saving all metadata.  Thanks
        to David Au for the fix!
        
        New i18n keys in i18n/templates/default.properties:
           * workflow.details
           * workflow.details.title
           * conflict.oops.title
           * find.tab.help
           

2008-01-12 Dirk Frederickx (dirk.frederickx@gmail.com)

        * 2.6.1-cvs-7
        
        * [JSPWIKI-128] fixed various issues in the  printing style sheet.
        Validation of IE is pending.

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

        * 2.6.1-cvs-6
        
        * [JSPWIKI-95]: Links to anchors with blanks work now.  This introduces
        a tiny, very tiny compatibility issue with links to headings changing
        case in some cases.  Reported by Jügen Weber.
        
        * [JSPWIKI-125]: FilterManager now checks for version compatibility 
        of PageFilters by looking into the ini/jspwiki_module.xml.  This was a 
        surprisingly big change.  I would very much like to move to annotations
        in 3.0... Reported by Florian Holeczek.

        * [JSPWIKI-124]: Turns out that using de_DE as the language name
        is not a good idea, as it really works only when you define Deutsch (Deutschland)
        as your language - all other German-speaking folks would see Englisch...
        Reported by Goran Karlic.

        * added stress/MassiveRepositoryTest.

2008-01-06  Janne Jalkanen <jalkanen@ecyrd.com>

        * Fixed a number of Eclipse warnings.  No version bump, no
        functionality change.

2008-01-05 Dirk Frederickx (dirk.frederickx@gmail.com)

        * No version bump - small fix of exception in Footer.jsp

2008-01-05  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.6.1-cvs-5

        * [JSPWIKI-108]: Fixed EditPageHelp.txt which had an extra pipe char.

        * [JSPWIKI-106]: Password recovery emails are now sent with UTF-8 encoding.

        * [JSPWIKI-113]: Patch from Harry Metske to make sure the JNDI factory is
        only checked once when sending email.

        * [JSPWIKI-119]: URI detector now detects properly ~ and % characters.

2008-01-03 Dirk Frederickx (dirk.frederickx@gmail.com)

        * 2.6.1-cvs-4

        * Improving robustness of Wiki.getPageName(url) which was dying on unexpected url formats.


2008-01-02  Dirk Frederickx (dirk.frederickx@gmail.com)

        * 2.6.1-cvs-3

        * [JSPWIKI-49] Fixed handling of the Editor choice as part of the user preferences.
        When restarting the browser, also the preferred editor setting is recovered.
        Still 2 properties exist to set the default Editor choice (both are kept for bw compat)
        You can choose either one.
          jspwiki.editor=plain
          jspwiki.defaultprefs.template.editor =plain    (=> preferred)

        * All WEBTESTs are now converted to Selenium. They run manually -- still need to verify
        the automatic run via ant.

        * The MORE dropdown is now also available during Login, UserPreferences and Find screens.
        This makes all common links (stored in MoreMenu) more easily accessible.

        * Minor JS refactorings on handling color for GraphBars and ZebraTables.

        * Minor JS refactorings to better support Category styles for IE.

        * Both JSPWiki logo's (shaded and not-shaded image) have been merged in a single .png
        to resolve image flicker at mouse-hover. (especially on ie)


2007-12-10  Andrew Jaquith <ajaquith AT apache DOT org>

        * 2.6.1-cvs-2

        * [JSPWIKI-116] Under certain circumstances, calls to
        UserManager.getUserDatabase() are made before the user database is
        actually initialized, resulting in NPEs. To resolve, we simply replaced
        internal references to m_userDatabase with getUserDatabase(),
        which lazily initializes the database if it has not already happened.

2007-12-25  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.6.1-cvs-1

        * Added SpamFilter.isValidUserProfile() and corresponding checks
        to allow also user registrations to be spam-checked.

2007-12-22  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.6.0!  Woot!

        * Removed JSPWikiToCreoleTranslator (the class was empty and unused)
        in an effort to clean the code base a bit for release.

        * Added some warnings to CreoleFilter & CreoleToJSPWikiTranslator
        to make sure people understand they are experimental features.  Also
        removed WikiCreole from "new features" list.

        * Fixed a number of failing unit tests for Creole by removing a lot of
        line separator management code.  As far as I can tell, it was all
        unnecessary and by accident didn't fail only on Windows.

        * Improved javadocs, removing a number of Checkstyle errors.

2007-12-10  Andrew Jaquith <ajaquith AT apache DOT org>

        * 2.6.0 RC5

        * Checked a new version of web.xml that I inadvertently missed
        in RC3. This resolves [JSPWIKI-92], for real this time. Sorry!

        * Resolved [JSPWIKI-33] by removing all external class dependencies
        in WikiBackgroundThread (other than JSPWiki.jar classes). Also
        changed the default webtests-teardown task in Ant so that web unit
        tests are taken down unless the 'webtests.keepup' property is set.

        * Replaced jug-lgpl with the Apache-licensed version [JSPWIKI-41].

        * The Ant war/test war tasks were not always properly excluding
        test-related jars, such as Selenium. This was causing webapps to
        fail to load in some cases. These jars have now been moved to tests/lib.

        * Adjusted the README file in lib to reflect reality.

2007-12-10  Christoph Sauer <sauer@hs-heilbronn.de>

        * 2.6.1 RC4

        * (I am really not sure if I am numbering right here, since
           I fixed a bug, should the revision number not be incremented
           as well, according to [JSPWIKI:VersioningProposal]?)

        * Fixed Bug in CreoleFilter: When you used the signature
          markup from creole (--~~~~), plugin syntax did not get properly
          translated back into creole markup, so even if you
          typed in <<Plugin>>, it was later displayed in the source
          as [{Plugin}]

        * Added some missing linebreaks in translation

2007-12-10  Andrew Jaquith <ajaquith AT apache DOT org>

        * 2.6.1 RC3

        * Fixed Ant script compatibility issue reported in [JSPWIKI-109].
        JSPWiki's 'war-tomcat'  and 'webtests' tasks now work correctly
        when running under Tomcat 5.5 *and* 6.0.

        * Fixed a compatibility bug that was preventing JSPWiki from
        starting in an older version of Resin [ JSPWIKI-92]. This issue surfaced
        three bugs: web.xml's <description> and <display-name> elements
        were in the wrong order; an unneeded SAX parser feature was being
        set in WebContainerAuthorizer; and (most egregiously) TabTag
        overrode a superclass method, setId(), when it should not have.
        TabTag's implementation has been "pulled up" to WikiTagBase, and it
        now delegates properly to the superclass. In addition, as a bonus,
        all "id" attributes for custom JSPWiki tags are now immunized from
        cross-site scripting injection.

2007-12-05  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.6.0 RC2

        * Changed versioning scheme

2007-12-16  Christoph Sauer <sauer@hs-heilbronn.de>

        * 2.6.2 RC1

        * [JSPWIKI-101]: Fixed, TOC plugin did not call filter

        * Improved MissingTranslations utility, now outputs sorted list
          of diff properties.

        * Added missing german translations

2007-12-10  Andrew Jaquith <ajaquith AT apache DOT org>

        * 2.6.1 RC1

        * Ripped-and-replaced web unit tests and replaced with Selenium.
        Selenium test directory structure replaced with a patched
        selenium-server-0.9.2.jar. Web tests are yet not at parity
        with old (failing) JWebUnit tests, they are pretty good for
        a start. Many thanks to Dirk to figuring out the minor patches
        we needed to get Selenium to work nicely with Mootools.

        * Removed all traces of JMeter, HttpUnit and JWebUnit
        (as much as I could find, anyway).

        * Re-based Selenium tests to tests/etc/selenium/tests.

        * If you want to try developing your own web tests, check out
        Selenium IDE, a FireFox plugin that records user actions
        and generates tests scripts.

2007-12-05  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.6.0 RC1

        * [JSPWIKI-55]: Added patch from David Au to fix pages
        with spaces.

        * [JSPWIKI-62]: Added patch from David Au to fix ShortURLConstructor
        and plain.jsp.

2007-12-10  Dirk Frederickx (dirk.frederickx@gmail.com)

        * Added selenium-core (selenium.core.version=0.8.3, selenium.core.revision=1879)
        with few patches for mootools compatibility.
        (see http://forum.mootools.net/viewtopic.php?id=1639)

        * Added first set of web unit tests based on Selenium.
        Read the tests/selenium-tests/readme.txt for more instructions how to
        run them manually. Automated testruns from ant still need to be setup.

2007-12-05  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.5.166

        * [JSPWIKI-78]: It's no longer possible to recover password
        based on user account name - you need the email address.  Props
        to Ounce Labs.

        * Contents of login.lostpw.help, login.lostpw.name have changed. Updated
        English and Finnish translations accordingly.

        * [JSPWIKI-65]: InsertTag now protects against a problematic XSS injection.
        Thanks to Ounce Labs.

2007-12-04  Dirk Frederickx (dirk.frederickx@gmail.com)

        * 2.5.165

        * [JSPWiki-88] Fixed js bug to tab to group or profile in IE6


2007-12-01  Dirk Frederickx (dirk.frederickx@gmail.com)

        * 2.5.164  : various xss vulnerablilities

        * Wrong Password Error Message May increase Credential Guess [JSPWIKI-85]

        * GROUP parameter validation [JSPWIKI-69]

        * Input Validation of editors pararmeter [JSPWki-67]

        * Resolve commonheader.jsp xss vulnerabilities wrt skins [JSPWIKI- 66]

        * Various wiki tags improvements [JSPWiki-63]

        * Author Tag and Asserted Username [JSPWiki-60]

2007-11-25  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.5.163

        * Rolled back fix to JSPWIKI-74, since a) it's not necessary,
        and b) it kills the performance of the save process.

        * [JSPWIKI-84]: Added note to the jspwiki.properties.

2007-11-??  Andrew Jaquith <ajaquith AT apache DOT org>

        * 2.5.162

        * Fixed [JSPWIKI-82]. We were failing to properly close JDBC connections
        in JDBCUserManager and JDBCGroupManager. Credit: Ounce Labs.

        * Fixed [JSPWIKI-74]. SpamFilter now uses SecureRandom.
        Credit: Ounce Labs.

2007-11-25  Janne Jalkanen <jalkanen@ecyrd.com>

        * Same version, don't want to bump too many times in one day :)

        * [JSPWIKI-46]: it's no longer possible to do redirection on
        nextPage when uploading.  Thanks to Ounce for letting us know.

        * [JSPWIKI-53]: Added patch from Dave Wolf to turn a missing
        policy file -NPE to a proper exception (with explanations).

2007-11-25  Dirk Frederickx (dirk.frederickx@gmail.com)

        * 2.5.161

        * IE wide images also fixed on PREVIEW mode;

        * Stack overflow on IE for login page fixed [JSPWiki-51]

        * %%collapse rendering was incorrect with larger default font-sizes.
        Adapted to height of the colllapse bullets. [JSPWiki-34]

        * Minor adjustment of the smart skin: alignment of search-box and
        header/footer widths.

2007-11-25  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.5.160

        * Applied patch from Harry Metske to slightly speed up PageTimeComparator.

        * [JSPWIKI-47]: SecurityConfig.jsp now ships off by default, but can
        be enabled by setting jspwiki-x.securityconfig.enable=true.  The page
        also has instructions on how to accomplish that, when you try to access
        it.

2007-11-22  Dirk Frederickx (dirk.frederickx@gmail.com)

        * 2.5.159

        * IE fixes for fluid template with very wide images. (cont'd)
        Also fixes a bug introduced in v2.5.155 wrt image formatting.
        [JSPWiki-15, JSPWiki-52]

2007-11-22  Andrew Jaquith <andrew AT freshcookies DOT org>

        * 2.5.158

        * Ant build script for webtests is now much smarter. Web tests now perform a
        "pre-flight" check to make sure preconditions are satisfied before launching.
         If you've wanted to run web tests before but "couldn't get them working."
         the new script should set things right.

2007-11-18  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.5.157

        * [JSPWIKI-21]: Password hash now uses UTF-8 instead of platform default.

        * Cleaned JSPWikiToCreoleTranslator to conform to coding rules

        * CommentedProperties was also storing with platform default encoding.  In
        most cases this would work, but it would create an unwelcome incompatibility
        between regular property files and these property files.  It now explicitly
        uses ISO-8859-1 encoding.

        * Fixed a couple of wrong entities in Spanish and Finnish translations.

        * [JSPWIKI-29]: Per-page RSS links should now be correct again.

2007-11-17  Dirk Frederickx (dirk.frederickx@gmail.com)

        * 2.5.156

        * Removed the error prefix from the successfull LossPassword information message.  [JSPWIKI-26]

        * Small searchbox improvements: search icon now appears inside the search box;
        an empty search is really empty and does not search for the string 'Quick Navigation' anymore.

        * Fixed the search Highlight to cooperate well with AJAX based searches.

2007-11-16  Dirk Frederickx (dirk.frederickx@gmail.com)

        * 2.5.155 - IE6 wide images

        * Fix funny indenting of collapsable list when %%collapse are nested [JSPWiki-34]

        * (finally) Fixing wide image support for ie6 in fluid templates. [JSPWiki-15]
        For IE6 browsers, a <div class="ieimage"> will be inserted around each image. This <div>
        gets a specific overflow-x:auto style, activating proper scrolling for this famous browser.

        * Added a correction to the fixed width template Vanilla-1024x768, to support wide images
        on ie6 here as well. [reported by Harry Metske]


2007-11-12  Juan Pablo Santos (juanpablo.santos@gmail.com)

        * 2.5.154

        * Added support for JMeter (v. 2.3) tests in build.xml & webtests.xml,
        two new properties must be set up at your build.properties: tomcat.protocol
        and @jmeter.home@.

        * Added jmeter-tests.jmx with simple login and logout web tests and
        jmeter-init-workbench.jmx, which contains initial nodes to start recording
        new tests.

        * JWebUnit tests are no longer running when executing the <webtests> target.
        You can keep running them inside your IDE as normal JUnit test or uncomment
        the appropiate section in the <webtests> target.

2007-11-10  Dirk Frederickx (dirk.frederickx@gmail.com)

        * 2.5.153

        * Form element focus was failing on preferences pages in IE [JSPWiki-24]

        * Added TitleBox to the template. When creating a page 'TitleBox', it's contents
        will be included at the top of the header of the wiki site.
        This allows you to put a title message or specific announcements or newsflashes
        on your site. [Suggested by Murray & Janne]

        * Added a new skin PlainVanilla 1024x768, which has a fixed width layout iso
        the fluid layouts used in the default PlainVanilla skin.
        This new skin allows to better support IE browsers when showing wide images.
        (IE has terrible float support)


2007-11-09  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.5.152

        * [JSPWIKI-19]: Fixed localization which was encoding HTML entities
        even though there was no need.

        * [JSPWIKI-12]: Fixed localization.

        * Added Murray's patch for WikiPageRenameEvent.

        * [JSPWIKI-28]: LinkParser was failing dismally with interwiki links.
        Added a new unit test to catch these, and rewrote LinkParser interwiki
        link parsing.

        * LuceneSearchProvider.getAttachmentContent() is now protected for
        subclassers.

        * ClassUtil is now a bit more verbose.

2007-11-07  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.5.151

        * [JSPWIKI-11]: It's now possible to set mail.smtp.starttls.enable
        also from the property file.  Previously it would always default
        to true, making it fail when there was a self-signed certificate
        at the other end.

        * Added an UTF-8 check to SpamFilter to catch bots which munge
        UTF-8 and cause major breakage...

        * Fixed some issues with the password recovery email localizations.

2007-11-3  Dirk Frederickx (dirk.frederickx@gmail.com)

        * 2.5.150 - small template fixes

        * IE6 stuff: fixed the height of actionsTop

        * Smart skin: searchbox didn't show up, several style alignments with vanilla template

        * Finish, Spanish, German I18n : removed some obsolete <br /> tags [JSPWiki-17]

2007-11-1  Dirk Frederickx (dirk.frederickx@gmail.com)

        * 2.5.149 - various ie6 fixes in css and javascript

        * The Accordion style now support dynamic content. Iow, accordion sections
        will dynamically grow/shrink with dynamic content such as collapsible lists or boxes.

        * The body of a page and the Info tab have gotten a css overflow:auto style. to support wide pages.
        When contents becomes too wide (eg wide tables) the pagecontent will overflow horizontally
        with scrollbars at the bottom of the page.
        Add small ie6 fix for wide preformatted {{{blocks}}}
        For ie6, specific proprietary overflow-x style is used.

        * Long values in table filter dropdowns are trimmed to maximum 32chars. This will reduce
        the occurance of wide tables in eg Page Info tab.

        * Added slimbox icon gifs for ie only.

        * IE6 Collapsible List is working again. (finally)

        * IE6 Layout of the Edit and More tabs is now properly aligned with the rest of the page border

        * Fixed the mouse-selection bug on the edit textarea, for ie6.

        * Improved editor toolbar handling for ie6, with better handling of selected text in the textarea.
        [BUGZILLA BUG 118]


2007-10-30  Dirk Frederickx (dirk.frederickx@gmail.com)

        * 2.5.148 - ie6 fixes cont'd

        * Replacing several .png icons by .gif variants, which are better supported
        across browsers. The warning and error icons were swapped. (reported by Murray)

        * Added a small fix on wide pages with {{{blocks}}}

2007-10-29  Dirk Frederickx (dirk.frederickx@gmail.com)

        * 2.5.147 - more IE6 fixes

         * Pages with wide preformatted {{{text blocks}}} where not overflowing correctly on ie6.
         [JSPWiki-2]

         * More updates on collapsible lists for ie6. More testing required.

         * Fixed the SearchBoxMenu to ensure proper width on ie6


 2007-10-27  Dirk Frederickx (dirk.frederickx@gmail.com)

        * 2.5.146 - more IE6 fixes and small gui updates

         * Refactored collapsible lists in view of ie compatibility.
         * Improved layout consistentcy of the quick navigation action buttons
         * Resolved double loading of print.css. (commonheader.jsp)


2007-10-26  Dirk Frederickx (dirk.frederickx@gmail.com)

        * 2.5.145 - many IE6 fixes and small gui updates

        * Heading rendered wrong in IE6, because IE doesn't like floats with margins.
        [JSPWIKI-4]
        * By default, the more-menu is hidden by default, to avoid bumpy screen rendering
        for slower page loads. [JSPWiki-9]
        * TabbedSections in IE6 had annoying additional spacing between tab and body

        * BUGZILLA 115: URL Constructor compatibility is fixed for Ajax enabled searches.

        * Align look n feel of collapsible lists, boxes and accordions.
        All hovered actions now get a consistent, neutral color, instead of the previous orange tint.
        (reported by Murray Altheim)

        * CollapsibleBox update: you can now click anywhere on the title of a collabsible box
        to open or close it. Previously, you had to hit the +/- collapse button.

        * The %%category now supports any url constructor type. (was failing on jspwiki.org)
        The look 'n feel of the category popup has been aligned with Tip-Style.
        (no more orange, but transparent dark grey)

        * The Redo/Undo buttons are moved to the top of the Edit.jsp form, because they function
        irrespective of the search functions.

        * TOC has become a floating element, such that commentboxes and toc's can nicely
        float next to each-other. Downside is that, when entering text right after a TOC, the text will
        float next to the toc. To prevent this, you can always enter a \\ (wiki linebreak) which
        will nicely push the contents under any float. (clear:both)  [JSPWiki-1]

        * added 2 new i18n resources
        javascript.slimbox.previous=&laquo;Previous
        javascript.slimbox.next=Next&raquo;

2007-10-24  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.5.144

        * SpamFilter now has the ability to check against all the
        tests by setting <strategy>score</strategy>.

2007-10-13  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.5.143

        * Some additional improvements to SpamFilter, which now
        keeps track of user sessions and stores some data in it
        (yes, I'm being a bit vague here on purpose).

        * 2.5.142

        * Combined edittime and addr fields into one hash value.

        * Also improved edit process slightly to catch bots.

        * SpamFilter now also matches against the IP address.

2007-09-25  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.5.141

        * Added Murray's patch to allow better extensibility for
        LuceneSearchProvider.

2007-09-23  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.5.140

        * Fixed issue with deploy/redeploy - removed a thrown exception
        in WatchDog, and made the AdminBeans properly unregister upon
        shutdown.

2007-09-19  Janne Jalkanen <jalkanen@ecyrd.com>

        * Updated Finnish localization

2007-09-18  Juan Pablo Santos (juanpablo.santos@gmail.com)

        * Fixed a pair of typos: use of tomcat.host & port instead of localhost:8080 in
        build.xml + cvs.root property pointing to cvs.jspwiki.org instead of
        grey.ecyrd.com and one more localized string at CoreResources.properties,
            - markupparser.link.create = Create &#39;{0}&#39;

2007-09-16  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.5.139

        * [BUG 136]: Fixed several XSS vulnerabilities in plain.jsp,
        commonheader.jsp, GroupContent.jsp, EditGroupContent.jsp,
        InfoContent.jsp, NewGroupContent.jsp, VariableTag, UserProfileTag
        and MessagesTag.  Reported by Jason Kratzer.

        * Fixes a local path disclosure vulnerability in
        BasicAttachmentProvider.  Reported by Jason Kratzer.

        * Updated Finnish localization

        * Also fixed a number of instances of apostrophe (') use in
        localization files - better to use &#39; to avoid loads of nastiness
        with certain constructions.

2007-09-14  Juan Pablo Santos (juanpablo.santos@gmail.com)

        * 2.5.138

        * Localized Referring Pages and Current Time plugins (again, strangely enough,
        the plugins' texts were already in the resource file.). Updated
        referringpagesplugin.more localized text, it was looking for two parameters and
        the plugin uses only one.

        * Localized also Forms Plugins, JSPWikiMarkupParser, PluginContent,
        TranslatorReader and PluginManager. New localized strings:
        + CoreResources.properties
            # JSPWikiMarkupParser
            - markupparser.error.invalidset = Invalid SET found: {0}
            - markupparser.error.nointerwikiref = No InterWiki reference defined in
                    properties for Wiki called '{0}'!
            - markupparser.error.parserfailure = Parser failed: {0}
            - markupparser.error.javascriptattempt = Attempt to output javascript!
        + PluginResources.properties
            # Forms Plugins
            - formclose.noneedtoshow = (no need to show close now)
            - forminput.namemissing = Input element is missing parameter 'name'.
            - forminput.noneedtoshow = (no need to show input field now)
            - formopen.missingparam = The FormOpen element is missing the '{0}'
                    parameter.
            - formopen.postorgetonly = Method must be either 'post' or 'get'
            - formopen.noneedtoshow = (no need to show form open now)
            - formoutput.missingargument = Argument '{0}' required for Form plugin
            - formselect.namemissing = Select element is missing parameter 'name'.
            - formtextarea.noneedtoshow = (no need to show textarea field now)
            - formtextarea.namemissing = Textarea element is missing parameter 'name'.

        * Web tests no longer require the servlet container to be running at
        http://localhost:8080/. Now you can set host & port at the build.properties
        file indicated in build.xml

2007-09-09  Dirk Frederickx (dirk.frederickx@gmail.com)

        * 2.5.137

        * Few javascript fixes for improved URL constructor compatibility [ BUG 115 ]
        The generated links in the ajax search dropdown are now compatible with
        the selected URL constructor.

        * More IE fixes to improve rendering of floats. ( ref. IE6 peekaboo bug )


2007-09-08  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.5.136

        * D'oh, due to some debug code left in CookieAuthenticationLoginModule,
        it was expiring sessions in 30 seconds.

        * AdminUI now shows all known plugins and whether they are compatible
        with this version of JSPWiki.  WikiWizard also gains an AdminBean
        (though it doesn't do anything).

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

        * 2.5.135

        * [Bug 135]: Turned out to be a faulty quote in Finnish translation.

        * [Bug 134]: Ditto.

2007-09-03  Dirk Frederickx (dirk.frederickx@gmail.com)

        * 2.5.134

        * Fixed the JSON-RPC url, to be independent on the url constructor

2007-09-02  Juan Pablo Santos (juanpablo.santos@gmail.com)

        * 2.5.133

        * [Bug 133]: Release.isOlderOrEqual() was not comparing revisions
        properly and, in the end, Editors were not registering. Something
        similar was happening with Release.isNewerOrEqual(), fixed as well.

        * [Bug 122]: Partly fixed. Preferences for default template are now readed
        from jspwiki.properties instead of being hardcoded in
        com.ecyrd.jspwiki.preferences.Preferences. Cfr. with jspwiki.properties.tmpl
        lines 258 - 261.

        * Updated es_ES locales

2007-09-02  Dirk Frederickx (dirk.frederickx@gmail.com)

        * 2.5.132

        * Fixed search menu for Smart skin. (improve compat. with IE)


2007-09-01  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.5.131

        * [Bug 131]: Added Harry Metske's patch to allow "excludeattachments"
        on UnusedPagesPlugin for those who need it.

        * Updated Finnish localization.

2007-09-01  Dirk Frederickx (dirk.frederickx@gmail.com)

        * 2.5.130

        * Fixed missing html attrib in LostPassword tab

        * The Edit findSuggestionMenu has been moved into the Favorites,
        so it nicely accomodates with Left or Right position of the favorites block.

        * [ BUG 132 ] Collapsable lists and boxes now also are rendered in preview mode

        * [ BUG 123 ] Added a confirm box in case you click aways from the page without saving.
        When you leave the edit session without first saving your changees (eg clicking the
        Info tab, clicking any page link, etc.) a popup window asks you to confirm.

        javascript.edit.areyousure=Without clicking the Save button, your changes will be lost. \
            Are you sure you want to exit this page?

        * [ BUG 126 ] Remove 'spurious' css errors.

2007-08-28  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.5.129

        * Fixed a number of bugs in the SpamFilter, and added automatic
        bot detection according to idea from
        http://www.modernbluedesign.com/web-design-blog/fighting-spam-with-css/

        * SpamFilter captcha is now user-settable.  Possible options
        are "none" and "asirra".

        * 2.5.128

        * Added SearchManagerBean to the admin UI.  It's now possible
        to force a reindex of all pages, either from your MBean manager
        or the Admin UI.

2007-08-27  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.5.127

        * Login redirections were failing; fixed with some bubble gum.

2007-08-26  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.5.126

        * Performance optimizations: PagePermission constructor
        no longer uses String.split() but StringUtils.split().
        String.split() is a regexp function, and they're always
        expensive.

2007-08-26  Dirk Frederickx (dirk.frederickx@gmail.com)

        * 2.5.125

        * Add UserBox.jsp

        * Spaces should not break action buttons such as 'Log In' or 'My Prefs'.
        (reported by Murray Altheim)

        * [Bug 120] : Fix unbalanced JSP single or double quote's. (eg on Websphere or BEA)

2007-08-25  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.5.124

        * [Bug 89]: Removed Test plugin (now that IfPlugin can do all the
        same things).

        * [Bug 32]: LuceneSearchProvider now also indexes the page
        with all the non-letters removed.

        * [Bug 121]: RSS.rdf is now only generated of pages to which
        the Anonymous user has access to.

2007-08-24  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.5.123

        * Added Murray's patch to allow static calling of IfPlugin.

2007-08-22  Dirk Frederickx (dirk.frederickx@gmail.com)

        * 2.5.122

        * [Bug 113]: Error with 'join wiki now!' link creating new accounts

2007-08-22  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.5.121

        * [Bug 10]: Fixed.

        * Made findSuggestionMenu transparent since it sometimes blocks
        the view.  Also reduced fontsize a bit.

2007-08-21  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.5.120

        * [Bug 89]: Added support also for [{If var='xyssy' exists='true'}],
        requested by Dirk.

        * Localized WeblogEntryPlugin (strangely enough, the plugin text
        was already in the resource file.)

        * [Bug 39]: Fixed the login issue, but many things still remain.

        * Fixed issue with login email sending which was using a hard-coded
        URL.

2007-08-19  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.5.119

        * [Bug 89]: Added "exists" parameter to IfPlugin.

2007-08-19  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.5.118

        * [Bug 110]: WikiContext.checkAccess() was doing double encoding,
        and therefore pages with spaces would be returning wrong login
        URLs.  Reported by Alex Samad.

        * Fixed a bunch of failing unit tests - the change of "editpage"
        to "createpage" had for some reason slipped everyone's attention.

2007-08-17  Juan Pablo Santos <juanpablo.santos@gmail.com>

        * 2.5.117 - Page renaming caused a NullPointerException under some circumstances,
        filed as Bug 85. Fixed, seemed to be caused when renaming a non-existing page
        (cfr. with http://bugs.jspwiki.org/show_bug.cgi?id=85). Added some JUnit tests to
        check this.

2007-08-15  Dirk Frederickx (dirk.frederickx@gmail.com)

        * 2.5.116 - More fixes for IE

        * More fixes for collapsable lists and the Greeting box.

        * Positioning of popup menu's now also correct on IE.

        * CSS-classes were added reflect anonymous, asserted, authenticed status.
        The SMART skin has user icons reflecting the login status.
        (suggested by Murray Altheim)


2007-08-12  Dirk Frederickx (dirk.frederickx@gmail.com)

        * 2.5.115 - More IE fixes (more to come)

        * Collapsable lists were not working in the current STRICT DTD mode,
        due to a remarkable IE bug (ref. http://mt-olympus.com/emmett/bug_overflow_positionrelative.php )

        * The USER greeting box needed an fix, for IE.

        * Fixed the visibility of the Attachment Tab for IE

        * The handling of the user profile Creation (under login context) and
        user profile modifications (under Pref context) has been fixed.
        Errors during creation or update are now routed back to the correct contexts.


2007-08-06  Dirk Frederickx (dirk.frederickx@gmail.com)

        * 2.5.114 - Few IE fixes

        * Some annoying IE layout issues fixed:
        TAB layouts and positioning of User greeting & login & prefs.
        There is still a major bug on the positioning of the popup menu's
        in IE  which makes the More menu and Navigation menu's not usable.
        Ongoing.

        * Checkboxes for Tab-completion and Smart-typing-pairs are not
        functional in IE, so now they are hidden in that browser. (BUG 103)

        * Added the LoginHelp page.

        * Ensure xhtml compliance when suppressing the PageActionsTop
        in 'login' and 'prefs' context

2007-08-04  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.5.113

        * Added "localheader.jsp", which is included from commonheader.jsp.
        The idea is that it is an "empty" header file which can be safely
        overridden in your local template without having to change
        commonheader.jsp

        * Updated Finnish localization.

2007-08-05  Dirk Frederickx (dirk.frederickx@gmail.com)

        * 2.5.112 - Login/LostPassword/Register user fixes

        * Fixed 'show-all' search results in Find. Only display of blocks of 20 was working.

        * Renamed the css class 'editpage' to 'createpage'
        because that's actually what it is. (BUG 55)

        * Login/LostPassword/Register jsp's clean up and bugfixes:

        Handling of Lost/Reset Password is now properly covered by template jsps. (BUG 38)

        Still todo: the handling of Create/Modify User Profile (part of UserPreference and Login flow)
        need to be refactored. When creating a new user profile in the Login screens, the error handling
        get's processed by UserPrefs. Confusing.

        Some i18n resources where shifted to the right CoreResources or templates.default bundle.
        (this still needs to be done for all language specific resource files !!)

        # Login.jsp  (moved from template.default to CoreResources)
        login.error.capslock=Invalid login (please check your Caps Lock key)
        login.error.password=Not a valid login.
        login.error.noaccess=It seems you don't have access to that. Sorry.

        # moved from CoreResources to template.default  (NOTE: lostpwd changed to lostpw !)
        login.lostpw.reset.clickhere=Click here
        login.lostpw.reset.login={0} to log in once you retrieve your new password.

        * PageActionsTop.jsp was updated to hide the More menu from 'non-page' related contexts.
        The More menu will only be shown in view, edit, comment, diff, info, preview, upload & find

        * The SearchPageHelp was extended with some Lucene hints.

2007-08-04  Janne Jalkanen <jalkanen@ecyrd.com>

        * Updated Finnish localization.

2007-08-05  Juan Pablo Santos <juanpablo.santos@gmail.com>

        * i18nized some JSPs with hard-coded text. New localizable strings:

            - GroupTab.jsp (default.properties)
            grp.createdon
            grp.lastmodified
            grp.groupnames.title
            grp.newgroupname
            grp.savegroup
            grp.savenewgroup
            grp.cancel
            grp.deletegroup
            grp.deletegroup.confirm
            grp.formhelp
            grp.allgroups
            (grp.by removed due to proper use of MessageFormat)

            - NewGroupContent.jsp (default.properties)
            newgroup.creategroup

            - PreferencesContent.jsp (ProfileTab.jsp, default.properties)
            prefs.roles
            prefs.groups
            prefs.creationdate
            prefs.profile.lastmodified

            - UserProfileTag (coreresources.properties)
            userprofile.nogroups
            userprofile.noroles

        * Updated spanish (es_ES) translation.

2007-08-04  Dirk Frederickx (dirk.frederickx@gmail.com)

        * 2.5.111

        * Closing final final XHTML compliancy issues (Closing BUG 9)

        * More menu is now extendable (BUG 20)
        A new page called 'MoreMenu' can now be used to extend the More menu
        with extra stuff, such a links to Recent Changes, Page Index,
        System Info, About, Site Map, etc. The behaviour is similar as for the LeftMenu.
        It is only functional when JS is turned on in your browser.
        Otherwise the more menu is an ordinary dropdown.

        * Fixed Favorites position (left/right) in Edit and Upload view

        * Removed font resizing stuff. No real add value. (and not working in IE anyway)

2007-08-04  Janne Jalkanen <jalkanen@ecyrd.com>

        * "ant war" now compresses jspwiki-edit.js, jspwiki-common.js
        and jspwiki-prefs.js using the Rhino library.  This should bring
        in considerable savings to bandwidth and response.

2007-08-03  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.5.110

        * Added patch from Murray to provide property cascading from
        system properties.

        * Added patch from Murray to provide setting of AclManager
        (use jspwiki.aclManager=<class>).

2007-07-30  Dirk Frederickx (dirk.frederickx@gmail.com)

        * 2.5.109 - internal cleanup of JSP's, few bugfixes (one for IE)

        * Added new <wiki:SetPagination> Tag to get rid of java hacking
        in InfoContent.jsp and AJAXSearch.jsp. Fixed a few bugs on pagination
        as well. Now pagination does show up properly at version=20.
        (reported by Milt Taylor)

        * New marker defined 'jslocalizedstrings' to cleanup commonheader.jsp.
        Some refinement is still needed, but it works for now.

        * Fixed IE crash in jspwiki-edit.js causing edit toolbars not to be
        rendered. (as reported by Milt Taylor)

        * Bugfix: Attachment upload was not working anymore (introduced in 2.5.107)


2007-07-30  Dirk Frederickx (dirk.frederickx@gmail.com)

        * 2.5.108 - template changes & usability

        * The 'Edit' button is now back in its previous position. (after recent popularity poll ;-)
        The 'More' button now has a little down-icon as visual clue that it's actually a dropdown.
        The GoTo-Bottom triangle has been removed (reduce screen clutter, not used much anyway)
        The GoTo-Top button is still there.
        The 'Login', 'Logout' and 'My prefs' are put below Greeting, which is more natural.
        (with still 2 different approachs in the default and Smart skin)

        * New preference added to select Left/Rigth position the Favoristes menu.
        The position of the 'More' menu and 'Find/Recentchanges' dropdowns is now calculated on the fly.

        prefs.user.orientation=Favorites style
        prefs.user.orientation.left=Left
        prefs.user.orientation.right=Left

        * Smart and OrderedList skins are now aligned with latest GUI changes

        *  After setting new UserPreferences, you get now redirected back to the page you came from.
        (similar to login)

        * XHTML compliance improvements.
        Border settings have been removed from img elements. (RecentChangesPlugin,
        RSSCoffeeCupLinkTag, TranslatorReader)
        Replace all <u> in default.properties by <span class="accesskey">

        editor.plain.name=Your <span class='accesskey'>n</span>ame
        editor.plain.email=Homepage or e<span class='accesskey'>m</span>ail
        actions.edit=<span class='acceskey'>E</span>dit
        actions.editparent=<span class='acceskey'>E</span>dit parent page
        actions.prefs=My <span class='acceskey'>P</span>refs
        actions.prefs.title=Manage user preferences [ p ]

        * The attachment img viewers now alos supports capitalised extensions
        (eg both jpg and JPG can be reviewed)

        * Small refactorings on the Tabbed Sections. (simplified TabTag html)
        All content inside a tab, also the floated content, will nicely fit inside the tab.
        (ref bug 101)

2007-07-24  Juan Pablo Santos <juanpablo.santos@gmail.com>

        * Updated spanish (es_ES) translation.

2007-07-24  Janne Jalkanen <jalkanen@ecyrd.com>

        * Just updated Finnish translation and fixed some entity names
        in English translation.

2007-07-23  Dirk Frederickx (dirk.frederickx@gmail.com)

        * 2.5.107

        * Many 'usability' improvements based on many many inputs from
        Claudia, Murray, Alex and Janne. Hope you like them :-)

        All screens now consistenty show 3 TABS (view, attach and info)
        The Edit action has become a 'pseudo' TAB positioned right next
        to the standard set of tabs, but visually different.
        For the time being, Add-Comment remains hidden in the More dropdown
        as it is less frequently used.
        The More action has been visually adjusted as a kind of 'button'.

        The Link tab and Diff tabs are incorporated in the Info screen as
        collapsable boxes, and are only shown depending on the context.
        This brings back all page info (links, version history) back under one
        single place.

        A new --USER-- bar is added with UserName, Login/Register, Prefs and Logout
        actions. These actions are not anylonger in the top pageactions sections.
        This USER bar is positioned at the top of the screen (PlainVanilla skin)
        or in the Favorites sections (SMART skin)

        The bottom page actions have been simplified to the max.
        When clicking the 'goto TOP' triangle, you are just one click away
        from all remaining actions and buttons. (this was the most easiest for now ;-)

        Pending stuff: allow configurable 'quick-links' to be added next to and
        inside the More... menu. Skins may not yet be up to date with all changes
        - expect some glitches here and there.

        * Added link to 'View source page' to the More menu. New i18n property:`
        actions.rawpage=View Page Source

        * Fixed the Diff dropdown selectors when no parameters (r1 and r2) are provided.

        * Editor/Posteditor improvements:
        Checkboxes were added to turn on/off the Tab Completion and
        Smart TypingPairs. Your settings are cookie-fied.
        Some new i18n keywords added:

        editor.plain.smartpairs= Smart Typing Pairs
        editor.plain.smartpairs.title= Auto pairing of () [] {} "" ''
        editor.plain.tabcompletion=Tab Completion (keyword+Tab)
        editor.plain.tabcompletion.title=Auto expansion of keyword to Wiki Markup

        All posteditor functions are now also undo-able.

        The Posteditor now correctly handles Shift+right-arrow in Firefox. (Bug 91)

        * Fixed Bug 86 Commentbox and Tabbedsection not playing well (reported by Alex Samad)


2007-07-20  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.5.106

        * Fixes an XSS vulnerability with evilly formed links.
        Reported by Igor Minar.

2007-07-18  Janne Jalkanen <Janne.Jalkanen@ecyrd.com>

        * 2.5.105

        * AdminUI has now rudimentary user management - it's now
        possible to add, change and remove user accounts using the adminUI.
        AdminUI is reachable through admin/Admin.jsp.

2007-07-18  Dirk Frederickx (dirk.frederickx@gmail.com)

        * 2.5.104

        * The "Home" link now get's the actual name of the home/front page
        (suggested by Claudua Frers)
        Remove the key='actions.home'  from i18n properties

        * Fixed floating issue between TabbedSections and CommentBoxes inside pages.
        (reported by Alex Samad)

        * More xhtml fixes on PreferncesTab and default.properties.

2007-07-18  Janne Jalkanen <Janne.Jalkanen@ecyrd.com>

        * 2.5.103

        * [Bug 21]: Turned out to be a problem of self-referencing
        pages.

        * [Bug 85]: Added an extra check for this case.  It still throws
        an exception, but at least it's a lot more useful to debug.

        * [Bug 25]: Was related to Bug 21.  Added test cases and fixed.

        * Added IfPlugin; thanks to Scott A. Bybee who explained to me
        how useful conditional wikitext can be.

        * [Bug 87]: Login process now returns you to the same page
        where you chose to login.

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

        * Updated Finnish localization.

2007-07-17  Dirk Frederickx (dirk.frederickx@gmail.com)

        * No version bump -- some small fixes only.

        * Few small IE6 tweaks: position of actionmenu popup,
        position of triangle icons for top and bottom link

        * Remaining xhtml issues (empty <td/> are not allowed) (BUG 9)
        All pages of xhtml compliant, excpet UserPreferences.

2007-07-17 Christoph Sauer (sauer@hs-heilbronn.de)

        * 2.5.102

        * Bug 13 fixed. Chuck found that by using WikiWizard 1.1.1 instead of 1.1,
          it would load properly. However, it would not import the text with JavaScript
          due to a new security mechanism built into Mac OS X. To remedy this problem,
          we added scriptable="true" to the applet tag and it should work now.

       *  Added missing german localisations. Added a class called MissingTranslations
          that helps diff the ressource property files. Adapt it to your localisation
          and run it directly in your IDE.

2007-07-14  Dirk Frederickx (dirk.frederickx@gmail.com)

        * 2.5.101

        * Few more xhtml issues resolved.

        * Default Template is now fixed for IE6.

        * Edit Assist toolbar tips localized.
          New localisable items, since v2.5.100

            editor.plain.posteditor=Enter Keyword+Tab:
            editor.plain.posteditor.title=shift+enter for next next field
            editor.plain.editassist=Edit Assist
            editor.plain.editassist.title=Toggle Edit Assist buttons
            editor.plain.tbLink.title=link - Insert wiki link
            editor.plain.tbH1.title=h1 - Insert heading1
            editor.plain.tbH2.title=h2 - Insert heading2
            editor.plain.tbH3.title=h3 - Insert heading3
            editor.plain.tbHR.title=hr - Insert horizontal ruler
            editor.plain.tbBR.title=br - Insert line break
            editor.plain.tbPRE.title=pre - Insert preformatted block
            editor.plain.tbDL.title=dl - Insert definition list
            editor.plain.tbB.title=bold
            editor.plain.tbI.title=italiceditor.plain.tbMONO.title=mono - monospace
            editor.plain.tbSUP.title=sup - superscript
            editor.plain.tbSUB.title=sub - subscript
            editor.plain.tbSTRIKE.title=strike - strikethrough
            editor.plain.tbTOC.title=toc - Insert table of contents
            editor.plain.tbTAB.title=tab - Insert tabbed section
            editor.plain.tbTABLE.title=table - Insert table
            editor.plain.tbIMG.title=img - Insert image
            editor.plain.tbCODE.title=code - Insert code block
            editor.plain.tbQUOTE.title=quote - Insert quoted block
            editor.plain.tbSIGN.title=sign - Insert your signature

2007-07-14  Dirk Frederickx (dirk.frederickx@gmail.com)

        * 2.5.100

        * Finalising xhtml fixes. I hope to close (BUG 9) really soon now.

        * The Frontpage variable can not be use cause it is not always set.
        Falling back to engine.getFrontPage() (BUG 82)

        * The Edit Assist and the resize bar are now also availble in the Add Comment page

        * The Edit Assist buttons have been improved. Pressing a button will replace the selected
        text properly, instead of just overwriting it. (EG, select a word and press the BOLD button
        to replace theword by __word__) Also the handling of newline has been improved as
        some markup should always appear at the start of a new line. (EG, headers, tables, ...)
        (ref also BUG 83)

        * Experimental, but looks promising ;-)  When JSPWiki rendered on a narrow screen, (eg 200x320px)
        page-tabs were overlapping with page-actions, and not usable anymore.
        Now, the tabs nicely shift below the page-actions when the screen is very small.
        This will help JSPWiki to be usable on mobile divices such as S60 or iPhone. (BUG 80)
        As always:: please test this on IE browsers and feedback. Testing was done FF, Safari, Opera and Camino ok.

        * The Smart and OrderList skin have now aligned with latest pageactions changes

2007-07-14  Janne Jalkanen <Janne.Jalkanen@ecyrd.com>

        * 2.5.99

        * [Bug 77]: We were starting two FilterManagers - apps were
        registering to the other one, and events were fired with the
        other one... Heh.

        * Startup now outputs a lot more useful info about the environment
        (enabled by setting WikiEngine to DEBUG).

        * WebSphere Community Edition (WSCE 1.0) was crashing at startup,
        due to AuthenticationManager.hasCookieAuthentication() assuming
        non-null JAAS lists.

        * TestHttpServletRequest now returns a sane locale (so that no
        NPE's occur anymore in tests).

        * Updated Finnish localization up-to-date.

2007-07-14  Juan Pablo Santos <juanpablo.santos@gmail.com>

        * Checked in spanish (es_ES) translation.

        * Added localization for validateNotNull at InputValidator, one new
        localizable string in CoreResources:

           - validate.cantbenull

2007-07-13  Christoph Sauer <sauer@hs-heilbronn.de>

        * checked in missing /com/ecyrd/jspwiki/plugin/PluginResources
          german translation. [Bug 74] closed.

2007-07-12  Christoph Sauer <sauer@hs-heilbronn.de>

        * 2.5.98

        * Added jspwiki.basicAttachmentProvider.disableCache property. It takes
          a regex that let you define for which filename patterns to disable the
          browser cache. See more on this in the jspwiki.properties.tmpl comment

        * Fixed Bug in CreolePageFilter: Two tables seperated by a blank line
          where rendered as one table

        * Checked in German localisation for CoreResources

2007-07-12  Janne Jalkanen <Janne.Jalkanen@ecyrd.com>

        * 2.5.97

        * Changed "validate.unsafechars" i18n pattern to fix a fatal
        bug with it.  Also deleted "validate.invalidid", since it's no
        longer needed.

        * Updated Finnish localization (fi).

2007-07-11  Janne Jalkanen <Janne.Jalkanen@ecyrd.com>

        * 2.5.96

        * Added a bunch of missing localizations, reported by Youheng Hu.
        New localizable strings in CoreResources are:

           - security.error.createprofilebeforelogin
           - security.error.blankpassword
           - security.error.passwordnomatch
           - security.error.illegalfullname
           - security.error.illegalloginname
           - security.user.loginname
           - security.user.fullname
           - security.user.email
           - validate.unsafechars
           - validate.invalidemail
           - validate.invalidid

        * WikiSession gains getLocale() method, which provides a cached
        locale object.

2007-07-10  Janne Jalkanen <Janne.Jalkanen@ecyrd.com>

        * [BUG 81] Added the _en resource bundles to the JAR build by copying
        the default bundles in build.xml.  No bump, no functionality change.

2007-07-09  Dirk Frederickx (dirk.frederickx@gmail.com)

        * 2.5.95

        * Stabilising 2.5.94.

        * Remove editor type selector from CommentContent.jsp

        * Bugfix on tab switching in the Login and UserPreferences pages

        * Bugfix: the SIGN shortcut was not working in Edit Assist

        * Bugfix: typo in commonheader.jsp caused jspwiki-edit.js to be loaded twice

        * Bugfix: z-index adjusted for More.. menu to satisfy IE editors.

        * Fixed remaining xhtml issues. (BUG  9)


2007-07-08  Dirk Frederickx (dirk.frederickx@gmail.com)

        * 2.5.94

        * Cookie handling has been refactored. JSPWikiUserPrefs is now JSON based.
        Also the height of the edit textarea is 'cookiefied', so jspwiki remembers
        your prefered height of the editor area. (BUG 67)
        The RecentSearches memory has been added to the JSPWikiUserPrefs and doesn't require
        an additional cookie. (less cookie dirt)

        * Replace all hardcoded references to 'Main' by 'wiki.frontPage'  (BUG 42)

        * Improved the loading of additional Javascript chunks. jspwiki-edit.js is now
        only loaded with plain.jsp, so no more interference with WikiWizard (BUG 78)

        * Major refactoring of the 'More...' dropdown menu. It now perfectly runs on Firefox,
        Opera, Camina, Safari and (i hope ;-) on IE. Plse test test test on IE6 and IE7 and report
        bugs. The new menu is also XHTML compliant.
        Many improvements have been done on the remaining XHTML compliancy issues.

        * The Editor type selector is now moved to the UserPreferences page, instead of the
        Edit.jsp. Changing the editor type during an edit session was dangerous,
        as changes to the page are not saved. Now you can set your preferred editor in MyPrefs.

        * The editor textarea has been boosted with Posteditor
        (see http://icebeat.bitacoras.com/mootools/posteditor/ for a demo)
        The textarea now supports the TAB key, smart 'typing pairs' (suchs as () [] {} )
        and has some fancy tab-completion of commonly used commands.
        Try entering toc+TAB to see the effect.
        The PostEditor is only functional on non-IE browsers, and if Javascript is on.

        * The Editor assist toolbar provides a set of buttons to assist newbies in entering
        wiki markup. Supports both non-IE as IE, only if Javascript is on.


2007-07-06  Janne Jalkanen <Janne.Jalkanen@ecyrd.com>

        * 2.5.93

        * RESOURCE_HTTPHEADER didn't work if adding dates.

        * AdminBeanManager is now a bit more robust if a bean is already
        registered.  Thanks to Alex Samad for the patch.

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

        * 2.5.92

        * DiffProviders are now localized.  Unfortunately, this meant an API
        change, so WikiEngine.makeDiff() now takes a WikiContext as a parameter.
        I don't think many people were using it, though, so it's not a major
        issue.

        * New localizations in CoreResources-bundle:

            - diff.traditional.added
            - diff.traditional.changed
            - diff.traditional.removed
            - diff.traditional.oneline
            - diff.traditional.lines

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

        * 2.5.91

        * There have been loads and loads of fixes to Checkstyle warnings.

        * Added RESOURE_HTTPHEADER from Alex Samad.  Thanks!

2007-06-30  Janne Jalkanen <Janne.Jalkanen@ecyrd.com>

        * 2.5.90

        * [Bug 71]: Login.jsp is now localized.  All localizers, please
        note that there are three new strings to localize in
        "templates.default" -bundle:

            - login.error.capslock
            - login.error.password
            - login.error.noaccess

        * In addition, there are further localization done in top-level
        JSPs.  New strings in CoreResources are:

            - security.error.noaccess.logged
            - security.error.noaccess
            - security.error.wrongip
            - rename.empty
            - rename.error.title
            - rename.error.reason
            - rename.identical
            - rename.exists
            - rename.unknownerror
            - lostpwd.newpassword.email
            - lostpwd.newpassword.subject
            - lostpwd.nouser
            - lostpwd.nomail
            - lostpwd.emailed
            - lostpwd.reset.title
            - lostpwd.reset.clickhere
            - lostpwd.reset.login
            - lostpwd.reset.unable
            - lostpwd.reset.blurb
            - lostpwd.reset.submit

        * Updated English and Finnish localizations (and fixed a couple of
        sillinesses in the Finnish localization)

2007-06-23  Dirk Frederickx (dirk.frederickx@gmail.com)

        * 2.5.89

        * Cookie handling has been refactored. JSPWikiUserPrefs is now JSON based.
        Also the height of the edit textarea is 'cookiefied', so jspwiki remembers
        your prefered height of the editor area. (BUG 67)

        * Fixed handling of form focus() logic. JSPWiki now correctly puts the focus
        on the first visible form element. This also resolves a JS crash on IE.

        * Some improvement on XHTML compliance (BUG 9) Still some refactoring
        needed on dropdown menu to improve compliance.

        * Added UTF8 support to AJAXSearch.jsp

2007-06-18  Janne Jalkanen <Janne.Jalkanen@ecyrd.com>

        * 2.5.88

        * [Bug 24]: BugReportHandler no longer talks about "bug
        reports", but pages.  Reported by Gregor Hagedorn.

2007-06-16  Dirk Frederickx (dirk.frederickx@gmail.com)

        * 2.5.87

        * BUG 62 resolved: no sensitve info in LeftMenu during Login.

        * Fix some SkinName issue relate to the new preferences object.

        * BUG 52 resolved: Diff.jsp and PageInfo.jsp should not be indexed

        * TextArea resize bar image.

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

        * 2.5.86

        * [Bug 29], search path is now trim()med properly. Thanks
        to David Au.

        * A couple of fixes to warnings courtesy of Alex Samad.

        * [Bug 12], AM/PM are now correct in preferences.

        * Created new Preferences object, and refactored some old
        preferences code from commonheader.jsp into it.  This also
        means that instead of using ${prefTimeZone} you would use
        ${prefs["TimeZone"]} in your variables.  This is far more
        extensible and future-proof than before.  The HttpSession
        now gets a Preferences object under the name "prefs".  There
        are also some utility methods in the Preferences class which
        abstract this away.  (It's also a lot faster because we do
        not parse the cookie every single time.)

        * [Bug 63]: The default eclipse coding style file now
        has .xml suffix.

        * Checkstyle config under doc/eclipse also now gains a .xml
        suffix.

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

        * 2.5.85

        * Bug fix: Bug 58, BreadcrumbsTag.java does not compile under JDK 6

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

        * 2.5.84

        * Bug fix: Bug 8, Multiple spaces in page names are not cleaned

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

        * Added Finnish localization.  No version bump, as there
        is no functionality change.

2007-06-11  Dirk Frederickx (dirk.frederickx@gmail.com)

        * 2.5.83

        * Fixed blocking IE javascript bug.

2007-06-11  Christoph Sauer (sauer@hs-heilbronn.de)

        * 2.5.82

        * Added German localisation.

        * Added missing i18n tags in PageInfo and UserPreferences

2007-06-10  Janne Jalkanen <Janne.Jalkanen@ecyrd.com>

       * 2.5.81

       * Fixed a couple of localization issues (diff tab
       was not localized properly).

2007-06-09  Dirk Frederickx (dirk.frederickx@gmail.com)

       * Several XHTML STRICT compliance issues fixed.

2007-06-09  Dirk Frederickx (dirk.frederickx@gmail.com)

       * 2.5.80

       * Refactoring of SubmitOnce functionality, such that is doesn't harm
       when javascript is off. Wiki.SubmitOnce() prevents you from pressing
       submit buttons multiple times.
       Editing is now possible (and login etc.) while javascript is off.
       (ref. http://bugs.jspwiki.org/show_bug.cgi?id=3)

       * Added experimental GroupTab.

       * Info tab added to Upload.jsp

       * Minor missing i18n fixed. Small css fixes


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

       * 2.5.79

       * Fixed minor issue with default template saying "go" instead
       of "find".

       * First alpha release of JSPWiki 2.6.

2007-06-09  Andrew Jaquith <andrew AT freshcookies DOT org>

       * 2.5.78

       * Even more little fixes to remove Checkstyle issues.

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

       * 2.5.77

       * Refactored EditorIteratorTag; Added editor changes
       to the UserPreferences.

2007-06-09  Dirk Frederickx (dirk.frederickx@gmail.com)

       * Info tab is back, now making use of the new tab url parameter.

       * Stylesheets of the Smart and OrderedList skins have been refactored.

       * Submit of the quick Navigation menu now defaults back to the
       advanced Search page. The same applies to clicking the looking-glass icon.

       * Upgraded to mootools v1.11

2007-06-05  Christoph Sauer (sauer@hs-heilbronn.de)

       * 2.5.76

       * JSPWiki now supports WikiCreole 1.0:
       Checked in CreoleToJSPWiki renderer plus CreolePageFilter.
       This will allow users to operate JSPWiki in WikiCreole mixed mode.
       see http://www.wikicreole.org for more infos about WikiCreole.

2007-06-03  Dirk Frederickx (dirk.frederickx@gmail.com)

       * Same version

       * Progress bar fixed to run on Safari or Opera as well.
       It uses now css style visibility:hidden iso display:none.

       * Minor css fixes.

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

       * 2.5.75

       * JSON interface now actually checks whether the user has
       permission to call the methods.  This was a relatively major
       security hole... :-)

       * Performance optimization to JSONSearch.

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

       * 2.5.74

       * Remaining patches from David to FCK editor support.

2007-06-03  Dirk Frederickx (dirk.frederickx@gmail.com)

       * 2.5.73

       * In-page Upload Progress Bar has been added based on jsonrpc backend.
       (i'm not yet 100% sure on the cross browser compatibility - can anybody
       check this on ie win ?)  This replaces the Progress.Popup jsp.

       * Cookie handling fixed. Bug caused text-area size to be mixed up
       with font size.

       * New sort-icons added. Sortable tables have a better visibility now.

2007-06-02  Janne Jalkanen <Janne.Jalkanen@ecyrd.com>

       * 2.5.72

       * D'oh, David's patch didn't make it completely to CVS.  Now
       it should be there.

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

       * 2.5.71

       * Added UserManager.JSONUserModule

       * Fixed Admin.jsp such that it can no longer be invoked
       accidentally (don't expect it to be available in initial alphas).
       Turn on "jspwiki-x.adminui.enable=true" to see how it works.

       * Added initial, non-functional user management tab in Admin.jsp.

       * Added new AjaxWiki object to jspwiki-common.js to simplify AJAX
       calls (mootools is nice, but their AJAX API is insanely complex).

       * Added Murray's patch to enable event monitoring.

       * Added David Au's patch to fix remaining issues in FCK integration.

       * fckconfig.js: Disabled 'Insert Flash' button.

       * FCK.jsp: Fixed issue where image attachments would not be displayed
       when accessing JSPWiki via https.

       * PluginContent.java: Fixed issue where plugin error messages were
       appearing in FCK's editor area.

       * WysiwygEditingRenderer.java: Fixed issue where pagenames were
       appearing in their URL-encoded format in the href.

       * XHtmlElementToWikiTranslator.java: Beautify the generated wiki markup
       by printing a newline character after a linebreak. Fixed issue when
       generating wiki links with spaces in the pagename.  Don't print a
       extraneous space after a link or an image anymore.

       * WysiwygEditingRendererTest.java: Added tests for pagenames with
       spaces.

       * HtmlStringToWikiTranslatorTest.java: Fixed several unit tests broken
       by this latest set of changes.


2007-05-30  Andrew Jaquith <andrew AT freshcookies DOT org>

       * 2.5.70

       * Many, many little fixes to remove Checkstyle issues.

       * Removed the two-argument constructor from GroupPrincipal
       and its associated "wiki" field. This interacted in a
       very subtle way with LocalPolicy to prevent GroupPrincipal
       privilege grants from being processed correctly. We
       concluded that this "feature", while intended to be used
       with multi-wiki environments, was fatally broken from the
       start. This change is purely "under the covers" and users will
       not notice the difference or need to do anything special.

       * Minor tweaks to SessionMonitor and AuthorizationManager
       that should slightly reduce memory leak potential.

       * Introduced a new exception called DecisionRequiredException
       that denotes when an operation cannot complete because
       a person must make a decision. It is thrown by WikiEngine.saveText()
       and UserManager.setProfile().

2007-05-29  Janne Jalkanen <Janne.Jalkanen@ecyrd.com>

       * 2.5.69

       * Renamed TEST plugin as Test to be more in line with
       Java class naming conventions.  Updated jspwiki_module.xml
       to still use TEST as an alias.

       * Tiny tweaks to some tests, who should now tell you
       what to do if they cannot connect to a database.

2007-05-29  Andrew Jaquith <andrew AT freshcookies DOT org>

       * 2.5.68

       * Fixed a bug in the Ant script that were causing tests
       to refuse to run sometimes because of an (erroneous)
       Hypersonic error.

       * As of this build, we have eliminated the need to sign
       JSPWiki JARs for 95% of most users' deployments. The only
       case where you need to sign them, now, is when you wish
       to create a JVM-wide, consolidated security policy. We have
       retained an Ant target "signjar" for that purpose. If you
       are upgrading from an earlier version of JSPWiki and are
       using a customized policy, however, you MUST MUST MUST
       remove any "signedBy jspwiki" and "keystore" references,
       otherwise JSPWiki might act odd.

       * The container-specific/JVM-wide parts of the Java
       security policy have been moved to a new file,
       etc/jspwiki-container.policy. This is NOT bundled into
       the WAR because it isn't needed there in any event...

2007-05-28  Dirk Frederickx (dirk.frederickx@gmail.com)

       * SMART skin updated. Few bugfixes

2007-05-27  Janne Jalkanen <Janne.Jalkanen@ecyrd.com>

       * 2.5.67

       * WeblogPlugin now considers ACLs - if the user does not have
       view permission on an entry, it's ignored on display.  Also
       refactored the WeblogPlugin slightly to be more legible.

       * 2.5.66

       * Added "url" parameter to TabTag to allow for Javascript-less
       tabs.

       * Removed WikiEventManager.WikiEventDelegate.m_client field, as
       it was not used anywhere.

       * UploadTemplate.jsp now uses the "url" parameter so that it's not
       possible to get broken URLs anymore (i.e. it looks just like a regular
       page view, but the URL says "Upload.jsp").  This would be pretty
       confusing to an user if you sent the wrong URL in email, and the
       recipient didn't e.g. have access to Upload.jsp, but did to Wiki.jsp...

       * Added doc/eclipse/jspwiki-checkstyle Checkstyle Eclipse preferences.

       * Added patch from Juan Pablo Santos Rodriques to add i18n targets
       to build.xml.

2007-05-26  Andrew Jaquith <andrew AT freshcookies DOT org>

       * 2.5.65

       * Lots of little fixes for bugs FindBugs found.

2007-05-26  Dirk Frederickx (dirk.frederickx@gmail.com)

       * 2.5.64 - 4th Brushed Template commit (still more to come)

       * Font size fixed. Various css enhancements. Skins not yet finished.

       * Enhanced Find page, including search scope (author, pagename, attachement),
       and on/off checkbox for find details. Find page is now ajax driven, but also
       functions properly when javascript is off.

       * Edit textarea is resizeable, with a cool drag effect.

       * GoToBottom and GoToTop links have icons instead of >> and <<

       * Refactoring of Collapse and CollapseBox. New icons (+ and -) are being used.

       * Bugfixes on Tips JSPWiki style

       * Test Plugin added, to enhance use of JSPWiki variables.
       EG you can now use [{TEST name="context" match="edit"  ...some body... }]
       for specific content in your leftmenu.
       More info at http://www.jspwiki.org/wiki/BrushedConditionalPlugin


2007-05-25  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

       * 2.5.63

       * Fixed a couple of typos in default template (thanks to Frank Fischer).

       * Fixed a couple of typos in code (thanks to Murray Altheim).

       * Fixed HTML editor crashing when editing (thanks to David Au).

2007-05-22  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

       * 2.5.62

       * Added CookieAuthenticationLoginModule.  This module stores
       an UID in the user's browser, and automatically logs the user
       in, if the cookie exists.  This can be a security hazard, so
       it is a good idea to disable it in jspwiki.jaas, if you are
       worried about local users being able to spoof identities.
       For this reason, it's by default disabled in jspwiki.jaas

       * Modified LoginContent.jsp to contain "Remember me?" checkbox.

2007-05-20  Andrew Jaquith <andrew AT freshcookies DOT org>

       * 2.5.61

       * Fixed the last of the failing JWebUnit tests. Also added a new one
       that verifies that profile renaming operations correctly re-set group
       memberships and page ACLs.

2007-05-20  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

       * 2.5.60

       * New, improved SpamFilter with Captcha recognition, if we
       suspect you to be a spammer.  Captcha system is currently based
       on Microsoft Research's Asirra, though we will probably want
       to make it pluggable.  I have to admit that this required
       far too much surgery in Edit.jsp to be nothing but a hack,
       but I have to get it off my hard drive.  In addition,
       commenting does not work, if spam is detected.

2007-05-19  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

       * 2.5.59

       * Again, a number of CheckStyle issues fixed.

       * Switched to new HttpMultipartRequest library (2.00b9)

       * Added upload progress bar.  Unfortunately, it's still kinda
       kludgy, but we'll try to fix it.  The backend stuff works; it's just
       the UI which looks like a brick of legos built by a two-year old.

       * New package: com.ecyrd.jspwiki.ui.progress, which manages different
       kinds of progress systems.

2007-05-14  Dirk Frederickx (dirk.frederickx@gmail.com)

       * i18n default.properties included, inline with last BrushedTemplate commit

2007-05-11  Dirk Frederickx (dirk.frederickx@gmail.com)

       * 2.5.58 - 3nd Brushed Template commit (still more to come)

       * Quick Navigation box has been refactored and now uses the new RPC-JSON in the backend.
       Search icon added.

       * Update of all Editors, including FCK and WikiWizard. (i18n alignment)
       you can now also use wysiwyg editors in the Comment.jsp. There is still a
       widht/heigh bug in the combination WikiWizard & FireFox (visible in Comment.jsp)

       * Font-size is based on the default browser settings. For FF this is pretty large.
       You can now adjust the font-size in the UserPreferences.

       * Many bugfixes: e.g cookie handling.


2007-05-13  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

       * Installed "FindBugs" and "Checkstyle", and found about 1500
       problems.  This update fixes a number of minor code style issues.
       No functionality changes, therefore no revision bump.


2007-05-11  Dirk Frederickx (dirk.frederickx@gmail.com)

       * 2.5.57 - 2nd Brushed Template commit (more to come)

       * Remove Info tab from all screens, as it causes overload on the wiki server,
       but also to avoid confusion when similar screens are served from different URLs.
       The info page has back it own existence, with small optimalisations.

       * Mootools library upgraded to v1.1, just released

       * Added code prettifier from Google. (use %%prettify around code blocks)

       * Several smaller refactorings on jsp's and i18n default.properties
       The new more-info menu gets replaced by dropdown when browser has javascript on.

       * Bugfix on numberformat reported by Frank Fisher.
       See http://www.jspwiki.org/wiki/BugAttachmentAndInfoTabsAreBlank


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

       * 2.5.56

       * Tiny refactorings all over the place; removing unnecessary
       imports, renaming fields, removing compiler warnings,
       that sort of stuff.

       * Removed jmxri.jar and jmxtools.jar from the distro - since
       we require 1.5 anyway to compile, there's not much point in
       putting them in here.  Most J2EE containers already ship
       with a JMX implementation anyway.

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

       * 2.5.55

       * Tiny optimization for PageManager, improving the performance
       for pageExists(String,int), if CachingProvider is in use.
       This should help considerably in listing page histories.

2007-05-07  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

       * 2.5.54

       * Several performance optimizations, including:

       * Added PermissionFactory, which caches the permissions using
       a WeakHashMap.  Creation of PagePermissions is relatively expensive
       due to permissions parsing, so this should help a lot.  All routines
       should be using the PermissionFactory.getPagePermission(), if possible.

       * Refactored AbstractCommand constructor so that it no longer uses
       String.replaceAll(), which is a very expensive operation due to
       regular expressions.  It's still expensive, but the biggest pain
       point is now resolved.

       * InfoTab just lists ReferringPages one deep - three-level deep nesting
       ended up using something like 30% of all CPU power on a moderately
       link-heavy page.

       * Bug fix: if the user updated his account (e.g. by requesting a new
       password) AND his account was created in the old days when
       XMLUserDatabase was using platform default formatting for dates,
       the dates were in different formats, causing XMLUserDatabase to
       behave irrationally.

       * ReferredPagesPlugin now allocates a bigger buffer for creating
       html to avoid allocation overhead.  Ditto for TabbedSectionTag.

2007-05-06  Andrew Jaquith <andrew AT freshcookies DOT org>

       * 2.5.53

       * Changed the behavior of the UserDatabase and GroupDatabase classes
       so that the save/delete methods are atomic. Consequently, the
       commit() methods in these classes are deprecated and will be removed
       in a future release. The reason for this change is simple: the
       commit() methods made no sense and were never *not* used. Also, added
       a new method, rename(), that permits renaming of profile login names.
       References to commit() were removed from all classes, including
       test classes.

       * Recently added status flags for UserCheckTag were moved to
       UserProfileTag and renamed. The new property values are
       "canChangePassword" and "canChangeLoginName" and are used in
       ProfileTab.jsp to selectively display input fields. These
       properties also allow negation too (e.g., !canChangePassword).

       * UserManager receives final tweaks to allow profile renaming.
       Modified ProfileTab.jsp slightly to accommodate this new feature.

       * Minor de-stringification and anal-retentive i18n tweaks.

       * Fixed several failing web unit tests. A few still fail, though.

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

       * 2.5.52

       * Fixed TemplateManager.listSkins() so that it returns only
       directories, not everything.

       * Added SearchManager.JSONSearch.findPages(), though be warned that
       it can be really slow.  An API change to SearchProvider needs to be
       done before this can be fixed.

       * Reformatted ChangeLog to word wrap at column 80 to make it more
       readable...

       * A major commit of new Admin.jsp and AdminTemplate.jsp and all the
       related paraphernalia.  It's not yet complete, but the framework is
       getting there.  Due to the use of JMX, JSPWiki now requires JDK 1.5
       to compile (though it should happily continue to run under 1.4 as
       well).

2007-05-03  Dirk Frederickx (dirk.frederickx@gmail.com)

       * 2.5.51 - Brushed Template incorporated.

       * Bulk commit of Brushed Template. Expect things to be broken :-)
       JSPWiki now has a tabbed-user interface, skins, slimbox attach-viewer,
       improved jspwiki-styles suchs as table-filters, accordions, tips,
       etc. etc...  Look 'n feel is still very ikea like.  Read the
       jspwiki.css to change color scheme.  Additional menu items are now
       visible via a "More...." dropdown.

       * Javascript is based on the mootools library.

       * Many JSPs are now driven by JSTL's EL. Not yet 100% completed.

       * Only plain editor has been updated. No work done yet on WikiWizard,
       FCK

       * The JSPWiki template has been tested on safari and FF.
       Feedback on IE 6.x and 7.x. is appreciated.

       * RecentChanges plugin now sets colspan correctly. (formatting of
       recent changes page)

       * Two skins added: Smart and OrderedList. These skins are not yet
       tested 100%.


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

       * Enhancement: checked in back-end code that removes the restriction
       on changing login names and user names ("full names") after
       registration. To do this, UserManager emits a new WikiSecurityEvent
       called PROFILE_NAME_CHANGED that signals when the login name or user
       name changes. PageManager and GroupManager listen for this event,
       and will make all appropriate changes to page ACLs and groups that
       contain the old user name(s). The front-end changes (JSP tweaks)
       are nearly finished and will be checked in shortly.

       * Added a new method for AclManager, setPermissions(), that persists
       Acls. The DefaultAclManager (which extracts Acls from wiki page markup)
       implements setPermissions() by injecting the [{ALLOW ....}] markup
       into the wiki page.

       * Synchronized thread-sensitive methods in the AclImpl/AclEntryImpl
       class.

2007-04-28  Andrew Jaquith <andrew AT freshcookies DOT org>

       * Enhancement: user profile JSPs no longer request a distinct wiki
       name when a user registers. The wiki name is now computed automtically;
       it is the user name without any whitespace. This change should make
       registration even easier.  In the various user manager/database
       classes, UserProfile/DefaultUserProfile.setWikiName() is hereby
       deprecated and will be removed in a future release. However,
       getWikiName() remains, as does the UserDatabase method findByWikiName().
       The UserDatabase classes do not change their public APIs, and they
       still persist WikiNames so that they can be searched. However, when
       UserManager loads a profile from the UserDatabase, it always re-computes
       the wiki name.

       * Tweaked i18n resource file to remove references to "wiki names" in
       favor of just plain old "names." Typographically correct curly quotes
       were substituted wherever needed.

2007-04-23  Christoph Sauer <sauer AT hs-heilbronn DOT de>

      * 2.5.48 - Bugfix

      * Bugfix: NullPointer Exception on initReferenceManager, reason
        was that it indirectly uses the filterManager -> m_filterManager
        has to be initialized before.


2007-04-23  Andrew Jaquith <andrew AT freshcookies DOT org>

       * 2.5.47 aka the JavaMail refactoring release

       * Enhancement: To increase security, MailUtil gains the ability to use
       container-managed JNDI JavaMail session factories, in addition to the
       standalone factory configured via jspwiki.properties. JNDI is now the
       preferred method of obtaining mail sessions, and will always be attempted
       first before falling back to the stand-alone method. See the JavaDocs
       for MailUtil. All of MailUtil's internal code, test properties
       and JavaDocs were also totally refactored. A sample JNDI block for JavaMail
       was added to web.xml; it is commented out by default.

       * Enhancement LostPassword.jsp now uses POST for form submission.

       * Enhancement: Profile registrations now automatically trigger an
       e-mail confirmation to the user, if an e-mail address was supplied.

       * Bug fix: page-save workflow does no longer sends rejection SimpleNotifications
       to users unless they have already authenticated when they save the page.
       Also, the submitter's authentication status is added as a Fact for the
       approver to consider.

       * WorkflowBuilder.buildApprovalWorkflow now interprets a null value for
       the rejectedMessageKey parameter as meaning "don't send a notification"
       upon rejection.

       * MailTest moved to the *.util package, which was where it belonged.

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

       * 2.5.46 - my birthday release!

       * PermissionTag now allows a list of permissions just like
       CheckRequestContextTag, as well as negative permissions.  Based
       on an idea by Dirk Frederickx (whose last name I will learn to
       spell one of these days).

2007-04-17  Andrew Jaquith <andrew AT freshcookies DOT org>

       * 2.5.45

       * Checked in workflow support for user profile creation. Now, new profiles
       can be routed for approval before they become active. The name of the user,
       role or group that approves new profiles is contained in jspwiki.properties
       under the property jspwiki.approver.workflow.createUserProfile. If not
       supplied (the default), user profiles are created without requiring approval.

       * UserManager receives a proper unit test, at long last. We test with
       approval workflows turned on and off.

       * Minor bug fixes to the Fact and WorkflowBuilder classes.

2007-04-15  Andrew Jaquith <andrew AT freshcookies DOT org>

       * 2.5.44

       * Found the b*****d. VariableManager makes an unsafe assumption
       that WikiContexts will always have an associated request and HttpSession.
       This isn't always true with a WikiContext passed along in a Workflow,
       which will come from an earlier point in, and from a potentiallly different,
       Http session. We now check explictly for the presence of the HttpSession
       before querying it for wiki variables.

2007-04-15  Andrew Jaquith <andrew AT freshcookies DOT org>

       * 2.5.43

       * Many incremental changes to the workflow package to increase
       ease of use. A new WorkflowBuilder class includes a factory method
       for composing simple approval workflows. SaveWikiPageWorkflow and
       the workflow.impl package goes away, and instead the workflow code
       for saving pages moves to inner classes in PageManager (it is now
       much smaller because it uses WorkflowBuilder).

       * Unit tests for the page-save workflow now simulate PageFilter failures
       so that proper propagation of exceptions is verified. Should help Janne a lot.

       * Workflow.jsp receives minor UI tweaks, notably the replacement of submit
       buttons with a JavaScript-driven dropdown. The default.properties
       localization file receives properties in preparation for the new user profile
       workflow (not checked in yet, because it isn't debugged).

       * The UI for approving workflows currently contains a nasty, intermittent NPE
       that is resisting my best efforts to debug. It usually occurs when selecting
       the 'approve' option. It results in Decisions being removed from the workflow
       inbox, and the page does save correctly -- so it is essentially "cosmetic".
       However, it's ugly and we need to fix it. Assistance is most welcome.

       * If you are a US citizen, it is that time of year again. Many happy returns.

2007-04-09  Andrew Jaquith <andrew AT freshcookies DOT org>

       * 2.5.42

       * Modified the PagePermission implies() algorithm so that the "rename"
       permission no longer implies "modify" (or "upload"). This will allow
       separation of uploading attachments from page edit/rename actions.
       Thanks to Tim Koop for the suggestion.

       * Added WikiContext.MESSAGE to support workflows and other processes
       that need to send a non-exception-related UI message in response
       to user events. Also added a top-level Message.jsp and template.
       Changed DisplayMessage.jsp slightly to use the <c:out> tag, which
       gives us protection against cross-site scripting.

       * Added 'throws WikiException' to all methods meant to be
       implemented by workflow subclases: notably Step.start(),
       Decision.decide(), Workflow.start()/restart(). Now, if these
       methods encounter exceptions they will abort the workflow and
       propagate the exceptions to callers.

       * Many tiny little Javadoc fixes.

       * Fixed failing PageRenamerTest.

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

       * 2.5.41

       * Added David Au's new set of patches for WYSIWYG editing.

       * WikiEngine.scanWikiLinks() no longer renders the page; it just
       parses it.  This should provide some speedup at startup.

       * Changed the default template resource bundle from
       webdocs/templates/DefaultResources.properties to
       etc/i18n/templates/default.properties (more logical).

       * Added class remapping ability.  See etc/ini/classmappings.xml
       and ClassUtil.java for further information.  This is not yet a complete
       feature, but it brings some simple AOP to JSPWiki.

       * Javascript is now localized.  The key-string mappings reside in
       templates/<template>.properties; and the correct method to call is
       "<key>".localize(args).  Thanks to Dirk Frederickx for the help!

2007-04-09  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

       * Added a number of unit tests to AllTests runs; they were not being
       properly included, so a number of them were not run during a regular
       unit test run...

2007-04-09  Andrew Jaquith <andrew AT freshcookies DOT org>

       * 2.5.40

       * Fixed AuthorizationManager failure to add attachment
       when jspwiki.security=off. [BugAddAttachmentFailsWithContainerAuthentication]

       * Upgraded freshcookies-security lib to 0.54. This new version accepts
       a user-supplied charset for parsing security policy files.
       Previously, PolicyReader defaulted to the platform default encoding.

       * AuthorizationManager, when it initializes, supplies the default
       JSPWiki encoding to the updated freshcookies PolicyReader class.
       Many thanks to Harry Metske for identifying the need for this, based on his
       experiences using JSPWiki on a platform where EBCDIC is the default.
       (Which is probably a mainframe; yegads.)

       * Fixed bug that was causing Workflows to be added multiple times
       to the "history" queue; this was caused by recent changes to the
       WikiEventManager classes.

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

        * 2.5.39

        * Fixed bug in SessionsPlugin which threw an Exception
        at startup.  Reported by Harry Metske.

        * Greatly improved SpamFilter logging.  There's a new SpamLog
        which can be used to track all changes; accepts and rejects.

        * SpamFilter no longer adds Akismet-rejections to the temporary
        ban list.  Akismet is non-deterministic, so it's kinda annoying
        for users who just quite don't know why this is happening.

        * Fixed also some dumb bugs in the way SpamFilter was
        computing the delta.

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

        * 2.5.38

        * Added Note plugin from John Volkar.

        * Added PAGE_REQUESTED, PAGE_DELIVERED events fired by
        WikiJSPFilter.  Unfortunately, no such things are fired for
        attachments.  Note that attaching to these events is very noisy.
        Thanks to Murray Altheim.

        * Renamed TestHtmlStringToWikiTranslator to
        HtmlStringToWikiTranslatorTest to conform to other tests.

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

        * 2.5.37

        * Forward ported fixes from 2.4.102

        * Fixes issue with a number of plugins failing due to wrong
        initialization order.

        * Moved everything pre-2.4.0 to OldChangeLog.  Oh, the memories...

2007-03-29  Christoph Sauer <sauer AT hs-heilbronn DOT de>

        * 2.5.36

        * Moved FilterManager initialisation in the wiki engine to the bottom,
          so that all object references to modules are already available to
          a page filters initialize method. This is important to register
          event listeners there.

        * Added a destroy method to the PageFilter interface. Destroy is
          called upon engine shutdown. You can use this to close global
          resources that you opened in the PageFilters initialize method.

2007-03-26  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * 2.5.35

        * Refactored the XML-RPC implementation a bit to provide proper
        authentication/authorization.

        * Upgraded to Apache XML-RPC 2.0.1.

2007-03-24  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * 2.5.34

        * Added Mikkel Troest's patch to AttachmentServlet to fix issues
        with uploading and file size.

        * Added DynamicAttachments and their generation.  You can now go
        and build attachments which do not exist in the repository, but
        are generated on-the-fly.  See the attachments package and related
        documentation.

        * Bug fix: [open bugs] would not be recognized as wikipage OpenBug.

        * Changed ETag generation to make it unique per page.

2007-03-19  Christoph Sauer <sauer AT hs-heilbronn DOT de>

        * 2.5.33

        * Changed signature of sendMail in MailUtil from using WikiContext
        to use WikiEngine.  WikiContext was not needed. This enables us
        to use the mail util, even if no Wiki Context is available.

2007-03-19  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * 2.5.32

        * Fixed a bunch of Eclipse warnings; hopefully no functionality
        changes.

        * Fixed BugInlineImagesCaseSensitive - inline image lists are now
        case insensitive (yay!).  Thanks to Harry Metske.

        * Fixed BugMultiWikiCreatesRSSFileInWrongPlace.  Thanks to Harry Metske
        again.   Now, if the rssFile property is set to an absolute path, it is
        used instead of a relative path to the wikiengine home.  This allows you
        to have separate paths for multi-wikis.

        * Fixed BugReferringPagesPluginLinksNonExistingPages, thanks to
        Candid Dauth.

        * Implemented IdeaRemoveDuplicatesFromSessionsPlugin from Harry Metske.

2007-03-19  Christoph Sauer <sauer AT hs-heilbronn DOT de>

        * 2.5.31

        * Fixed Bug with LostPassword.jsp: If you set access priviledges for
          a wiki completely private (even view) then you where not able to restore
          the password since LostPassword.jsp required login.

2007-03-18  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * 2.5.30

        * Fixed BugReferenceToRenamedPageNotCleared

        * Fixed BugTableHeaderNotXHMTLCompliant

        * Fixed BugInitializablePluginNotInitialized

        * API Change: The signature of PageFilter.initialize() now
        also includes the WikiEngine.  This was necessary, because otherwise
        the initialize() -method was essentially useless for most use
        cases.

        * Added ParserStagePlugin interface.  This allows a plugin to be
        executed even during parsing of the wiki page, not until the render
        stage.

        * Added David Au's patches to get the FCK support back up to speed
        again.

2007-03-17  Janne Jalkanen  <Janne.Jalkanen@ecyrd.com>

        * 2.5.29

        * Forward ported fixes from 2.4.100.

2007-02-28  Christoph Sauer <sauer AT hs-heilbronn DOT de>

        * 2.5.28

        * Improved MailUtil: Added authentication support, so
          that you can use mail servers that require an account
          (the OpenRelay issue...). You now also can indicate
          a different smtp port. Changed LostPassword.jsp accordingly.

2007-02-25  Andrew Jaquith <andrew AT freshcookies DOT org>

        * 2.5.27

        * Upgraded bundled log4j to 1.2.14; freshcookies-security to 0.51.

        * Fixed 2 failing RPCHandlerTest tests by counting changes relative
        to beginning of test, rather than absolute changes.

        * Changed all JSP taglib declarations to use JSP 2.0-compatible tags.
        Also upgraded jstl.jar and standard.jar to JSTL 1.1 versions. Note:
        if you are a template developer, you should change your taglib
        declarations as follows:

         New:
         <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
         <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

         Old:
         <%@ taglib uri="http://java.sun.com/jstl/fmt" prefix="fmt" %>
         <%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>

2007-02-24  Andrew Jaquith <andrew AT freshcookies DOT org>

        * 2.5.26

        * Major enhancement: replaced JSPWiki's dependency on the global,
        JVM-wide security policy with a "local policy" that is always
        read from WEB-INF/jspwiki.policy. If you have a JVM-wide policy,
        the local policy will supplement it. The practical upshot of this
        change is that the most common configuration challenge that most
        first-time admins face (why won't any pages display?) is gone,
        and gone forever. No more fiddling with the java.security.policy
        property! The syntax for the local policy is exactly the same
        as what it's always been; but now it Just Works instead of
        Mostly Works.

        * Fixed bug in WebContainerAuthorizer introduced by change to
        Java Servlet API 2.4. The parsing class now explictly includes
        namespaces in XPath searches. This was not something we needed
        to worry about with 2.3 (which used a DTD). The result of this
        problem was causing container-managed logins to fail.

        * Fixed failing unit tests WebContainerAuthorizer; web tests
        CommonCustomTests, CommonTests.

        * Minor enhancement to WikiSession now allows full use of non-JSPWiki
        supplied JAAS LoginModules in the JSPWiki-custom configuration. Previously,
        we considered a user to be authenticated only if a LoginModule had added
        Role.AUTHENTICATED to the Subject's principal set. This is clearly
        unreasonable for LoginModules that have no knowledge of JSPWiki, such
        as Sun's supplied modules or third-party modules used for LDAP
        authentication. Now, we consider a user authenticated if they are
        not anonymous and not asserted, and we lazily add Role.AUTHENTICATED
        in these cases, after login.

        * Bug fix: WikiEventManager refactoring in 2.5.24 caused duplicate
        listeners to be added in some cases. This has been fixed.

        * The security policy file has been simplified to remove redundant
        grants that don't vary across roles. It should be simpler to read
        and understand.

        * Did I mention that local security policies are a big deal?

2007-02-22  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.5.25

        * Added SisterSites.jsp to support the SisterSites standard.

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

        * 2.5.24

        * Forward ported features from 2.4.94, including the WatchDog,
        and the new, faster WikiEventManager.

2007-02-18  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.5.23

        * Added David Au's patches to re-enable FCK.  All you now need
        to do is to install FCK, and enable it in the ini/jspwiki_modules.xml.
        This also added a new mode for RenderingManager: WYSIWYG_EDITOR_MODE,
        which will not render plugins (except some), but keep them in plain
        text format.

        * web.xml now explicitly declares Java Servlet API 2.4.

        * Added AdminBeanIteratorTag

        * Bug fix: putting a plugin or a variable on the first line would
        cause a crash, if there were more than one paragraph on the page.
        Thanks to Terry Steichen for debugging.

        * There is now a rudimentary plugin-based administration interface
        in admin/Admin.jsp (and the corresponding template files).  It does not
        quite work yet, and it's definitely unstable, but it's been submitted
        to get some comments.  The idea is that you can declare in your
        jspwiki_module.xml an "adminBean" class, which then offers an
        administrative interface to your plugin.  As an example, a
        PlainEditorAdminBean is implemented (partly).

2007-02-05  Christoph Sauer <sauer AT hs-heilbronn DOT de>

        * 2.5.22

        * Added variable mechanism in property files. You now
          can declare a variable as a regular property with
          prefix 'var.' and then use it with the '$' prefix
          in other property values within the property files cascade.

        * Factored out property reading from WikiEngine into a new
          class called PropertyReader, since it now represents a distinct
          concept. Added UnitTest for it.

2007-02-05  Christoph Sauer <sauer AT hs-heilbronn DOT de>

        * 2.5.21

        * Added possibility to specify cascading properties
        in the context-mapping for multiple wiki setups. Added
        method to WikiEngine that will check for
        jspwiki.propertyfile.cascade.x context properties, where
        x is a number from 1 to n. Properties specified in those
        files will overwrite values specified in the default jspwiki.properties
        file or a properties file of a lower cascade.
        This is based on an idea by Olaf Kaus, see [JSPWiki:MultipleWikis]
        discussion.

2007-01-30  Andrew Jaquith <andrew AT freshcookies DOT org>

        * 2.5.20

        * Minor tweak to the i18n properties file to add in some whitespace
        between words for several messages (DefaultResources.properties).

        * Corrected a SessionMonitor failure to correctly stash a WeakReference
        in the user's HttpSession, which was causing downstream ClassCastExceptions.
        Thanks to Marc Pateet for isolating the issues. I haven't tested this
        fix extensively, so please let me know if it fixes (or does not fix)
        the issue.

        * I continue to be flabbergasted at the speed at which my new dual-core
        MBP runs the 737 JUnit tests in the JSPWiki test suite: about 2min 45s,
        compared to 7min on my old machine. This has no place in a ChangeLog, I know.
        But still.

2007-01-29  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.5.19

        * Synchronized with 2.4.91

2007-01-08  Andrew Jaquith <andrew AT freshcookies DOT org>

        * 2.5.18

        * Bug fix: fixed DefaultResources.properties trailing space in multi-line
        property that was causing Role and Group memberships on the Profile
        tab of UserPreferences to fail to display. If you were wondering why
        UserPrefs wasn't showing group memberships -- well, it's fixed now.

        * Bug fix: PageActions.jsp now links to UserPreferences as a JSP, not
        as a wiki page. Also gains a Workflow link for authenticated users.

        * Minor enhancement: WikiEngine gains an accessor for the DifferenceManager
        (getDifferenceManager). This is used by the workflow classes.

        * Minor enhancement: To support workflow, WikiContext gains new a context,
        WORKFLOW. It does not require special privileges to access. WikiCommand
        gains a corresponding WORKFLOW command.

        * Second major checkin of the workflow package. The API is mostly stable,
        but it should still be regarded as volatile. Workflow now includes
        a working user interface (Workflow.jsp). UI has a workflow "inbox" (for
        decisions a user has been asked to make) and an "outbox" (for workflows
        a user has started). Users must be authenticated to see their workflows.

        * 'SaveWikiPageWorkflow' is now operational. It provides moderation for
        saving wiki pages, and is turned off by default. See jspwiki.properties
        for configuration guidelines.

        * To test workflow, enable SaveWikiPageWorkflow via jspwiki.properties.
        Note: a cosmetic NullPointerException occurs in some cases after approving
        page saves; this does not prevent the actual page save. This will be
        fixed very soon. Other than this, approve/deny/abort features work nicely.

        * TestEngine gains accessors for the 'admin' and 'Janne' sessions.

2007-01-02  Andrew Jaquith <andrew AT freshcookies DOT org>

        * 2.5.17

        * Happy New Year everyone!

        * This release adds a significant new package for modeling
        workflow operations (com.ecyrd.jspwiki.workflow). This package allows
        arbitrary combinations of "steps" to be modeled, with support for
        unlimited branching and support for human intervention. The core class
        is the Workflow class. Workflows are composed of Steps, which can be
        Tasks (which run uninterrupted) and Decisions (which require input
        from named Principals -- users, roles or groups). This initial checkin
        is well-tested and solid code, but the API should not be considered
        stable... yet. There are NO user-interface classes as yet.
        Additional front-end JSPs that provide a UI will follow in the coming weeks.

        * The initial sample Workflow subclass, checked in today, implements moderated
        page changes (SaveWikiPageWorkflow). It has an undocumented configuration
        interface, which I will detail more fully when the UI is closer to completion.

        * See the (very complete) JavaDoc for more details. I'm VERY psyched
        about this new capability, and once we get flesh out the interface you all
        will be too!

        * Enhancement: changed throws clause in I18NManager methods.

        * Enhancement: added new dir (etc/i18n) and a resource file called
        CoreResources.properties for message strings for the core JSPWiki packages
        (that is, not plugins, tags or JSPs).

        * Enhancement: added new event class, WorkflowEvent, to support workflow
        create/run/pause/restart/halt/complete events.

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

        * 2.5.16

        * If there was no default locale set, I18NManager.getBundle()
        would fail.

        * Attachment links with new character set work now.

        * Section titles are now returned back to 2.5.14 behaviour.

        * Some tiny i18n work on TableOfContents.

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

        * 2.5.15

        * English resource files had some &apos;'s in them.  Replaced
        with &#39;.  Turns out that &apos; is an entity in XML, but
        not in HTML - and therefore IE does not recognize it.  Fun,
        but for once IE is correct in their standards support.  Found
        by Harry Metske.

        * The LinkParser would not boot jspwiki.org content due to
        being too strict: ("[]") would cause a RuntimeException being
        thrown, which would not be caught until a very high level.
        Fixed LinkParser to use a new declared exception "ParseException".
        Reminder to self: RuntimeExceptions are evil.

        * This is a biggie: increased the number of allowed characters
        in a wikiname.  Now the list reads " ()&'*+,-=._", so yes,
        spaces are allowed now.  Added MarkupParser.wikifyLink() to
        keep compatibility with previous versions, and also enhanced
        CommandResolver to be able to figure out old-style links.
        Please be aware that this is not yet a final set of characters,
        so using this version may cause a legacy you might have to
        deal with it painfully later on.  Also, note that the code is
        largely untested right now, and many unit tests are failing
        right now, so consider this now "bleeding edge".  Please give
        feedback on what the proper set of characters should be.

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

        * v.2.5.14

        * Bug fix: 2.5.9 was breaking unit tests badly, thanks
        to a missing null check.

        * Bug fix: Any markup in the first paragraph would break
        paragraph detection in JSPWikiMarkupParser.parse().
        Reported by Murray Altheim.

        * Added patch from Murray to add the "target" attribute to
        the Image plugin.

        * CommentedPropertiesTest no longer requires JDK 1.5.  Thanks
        to Murray for spotting this!

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

        * 2.5.13

        * Added LinkParser class from Murray Altheim.  Thanks!
        Links now have a new, extended syntax.  You may add metadata
        to a link by adding a new bar: [text|link|attributes]. Only
        a subset of attributes is allowed, as described in LinkParser.
        This allows you to have things like link targets and link
        relations.

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

        * 2.5.12

        * Fixed bug with Login/LoginContent that was preventing
        page redirection upon login from working properly. The
        corresponding web unit tests now all work again, too.

        * Fixed minor bug in Ant Hsql database teardown task
        that would cause the test db to erroneously think the
        database didn't need starting, even if it did.

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

        * 2.5.11

        * Fixed failing auth unit tests and web unit tests.

        * Fixed compilation errors for *GroupContent JSPs.

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

        * 2.5.10

        * Mass commit of code from 2.4.87

2006-12-18  Christoph Sauer <sauer@hs-heilbronn.de>

        * 2.5.9

        * Bugfix in FilterManager: Filter Manager used
        getClass().getResourceAsStream( "/filters.xml" ) to locate filters.xml.
        To ensure that it reads it from WEB-INF like described in the
        documentation we have to use the same aproach like with jspwiki.properties:
        engine.getServletContext().getResourceAsStream( DEFAULT_XMLFILE );

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

        * 2.5.8

        * JSPWikiMarkupParser now exports parseToken() method, which
        can be used by subclasses to modify or change the default
        markup rendering.  There are a couple of caveats: first,
        don't forget to call super.parseToken() if you don't do
        anything; second, you might create a completely non-compatible
        version of JSPWiki with this method.  So be very, very careful.
        Note also that this is an experimental way yet, so I would
        very much like to hear feedback before we cement it to stone.

        * CreoleRenderer now correctly renders plugins and images.

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

        * 2.5.7

        * JSPWikiMarkupParser will now ignore whitespace between
        list bullet and list - makes no difference and produces more
        unambiguous code.

        * Added CreoleMarkupRenderer, which currently supports
        WikiCreole 0.2 syntax.  This is a highly experimental feature.
        You can't do much with it yet, since we're missing a backconverter.

        * JSPWikiMarkupParser now properly produces <p> tags for
        all paragraphs - UNLESS there is just a single paragraph, in
        which case old behaviour will follow.

        * Bug fix: DefaultResources.properties was still using some
        {0,date} strings instead of just strings.  Reported by Harry
        Metske.

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

        * 2.5.6

        * Merged in JSPWIKI_2_4_BRANCH changes up to 2.4.84.

2006-11-28  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.5.5

        * plain.jsp did not compile due to last-minute changes in
        package structure.  Reported by Juan Pablo Santos Rodriguez.

        * InternationalizationManager was not properly initialized.
        Reported also by Juan.

        * TableOfContents was using wrong resource bundle.  Reported
        by Juan.

        * LoginContent.jsp was failing, if someone localized the login
        button.  Reported by someone (remind me and I will fix this entry)

2006-11-27  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.5.4

        * Added rpc package, JSONRPCManager, and added preliminary
        support to get suggestions in plain.jsp over AJAX.  Yes,
        JSPWiki just gained AJAX support using JSON...

        * Moved AtomAPIServlet to rpc/atom under the assumption that
        nobody was using it anyway.

2006-11-21  Christoph Sauer <sauer@hs-heilbronn.de>

        * 2.5.3

        * Checked in WikiWizard 1.1:

          Major Improvements:
          - Now supports multiple file uploads
          - Speed up loading by putting config file init
            in extra thread
          - Highlighting of %% tags
          - "Mark Occurences" function similar to eclipse
          - Drag 'n Drop Interface for extension bar

          for details please take a look
          at /applets/WiWi-INF/ChangeLog.txt

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

        * 2.5.2

        * Synchronized with 2.4.81.

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

        * 2.5.1

        * Fixed LoginContent.jsp so that it compiles.

        * Fixed issue with PolicyLoader when the URI found had a "file:"
        in it.

        * Fixed some other issue which I can't remember right now because
        I drunk some very nice Tomintoul 27 years old single malt whiskey.

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

        * 2.5.0

        * Split off 2.4 to its own JSPWIKI_2_4_BRANCH stable development
        branch.  HEAD is now 2.6 development branch.

        * Mass commit of i18n code.  Almost everything is localized now,
        but unfortunately we only support English right now.

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

        * 2.4.78

        * A bunch of minor refactorings suggested by Aron Gombas,
        including:

        * Visibility of member variables in WikiContext have been checked -
        things were made more private, except m_request is now protected to
        help in subclassing.

        * JSPWikiMarkupParser also has visibility checked a bit to help
        in subclassing - the different link types are now protected,
        and a new factory method createAnchor() was added.

        * JSPWikiMarkupParser now checks WikiContext for overrides for
        most variables.

2006-11-06  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.4.77

        * Hopefully fixed login redirection issues when using
        container authentication.  If the user did not have permissions
        even after login, this would result in a constant series of
        redirections.

        * Added run_webtests.sh

2006-11-06  Christoph Sauer <sauer@hs-heilbronn.de>

        * 2.4.76

        * added fix from Chuck Smith so that WikiWizard.jsp now is valid XHTML:
          document.write() function in JavaScript is deprecated, instead
          document.addEventListener("DOMContentLoaded", changeWidth, null)
          is used now to modify the the DOM Tree after it is loaded.

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

        * 2.4.75

        * Added patch from Tomasz Szymko to fix previews when adding
        comments.  Thanks!

        * Added patch from Murray Altheim to provide timestamps in
        WikiEvents, and added a new SESSION_EXPIRED event as well.

        * Session monitor now fires SESSION_EXPIRED events.

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

        * 2.4.74

        * Improved startup a bit; now the log files should be better in
        case you have a problem in your jspwiki.properties.  It's still
        not perfect, but it's better.  The unfortunate side effect is
        that you'll start getting 404 errors instead of error messages
        when you are trying to access the site.

        * Got rid of jspInit() in all top-level JSP files.  This is a
        bit nicer and simpler all around.

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

        * 2.4.73

        * Patch from Neil Miller to fix PageManager which was not using
        proper getProperty().

        * AttachmentManager.listAttachments() now sorts the attachments.
        Suggested by Fabio Bonin.

        * If jspwiki.useCache was set to false, finding pages would
        not work with VersioningFileProvider, thanks to some really old
        optimization code that never got updated.  Removed optimization,
        hey presto!  It works!

        * Spam filter now includes change notes in its checks as well.

        * WikiEventSource is now gone, since it was not used for anything.
        Thanks to Murray for the heads-up!

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

        * 2.4.72

        * SpamFilter is now a lot smarter.  I enlisted a small guy
        called Herb, who has agreed to sit in the JAR file, and watch
        for any spam.  Log files are a bit better, too.

        * SpamFilter will now watch at consecutive modifications, and
        mark them as spam, if there are too many similar-looking
        modifications (no matter what IP they're from).

        * SpamFilter can now connect to Akismet (www.akismet.com).
        You need to get your own API key, though, and put it in the
        filters.xml config file.  Unfortunately we don't yet have
        the ability to mark "ham" and "spam".

        * ShortURLConstructor did not handle CONFLICT situations
        correctly.

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

        * 2.4.71

        * Small fix from Tomasz Szymko: jspwiki.css has information
        and error images reversed.

        * Comment.jsp did not compile.  Reported by a number of people.
        Ooops...

2006-10-13  Erik Bunn  <ebu@memecry.net>

        * 2.4.70

        * Minor mod to WeblogEntryPlugin: now accepts a 'page' parameter,
        like WeblogPlugin. Allows providing a 'new entry' link on some
        page other than the actual blog page; this may be useful e.g.
        for alternate views of a blog page.

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

        * 2.4.69

        * Added a couple of patches from Tomasz Szymko to fix a problem
        with messages from the AttachmentServlet, and a problem with
        EditLinkTag.

        * Added patch from Murray Altheim to fix a problem with
        TextUtil.replaceString() - it would be dying under certain
        circumstances.

        * Added patch from Murray to add "_bounds" parameter to the
        plugin invocation.  _bounds consists of an integer array (int[]),
        where element 0 is the start of the plugin position in the page,
        and element 1 the end.

        * Small fixes to LuceneSearchProvider.

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

        * 2.4.68

        * Hopefully fixed the "ACL not refreshed at startup" problem,
        reported by many people.

2006-10-08  Andrew Jaquith <andrew AT freshcookies DOT org>

        * 2.4.67

        * Enhancement: JDBCUserDatabase will now use transactions, if the
        back-end database supports them. In addition, JDBCUserDatabase now
        nails up a single, long-running connection instead of continually
        opening and closing them. Log message verbosity expanded slightly.

        * Enhancement: GroupDatabase now has a relational database implementation
        called JDBCGroupDatabase. It supports transactions and is configured
        using a container-managed JNDI DataSource, exactly like JDBCUserDatabase.
        Unit tests and DDL setup/teardown scripts were upgraded for the
        new implementation. Sample scripts are included for PostgreSQL and
        Hypersonic.

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

        * Fixed a bunch of javadoc warnings; not enough to warrant a
        version bump.

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

        * 2.4.66

        * Added small patch from Neil Miller to fix WikiEngine.getInstance()
        which was not properly passing its arguments.  Thanks!

        * Added patch from Murray Altheim which makes ReferenceManager and
        SearchManager to behave as EventListeners for page deletion.  Notably,
        AttachmentManager and RenderingManager do not yet fire or listen these
        events (needs fix).

        * Added PAGE_DELETED and PAGE_DELETE_REQUESTED from Murray.

        * Added patch to JSPWikiMarkupParser from Murray to make some of the
        attributes publically accessible and less magic.

        * Fixed ShortURLConstructor again for some contexts (FIND, DELETE & PREFS)

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

        * 2.4.65

        * Bug fix: fixed an issue with WikiContext that caused ACLs and policy settings to
        be ignored when accessing the default front page. This bug was introduced during
        the AAA mega-patch in July (2.4.25). Note: we still have an unrelated bug
        with ACLs not being applied the *first time* pages are loaded.

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

        * 2.4.64

        * WikiPage.clone() was not cloning everything; this should now be fixed.

        * Included patch from Neil Miller to make RenderingManager use the
        eventing system instead of PageFilters.  Thanks!

        * ShortURLConstructor now supports group functionality.

        * Fixed an annoying bug which appeared if saving failed for some reason
        (e.g. when SpamFilter would reject an edit): the cache would still
        contain the changed page metadata.  We now make a clone of the
        WikiPage before we attempt a save.

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

        * 2.4.63

        * WikiSession receives several under-the-hood changes to improve session
        stability. The technique used to detect session status changes now includes an
        explicit check for prior authentication; this should prevent sudden "downgrades"
        from authenticated status to asserted (cookies). User/login Principals and
        the status strings (anonymous/asserted/authenticated) are cached now, rather
        than dynamically calculated. WikiSession gains a new public method, isAsserted()
        that does what it says. Finally, WikiSession now takes responsibility
        for populating the JAAS Subject with user profile principals, rather than
        the various login modules.

        * AuthenticationManager now fires an event called LOGIN_INITIATED whenever
        the authentication status changes, signifying that the JAAS login stack
        executed (but without regard to whether it succeeded). WikiSession listens
        for this event and updates its cached principals. AuthenticationManager
        also now fires explicit events called LOGIN_ANONYMOUS and LOGIN_ASSERTED
        in addition to LOGIN_AUTHENTICATED.

        * In the name of code simplification, event support was removed from the
        Group class. It was redundant and made things more complicated. Consequently,
        GroupManager loses its GroupListener inner class, and WikiSecurityEvent gets
        rid of types GROUP_ADD_MEMBER, GROUP_REMOVE_MEMBER, GROUP_CLEAR_MEMBERS.
        If you really really need these let me know, but in the meantime the coarser-
        grained GROUP_ADD and GROUP_REMOVE will do what we need.

        * UserDatabaseLoginModule no longer populates WikiSession's Subject with
        user profile principals; this was moved to WikiSession. This should make
        pure, authentication-only login modules possible, such as for LDAP and Kerberos.
        Because authentication and user profile storage are better separated, it will
        prevent the need to subclass and hack XMLUserDatabase. WebContainerCallbackHandler
        no longer needs a UserDatabaseCallback as a result, so the callback was removed.

        * Bug fix: LoginForm now injects a WikiContext, but only if one does not already
        exist in the page context. This plugs the bug introduced in 2.4.60. Page redirection
        after login works for both container and custom authentication; the web unit
        tests now test for this condition explicitly. The fix has been tested with
        Tomcat and JBoss 4.

        * Fixed a bunch of failing auth tests.

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

        * 2.4.62

        * Fixed the fix for the login-redirection issue, patched in 2.4.60.
        "Regular" logins (those without a subsequent redirection) now work again.
        Thanks to the indefatigable Terry Steichen.

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

        * 2.4.61

        * Fixed a couple of failing tests (recent changes caused slight behaviour
        change)

        * Bug fix: the Wiki Event INITIALIZING is now fired after log4j is running -
        this stops about a zillion of errors in the container log file.

        * Slightly juggled with the built-in system filter priorities to make sure
        that they are executed in correct order.

        * Added a small fix to saveText() to check if it possibly fixes some problems
        with disappearing ACL lists or other metadata.  Our provider interface is
        desperately in the need of an overhaul...

2006-09-27  Andrew Jaquith <andrew AT freshcookies DOT org>

        * 2.4.60

        * Fixed typo in SecurityConfig.jsp that caused group verification to
          report the number of "users" rather thank groups. Credit: Chuck Deal.

        * Fixed a series of related, minor bugs that caused JSPWiki to always
        redirect to the front page after login, even when instructed to redirect
        to another page. This fix also resulted in the removal of a redundant
        WikiContext creation in LoginForm. Thanks to Terry Steichen for figuring
        out where to look.

2006-09-24  Andrew Jaquith <andrew AT freshcookies DOT org>

        * 2.4.59

        * XMLGroupDatabase and XMLUserDatabase now represent dates using
          a locale-independent, machine-independent format. To preserve backwards
          compatibility, JSPWiki will attempt to parse dates using the platform
          default format if parsing with the standard format fails. New records
          will always be saved in the standard format.

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

        * 2.4.58

        * Some internal reshuffling of Managers.

        * PluginManager and EditorManager now check if a module is
        compatible with JSPWiki.  You can state your own compatibility
        by declaring it in the jspwiki_module.xml file, as
        <minVersion>2.4</minVersion>, and/or
        <maxVersion>2.6.32</maxVersion>.

        * 2.4.57

        * Added change notes also to attachments

        * Attachment names are now also beautified (though just the
        page name part).  This should help the problem when RecentChanges
        plugin overflows.

        * Cleaned away a few compiler warnings

        * Improved some PluginManager javadocs

        * BasicAttachmentProvider has now more sanity checks and should
        no more throw wild NPEs at startup.

        * Fixed
        BugLuceneSearchProviderNotReadJspwiki.lucene.analyzerFromConfiguration
        Thanks to Ekkasit Takoungsakdakul for pointing this one out!
        (And I am very sorry I did not notice that bug report earlier.)

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

        * 2.4.56

        * Added patch from Kalle Kivimaa to fire the event with the
        proper principal at logout.  Thanks!

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

        * 2.4.55

        * Added patch from Joseph Schmigel to recognize IP
        addresses in sortable tables.  Thanks!

        * Added new icons from Murray Altheim so that we could
        get rid of all Creative Commons-licensed icons.  This was
        done so that JSPWiki 2.4 could be included on Debian.  Thanks
        heaps for the good work!

        * Reverted to previous behaviour with respect to WikiWizard:
        no longer closes applet and div with javascript, which should help
        in IE.

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

        * 2.4.54

        * Added patch from Murray Altheim to fix WikiEventManager
        javadocs, as well as made it return booleans on a couple
        of methods.  Thanks Murray!

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

        * 2.4.53

        * Removed FCK.jsp from the distribution (since we don't distribute
        FCK, it's sort of weird to have it there breaking things).

        * Bug fix: Comment.jsp now catches RedirectExceptions

        * Bug fix: BugReportHandler also catches RedirectExceptions and
        now gives a proper error report.

        * Limited change note length to 80 characters.

2006-09-09  Andrew Jaquith <andrew AT freshcookies DOT org>

        * 2.4.52

        * UserManager now checks to make sure that a user can't
        specify as a wiki name somebody elses's full name or login
        name. This check is peformed for all other combinations of
        these three user profile fields also. This is a potentially
        serious security flaw, so all users should upgrade.

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

        * 2.4.51

        * Added patch from Malte Kiesel to fix a problem which caused
        overwriting of user profile.

        * Fixed WikiJSPFilter writing the wrong content length to the
        response (we're skipping setting the length for now).

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

        * 2.4.50

        * Test release to check whether we can solve some WebLogic
        issues.

        * Split WikiServletFilter to WikiServletFilter and WikiJSPFilter.
        The latter takes care of JSP stuff, the former of all other types
        of data.  WikiJSPFilter uses getWriter() extensively, while
        WikiServletFilter is for those instances that use
        getOutputStream().  Thanks to Marc Patteet for the help.

        * Renaming now also renames attachments (assuming that the
        attachments exist - if they don't, then there's no way to know
        which pages refer to them (bar going through all pages).

        * Changed web.xml to reflect the new filters.  Don't forget
        to update!

        * Added "print" style for jspwiki.css in commonheader.jsp.  This
        should fix problems with printing looking different from screen.
        Reported by Steve Lihn, fix from Dirk Frederickx

        * Fixed InfoContent.jsp for WebLogic.  By Marc Patteet.

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

        * 2.4.49

        * Witness the awesome p0w3r of unit testing.  Fixed the
        unit tests added in the morning so that we now hopefully
        are fixing BugStrangeRenameBehaviour.  Reported by Candid
        Dauth.

        * Bug fix: ReferenceManager was not removing all references
        to a page if it was renamed, resulting in "hanging" pages.

        * Added a bunch of new unit tests to check for page
        renaming problems.  At the moment most of them fail, suggesting
        that there is something wrong in PageRenamer...

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

        * 2.4.48

        * Bug fix: it was possible to gain user privileges simply
        by faking the cookie.  This is a serious problem and all
        people running 2.4.x are suggested to upgrade.  Thanks
        to Andrew for the fix.

        * SecurityVerifier no longer gets confused, if you state
        a property using "==" instead of "=".

2006-09-05  Christoph Sauer <sauer@hs-heilbronn.de>

        * 2.4.47

        * Added title and accesskey attribute to
          LinkTag, EditLinkTag and PageInfoTag. You can now set
          accesskeys to edit pages in the PageActions.jsp
          Use the title attribute to add a tooltip text to indicate
          the speedkey you used.

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

        * 2.4.46

        * Bug fix: PageLock was using acquisition time for both
        expiry and acquisition.  Fixes BugLockNotWorking.  Reported
        by Terry Steichen.

        * Added WikiContext.hasAdminPermission() as a convenience
        method.

        * Changed SpamFilter to check for AllPermission instead of
        a group called Admin - this is better because of i18n.

        * SpamFilter now checks also the changenote before saving.

        * Added the possibility to escape }}} within a preformatted
        section by using ~}}}.  Suggested by several people at
        WikiCreole.org...

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

        * 2.4.45

        * Bug fix: When SpamFilter rejected something, there would
        be no message shown in RejectedMessage.  Reported by
        Terry Steichen.

        * Removed plenty of documentation from the default wikipages
        package.  It was out of date, and better written up at
        doc.jspwiki.org anyway.

        * Removed doc/Templates.txt, which was no longer accurate.

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

        * 2.4.44

        * Both XMLUserDatabase and XMLGroupDatabase will now check
        if the database is up to date.  This allows propagation of
        databases across wikis (though it's rather flaky; there are
        concurrency issues).

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

        * 2.4.43

        * Bug fix: If the front page did not exist, would die with
        a NullPointerException, when accessed with the default URL
        (e.g. /Wiki.jsp, or /wiki/ without the page).
        Should fix BugBadDefaultConfig.

2006-09-02  Christoph Sauer <sauer@hs-heilbronn.de>

        * 2.4.42

        * Fixed Bug with WikiWizard.jsp and Weblogic reported by Marc Patteet

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

        * 2.4.41

        * LinkTag should no longer crash if WikiContext does not have
        a page attached.  Reported by Fabiano Bonin.

2006-08-30  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.4.40

        * Christoph Sauer joins in as a contributor (if only I got
        him to update the ChangeLog... ;)

        * WikiWizard is now included.  Hooray for WIKIWYG editing!

        * Small tweaks to the EditTemplate.

        * Changed "jspwiki.security=container" to "jspwiki.security=off".
        This should make it more clear to people.  The old setting
        will continue to work.

        * Added page info links back to attachments in RecentChanges.
        Unfortunate side effect of the new renderer...

2006-08-30  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.4.39 - The "Piko" release.  Rest in Peace.

        * Added SearchManagerTest to make sure that our search works.

        * Bug fix: LuceneSearchProvider was not indexing the WikiName
        of the page.

        * Bug fix: SearchManager now always indexes the latest version
        of the page (thanks heaps to John Volkar for finding this).

        * Disabled ContextualDiffProviderTest.testKnownProblemCases(),
        I have no idea how to fix those, and it was never running anyway.

        * Disabled JSPWikiMarkupParserTest.testSpanJavascript2() -
        it would need a lot more care to make it really run.

        * Fixed failing XMLRPC tests.

        * Upgraded to Lucene 2.0.0.

2006-08-27  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.4.38

        * WikiEvents are now fired at almost any occasion that seems suitable.
        Thanks to Murray Altheim for this mega-patch.  Some of the event
        classes were also reorganized (thanks to Andrew and Murray).

        * SpamFilter no longer counts admins as evil, if they make many
        changes/minute.

        * WikiServletFilter fails now gracefully if WikiEngine instatiation
        fails - should no longer emit dumb NullPointerExceptions.

        * FindContent.jsp now hopefully calculates previous- and next
        search sizes correctly.

        * Change Notes are now visible in page history as well.  Unfortunately,
        the visuals suck.  Anyone want to help to make them look better?  Just
        don't make them too wide...

        * Change Notes are now limited to 60 characters (totally arbitrary).

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

        * 2.4.37

        * Faced with physical threats at WikiSym, I added the "change note"
        feature.  Hope y'all are happy now :-D  (Well, okay, it does not
        work in the page info yet; I'm thinking what would be a good
        presentation so that the page does not get overly wide).

        * Bug fix: jspwiki.tld had the wrong attribute for RequestResourceTag.
        Reported by Marc ?.

2006-08-14  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.4.36

        * Bug fix: UserProfileTag was not printing groups.  Reported by
        Dirk Fredericx.

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

        * 2.4.35

        * Fixed BugPreformattedTextWithHtmlDoesnTWorkIfAllowHTMLTrue. Thanks to
        RealGagnon and an unknown submitter.

        * Fixed BugStyleDoublePercentProblem.  There are two new tokens:
        /% can also be used to stop a style, and ~<space> is a non-rendering
        space.

        * Fixed BugNullPointerExceptionWhenInsertingImagesWithoutAlignAttribute.
        Thanks to Candid Dauth for pointing it out.

        * Added patch from Laurent Courtin to fix
        BugTableOfContentsDoesnTWorkWithPageNotInAscii.  Thanks!

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

        * 2.4.34

        * Implemented RequestResourceTag (oops, it had been skipped for
        some reason).

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

        * 2.4.33

        * RecentChangesPlugin was missing a quote in the generation
        of author names.

2006-08-08  Andrew Jaquith <andrew AT freshcookies DOT org>

        * 2.4.32

        * Fixed an astoundingly brain-damaged bug in WikiContext that caused
        all wiki contexts to use the default template in all cases, regardless
        of the setting in jspwiki.properties. This bug was introduced by the
        2.4.25 security mega-patch. The fix, of course, was three lines
        of code. Now that it's in, I'd like to put down my crack pipe
        long enough to thank Terry Steichen for spotting this.

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

        * 2.4.31

        * Bug fix: BugArbitraryHTMLMarkupInHeadingIsRenderedByTableOfContentPlugin,
        reported by Jerome Duprez.

        * Bug fix: BugCenteringImagesUsingImagePluginDoesNotWorkInFirefox,
        contributed by Alex Reid.

        * Bug fix: BugCanKeepPressingNext20ResultsOnResultSearchPage.  Rewrote
        the scriptlets in FindContent.jsp to provide a better experience
        overall.

        * Bug fix: BugReferringPagesPluginDontWriteNobobyAfterFiltering.
        Reported by François Burtin.

        * Removed a bunch of compiler warnings found thanks to upgrade to
        Eclipse 3.2.

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

        * 2.4.30

        * Fixed cosmetic bug that was causing all search results to
          appear with the name "Search".

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

        * 2.4.29

        * Character encoding is now set in the servlet filter, not
        WikiEngine.createContext() anymore.  This should remove certain
        cases where character encoding got lost.

        * 2.4.28

        * Fixed a HUGE number of potential problems, found using FindBugs.
        Problems included such as:

        * Now many Comparators are also Serializable

        * hashCode() is now implemented properly on objects that do
        equals()

        * clone() is rewritten to use super.clone()

        * Many inner classes were made static to save extra effort

        * Forms package classes had really dubious null checks which
        were rewritten.

        * TranslatorReader is no longer used in the code anywhere.  Even
        the TranslatorReaderTest is gone.  The class, however, remains,
        until we can refactor it to be a facade for JSPWikiMarkupParser.

        * Coding style is now a local setting instead of a global
        setting...

        * And a lot of small bits and pieces...

2006-07-31  Andrew Jaquith <andrew AT freshcookies DOT org>

        * 2.4.27

        * Bug fix: SecurityConfig was erroneously reporting that externally set
          values for java.security.policy did not resolve to existing files,
          even when they did.

        * Bug fix: SecurityConfig was erroneously reporting that wiki groups
          could not be deleted, even when this function actually worked
          properly.

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

        * 2.4.26

        * Fixed editor textarea width, thanks to Gordon Smith.

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

        * 2.4.25 - a.k.a. the AAA mega-patch

        * This release completely changes the way JSPWiki manages wiki groups.
          They are no longer stored in pages; instead, GroupManager controls
          access, while back-end storage is provided by the GroupDatabase interface.
          This change has caused many other changes. More details:

          * GroupManager changes from an interface to a concrete, final class. Group storage
            is now handled by a separate GroupDatabase interface. The default implmentation is
            XMLGroupDatabase. In addition, Group becomes a concrete final class; DefaultGroup
            and DefaultGroupManager disappear. Group gets a new method groupPrincipal() that returns
            the equivalent GroupPrincipal. Many new unit tests created for all of these changes.

          * Group creation handled in UI by NewGroup.jsp. Editing is via EditGroup.jsp.

          * UserProfileTag gains a property "groups" that will print the list of wiki groups
            the current user belongs to. The "roles" property now just prints the roles.

          * Default security policy (jspwiki.policy) gains grant entries for group
            viewing, editing, deletion permissions. By default, users must be at least
            "asserted" to view group members, and must be a member of a group to edit
            the membership.

          * PermissionTag gains three new permission checks: "viewGroup", "editGroup", "deleteGroup".

          * Group principal injection responsibilities moves to WikiSession from AuthenticationManager.

          * The hard-coded restriction on pages prefixed "Group" has been lifted.

          * SecurityVerifier adds tests for GroupPermission. Better support for detecting
            exceptions. Adds tests for adding/deleting Groups.

          * New Groups plugin prints a sorted list of the wiki groups in the group database;
            generates a hyperlink to each group page.

        * JSPWikiInstaller (Install.jsp) receives a makeover and substantial enhancements to
          support the new group scheme. When the wiki is set up, we now create an administrative
          user and an Admin group. It also uses the default CSS.

        * The new Command class is now fully integrated into WikiEngine.createContext()
          and the WikiContext constructors. Practically speaking, this means that the
          page names and redirect errors shown on pages will actually show something useful
          when non-pages are accessed (e.g., access denied for UserPreferences.jsp won't
          print the non-sensical "you don't have access to 'Main'). WikiEngine delegates
          page-resolution responsibilities to CommandResolver. Minor changes to new
          Command/CommandResolver classes to make JSP page names "friendlier".

        * WikiSession.getUserPrincipal now defaults to the wiki principal, rather than
          the full name. This means that favorites auto-linking won't break. It also gains
          a method getRoles() that returns the roles and groups the user possesses.
          The method doPrivileged(WikiSession,PrivilegedAction) allows actions to be
          executed using the user's privileges. WikiSession's getSubject() method has been
          removed; it was a security risk.

        * Substantial changes to the AAA package tests. Web unit tests changed to accomodate groups.

        * Minor refactoring: AllPermission, WikiPermission, PagePermission. AllPermissionCollection.

        * Bug fix: closed <span> tag in InsertPagePlugin

        * WikiContext.getName() provides a "safer" shortcut than calling WikiContext.getPage().getName()
          because not all wiki contexts apply to pages. This change was made to: TableOfContents plugin;
          most of the top-level JSPs; TranslatorReader; PageNameTag.

        * Container role principals are now injected at login time by WebContainerLoginModule,
          rather than the AuthenticationManager.

        * More use of checked exceptions. Authorizer.initialize() throws WikiSecurityException

        * WikiSecurityEvent gains the event type PROFILE_SAVED, emitted by UserDatabase. Most
          of the security events are now marked as "debug" level events, which means the logs
          will be much less chatty (this is a temporary hack).

        * AuthorizationManager gains a new public method: getAuthorizer()

        * The WikiEventSource "marker interface"  added to class declarations for AuthorizationManager
          AuthenticationManager, WikiEngine. EventSourceDelegate used in place of cut-and-paste code
          for these classes also.

        * TextUtil.password generator now uses SecureRandom instead of Random.

2006-07-24  Andrew Jaquith <andrew AT freshcookies DOT org>

        * 2.4.23

        * Andy J. fixes what he broke... namely the build. Thanks
          to Mark Rawling for pointing it out.

        * SessionMonitor achieves escape velocity and becomes its own class,
          breaking free of WikiSession's gravity.

        * WikiSession.guestSession() changes to guestSession(WikiEngine).
          This required small tweaks to a few classes, notably the RPC handlers
          and parts of the Auth code.

        * Various classes receive small code tweaks in preparation for upcoming
          builds. WikiContext gains three new group-related contexts; WikiEngine
          gains code to initialize CommandResolver and a related accessor;

        * GroupPrincipal gains a two-argument constructor that accepts the
          wiki name as the first parameter.

        * WikiPermission's action strings are now public. Ebu's been waiting a while
          for this.

        * CommentedPropertiesTest's missing test.properties file is now in CVS.

2006-07-23  Andrew Jaquith <andrew AT freshcookies DOT org>

        * 2.4.22

        * Added several classes and interfaces to support upcoming
          AAA refactoring. These do not affect functionality, because
          they are not referenced by any existing classes. New classes
          include: (1) Command interface and related AbstractCommand,
          PageCommand, GroupCommand and WikiCommand implementations;
          (2) WikiEventSource interface and EventSourceDelegate class,
          both in events package; (3) GroupDatabase interface and sample
          groupdatabase.xml files and (4) CommentedProperties class for
          reading and re-saving properties files that include comments.
          Again, these classes are not yet actively used.

        * Minor tweak to TestHttpServletRequest to support parameters and
          servlet path.

        * Removed cruft from HttpUtil; no functionality changes.

        * WikiBackgroundThread now contains a getEngine() accessor.

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

        * 2.4.21

        * RCSFileProvider had a rare concurrency issue with the
        SimpleDateFormat.  Reported by Bosmon on IRC.

2006-07-17  Erik Bunn  <root@d183.fi.basen.net>

        * Modularized RenderingManager. By setting
        jspwiki.renderingManager.renderer in jspwiki.properties, a custom
        WikiRenderer can be specified. Defaults to XHTMLRenderer.

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

        * 2.4.20

        * Fixed BugNoMoreThanOneSortableTablePerPage.  Thanks to
        Juan Pablo Santos Rodriguez!

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

        * 2.4.19

        * Added "InternalModule" interface.  This is just an empty
        interface which a module can declare and not get listed
        in SystemInfo, for example.  Used internally by JSPWiki.

        * Fixed a major issue with page renaming: thanks to an
        erroneus context sent downstream, the page which was renamed
        from would get random contents.

        * Page rename would not change referrers if the breakTitleWithSpaces
        option was set on.

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

        * Made ParamTag attribute 'value' non-required; tag body is
        acceptable for value. (This should not warrant a version bump.)

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

        * 2.4.18

        * BugReportHandler was dutifully adding the "_cmdline" to the
        pages it was creating...

        * Fixed some quote issues in commonheader.jsp and
        PreferencesContent.jsp which were causing issues with
        WebSphere.  Reported by Robin Tew and Thorsten Nordholm S?birk.

2006-06-28  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.4.17

        * WikiSecurityEvent.toString() would die if you had a null principal...

2006-06-17  Andrew Jaquith <andrew AT freshcookies DOT org>

        * 2.4.16

        * Bug fix: SessionMonitor.sessions() now returns the same
        number of sessions as userPrincipals(). Credit: Terry Steichen.
        Also, the array of Principals returned by userPrincipals() is now sorted.

        * WikiSession receives lots of Javadoc tweaks and minor
        cleanup-oriented fixes (e.g., member visibility changes) that
        do not change functionality. The class, and all of its methods, are
        now marked final. The setSubject() method, which was not called
        anywhere, was removed; it was a potential security risk.

        * Ant 'javadoc' task now links to J2EE 1.3 API.

        * Added table entry to SystemInfo page to display list of active users.
        If you feel this is a privacy risk, remove the line from SystemInfo.

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

        * 2.4.15

        * Fixed issue with absolute URLs and ShortURLConstructor (we were
        using %U where %u should've been used in ERROR and NONE contexts).
        Thanks to jim from IRC for pointing this out.

        * Added patch from Brad Johnson to give better error output if
        RCSFileProvider fails.

        * Added patch from Murray Altheim to support _cmdline in PluginManager.
        This allows a plugin to do completely custom parsing.

2006-06-17  Andrew Jaquith <andrew AT freshcookies DOT org>

        * 2.4.14

        * Enhancement: all background threads now subclass a new class called
        WikiBackgroundThread which will gracefully shut themselves down when
        they hear a 'wiki shutdown' event. These threads are, at present:
        WikiSession.SessionMonitor, PageManager.LockReaper, RSSThread, and
        LuceneSearchProvider.LuceneUpdater. These threads are NO LONGER
        daemon threads, which means they won't stay in memory when
        the wiki webapp is removed.

        * Enhancement: Added protected method shutdown() to WikiEngine that is
        triggered by WikiServlet catching webapp destroy() events. Shutdown()
        fires a WikiEngineEvent called 'shutdown' to all listeners, which at
        present includes all WikiBackgroundThreads. New class added:
        WikiEngineEvent. To catch container events, WikiServlet was changed in
        web.xml to load at startup. This is a dirty hack, but not too dirty.

        * Enhancement: Major refactoring of WikiSession to include a background
        'monitor' thread that removes expired wiki sessions. This means that
        session-count information should be accurate to within a minute
        of when your web container expires its sessions. The background thread
        is an inner class called SessionMonitor that subclasses WikiBackgroundThread.
        WikiSession also gains a method called getUserPrincipals(WikiEngine)
        that returns an array of Principals that represents the current
        users currently using the wiki.

        * Enhancement: SessionsPlugin receives parameter 'property' to specify what
        session information should be returned. If set to 'users', plugin
        returns the list of current users. If omitted, it returns the number of
        active sessions. Thus, [{INSERT SessionsPlugin property=users}]
        will actually print the names of current users -- neat!

        * Enhancement: Group interface receives a long-awaited members()
        method that returns the wiki group's current members as an array
        of Principals.

        * Enhancement: thread responsible for RSS generation extracted out of
        WikEngine and moved to its own RSSThread class.

        * Bug fix: to support multi-wiki webapps, WikiSession.getWikiSession's
        method signature now includes a parameter for the current WikiEngine.
        Check your custom JSPs to see if this affects you (it shouldn't; none of
        the default JSPs currently use this method).

        * Bug fix: Fixed deprecated methods used in LuceneSearchProvider.

        * Bug fix: added sensible session timeout defaults to TestHttpSession
        to prevent some tests from failing.

        * Minor signature change to GroupManager: commit() now throws WikiException.

        * Minor refactoring of WikiEvent class and subclasses to add getType()
        method to superclass.

2006-06-05  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.4.13

        * Added EditorManager patch from Chuck Smith.  This now allows
        fully dynamic editor selection using a drop-down menu in EditContent.jsp

        * Added EditorIterator tag from Chuck, too.

        * Fixed some IE tab layout issues, thanks to Dirk Fredericx.

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

        * 2.4.12

        * Added Hypersonic embedded database for JDBC testing. Enabled
        JDBC testing in build.properties to use Hypersonic by default.
        Added license file; corrected file extensions of two others.

        * Removed database scripts for Mckoi embedded database.

        * Added Ant target called 'tests-auth' for JDPA debugging of
        AuthorizationManagerTest.

        * Minor Javadoc fixes.

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

        * 2.4.11

        * WikiSession received minor refactorings to remove the set/getLastContext()
        methods. These were used for only one purpose anyhow (WebContainerAuthorizer)
        and the net result was that their inclusion was preventing garbage collection
        of expired WikiSessions. WikiSession also receives a removeWikiSession()
        method, which removes wiki sessions from its internal cache, and is called
        during logout.

        * Bug fix: WikiSession.sessions() and the related SessionsPlugin now
        more accurately reflect the number of current WikiSessions, instead of
        continuously incrementing. (Technically, the counter shows the number of
        non-GCed sessions.) In the future a "session reaper" would make this even
        better.

        * Bug fix: Removed divide-by-zero error from SecurityVerifier.

        * Bug fix: DefaultGroup and DefaultGroupManager now store their
        WikiEventListeners in WeakHashMaps to prevent listener objects
        (such as WikiSession) from being reclaimed by GC.

        * Bug fix: WikiDocument now stores its reference to WikiContext
        as a WeakReference, so that caching operations won't prevent GC
        of the WikiContext.

        * Bug fix: Corrected text on the default PreferencesContent.jsp
        to reflect recent e-mail reset function.

        * Bug fix: Fixed listener bug DefaultGroupManager that was preventing
        WikiSessions from receiving updated GroupPrincipals when groups
        were changed to include new members in certain cases.

        * Bug fix: Fixed 'index out of range' error caused by zero-length cookies.

        * Bug fix: WebContainerAuthorizer now recognizes roles declared in
        web.xml for elements web-app/security-role/role-name, in addition to
        those declared for web-app/security-constraint/auth-constraint/role-name.

        * Moved hack-ey code that injects web container Role Principals from
        AuthenticationManager to WebContainerLoginModule, where it belongs.

        * As part of the memory-leak fix, WebContainerAuthorizer no longer
        relies on a sneaky call to WikiSession.getLastContext().getHttpRequest()
        to test whether a user possesses a particular container role. Instead,
        we (only) inspect the user's Subject's Principal set for the desired role.
        This means that changes to container's user/role mappings are NOT
        reflected until the next time the user logs in.

2006-05-28  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.4.10

        * Atom feeds now validate properly

        * RSS and Atom feeds are now served with proper media type

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

        * 2.4.9

        * Enhancement: UserDatabase interface includes two new methods:
        getWikiNames() for enumerating the users in the current database,
        and deleteByLoginName( String ), for removing users. I have implemented
        these methods to the concrete classes JDBCUserDatabase and
        XMLUserDatabase. Thanks to Frank Fischer for his patches; they
        served as the basis for these changes. I have *not* added convenience
        methods to UserManager... yet.

        * Enhancement: SecurityVerifier includes new code that checks to make
        sure the UserDatabase is initialized properly, and that it can add
        and delete users correctly. Also, admin/SecurityConfig.jsp includes
        a new section ('UserDatabase') where results of the checks are displayed.

        * Minor tweaks to the database setup scripts to include update/delete
        privileges for the roles table.

        * Minor tweak to web unit tests to account for cleared cookies at logout.

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

        * 2.4.8

        * Enhancement: AuthenticationManager now injects role Principals
        at login time from the external authorizer into our WikiSession's
        subject. This works with all Authorizers, including (of course)
        WebContainerAuthorizer. This enables grants to Principals of
        type com.ecyrd.jspwiki.auth.authorize.Role to be specified in
        the Java security policy. In particular, this means that policy
        files can be broadened to include container roles.
        WebContainerAuthorizer received a new method to accomodate this.

        * Enhancement: Added grant block in jspwiki for administrator groups
        principal com.ecyrd.jspwiki.auth.GroupPrincipal "Admin" (wiki group)
        and principal com.ecyrd.jspwiki.auth.authorize.Role "Admin" (container
        role). Added new wiki page to distribution, GroupAdmin.txt with an
        empty (disabled) membership, which makes the administrator group
        secure by default. We expect that a future enhancement to Install.jsp
        will overwrite the contents of this file, thus "enabling" the admin group.

        * Bug fix: Uploaded JDK1.4-compatible version of freshcookies-security.jar.

        * Bug fix: Fixed error in jspwiki.policy.

        * Bug fix: Changed WikiEvent so that its toString() method does not
        leak credentials.

        * Bug fix: Logout.jsp now removes "asserted" identity cookies.
        This is arguably less confusing to users.

        * Bug fix: Removed SecurityConfig.jsp from web.xml constraint (for now).

        * Removed spurious import in AuthorizationManager.

        * Massive refactoring and huge improvements to SecurityVerifier and
        admin/SecurityConfig.jsp. Janne, it should even for you now. :)

        * AllPermissionCollection now accepts WikiPermission and PagePermission
        types in its add() method. The newPermissionCollection() method for
        WikiPermission and PagePermission returns a new AllPermissionCollection().

2006-05-09  Dan Frankowski

        * 2.4.7

        * Fixed SearchBox "edit" bug when
      jspwiki.urlConstructor=ShortURLConstructor

        * Add a link on the attachment page back to the original page

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

        * 2.4.6

        * Fixed NPE in ReferenceManager.pageRemoved (thanks
        to JMarquart).

        * ShortURLConstructor did not have PREVIEW context
        available; thanks to Malte Kiesel for the fix.

        * Added quick fix from Dan Frankowski to generate
        JDOM javadoc links.

        * Plain URIs in text are now parsed properly and no longer
        cut at the first "=" sign.

        * NewGroup.jsp would occasionally throw NPEs if the context
        was null - fixed by ICantRememberWhoAnymoreBecauseILostTheEmail.
        Thanks anyway!

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

        * 2.4.5

        * Added a new JSP for verifying JSPWiki's security
        configuartion, admin/SecurityConfig.jsp. This JSP
        collaborates with a new class, c.e.j.auth.SecurityVerifier.
        SecurityConfig will verify the presence or absence of
        the JAAS login config file, the security policy file,
        and container-managed auth constraints. It will also
        validate that the correct JAAS login configations exist,
        and will print a summary table showing the privileges
        that apply to each role. Much needed, and should
        help folks get their security working.

        * To support the security verifier, small (non-public)
        changes were made to WebContainerAuthorizer. This class
        also gains a new public method isConstrained(String, Principal).

        * Bug fix: AuthenticationManager's method of finding
        its JAAS and security policy files changed so that
        full (absolute) patchs are discovered, rather than
        local (JNDI) paths.

        * Bug fix: small change to default security policy file
        jspwiki.policy. It now includes commas between the
        codebase and principal entries, as it should have.

        * Added a small third-party utility jar (my own)
        for parsing security policy files.

2006-05-06  Janne Jalkanen <jalkanen@ecyrd.com>

        * 2.4.4

        * Added activation.jar and mail.jar to the distribution

        * AuthenticationManager now complains if it cannot
        locate the JAAS LoginManager information, instead of
        failing with NPE.

        * PagePermission.hashCode() no longer fails with NPE
        if wiki is not set (normally, though, you would never
        need it, but there are certain cases where this might
        occur).

        * Added a great patch from Dan Frankowski which allows
        recovery of forgotten passwords!  Please see your
        jspwiki.properties for new SMTP options.

        * Added search results filtering based on permissions,
        i.e. you no longer see pages to which you have no
        access to.  Requested by many people.

        * Login button is now on its own line instead of being
        hidden in the right corner.  Helps those people who
        like to "hunt and click" on the mouse.

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

        * 2.4.3

        * Added fix from Rolf Schumacher: no longer outputs
        password to the log file in Tomcat.  Oops.

        * Fixed a failing unit test

        * atom.jsp is now gone; please use "rss.jsp?type=atom"

        * Fixed SearchBox.jsp issue reported by Dirk Fredericx.

        * FeedDiscoveryTag should now offer Atom 1.0 feeds.

        * WeblogPlugin no longer considers empty comment pages
        as "1 comment".

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

        * 2.4.2

        * Page Renamer did not write the author name properly to
        any pages that were changed due to referrers changing.

        * Page Renamer would accidentally do double-encoding of
        XHTML entities...  Yes, there's a difference between
        getText() and getPureText().  Thanks to suomigo.net
        community for finding this one out.

        * WikiEngine.renamePage() API signature was changed
        because of this... It now takes a WikiContext as well.

        * Login.jsp did not write proper content encoding.

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

        * 2.4.1

        * Updated README.

        * Split old stuff from ChangeLog to OldChangeLog

        * Added missing SearchPageHelp

        * PageActions.jsp now checks if login is allowed

        * Install.jsp now sets "jspwiki.security=container" to make
        first-time installs easier.

        * AuthorizationManager returns now "false", if security is
        set to container and you ask for login permissions.  This
        drops the "Login" button from the display, if JSPWiki is
        not managing authentication, fixing an annoyance.

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

        * 2.4.0

        * SearchResultsIterator now can start from a given place

        * You can now see all of the search results - just click on
        "next 20 results".

        * Included patch from Dan Frankowski to support returning
        of search fragments.  Thanks!

        * Upgraded to Lucene 1.9.1

        * Removed slash from allowed characters in wikipage - that would
        create pages that were impossible to link to.  Oops!  It must've
        been some debug code left in...

        * LinkTag now removes extra whitespace from link text; this allows
        you to use multi-line <wiki:Param> tags without the text becoming
        too unwieldy...

        * Search now also supports Google-like "are you feeling lucky"
        -functionality.  Just click on "Go!" in the search page.

        * Search help is now on a page called "SearchPageHelp".

        * Added support for left-to-right and right-to-left markup with
        the %%ltr and %%rtl default styles.  You can copy them from the
        "jspwiki.css" file.

        * Minor cleanups to build.xml.

        * CheckLockTag would get confused if two people were trying to
        create a non-existent page at the same time.  Reported by
        Mark Rawlings.

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.

