<!--

    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.

-->

<HTML>
<BODY>
    <h1>XML Tools API overview.</h1>

<h2>Status</h2>

Under development.
See also <a href="apichanges.html">API changes</a> document.

<h2>Purpose</h2>
XML tools API simplifies writing inter-operable modules handling user's XML
resources. It also improves consistency of user experience as it introduces
minimum standard behavior support for all XML domains.

<h2>Supported Use Cases</h2>

<h3>Actions</h3>
XML is general document format that allows to define document structure
and semantics. It influences behavior of common user's actions. Particular
behavior of such action depends on specifics of defined semantics. This
can be modeled in OpenIDE APIs using cookies. XML tools API defines set of
common cookies {@code org.netbeans.api.xml.cookies} and support for their providers
{@code org.netbeans.spi.xml.cookies}.
<p>A user can take a cookie action from the action pool and put it on a data
object serving particular cookie. The action is performed via served cookie
that is aware of actual behavioural enhancement for given data object.

<h3>User's XML Document Parsing</h3>
All standard XML processors APIs define call-back interfaces that must be provided
by clients. Further evaluation identifies one type of application wide
call-back interface - entity resolution (e.g. in SAX called 
{@link org.xml.sax.EntityResolver}). XML tools API introduces notion of context
user's entity catalog service  {@link org.netbeans.api.xml.services.UserCatalog}
back-ended by plugged in providers.
<p>A user has all their entity registrations at one place for given context and
these are shared by all processors handling user's documents in the context.

<h3>Unification&amp;Integration</h3>
Standard XML APIs (DOM, TrAX, SAX, OpenIDE) define a API for the same purpose
several times to avoid dependencies.
{@link org.netbeans.api.xml.parsers} provides classes bridging between them.
It also contains utility classes such as DTD parser.

<h3>Model</h3>
Looking for model and 2-way editing support? We are looking for ideas
how to define it!


<!-- Contributors & Reviewers:

   Libor Kramolis
   Svatopluk Dedic
   Jaroslav Tulach
   Petr Kuzel
 -->

</BODY></HTML>
