
Apache JSPWiki 2.10.4 - Release Notes
=====================================

    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you under the Apache License, Version 2.0 (the
    "License"); you may not use this file except in compliance
    with the License.  You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing,
    software distributed under the License is distributed on an
    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    KIND, either express or implied.  See the License for the
    specific language governing permissions and limitations
    under the License.  

The license file can be found in LICENSE.


Welcome to the stable version of Apache JSPWiki 2.10.4!

Apache JSPWiki 2.10.4 is the fifth JSPWiki release made as an Apache TLP. This release features, among other things:
  * Better support for mobile devices in the Haddock Template (JSPWIKI-835)
  * Favicon for haddock template
  * Important fixes
    -> ACL related: JSPWIKI-1039/JSPWIKI-1047/JSPWIKI-1067
    -> rendering cache fixes: JSPWIKI-1064
  * A handful of smaller fixes

Full details are available in the ChangeLog file or via our issue tracker. 

Please report any issues at https://issues.apache.org/jira/browse/JSPWIKI



Apache JSPWiki 2.10.3 - Release Notes
=====================================

    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you under the Apache License, Version 2.0 (the
    "License"); you may not use this file except in compliance
    with the License.  You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing,
    software distributed under the License is distributed on an
    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    KIND, either express or implied.  See the License for the
    specific language governing permissions and limitations
    under the License.  

The license file can be found in LICENSE.


Welcome to the stable version of Apache JSPWiki 2.10.3!

Apache JSPWiki 2.10.3 is the fourth JSPWiki release made as an Apache TLP. This release features, among other things:
  * A ton of Haddock updates
    -> new Image Styles like magnifying images, animations, captions, frames,...
    -> new Background Styles like gradients, images, background colours, etc,
    -> more mobile-friendly updates like hide/reveal site header when scrolling
    -> blogs styling
    -> a plethora of styles which can be triggered through %%add-css constructs, like custom fonts, image galleries, background patterns, page ribbons, and many more!
    -> Haddock Behaviours (javascript extensions to the Haddock Template) integrating SheetJS, MathJax, Marked and Chartist 
  * JSPWiki doesn't have mandatory properties anymore (JSPWIKI-1035 and JSPWIKI-1051) 
  * Important fixes
    -> default log is now redirected to stdout (JSPWIKI-1051)
    -> rendering cache fixes (JSPWIKI-1064) 
  * Portable binaries now use Apache Tomcat 7.0.81 and Launch4J 3.11
  * Devs-only: test-jar available 

Full details are available in the ChangeLog file or via our issue tracker. 

Please report any issues at https://issues.apache.org/jira/browse/JSPWIKI



Apache JSPWiki 2.10.2 - Release Notes
=====================================

    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you under the Apache License, Version 2.0 (the
    "License"); you may not use this file except in compliance
    with the License.  You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing,
    software distributed under the License is distributed on an
    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    KIND, either express or implied.  See the License for the
    specific language governing permissions and limitations
    under the License.  

The license file can be found in LICENSE.


Welcome to the stable version of Apache JSPWiki 2.10.2!

Apache JSPWiki 2.10.2 is the third JSPWiki release made as an Apache TLP. This release features, among other things:
  * JSPWiki portable binaries 
  * Support to run JSPWiki on dockerized containers 
  * Complete rewrite of ajax functionality - see SampleAjaxPlugin for an example of use 
  * New Cryptography Framework - see EncryptedPageFilter for an example of use 
  * New EncryptPlugin 
  * Fixes for running JSPWiki on Glassfish and improved support on Tomcat installations 
  * Upgrade of used libraries:
    -> ehcache to 2.8.3
    -> slf4j to 1.7.12
    -> jetty to 8.1.15 (for testing)
    -> selenium to 2.42.0 (for testing)
    -> stripes to 1.5.8 (for testing)
    -> junit to 4.12 (for testing)

Full details are available in the ChangeLog file or via our issue tracker. 

Please report any issues at https://issues.apache.org/jira/browse/JSPWIKI



Apache JSPWiki 2.10.1 - Release Notes
=====================================

    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you under the Apache License, Version 2.0 (the
    "License"); you may not use this file except in compliance
    with the License.  You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing,
    software distributed under the License is distributed on an
    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    KIND, either express or implied.  See the License for the
    specific language governing permissions and limitations
    under the License.  

The license file can be found in LICENSE.


Welcome to the stable version of Apache JSPWiki 2.10.1!

Apache JSPWiki 2.10.1 is the second JSPWiki release made as an Apache TLP. This release features, among other things:
  * Introducing HADDOCK Template (still under development) 
  * WikiPlugins can now be loaded from an external directory, via jspwiki.plugin.externalJars property 
  * VersioningFileProvider is now able to migrate contents from an existing FileSystemProvider installation 
  * ECS replaced by JDOM2 
  * Lucene upgraded to 4.7.0 
  * Fixed known issues on 2.10.0 with the installation page and container managed authentication 

Full details are available in the ChangeLog file or via our issue tracker. 

Please report any issues at https://issues.apache.org/jira/browse/JSPWIKI



Apache JSPWiki 2.10.0 - Release Notes
=====================================

    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you under the Apache License, Version 2.0 (the
    "License"); you may not use this file except in compliance
    with the License.  You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing,
    software distributed under the License is distributed on an
    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    KIND, either express or implied.  See the License for the
    specific language governing permissions and limitations
    under the License.  

The license file can be found in LICENSE.


Welcome to the stable version of Apache JSPWiki 2.10.0!

Apache JSPWiki 2.10.0 is the first JSPWiki release made as an Apache TLP. This release
features, among other things:
  * use of jspwiki-custom.properties to override specific values of jspwiki.properties file
  * new CleanBlue skin, contributed by Ichiro Furusato
  * support of the X-Forwarded-For HTTP request header
  * merging and compression of css & js
  * upgrade of used libraries
    -> lucene to 4.6
    -> commons-io to 2.4
    -> hsqldb to 2.3.0 (for testing)
    -> jetty to 8.1.12 (for testing)
    -> ehcache replacing oscache
  * switch to maven as build tool
  * jspwiki artifacts published at Central repository (org.apache.jspwiki groupId)
  * dropped RCS support

There have also been some public API changes, detailed at:
http://svn.apache.org/repos/asf/jspwiki/trunk/jspwiki-war/src/main/config/doc/2.10-API.txt

Details are available in the ChangeLog file or via our issue tracker.

Please report any issues at https://issues.apache.org/jira/browse/JSPWIKI



Apache JSPWiki 2.9.1-incubating - Release Notes
===============================================

    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you under the Apache License, Version 2.0 (the
    "License"); you may not use this file except in compliance
    with the License.  You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing,
    software distributed under the License is distributed on an
    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    KIND, either express or implied.  See the License for the
    specific language governing permissions and limitations
    under the License.  

The license file can be found in LICENSE.


Welcome to the stable version of Apache JSPWiki 2.9.1-incubating!

Apache JSPWiki 2.9.1-incubating is the second JSPWiki which is not only released
completely under the Apache License 2.0, but which is also an official Apache
release from within the Apache Incubator. This version is mainly a manteinance
release.

Details are available in the ChangeLog file or via our issue tracker.

Please report any issues at https://issues.apache.org/jira/browse/JSPWIKI



Apache JSPWiki 2.9.0-incubating - Release Notes
===============================================

    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you under the Apache License, Version 2.0 (the
    "License"); you may not use this file except in compliance
    with the License.  You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing,
    software distributed under the License is distributed on an
    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    KIND, either express or implied.  See the License for the
    specific language governing permissions and limitations
    under the License.  

The license file can be found in LICENSE.


Welcome to the stable version of Apache JSPWiki 2.9.0-incubating!

Apache JSPWiki 2.9.0-incubating is the first JSPWiki which is not only released
completely under the Apache License 2.0, but which is also an official Apache
release from within the Apache Incubator.


Please report any issues at https://issues.apache.org/jira/browse/JSPWIKI


UPDATES SINCE 2.8.4
===================

Details are available in the ChangeLog file or via our issue tracker.

Highlights include:

* The java packages have been renamed from com.ecyrd.jspwiki to org.apache.wiki.

* Support external properties in WikiEngine (idea from John McKinney)
          You can now override individual properties in jspwiki.properties using
          standard Java System properties.

* Extended the list of file suffixes indexable for the integrated Lucene search
          engine. We now do ".txt", ".ini", ".xml", ".html", "htm", ".mm",
          ".htm", ".xhtml", ".java", ".c", ".cpp", ".php", ".asm", ".sh",
          ".properties", ".kml", ".gpx", ".loc"


UPDATES SINCE 2.8.3
===================

The full list is available in the ChangeLog file.  Highlights include

* Improvements in JCR Export

* Numerous minor bug fixes


UPDATES SINCE 2.8.2
===================

The full list is available in the ChangeLog file.  Highlights include

* Improved logging

* JDK6 compilation support

* Brazilian Portuguese translation, thanks to Paulo Amaral

* Addition of new PageViewPlugin

* Numerous bugfixes, esp. in sorting.


NEW FEATURES SINCE 2.6.x
========================

* JSPWiki now requires JDK 1.5 to run.

* Simplified Chinese, Dutch, Italian and Russian localizations added!

* There is no more need for JAAS files!  Hooray!  This has
  been replaced with custom jspwiki properties.  Please see
  the UPGRADING document.

* Massive improvements to the default template, like
  section editing.
  
* Sneak preview in the default editor

* WikiWizard is removed (it is LGPL), but FCK integration is available,
  and WikiWizard can still be installed as a separate package.

* German, Finnish, Spanish, Simplified Chinese and Dutch language corepages

* Support for the UniversalEditButton (http://universaleditbutton.org/).

* Password hashes are now salted.  This means you can't share the passwords
  if you have JSPWiki 2.6 instances, as the passwords are upgraded
  transparently.

The full log of any issues fixed can be found at:

https://issues.apache.org/jira/secure/ReleaseNote.jspa?projectId=12310732&styleName=Html&version=12312864

Please also see http://www.jspwiki.org/wiki/NewIn2.8

UPGRADE NOTES
=============

Please see the UPGRADING document in this same directory.


EXPERIMENTAL FEATURES
=====================

There are some features in this release which could mostly be considered
experimental at best.  The following ones are known to work only
partially:

* WebDAV support.  This is known to be broken on pretty many levels...

* Admin interface.  Check out /admin/Admin.jsp.

KNOWN PROBLEMS
==============

* WebDAV does not yet support the new authentication/permissions scheme.
  Therefore, if you have very sensitive data in your wiki, you might not want
  to enable it.

* Not all old plugins work.  Specifically any plugins, which construct 
  new WikiPages will fail because of the constructor has been changed.

* The PageFilter API was changed in 2.6

* Our documentation simply sucks at this point.  Please forgive us,
  and point where those fixes are needed.  We will improve upon
  based your input.

* The ShortURLConstructor does not work reliably.  Please use
  ShortViewURLConstructor, or Apache mod_rewrite.

* Running with a security manager isn't yet supported (see JSPWIKI-129).
