
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).
