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.

