2014-05-23  Harry Metske (metskem@apache.org)

       * 2.10.1-svn-17

       * Fixed JSPWIKI-535 - direct links to sections with accents doesn't work

2014-04-20  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.10.1-svn-16
       
       * First steps integrating Siegfried Goeschl's Wiki On A Stick (https://github.com/sgoeschl/apache-jspwiki - 
         thanks!), portable module still pending. 
       ** Fixes JSPWIKI-826 - [Portable] PropertyReader ignores the web app class loader
       
       * Lucene updated to 4.7.0

2014-04-20  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.10.1-svn-15
       
       * Fixed JSPWIKI-822 - NPE thrown by PluginContext#getText()
       
       * JSPWIKI-814 - VersioningFileProvider does migrate original page properties (thanks to Brian Burch)

2014-04-20  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.10.1-svn-14
       
       * Fixed JSPWIKI-832 - [Portable] Problems setting up multiple wikis using a shared JSPWiki libraries 
         (patch by Siegfried Goeschl - thanks!)
       
       * Upgraded selenium-*-drivers to 2.41.0

2014-04-01  Harry Metske (metskem@apache.org)

       * 2.10.1-svn-13

       * Fixed JSPWIKI-831 - Container managed authorization does not work in tomcat

2014-03-17  Harry Metske (metskem@apache.org)

       * 2.10.1-svn-12

       * Fixed JSPWIKI-833 - temp policy file is created with wrong content (thanks to Dietrich Schmidt)

2014-03-11  Harry Metske (metskem@apache.org)

       * Fixed JSPWIKI-823 - set java.io.tmpdir to ${project.build.directory} in pom.xml

2014-03-11  Harry Metske (metskem@apache.org)

       * Fixed JSPWIKI-827 - Migrate the mvn_cheatsheet.txt to Markdown

2014-03-03  Harry Metske (metskem@apache.org)

       * 2.10.1-svn-11

       * Fixed JSPWIKI-813 - ReferenceManagerTest - two cases fail (thanks to Brian Burch)

2014-03-02  Dirk Frederickx (brushed AT apache DOT org)

       * 2.10.1-svn-10  
       
       This is the second major check-in of the HADDOCK template, with 
       fixes and improvements mainly related to the plain editor.

       * Livepreview has been fixed, with ajax based on the fly page rendering. 
         The livepreview area can now also be displayed side-by-side next to the editor textarea, 
         so you can immediately see the rendered wiki-markup during edit.

       * Suggestion dialog boxes are shown while you type to assist entrance of more advanced 
         wiki-markup such as links, %%styles, colors, fonts, plugins, and symbols.
         (but still heavily under development)

       * Section Editing has been improved: you can choose which part of the page you want to edit.

       * All icons are now based on an icon Font, replacing the FamFamFam icon set. 
         Based on Font Awesome by Dave Gandy - http://fontawesome.iohttp://fontawesome.io/icons/

       * The find & replace UI has been enhanced, showing number of occurrences, 
         supporting regular expressions, and supporting replacement for the first or all matches.

       * Text is automatically indented based on the indentation level of the previous line.

       * Using the TAB key inside the textarea will indent a line. Use shift+TAB to un-indent.
         Indentation also works when selecting multiple lines.

       * You can use shift+Enter to quickly insert line-breaks. (\\)


       Fixing following editor related JIRA tickets :
       
       * [JSPWIKI-382]  Remove posteditor.js
      
       * [JSPWIKI-482]  Wrong insert from the suggestion box  

       * [JSPWIKI-443]  Full screen editor. 
         Added a collapsible sidebar, and a side-by-side display of the live-preview area.

       * [JSPWIKI-336]  section selection box not working properly. Fixed. 

       * Fixed the User-Preference page-unload event. 
       

       Other changes : 

       * New "layout" user-preference to switch between fluid or fixed-width page layout.
 
       * Added a info drop-down menu with a summary of the page-info. 
         This is similar to page-footer section, but now accessible at the top of the page.
          
       * Replacing all *.png based icons by an icon font.  (eg. slimbox, filter, rss-feed )


2014-02-20  Dirk Frederickx (brushed AT apache DOT org)

       * 2.10.1-svn-9  
       
       * JS fix in haddock template : RegExp expression cause FF to crash.
       

2014-02-20  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.10.1-svn-8
       
       * [JSPWIKI-769 related] jspwiki-portable module, right now only Windows executable is generated, cfr. with
         https://jspwiki-wiki.apache.org/Wiki.jsp?page=PortableBinaries
       
       * [JSPWIKI-817 related] Install.jsp is broken ==> Translation corrections (install.jsp.intro.[p1|p2|p3]) for ES
       
       * [JSPWIKI-821] TestEngine sometimes creates testrepositories with double timestamps after r1567444
       
2014-02-18  Dirk Frederickx (brushed AT apache DOT org)

       * 2.10.1-svn-7  
       
       * Various small fixes on the HADDOCK template (jsp/css/js) :
       
       * Fixing %%category dropdowns which were clipped when inside a %%accordion.
         Replacing js based animation by2.10.1-svn-12 css3 animation to show/hide the popup.
       
       * Fixing bug when saving the Preferences (detected by Harry)
       
       * Changed fixed-width layout into fluid layout, occupying all screen real-estate.
         (this could become a user-preference setting in the future)  
         Slightly decreasing the size of the sidebar.
       
                  
2014-02-18  Dirk Frederickx (brushed AT apache DOT org)

       * 2.10.1-svn-6
       
       * Fixing the JSONRPCMAnager.emitJSONCall(..) so that it now renders 
         the correct JSON RPC invocation javascript.
                  
         You can test the RPCSamplePlugin like this:
         
              [{RPCSamplePlugin

              test
              }]

		 We are still getting error-code: 490, "No permission to access this AJAX method!"
         when invoking a plugin generated json-rpc call.
       

2014-02-14  Dirk Frederickx (brushed AT apache DOT org)

       * 2.10.1-svn-5

         Introducing the HADDOCK template, a new template/ui for Apache JSPWiki.
         
         This template contains various UI improvements and JSP simplifications, 
         a major redesign of the JSPWiki CSS stylesheet based on BOOTSTRAP 
         (now modularly build with LESS) and a rework of the javascript routines 
         based on mootools v1.4.x. (also the js is now split into modular class files)
 
         Be aware: this is a first commit -- expect things to be broken.
         More work is needed on the plain editor; the Group UI is to be fixed.
         Validation has been done against Safari, Chrome & FF;  IE testing is left
         to the adventurous user. 

         HADDOCK lives peacefully next to the default template. To activate the new 
         template, add following line to your jspwiki-custom.properties:

              jspwiki.templateDir = haddock
         

       * [JSPWIKI-504] New default look for 3.0
       
       * [JSPWIKI-431] Attachment Upload, support upload of multiple files, drag&drop, 
              improved progress bars. 
              However the server functionality to upload multiple files is
              currently broken. FFS
               
       * [JSPWIKI-432] Simplify Tabbed Section Markup 
              Still maintaining backwards compatibility with the current %%tabbedSection
              markup.

       * [JSPWIKI-712] Entites in ChangeNote should be decoded with "keep editing"

       * [JSPWIKI-797] Refactoring the JSPWiki javascript routines, upgrade js libs:
               mootools-core-1.4.5
               mootools-more-1.4.0.1
               prettify (dd. 4 mar 2013)

       * [JSPWIKI-798] Refactoring the JSPWiki main CSS stylesheet - 
               now based on the BOOTSTRAP CSS Framework

       * [JSPWIKI-430] DOM based popups to replace regular js alert or prompt dialog boxes
               Also the edit/clone UI has been refactored. 
               Some delete confirmation dialog boxes are still to be converted. 

       * [JSPWIKI-429] Improved SLIMBOX to support Youtube, flash and other formats.
                You can now also 'slimbox' another wiki-page or an external url.
                Based on this media viewer, also a %%carousel style has been added.

       * [JSPWIKI-478] Remember cookies of collapsible for all contexts
                Collapsible lists and boxes have been refactored, and styled with BOOTSTRAP.
                In general, all %%dynamic-styles are re-styled with BOOTSTRAP css components.

       * [JSPWIKI-693] style issues

       * [JSPWIKI-463] display error in default template
       
       * [JSPWIKI-449] Menuhide functionality is illogical
                The sidebar (aka Favorites) can be shown/hidden via a toggle button.
                By default, the sidebar is hidden in the Edit/Comment view, to give
                maximum square-meters to the edit text-area.
                
       * [JSPWIKI-512] CSS Error with Firefox 2.0.20
                
       *  Upgrade wro4j to latest version 1.7.3

2014-02-12  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.10.1-svn-4

       * Fixed JSPWIKI-819: Consider replacing ECS with JDOM, thanks to Ichiro Furusato
       
       * TestEngine( Properties ) uses a different directory as page repo (JSPWIKI-813 related)

2014-02-10  Harry Metske (metskem@apache.org)

       * 2.10.0-svn-72

       * Fixed JSPWIKI-812 - plugin jars should be loadable from outside the war

2014-02-09  Harry Metske (metskem@apache.org)

       * 2.10.0-svn-71

       * Fixed JSPWIKI-813 - ReferenceManagerTest - two cases fail, patch by Brian Burch

2014-02-08  Harry Metske (metskem@apache.org)

       * 2.10.0-svn-70

       * Fixed JSPWIKI-817 - Install.jsp is broken ==> Translation corrections required (EN en NL done)

       * Removed a bunch of System.out.println() statements from TestCases.

2014-01-13  Harry Metske (metskem@apache.org)

       * 2.10.0
       
       * 2.10.0-svn-69

       * added new CleanBlue skin, contributed by Ichiro Furusato.

2014-01-12  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.10.0-svn-68
       
       * Minor nit in jspwiki.css resulted in overly-tall popup menus on Preferences page. Spotted by Ichiro Furusato.
       
2014-01-07  Harry Metske (metskem@apache.org)

       * 2.10.0-svn-67

       * PropertyReader was using context.log for its logging. Every user changing his prefs is causing
         6 lines of logging to stdout which is cumbersome to get rid of. Changing this to log4j logging
         and offering a way to use an external log4j.properties file so PropertyReader can use log4j
         right away. (The cascaded property reading mechanism does not support "suppressing" properties
         from the ini/jspwiki.properties, only overriding)

2014-01-07  Harry Metske (metskem@apache.org)

       * 2.10.0-svn-66

       * JSPWIKI-810 - included the ReferringUndefinedPagesPlugin

2014-01-02  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.10.0-svn-65
       
       * JSPWIKI-731: replaced all http://www.jspwiki.org references with TLP homepage
       
2014-01-01  Harry Metske (metskem@apache.org)

       * 2.10.0-svn-64

       * dropped last pieces of RCS file support including ProviderConverter

2013-12-31  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.10.0-svn-63
       
       * Special page reference RecentChanges giving a blank page (due to non-existent JSP) instead  
         of required WikiPage.
       
2013-12-30  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.10.0-svn-62
       
       * JSPWIKI-809: PageCache has hardcoded limit of 1000 and doesn't fail gracefully
       
       * Attachment servlet would perform unsafe redirection on doGet if a nextpage param was provided 
         (JSPWIKI-46 related)

2013-12-28  Harry Metske (metskem@apache.org)

       * 2.10.0-svn-61

       * fixed JSPWIKI-807 VersioningFileProvider pageExist failure to properly handle latest version

2013-12-27  Harry Metske (metskem@apache.org)

       * 2.10.0-svn-60

       * fixed JSPWIKI-808 Refactor of o.a.w.HsqlDbUtils.stop() (simply use the Server.shutdown() cmd)

2013-12-26  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.10.0-svn-59

       * Big bunch of Sonar warnings fixed.
       
       * o.a.w.PropertyReader moved to o.a.w.util.PropertyReader
       
       * Workaround for testing Hsql - thanks to Marco Roeland

2013-12-22  Glen Mazza (gmazza AT apache DOT org)

       * 2.10.0-svn-58 (I think)

       * Moved MassiveRepositoryTest to surefire plugin exclusion test to speed
         up build.

       * Moved wro4j-maven-plugin from compile to prepare-package phase so
         people can run mvn test, mvn test -Dtest=xxxxTest, etc. without needing
         to trigger wro4j each time.  (A nice sanity saver.)

       * Simpler error messages when JDBC*DatabaseTest fail due to DB being
         unavailable.

2013-12-22  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.10.0-rc2-3 
       
       * fixed lots of EmptyStackException while checking WatchDogs' state
       
2013-12-22  Harry Metske (metskem@apache.org)

       * 2.10.0-rc2-2
       
       * fixed NPE when using custom policy file
       
2013-12-21  Harry Metske (metskem@apache.org)

       * 2.10.0-rc2-1

       * JSPWIKI-807: VersioningFileProvider pageExist failure to properly handle latest version

2013-12-17  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.10.0 - first RC 
       
       * 2.10.0-svn-57
       
       * JSPWIKI-758: dropped support for RCS (as per 2.9.1 notes on UPGRADING document)
       
       * moved o.a.w.providers.ProviderException to o.a.w.api.exceptions.ProviderException
         
2013-12-16  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.10.0-svn-56
       
       * decoupled o.a.w.util from o.a.w, cfr. with $SVN/jspwiki-war/src/main/config/2.10-API.txt 
         for details
       
       * wikipages for each language are zipped in their respective submodule
       
       * removed remaining build.xml from war submodule, all artifacts are generated from maven now
         
2013-12-15  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.10.0-svn-55
       
       * JSPWIKI-155: AuthenticationManager, AuthorizationManager, DefaultFilterManager, GroupManager
         and UserManager not final anymore
         
       * Introduced utility class to parse xml files.
       
       * DefaultFilterManager closes stream on .initialize(Properties props) if needed
         
2013-12-11  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.10.0-svn-54
       
       * retaking JSPWIKI-155, extracted interface o.a.w.api.engine.AdminBeanManager, cfr. with  
         $SVN/jspwiki-war/src/main/config/2.10-API.txt for details
         
2013-12-04  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.10.0-svn-53
       
       * some more refactorings before moving into JSPWIKI-155, cfr. with 
         $SVN/jspwiki-war/src/main/config/2.10-API.txt for details
         
2013-12-03  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.10.0-svn-52
       
       * second wave of removing deprecated classes / methods, cfr. with 
         $SVN/jspwiki-war/src/main/config/2.10-API.txt for details
         
2013-12-02  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.10.0-svn-51
       
       * first wave of removing deprecated classes / methods, cfr. with 
         $SVN/jspwiki-war/src/main/config/2.10-API.txt for details
         
       * Brought back Installer.INSTALL_WARNING constant, got lost somewhere in time and was still 
         being used by Install.jsp
       
2013-12-01  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.10.0-svn-50

       * Broke cycle between o.a.w.parser and o.a.w.api.engine packages:
       ** added public Pattern getPluginPattern() to o.a.w.api.engine.PluginManager
       ** moved PluginContent parsePluginLine( WikiContext context, String commandline, int pos ) from 
          o.a.w.api.engine.PluginManager to equivalent-static method on o.a.w.parser.PluginContent
       ** deleted deprecated public static boolean isPluginLink( String link ) from o.a.w.api.engine.PluginManager,
          consider using equivalent method on o.a.w.parser.JSPWikiMarkupParser

2013-11-30  Harry Metske (metskem@apache.org)

       * 2.10.0-svn-49

       * JSPWIKI-805: more general support for X-Forwarded-For header

2013-11-28  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.10.0-svn-48

       * JSPWIKI-804: SpamFilter should support X-Forwarded-For header in the banlist
         
       * Lucene upgraded to 4.6, minor upgrades on plugin versions

2013-11-25  Harry Metske (metskem@apache.org)

       * 2.10.0-svn-47

       * fixed JSPWIKI-803 Too strict version requirement on plain editor, maxVersion set to 2.9

2013-09-28  Harry Metske (metskem@apache.org)

       * 2.10.0-svn-46

       * fixed JSPWIKI-792 additional fix, ehcaches now have unlimited expiry (RecentChanges were not showing all entries)

2013-09-15  Glen Mazza (gmazza AT apache DOT org)

       * Removed jspwiki-site under jspwiki-trunk, now just one source of record
         for the website (jspwiki/site)

2013-09-03  Harry Metske (metskem@apache.org)

       * 2.10.0-svn-45

       * fixed JSPWIKI-792, replace opensymphony's oscache with ehcache

2013-08-25  Glen Mazza (gmazza AT apache DOT org)

       * 2.10.0-svn-44

       * Added jspwiki.login.throttling (default true, as in Java code) to default jspwiki.properties
       
       * Removed unnecessary config from IT test's jspwiki-custom.properties.
        
2013-08-24  Glen Mazza (gmazza AT apache DOT org)

       * No revision number (IT tests change only)

       * jspwiki-it-test-container-jdbc test now working, so all five IT test submodules are working 
         (except for RenameProfile which fails with all tests).

       * renamed the two "container" tests to more descriptive "cma" (container-managed authentication).
        
2013-08-22  Glen Mazza (gmazza AT apache DOT org)

       * No revision number (IT tests change only)

       * For IT tests switched to Brian Matthew's inmemdb-maven-plugin used by Roller, creates an in-memory
         HSQLDB database with a lifespan that of the IT tests themselves (so no Ant tasks and no DB drop 
         scripts needed).

       * jspwiki-it-test-custom-jdbc test now working, only one still not operative is -container-jdbc,
         which is up from 0 to 25 percent working.
        
2013-08-22  Glen Mazza (gmazza AT apache DOT org)

       * 2.10.0-svn-43

       * Changed jspwiki.propertyfile.cascade to jspwiki.custom.cascade to emphasize cascading is done
         on top of new jspwiki-custom.properties file if present, the default properties file only if not
         present.

       * Changed some internal constants from "propertyfile" to "custom" so they more accurately reflect
         their meaning in 2.10.
        
2013-08-17  Glen Mazza (gmazza AT apache DOT org)

       * 2.10.0-svn-42

       * Updated code from using org.hsqldb.jdbcDriver to org.hsqldb.jdbc.JDBCDriver

       * Switched from inaccurate NoRequiredPropertyException to somewhat better WikiSecurityException 
         for database errors in JDBCGroup/UserDatabase (former was giving confusing error messages
         when the underlying problem was just DB-related).

       * More work in IT tests, for JDBC tests to become operative again (not yet finished).

       * Renamed HsqlDbUtils to HsqlDBUtilsIT in it-tests, to fully ensure HsqlDBUtils in jspwiki-war
         isn't being run instead.
        
2013-08-15  Glen Mazza (gmazza AT apache DOT org)

       * 2.10.0-svn-41

       * Removed "incubator" from JSPWiki taglib URI, removed deprecated in 2004 RSSLinkTag

       * Some simplifications to web.xml put in, taking advantage of 2.5 web.xml format.
        
2013-08-15  Glen Mazza (gmazza AT apache DOT org)

       * 2.10.0-svn-40

       * Removed unneeded config files in Selenium IT module, changed its packaging to WAR
         and its parent to the it tests folder.  JDBC tests still inoperative, but others
         working as before.

       * Removed jdbc.properties file in favor of configuring it in jspwiki-custom.properties.

       * jspwiki.policy file in test updated to more recent structure used by the integrated 
         tests module, subsequently removed from latter as it's unneeded there.
        
2013-08-14  Glen Mazza (gmazza AT apache DOT org)

       * 2.10.0-svn-39

       * Cleaned out unused config in IT tests, centralized common config 
         to Selenium IT module's custom properties file.

       * Patches to the three non-JDBC IT tests made so they're now all running 
         except for one test (RenameProfile), two JDBC IT tests still inoperative.

       * Removed config references to long-discontinued "jspwiki.admin.user" value.
        
2013-08-13  Glen Mazza (gmazza AT apache DOT org)

       * 2.10.0-svn-38

       * Updated all the test/*-custom.properties files, removed all non-necessary configuration items

       * Removed no-longer-needed file filtering from the jspwiki WAR pom.
        
2013-08-11  Glen Mazza (gmazza AT apache DOT org)

       * 2.10.0-svn-37

       * Updated it-test's selenium module to use new jspwiki-custom.properties system.  IT tests only
         working 50% presently (same as before though).

       * Removed some values from our jspwiki-custom.properties files where the defaults in jspwiki.properties
         are sufficient.
        
2013-08-09  Glen Mazza (gmazza AT apache DOT org)

       * 2.10.0-svn-36

       * Introducted new jspwiki-custom.properties file, which can be placed in test/resources for JUnit tests
         or externally to the WAR (for Tomcat, $CATALINA_HOME/lib) and will be picked up automatically by 
         JSPWiki.  Only those elements that you're changing from default src/main/resources/ini/jspwiki.properties
         need addition to the custom properties file.  I still need to convert the Selenium tests to the new format.

       * Renamed jspwiki.properties, _rcs.properties, and _vers.properties file with new -custom suffix in src/test/resources
         (can be named anything as JUnit tests hardcode the names).  Removed elements that are the same as those
         in the default jspwiki.properties file.
        
2013-08-08  Glen Mazza (gmazza AT apache DOT org)

       * 2.10.0-svn-35

       * Partial revert of Jetty to v. 8.1.12 so it can still run with the JDK 6 used by Jenkins.
        
2013-08-07  Glen Mazza (gmazza AT apache DOT org)

       * 2.10.0-svn-34find 

       * Upgrade from Jetty used in unit test cases from v. 7.6.7 to v. 9.0.4
        
2013-08-06  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.10.0-svn-33

       * JSPWIKI-799: jenkins build fails because of SearchManagerTest. It was reusing the same page directory  
         as other tests, indexing pages created on other tests, depending on the test execution order.
         
       * Use of Lucene 4.4 *Fields on LuceneSearchProvider to instantiate Fields, instead of using deprecated 
         constructor + Field.Index

2013-08-04  Harry Metske (metskem@apache.org)

       * 2.10.0-svn-32

       * first guess in fixing JSPWIKI-799 TestEngine.emptyWorkdir() cleans another directory the the one used by the test ?

2013-08-03  Harry Metske (metskem@apache.org)

       * 2.10.0-svn-31

       * refixed JSPWIKI-791 NoClassDefFoundError for org.apache.lucene.analysis.standard.ClassicAnalyzer

2013-08-03  Harry Metske (metskem@apache.org)

       * 2.10.0-svn-30

       * fixed JSPWIKI-789 upgrade commons-io from 1.4 to 2.4

2013-08-03  Harry Metske (metskem@apache.org)

       * 2.10.0-svn-29

       * fixed JSPWIKI-790 upgrade HSQLDB from 2.2.9 to 2.3.0

2013-08-03  Glen Mazza (gmazza AT apache DOT org)

       * 2.10.0-svn-28

       * Removed unused variables as reported by Sonar, as information is obtainable
         by other means when needed.

       * Removed "incubating" references in pom.xml
        
2013-08-01  Dirk Frederickx (brushed AT apache DOT org)

       * 2.10.0-svn-27

       * JSPWIKI-761 : Implementing the WRO4J ( Web Resource Optimizer for Java ) Build-time solution 
       through the wro4j maven plugin. 
          - replacing YUI-Compressor for JS by UglifyJS (better compression)
          - introducing the LESS CSS preprocessor supporting advanced css authoring capabilities (variables, mixins, ...)
          - merging JS and CSS files to reduce the number of resources needed at page-load.

       You can now build with or without minification of the JS and CSS files to ease development 
       by using -Dminimize = true | false. (ref. mvn_cheat-sheet.txt)  
        
2013-08-01  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.10.0-svn-26

       * Removed org.apache.wiki.WikiException in favour of org.apache.wiki.api.exceptions.WikiException
         
2013-07-31  Glen Mazza (gmazza AT apache DOT org)

       * 2.10.0-svn-25

       * Added missing Lucene dependency for testing, changed location of
         userdatabase.xml and groupdatabase.xml to get more of the Selenium
         tests running.
         
2013-07-30  Glen Mazza (gmazza AT apache DOT org)

       * 2.10.0-svn-24

       * JSPWIKI-791: Upgrade Lucene from 3.6.0 to 4.4.0       

2013-07-28  Harry Metske (metskem@apache.org)

       * 2.10.0-svn-23

       * fixed JSPWIKI-784 UTF-8 chars not correctly rendered if served by JBoss
          (JBoss now also uses response.getOutputStream)

2013-07-19  Glen Mazza (gmazza AT apache DOT org)

       * 2.10.0-svn-22

       * Updated some dependencies and plugins based on results from mvn versions:display-[plugin|dependency]-updates (see base pom.xml)

       * Various Sonar fixes (if cases without braces, trailing-line comments, etc.)

       * Moved filter file (back) from jspwiki-war/src/test/filters to src/main/filters as I
         realized filtering is used in the webapp/WEB-INF folder in the main branch.

2013-07-18  Glen Mazza (gmazza AT apache DOT org)

       * 2.10.0-svn-21

       * Some Sonar fixes on trailing comments

       * Combined our two maven-war-plugin definitions in jspwiki-war, added a Maven 3 requirement to the base POM
         so we can run mvn versions:display-[plugin|dependency]-updates
       
       * Tightened up SearchManagerTest, now deleting page created after each test (was failing on Jenkins although
         for some reason still working fine on my computer).

2013-07-18  Glen Mazza (gmazza AT apache DOT org)

       * 2.10.0-svn-20

       * Some Sonar fixes on minor matters.
       
2013-07-15  Glen Mazza (gmazza AT apache DOT org)

       * 2.10.0-svn-19

       * Some Sonar complaints removed regarding redundant final declarations within
         final classes.
       
2013-07-14  Glen Mazza (gmazza AT apache DOT org)

       * 2.10.0-svn-18
       
       * Fixed the 160-170 Sonar complaints about redundant methods/variables redundantly being 
         declared "public" or "public static final" within interfaces, also removed unused imports.
         Pre-commit we're at 77.5% rules compliance (ranked 69 of 87 Apache projects).
 
       * Moved POM dependency scope declarations out of root pom and into jspwiki-war pom.

2013-07-11  Glen Mazza (gmazza AT apache DOT org)

       * 2.10.0-svn-17
       
       * Moved jspwiki.tld to releases/META-INF/ so it becomes part of the JSPWiki JAR instead of 
         standalone file
 
       * Upgraded jspwiki.tld from JSP 1.1 to JSP 2.1 (requires Tomcat 6 or higher), new URL for taglib 
         includes "incubator" but can be quickly changed should JSPWiki become TLP.

2013-07-11  Glen Mazza (gmazza AT apache DOT org)

       * 2.10.0-svn-16
       
       * Upgraded JSTL to 1.2 (which includes standard, so could remove that dependency)
      
       * Removed jstl-fmt.tld, oscache.tld in favor of versions within their respective JARs

2013-07-03  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.10.0-svn-15
       
       * JSPWIKI-772: Move site to trunk so content generated from source gets 
         built automatically

2013-07-03  Glen Mazza (gmazza AT apache DOT org)

       * 2.10.0-svn-14

       * Switched from org.jdom:jdom:1.2 to org.jdom:jdom2:2.0.5, to JUnit 4.11

       * Updated Maven cheat sheet to provide debugging info 

       * Moved filters file from src/main/filters to src/test/filters as test
         is the only place using it.

       * Updated some licenses to most recent.

2013-07-01  Glen Mazza (gmazza AT apache DOT org)

       * 2.10.0-svn-13

       * Switched from jdom:jdom:1.0 to org.jdom:jdom:1.2, removed 
         tomcat:jasper-runtime dependency

2013-06-26  Glen Mazza (gmazza AT apache DOT org)

       * 2.10.0-svn-12

       * Switched to Jaxen 1.1.4 and removed nonstandard *-exclusion to get rid
         of "jaxen:jaxen:jar with value '*' does not match a valid id pattern"
         warning messages in the build.

2013-06-23  Glen Mazza (gmazza AT apache DOT org)

       * 2.10.0-svn-11

       * Switched jslint checking from yuicompressor-maven-plugin to jslint-maven-plugin 
         (former uses out-of-date jslint version from 2010, and latter allows more customization
         options)

       * Updated google-code-prettify's JS to latest 2013 version.

2013-06-11  Harry Metske (metskem@apache.org)

       * 2.10.0-svn-10

       * upgraded hsqldb from 1.8.0.10 (very old, no more sources and docs in central)
                           to 2.2.9 (current release)
       * removed (illegal according to IntelliJ IDEA) cobertura systemProperties from pom.xml

2013-06-09  Harry Metske (metskem@apache.org)

       * 2.10.0-svn-9

       * minor tweaks to HsqlDbUtils so we get far less debug output on builds (450k => 90k)
       * WikiBackgroundThread: replace "System.out.println" with log4j error/warn

2013-06-07  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.10.0-svn-8

       * removed some deprecated classes (related to JSPWIKI-303), targetted to be removed
         on 2.10. Specifically: 
           - o.a.w.FileUtil: in favour of o.a.w.util.FileUtil
           - o.a.w.TextUtil: in favour of o.a.w.util.TextUtil
           - o.a.w.filters.FilterManager: in favour of o.a.w.filters.DefaultFilterManager
           - o.a.w.plugin.PluginManager: in favour of o.a.w.plugin.DefaultPluginManager

       * JSPWIKI-780: InternationalizationManagerTest is no longer sytem-locale dependent

2013-06-06  Harry Metske (metskem@apache.org)

       * 2.10.0-svn-7

       * removed duplicate keys from translation files.

2013-06-06  Glen Mazza (gmazza AT apache DOT org)

       * 2.10.0-svn-6

       * Update to Chinese, Portuguese, French and Italian language files.      

2013-06-05  Harry Metske (metskem@apache.org)

       * 2.10.0-svn-5

       * JSPWIKI-779: Refactor TemplateManager#listLanguages() to get rid of copying
         default.properties to default_en.properties

2013-06-03  Glen Mazza (gmazza AT apache DOT org)

       * 2.10.0-svn-4

       * Removed further webtest-related configuration from jspwiki-war/build.xml;
         updated parameters so ant dist still works.
       
       * Updated o.a.w.TranslationsCheck to make less chatty

       * Removed unused translations from Italian and German resource files.

2013-06-02  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.10.0-svn-3

       * JSPWIKI-771: inherit ASF parent pom. Deleted release profile in favour of
         apache-release and gpg configuration (both present on parent pom);
         added <ciManagement/>, <issueManagement/> and <mailingLists/> sections.
       
       * fixed runtime NPE on WikiJSPFilter (m_engine used before having been initialized)

2013-06-01  Harry Metske (metskem@apache.org)

       * 2.10.0-svn-2

       * JSPWIKI-396: UTF-8 characters in wiki pages incorrectly rendered if served by Weblogic

2013-05-28  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.10.0-svn-1

       * JSPWIKI-770: added jspwiki-it-test-container and jspwiki-it-test-container-jdbc
         selenium maven execution. Still some bits of refactor remaining + the IT 
         tests are assuming english language, but the base configuration is finished
       
       * artifact checksums created on release profile

2013-05-27  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.10.0-svn-0

       * Maven multimodule build (related to JSPWIKI-768, JSPWIKI-769, 
         JSPWIKI-770 and JSPWIKI-771)

2013-05-23  Glen Mazza (gmazza AT apache DOT org)

       * 2.9.2-incubating-14
       
       * Had Ant webtests and dist targets now write
         to target/ant-webtests and target/ant-dist
         respectively instead of non-Mavenized folder
       * Removed ant clean target in favor
         of mvn clean. 

       * Selenium tests folder moved to 
         src/test/config; deleted now-unused tests folder.

2013-05-23  Glen Mazza (gmazza AT apache DOT org)

       * 2.9.2-incubating-13
       
       * Adjusted exclusions in Apache Rat, nonvital
         i18n stuff removed from build.xml, HSQLDB now
         writing temp files to target instead of base
         directory (easier to remove that way).

2013-05-23  Glen Mazza (gmazza AT apache DOT org)

       * 2.9.2-incubating-12
       
       * Removed Cobertura and Sonar tasks from Ant build
         and placed into Maven project (relying on config
         in MVN3_BRANCH with comments added.)

2013-05-23  Glen Mazza (gmazza AT apache DOT org)

       * 2.9.2-incubating-11
       
       * Remove unused .externalToolBuilders, .fbprefs folders
         OldChangeLog out of root directory and now under config/dev,
         build.properties deleted, JDBC config notes moved from
         build.xml to JDBCUserDatabase.java, removed no longer used
         etc/WEB-INF folder, jartests target gone from build.xml. 

2013-05-22  Glen Mazza (gmazza AT apache DOT org)

       * 2.9.2-incubating-10
       
       * Removed the war target from the Ant build.xml, 
         the Ant webtests and dist targets run fine with
         the results from mvn clean install.

2013-05-22  Glen Mazza (gmazza AT apache DOT org)

       * 2.9.2-incubating-9
       
       * Removed the unit test targets from the Ant build.xml, 
         the Ant war, webtests, and dist targets run 
         fine with the results from mvn clean install.

2013-05-22  Glen Mazza (gmazza AT apache DOT org)

       * 2.9.2-incubating-8
       
       * Removed the Compile and Compile test targets from the Ant 
         build.xml, the Ant tests, war, webtests, and dist targets
         run fine with the results from mvn clean install.

2013-05-22  Glen Mazza (gmazza AT apache DOT org)

       * 2.9.2-incubating-7
       
       * Moved the javadoc and Rat plugins from MVN3_BRANCH to 
         trunk and removed corresponding javadoc and rat code from
         the Ant script; "ant dist" will now use the javadoc generated
         from Maven.  Note additional configuration for javadoc plugin 
         still present in MVN3_BRANCH; that can be moved over as part
         of the move to submodules.

2013-05-22  Glen Mazza (gmazza AT apache DOT org)

       * 2.9.2-incubating-6
       
       * Moved to one source of record for JSPWiki's 
         dependencies (the Maven pom.xml file), it will
         now be needed to run "mvn clean install [-Dmaven.test.skip]"
         prior to running any of the Ant tasks, in
         order to download the necessary libs.

       * Added maven-eclipse-plugin to pom.xml to create necessary
         Eclipse .project/.settings/.classpath settings upon calling
         mvn eclipse:clean eclipse:eclipse and removed corresponding
         folders in SVN repository. (IDEA users use mvn idea:idea
         instead.)

2013-05-22  Glen Mazza (gmazza AT apache DOT org)

       * 2.9.2-incubating-5
       
       * Mavenized location of doc directory; rat, javadoc,
         and releases folder now under target.         

2013-05-20  Glen Mazza (gmazza AT apache DOT org)

       * 2.9.2-incubating-4
       
       * Mavenized location of src/wikipages files

2013-05-19  Glen Mazza (gmazza AT apache DOT org)

       * 2.9.2-incubating-3
       
       * Mavenized location of src/webdocs files

2013-05-18  Glen Mazza (gmazza AT apache DOT org)

       * 2.9.2-incubating-2
       
       * Mavenized locations of remaining etc/ files.
       * Defaulting storageDir to same "jspwiki-files" dir as pageDir.

2013-05-18  Glen Mazza (gmazza AT apache DOT org)

       * 2.9.2-incubating-1
       
       * Removed filtering within DB and DB test creation scripts although 
         retained it within JDBC[User|Group]Database.java for users
         wishing to use different table/column names.

2013-05-16  Glen Mazza (gmazza AT apache DOT org)

       * 2.9.2-incubating-0
       
       * Mavenized location of jdbc.properties.tmpl, routed JDBC tests 
         from tests/etc/db to target/etc/db, removed unused Ant API-difference
         detector & switched to Maven Clirr plugin equivalent.

2013-05-06  Glen Mazza (gmazza AT apache DOT org)

       * 2.9.1-incubating-10
       
       * Mavenized locations of most tests/etc/ files -> src/test/resources

2013-05-03  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.9.1-incubating-9
       
       * Refactored TemplateManager#listLanguages(PageContext pageContext) so it doesn't search for 
         i18n files under a specific jar filename
       
2013-05-03 Glen Mazza (gmazza AT apache DOT org)

       * 2.9.1-incubating-8

       * Moved test jspwiki{_vers, _rcs}.properties, filter.xml to Maven test/resources
         location; activated Maven filtering for those files and updated build.xml and
         pom.xml to point to new location for these files. 

2013-05-02 Glen Mazza (gmazza AT apache DOT org)

       * Removed install.sh, build.sh/build.bat/build.properties.win, moved latter's
         info into build.properties.

       * slight renaming of web.xml files generated in build.xml for readability

       * Added Maven-only filters.properties to src/main/filters (not yet used)
        
2013-04-30 Glen Mazza (gmazza AT apache DOT org)

       * 2.9.1-incubating-7

       * Moved WAR resources from previous commit to correct src/main/webapps/WEB-INF location, fixed pom.xml
         to stop duplicating those resources in both webapps and webapps/WEB-INF
         

2013-04-30 Glen Mazza (gmazza AT apache DOT org)

       * 2.9.1-incubating-6

       * Moved WAR resources that don't require modification from etc/ to Mavenized src/main/webapps location.
         
       * removed unused etc/dtd folder

2013-04-29 Glen Mazza (gmazza AT apache DOT org)

       * 2.9.1-incubating-5

       * Moved i18n resource files to Mavenized location.
         
       * Updated build.xml and pom.xml for new i18n source locations

2013-04-25 Glen Mazza (gmazza AT apache DOT org)

       * 2.9.1-incubating-4

       * Moved ini folders from etc/ and tests/etc to 
         Mavenized locations src/[main|test]/resources/ini
         
       * Updated build.xml and pom.xml for new ini source locations

2013-04-24 Glen Mazza (gmazza AT apache DOT org)

       * 2.9.1-incubating-3

       * Moved JSPWiki source and test source to Mavenized locations
         
       * Updated build.xml and pom.xml for new JSPWiki source locations

2013-04-23  Dirk Frederickx (brushed AT apache DOT org)

       * 2.9.1-incubating-2

       * JSPWIKI-775, fixing "null" change-notes in PageInfo.jsp.

2013-04-21  Harry Metske <metskem@apache.org>

       * 2.9.1-incubating-1

       * fixed JSPWIKI-396): UTF-8 characters in wiki pages incorrectly rendered if served by Tomcat

2013-04-14 Glen Mazza (gmazza AT apache DOT org)

       * Start of Selenium plugin (just testing prior to it moving into its own module)
         
       * Tomcat 5.x JSP precompilation option removed from build.xml

       * Selenium TestSuite.html tests renamed to CamelCase to allow export-to-Java to work.

2013-04-07  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.9.1-incubating-0
       
2013-04-04 Glen Mazza (gmazza AT apache DOT org)

       * Updated pom.xml by removing Jaxen transitive dependencies and providing
         comments on how to deploy via tomcat7:run-war and tomcat7:redeploy

2013-04-02 Glen Mazza (gmazza AT apache DOT org)

       * Removed apparently unused stripes library from WAR created by build.xml

       * Updated Maven WAR plugin to bring in WEB-INF artifacts: classes, JARs, etc.

2013-04-01 Glen Mazza (gmazza AT apache DOT org)

       * Added YUICompressor Maven plugin into pom.xml to do the same compression
         done by the Ant build script to CSS and JS files in webdocs/scripts and /templates

       * Updated Maven WAR plugin to bring in the webdocs/scripts and /templates files.

2013-03-24 Glen Mazza (gmazza AT apache DOT org)

       * Removed empty src/applets folder

       * More work on Maven WAR plugin configuration

2013-03-21  Juan Pablo Santos (juanpablo AT apache DOT org)

       * JSPWIKI-651: added m2e configuration to pom.xml
       
2013-03-20  Harry Metske <metskem@apache.org>

       * 2.9.1-svn-31

       * fixed JSPWIKI-766): quick search not working anymore
       * "unfixed"  JSPWIKI-659 : NotSerializableException on Tomcat restart , UserManager not Serializable

2013-03-17  Harry Metske <metskem@apache.org>

       * 2.9.1-svn-30

       * fixed JSPWIKI-765): lucene search returns 3 results at max, discovered by Dave Koelmeyer

2013-03-06 Glen Mazza (gmazza AT apache DOT org)

       * Upgraded Maven's tomcat plugin to latest version 2.1

       * Placed in a more helpful error message in RCSFileProvider.java
         to let newbies know RCS needs to be installed on their machine

       * Updated location in build.xml and pom.xml for JSTL library.

2013-02-19  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.9.1-svn-29
       
       * JSPWIKI-764: ChangeLog published on site
       
       * Upgraded version of maven's tomcat plugin to latest available (JSPWIKI-651 related) 
       
2013-02-19  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.9.1-svn-28
       
       * JSPWIKI-762: Drop TranslatorReader
       
       * JSPWIKI-763: Requirement of at least Java 6 to build 
       
2013-02-15  Harry Metske <metskem@apache.org>

       * 2.9.1-svn-27

       * changed test email addresses from example.com to mailinator.com

2013-02-14  Harry Metske <metskem@apache.org>

       * 2.9.1-svn-26

       * changed test email addresses testville.com to example.com (reported by Tony Stevenson from infra)

2013-02-12  Harry Metske <metskem@apache.org>

       * 2.9.1-svn-25
       
       * JSPWIKI-759 Resin 4 Compatibility (thanks to Paul Cowan)
       
       * build.xml tweak: shut down the Jetty test server after the last webtest

2013-02-08  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.9.1-svn-24
       
       * Decoupled (for 2.10 scope) Preferences from WikiContext, effectively meaning that the following 
         methods are now deprecated
           - WikiContext#getBundle( String ) in favour of Preferences#getBundle( WikiContext, String )
           - WikiContext#getLocale( WikiContext ) in favour of Preferences#getLocale( WikiContext )
           - WikiContext#hasAccess( HttpServletResponse ) in favour of 
             AuthorizationManager#hasAccess( HttpServletResponse )
           - WikiContext#hasAccess( HttpServletResponse, boolean ) in favour of 
             AuthorizationManager#hasAccess( HttpServletResponse, boolean )
             
       * Decoupled (for 2.10 scope) org.apache.wiki.event from org.apache.wiki.workflow, by deprecating
           - WorkflowEvent#getWorkflow() in favour of WikiEvent#getSrc()
             
       * Added latest pom.xml from JSPWIKI-651 - Convert JSPWiki to a Maven project. Check associated
         JIRA for details

2013-01-28  Harry Metske <metskem@apache.org>

       * 2.9.1-svn-23
       
       * Dutch localization updates in follow up on JSPWIKI-143 and JSPWIKI-150

2013-01-28  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.9.1-svn-22
       
       * JSPWIKI-143: Unlocalized messages in user management
       
       * JSPWIKI-150: Unlocalized content at workflow's notification for creating a new user
       
       * Minor refactor to HsqlDbUtils init checks
       
       * deprecated 
           - JSPWikiMarkupParser.getImagePatterns( WikiEngine ) in favour of 
             WikiEngine.getAllInlinedImagePatterns()
           - UserManager.SaveUserProfileTask( WikiEngine ) in favour of 
             UserManager.SaveUserProfileTask( WikiEngine, Locale )

2013-01-27  Dirk Frederickx (brushed AT apache DOT org)

       * 2.9.1-svn-21
       
       * JSPWIKI-712, fixing entities encoding in change-note, author and link fields. 
         Part 2 : more fixes when adding page comments. (as pointed out by Harry)
         
       * Improved styling of form buttons, fixing presentation issues in Chrome.       

2013-01-26  Glen Mazza
       * Removed no longer needed StressTestRCSProvider.java,
         returned StressTestVersioningProvider to JUnit tests in build.xml

2013-01-26  Harry Metske <metskem@apache.org>

       * 2.9.1-svn-20
       
       * JSPWIKI-758 - deprecate RCS support.
       
2013-01-24 Glen Mazza

       * Minor tweak to testSerialization() in AclImplTest so it will work with both Maven and Ant 
         running the test. 

2013-01-22 Glen Mazza

       * Fix for JSPWiki-396 (updated org/apache/wiki/util/UtilJ2eeCompat.java to
         use streaming instead of char array-based output to WebLogic.

2013-01-20  Dirk Frederickx (brushed AT apache DOT org)

       * 2.9.1-svn-19
       
       * JSPWIKI-712, fixing entities encoding in change-note, author and link fields. 

2013-01-15  Harry Metske <metskem@apache.org>

       * 2.9.1-svn-18
       
       * fixed JSPWIKI-712  Entities in ChangeNote should be decoded when "keep editing"

2013-01-14  Harry Metske <metskem@apache.org>

       * 2.9.1-svn-17
       
       * fixed JSPWIKI-659  NotSerializableException on Tomcat restart , UserManager not Serializable
         We now no longer put JSONRPCBridge in the HttpSession. Long term solution is to migrate to 
         jackson. 

2013-01-12 Glen Mazza (gmazza@apache.org)

       * Switched to a hardcoded jdbc.properties file for testing to simplify build.xml and future
         Maven conversion. Updated the developing pom.xml in JSPWIKI-651.

2013-01-10  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.9.1-svn-16
         
       * some additional changes regarding org.apache.wiki.api.engine.PluginManager (cfr. $SVN/trunk/doc/2.10-API.txt):
           - @Deprecated public void executeParse(PluginContent content, WikiContext context)
               + consider using PluginContent.executeParse(WikiContext) instead
           - WikiPlugin newWikiPlugin( String pluginName, ResourceBundle rb ) is now public and part 
             of the org.apache.wiki.api.engine.PluginManager API

2013-01-09  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.9.1-svn-15
       
       * fixed JSPWIKI-757 Have default file direction location be in relative directory instead of 
         hardcoded /p/dir1/dir2.If jspwiki.fileSystemProvider.pageDir in jspwiki.properties isn't
         provided, it will default to ${user.home}/jspwiki-files
         
       * new API package org.apache.wiki.api.engine, intended to hold WikiEngine, its managers and
         related classes. FilterManager and PluginManager moved there (cfr. JSPWIKI-155, JSPWIKI-303
         and $SVN/trunk/doc/2.10-API.txt).
       
       * org.apache.wiki.FileUtil and org.apache.wiki.TextUtil Moved to equivalent classes under 
         org.apache.wiki.util. Original classes marked with @Deprecated and forwarding to the new 
         ones until 2.10
 
       * deprecated WikiEngine.getRequiredProperty( props, key ) in favour of 
         TextUtil.getRequiredProperty( props, key ). The former will be deleted in 2.10 scope

2013-01-08 Glen Mazza (gmazza@apache.org)

       * JSPWIKI-756 removed unused Xalan, Xerces, and Custom-Rhino JARs

2013-01-06  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.9.1-svn-14
       
       * Global use of org.apache.wiki.api.exceptions.WikiException instead of org.apache.wiki.WikiException, 
         as part of JSPWiki API (cfr. JSPWIKI-303).
       
       * Corrected the displayed version of commons-httpclient, we are downloading 3.1, but it was 
         named 3.0.1 (it is needed to either delete commons-httpclient-3.0.1.jar or run ant 
         clean-deps to ensure that the old jar goes away)
       
       * Some minor refactors to expose generified collections at Acl and AclEntry, and adding 
         missing serialVersionUID at org.apache.wiki.workflow

2013-01-06  Harry Metske <metskem@apache.org>

       * 2.9.1-svn-13
       
       * fixed JSPWIKI-533  proper handling of page deletes and renames for the Breadcrumb trail 

2013-01-06  Harry Metske <metskem@apache.org>

       * 2.9.1-svn-12
       
       * fixed JSPWIKI-439 Localization of JSPWiki

2013-01-02  Harry Metske <metskem@apache.org>

       * 2.9.1-svn-11
       
       * JSPWIKI-513 - Remove DAV support from JSPWiki

2013-01-01  Harry Metske <metskem@apache.org>

       * 2.9.1-svn-10
       
       * webtests now also use HsqlDbUtils (just like the normal tests), also removed redundant
         hsqldb ant tasks from build.xml

2012-12-30  Harry Metske <metskem@apache.org>

       * 2.9.1-svn-9

       * repaired broken webtests, we now have one (documented) failing webtest (RenameProfile
         for container managed auth).
         Required fixes:
           - TestContainer now binds the jdbc/UserDatabase jdbc/GroupDatabase in Jetty's namespace
           - Logout webtest checks for the specific JSPWikiAssertedName cookie
           - build.xml was missing a lot of tasks and macros, required to properly startup hsqldb (don't know how/why)
           - JDBCGroupDatabase : NamingExceptions do not have a cause, we now log the exception itself
           - removed the semicolon from the License in .ddl files (they cause syntax errors)
        
2012-12-26  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.9.1-svn-8
        
       * Filters API (org.apache.wiki.api.filters), as part of JSPWiki API (cfr. JSPWIKI-303). 
         Check UPGRADING document for details
         
       * Plugin API moved to its own sub-package, org.apache.wiki.api.plugin
         
       * explicit access to API interfaces to get rid of "cannot dereference error with 
         generics" errors at builds.a.o (cfr. http://stackoverflow.com/q/4144623)
       
2012-12-26  Harry Metske <metskem@apache.org>

       * 2.9.1-svn-7
        
       * fixed JSPWIKI-663 (Christmas 2012 patch, thanks to Glen Mazza),
         Rename page - page index still shows attachment with old page name, also patched the 
         WikiPageRenameEvent handling code in PageViewPlugin 
 
2012-12-14  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.9.1-svn-6
        
       * initial commit for JSPWiki API (cfr. JSPWIKI-303), mostly focused on plugin API. Check
         UPGRADING document for details
        
2012-12-12  Harry Metske <metskem@apache.org>

       * 2.9.1-svn-5
        
       * fixed JSPWIKI-742 NullPointerException in PriorityList (reported by Rakesh K. Cherukuri)
       
       * minor updates to build.xml to properly handle build failures (I am not an ant expert...)
 
 2012-12-09  Juan Pablo Santos (juanpablo AT apache DOT org)

       * Sonar Ant task executed even if there are tests failures
       
       * When building jspwiki.properties, jspwiki.baseURL defaults to http://localhost:8080/JSPWiki/
       
2012-12-08  Harry Metske <metskem@apache.org>

       * 2.9.1-svn-4
       
       * fixed JSPWIKI-754 Have PageViewPlugin work with page renames (thanks to Glen Mazza)
       
2012-12-06  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.9.1-svn-3
       
       * Added generics to WikiPlugin.execute( WikiContext, Map< String, String > ) 
       and propagated the change to all plugins. Cfr. with UPGRADING document for details.
       
2012-12-02   Harry Metske <metskem@apache.org>
       
       * 2.9.1-svn-2
       
       * fixed JSPWIKI-753 Consolidate TestEngine.deleteTestPage to single, non-static method (thanks to Glen Mazza)

2012-12-02   Harry Metske <metskem@apache.org>
       
       * 2.9.1-svn-1
       
       * fixed JSPWIKI-665 Page View Plugin and page renames and deletions (thanks to Glen Mazza)
       
 2012-11-22  Florian Holeczek (florianh AT apache DOT org)

       * version switch to 2.9.1-svn-0

2012-11-17  Juan Pablo Santos (juanpablo AT apache DOT org)

       * JSPWIKI-751: deleted guitests target
       
       * Upgraded Sonar Ant Tasks to 2.0

2012-11-01  Florian Holeczek (florianh AT apache DOT org)

       * 2.9.0-incubating (preparing release)
       
       * added generation of .sha1 checksum files

2012-10-30  Florian Holeczek (florianh AT apache DOT org)

       * moved doc/aaa-diagram.graffle to project management area

2012-10-28  Florian Holeczek (florianh AT apache DOT org)

       * 2.9.0-incubating-14

       * JSPWIKI-750: PageViewPluginTest is failing very often when using a JDK 7
       
       * minor documentation and logging fixes to PageViewPlugin

2012-10-22  Florian Holeczek (florianh AT apache DOT org)

       * several small fixes and improvements related to building and licensing stuff

2012-10-22  Florian Holeczek (florianh AT apache DOT org)

       * 2.9.0-incubating-13
       
       * fixed CommentedPropertiesTest, which broke because of the recent license header changes

2012-10-22  Florian Holeczek (florianh AT apache DOT org)

       * adjusted Ant target "rat-report"

       * added license headers to further files

2012-10-21  Juan Pablo Santos (juanpablo AT apache DOT org)
       
       * ensure correct information on cobertura reports.
       
2012-10-21  Florian Holeczek (florianh AT apache DOT org)

       * some further fixes to license headers

       * build improvements: checksum files in correct format, added SHA-512 hash

2012-10-20  Florian Holeczek (florianh AT apache DOT org)

       * some fixes for JSPWIKI-749 and CheckStyle version 5.6

2012-10-09  Juan Pablo Santos (juanpablo AT apache DOT org)
       
       * added Apache License Header to files which were missing it 
         (cfr. with http://s.apache.org/EDd).

2012-10-08  Juan Pablo Santos (juanpablo AT apache DOT org)
       
       * Added rat-report task. It requires at least Apache Ant 1.7.1, though.
       
       * .java files now conform strictly to Apache License Header (cfr. with 
         http://s.apache.org/EDd).

2012-09-25  Florian Holeczek (florianh AT apache DOT org)

       * no version bump

       * minor update to LICENSE file (YUI Compressor version number)

2012-09-23  Juan Pablo Santos (juanpablo AT apache DOT org)
       
       * upgraded Yui compressor to 2.4.7, 2.4.2 from Central is broken. Thanks to Peter Hormanns
         for noticing.
       
2012-09-18  Juan Pablo Santos (juanpablo AT apache DOT org)
       
       * tomcat jars downgraded to 5.5.23 so they can be downloaded from Central. Completes JSPWIKI-746
         and therefore closes JSPWIKI-744
         
       * jetty upgraded to 7.6.7.v20120910 and selenium-server downloaded from their site, to avoid 
         downloading anything from svn.apache.org during build time

2012-09-10   Harry Metske <metskem@apache.org>
       
       * 2.9.0-incubating-12
       
       * rewrote TestContainer to jetty version 7
       
       * upgraded to selenium-server-standalone-2.25.0.jar 

2012-09-06  Juan Pablo Santos (juanpablo AT apache DOT org)
       
       * 2.9.0-incubating-11
       
       * upgraded jrcs-diff to 0.4.2, as part of JSPWIKI-746
       
       * JSPWIKI-747: Dependencies currently unavailable at Central repo

2012-08-29  Juan Pablo Santos (juanpablo AT apache DOT org)
       
       * no version bump
       
       * JSPWIKI-745: Dependencies currently downloadable from Central repo
       
2012-08-09  Juan Pablo Santos (juanpablo AT apache DOT org)
       
       * 2.9.0-incubating-10
       
       * ant clean target cleans all generated files
       
       * junit reports are generated inside of ${tests.report} instead of inside ${tests.src}
       
       * dependencies are downloaded from Central repo whenever is possible, in order to avoid 
         the maintenance of a libraries' svn directory.
      
       * ${libs.opt} set to tests/libs-opt in order to avoid downloading of opt files every time a 
         clean is made
         
       * maven-ant-tasks aren't used to download opt-libs anymore
       
       * HSQL connections are handled inside the appropiate unit tests in order to ensure HSQL 
         server shutdown. Hypersonic is updated to 1.8.0.10 
      
       * added clean-deps target to remove all lib's directories. Useful to remove old jars
         if the dependencies get updated. This target needs to be run at least once to
         ensure that old jars don't remain in classpath
              
2012-07-22  Florian Holeczek (florianh AT apache DOT org)

       * 2.9.0-incubating-9
       
       * JSPWIKI-731: replaced some occurences of www.jspwiki.org by jspwiki.apache.org (XML namespaces)
       
       * some updates to release documentation

2012-07-20  Florian Holeczek (florianh AT apache DOT org)

       * 2.9.0-incubating-8
       
       * Several fixes and improvements for quite some localization resources. Special thanks go to Christophe Dupriez!

2012-07-18  Juan Pablo Santos (juanpablo AT apache DOT org)
       
       * 2.9.0-incubating-7
       
       * JSPWIKI-738: Dependencies should not be distributed with source archive
       
       * Small refactor in LuceneSearchProvider

2012-07-16  Florian Holeczek (florianh AT apache DOT org)

       * no version bump
       
       * synchronized windows to unix build files

2012-07-07  Dirk Frederickx (brushed AT apache DOT org)

       * 2.9.0-incubating-6
       
       * Fixing JSPWIKI-733 Box rounded corners missing in Firefox 13 for PlainVanilla skin elements etc.
         Add unprefixed border-radius and box-shadow to jspwiki.css. 
         (ref. https://bugzilla.mozilla.org/show_bug.cgi?id=693510   Gecko 2.0 dropped support for -moz-prefix.)
       
       * Fixing JSPWIKI-734 ShortURLConstructor causes Syntax Error when loading jspwiki-edit.js

2012-06-05  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.9.0-incubating-5, fixed JSPWIKI-737 IfPlugin negation doesn't work

2012-06-04  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.9.0-incubating-4, added support for cobertura reports and Sonar integration.

2012-06-08  Harry Metske <metskem@apache.org>

       * 2.9.0-incubating-3, fixed JSPWIKI-729 Update Lucene to current version  3.6.0

2012-06-06  Harry Metske <metskem@apache.org>

       * 2.9.0-incubating-2, fixed jsp compile error in rss.jsp ( we forgot one occurrence of com.ecyrd.jspwiki)

2012-05-02  Dirk Frederickx (brushed AT apache DOT org)

       * 2.9.0-incubating-1, fixing JSPWIKI-683 Sortable Tables.
       
       * second ASF release candidate build.

2012-04-21  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.9.0-incubating-0, first ASF release candidate build.

2012-04-18  Harry Metske <metskem@apache.org>

       * 2.9.0-svn-9
        
       * fixed JSPWIKI-726 drop the 2 case-sensitive tests in WikiEngineTest.testSpacedNames1
        
2012-04-14  Harry Metske <metskem@apache.org>

       * 2.9.0-svn-8
        
       * fixed JSPWIKI-725 Return to original page attachments list after deleting one attachment
        
2012-03-25  Juan Pablo Santos (juanpablo AT apache DOT org)
        
       * 2.9.0-svn-7
        
       * fixed JSPWIKI-722 Build broken under jdk 1.7

2012-02-22  Harry Metske <metskem@apache.org>

       * 2.9.0-svn-6
        
       * fixed JSPWIKI-721 Log FileNotFoundException on missing attachment

2012-02-12  Juan Pablo Santos (juanpablo AT apache DOT org)
        
       * 2.9.0-svn-5
        
       * small refactor on ClassUtil.getMappedObject: it uses varargs so we can take away 
         a couple of methods. Also /etc/ini/classmappings.xml file is fully populated with  
         all ClassUtil.getMappedObject calls 
        
2012-02-07  Juan Pablo Santos (juanpablo AT apache DOT org)
        
       * tests are now part of the main build. Also, they can be desactivated through 
         jspwiki.test.skip property (i.e.: ant clean dist -Djspwiki.test.skip=true)
        
2012-02-06  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.9.0-svn-4
       
       * taken back <signeddist/> goal from 3.0 branch in order to be able to accomplish 
         JSPWIKI-557
       
2012-02-01  Harry Metske <metskem@apache.org>

       * 2.9.0-svn-3
       
       * fixed JSPWIKI-719 (plugin compatibility with com.ecyrd.jspwiki)
       
       * draft ReleaseNotes

2012-01-29  Florian Holeczek <florianh@apache.org>

       * 2.9.0-svn-2
       
       * corrected some minor errors which emerged from package renaming

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

       * 2.9.0-svn-1
       
       * release bump because of package rename
