 -----
 What's new in 1.1?
 -----
 Vincent Siveton
 ------
 2009-05-31
 ------

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

~~ NOTE: For help with the syntax of this file, see:
~~ http://maven.apache.org/doxia/references/apt-format.html

What's new in 1.1?

 This document describes the changes made to Maven Doxia between versions 1.0 and 1.1.

* Notable New Features

 * <<Logging>>: added logging support with a new project called {{{./doxia/doxia-logging-api}doxia-logging-api}}.

 * <<Sink API improvements>>: added a new <<<SinkEventAttributes>>> interface to handle attributes.
  The <<<Sink>>> interface has been updated to use this new interface.
  Added new methods for comments and unknown events to the <<<Sink>>> interface.

 * <<SinkFactory>>: all Sink implementations can be retrieved via a factory.

 * <<XSDs>>: created several {{{./faq.html#doxia-xsd}XSDs}}, in particular for FML and Xdoc.

 * <<Tools>>: created some tools like a {{{./doxia-tools/doxia-converter/index.html}converter}}
   and a {{{./doxia-tools/doxia-linkcheck/index.html}linkchecker}}
 to use Doxia outside of Maven.

 * <<New Sinks>>: for Confluence, XLS-FO and Twiki.

 * Applied a few {{{./references/doxia-apt.html}modifications to the APT}} format.

 []

  The full list of changes for 1.1 can be found in our issue management system:
  {{{https://issues.apache.org/jira/secure/ReleaseNote.jspa?version=12330551&styleName=Text&projectId=12317230}1.1}} ::
  {{{https://issues.apache.org/jira/secure/ReleaseNote.jspa?version=12330552&styleName=Text&projectId=12317230}1.1.1}} ::
  {{{https://issues.apache.org/jira/secure/ReleaseNote.jspa?version=12330553&styleName=Text&projectId=12317230}1.1.2}} ::
  {{{https://issues.apache.org/jira/secure/ReleaseNote.jspa?version=12330554&styleName=Text&projectId=12317230}1.1.3}} ::
  {{{https://issues.apache.org/jira/secure/ReleaseNote.jspa?version=12330555&styleName=Text&projectId=12317230}1.1.4}}

* Binary Incompatibility

  Please note that in version 1.1 a number of new methods were added to the
  {{{./doxia/doxia-sink-api/clirr-report.html}Sink and SinkFactory APIs}},
  which makes them binary incompatible with version 1.0.

 <<However>>, maven reporting plugins have been kept binary compatible.
 If you are a Maven Plugin developer and you plan to switch to Doxia 1.1, please read this
 {{{./developers/maven-integration.html}Maven Integration}} page to understand how to integrate correctly Doxia 1.1
 with Maven.
