This document details any special actions that need to be taken when upgrading Wookie from a previous version. For
general information on new features and improvements, see NEW_AND_NOTEWORTHY.

FROM 0.14.0 TO 0.15.0
=====================
No major changes to the core or database schema. 

FROM 0.13.1 TO 0.14.0
=====================
No major changes to the core or database schema. 

FROM 0.11.0 TO 0.13.1 (Version 0.12.0 was not released)
=====================
No major changes to the core or database schema. The W3CParser module has been updated so it is possible
you may need to clear your ivy cache on your local machine.

FROM 0.10.0 TO 0.11.0
=====================
Participants now have a role attribute to support the getHost() method in shared widgets. 

Scripts for migrating databases to 0.11.0 can be found in /scripts/migration.

FROM 0.9.2 TO 0.10.0
====================

There are a number of API changes in 0.10.0, in particular the XML representation used for Widgets returned by the
REST API has been changed to follow more closely the W3C Widget XML format. This affects any plugins or connectors 
that browse the Wookie widget catalog by calling GET /widgets. The connector frameworks have been updated for this
release and so you should make sure you use a 0.10.0 connector with a 0.10.0 server.

The Services class and related classes deprecated in earlier versions of Wookie were removed in 0.10.0, and these
tables can be removed from the database. There is a script in /scripts/migration to drop these tables.

From 0.10.0 the API keys are managed using a configuration text file rather than in the database (as per Policies).
This means that you should add API keys to the /keys file from the database and then drop the API keys table. Note
that this is not included in the migration script to prevent inadvertently deleting the keys before creating the
keys file.

FROM 0.9.1 TO 0.9.2
===================

A number of changes to the data model were put in place in 0.9.2, meaning that any existing databases must be updated.

Scripts for migrating databases to 0.9.2 can be found in /scripts/migration.

From 0.9.2, proxy policies are handled in a /policies text file rather than in the database; you should add your
previous policies to the /policies file in the new format. The new file covers both widget-access policies and whitelist
entries; the latter have a wildcard scope (*). For more information, see NEW_AND_NOTEWORTHY and see the documentation
included in the default policies file.

FROM 0.9.0 TO 0.9.1
===================

A number of changes to the data model were put in place in 0.9.1, meaning that any existing databases must be updated.

Scripts for migrating databases to 0.9.1 can be found in /scripts/migration.

From 0.9.1 the JCR persistence mechanism is an optional module that must be built separately; any installations using 
JCR will need to upgrade using a source release, building the modules/jcr subproject.