cayenne-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From ntimof...@apache.org
Subject [04/11] cayenne git commit: CAY-2371 Switch documentation from Docbook to Asciidoctor format
Date Fri, 05 Jan 2018 14:21:32 GMT
http://git-wip-us.apache.org/repos/asf/cayenne/blob/7783cd34/docs/docbook/cayenne-guide/src/docbkx/queries.xml
----------------------------------------------------------------------
diff --git a/docs/docbook/cayenne-guide/src/docbkx/queries.xml b/docs/docbook/cayenne-guide/src/docbkx/queries.xml
deleted file mode 100644
index dfbad2f..0000000
--- a/docs/docbook/cayenne-guide/src/docbkx/queries.xml
+++ /dev/null
@@ -1,628 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-    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.
--->
-<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink"
-    version="5.0" xml:id="queries">
-    <title>Queries</title>
-    <para>Queries are Java objects used by the application to communicate with the database. Cayenne
-        knows how to translate queries into SQL statements appropriate for a particular database
-        engine. Most often queries are used to find objects matching certain criteria, but there are
-        other types of queries too. E.g. those allowing to run native SQL, call DB stored
-        procedures, etc. When committing objects, Cayenne itself creates special queries to
-        insert/update/delete rows in the dabase.</para>
-    <para>There is a number of built-in queries in Cayenne, described later in this chapter. Users can
-        also define their own query types to abstract certain DB interactions that for whatever
-        reason can not be adequately described by the built-in set. </para>
-    <para>Queries can be roughly categorized as "object" and "native". Object queries (most notably
-        SelectQuery and EJBQLQuery) are built with abstractions originating in the object model (the
-        "object" side in the "object-relational" divide). E.g. SelectQuery is assembled from a Java
-        class of the objects to fetch, a qualifier expression, orderings, etc. - all of this
-        expressed in terms of the object model.</para>
-    <para>Native queries describe a desired DB operation as SQL code (SQLTemplate query) or a
-        reference to a stored procedure (ProcedureQuery), etc. The results of native queries are
-        usually presented as Lists of Maps, with each map representing a row in the DB (a term "data
-        row" is often used to describe such a map). They can potentially be converted to objects,
-        however it may take a considerable effort to do so. Native queries are also less (if at all)
-        portable across databases than object queries. </para>
-    <section xml:id="selectquery">
-        <title>SelectQuery</title>
-        <para>SelectQuery is the most commonly used query in user applications. This may be the only
-            query you will need in most appplications. It returns a list of persistent objects of a
-            certain type specified in the
-            query:<programlisting language="java">SelectQuery query = new SelectQuery(Artist.class);
-List&lt;Artist> objects = context.performQuery(query);</programlisting>This
-            returned all rows in the "ARTIST" table. If the logs were turned on, you might see the
-            following SQL
-            printed:<programlisting language="java">INFO: SELECT t0.DATE_OF_BIRTH, t0.NAME, t0.ID FROM ARTIST t0
-INFO: === returned 5 row. - took 5 ms.</programlisting></para>
-        <para>This SQL was generated by Cayenne from the SelectQuery above. SelectQuery can have a
-            qualifier to select only the data that you care about. Qualifier is simply an Expression
-            (Expressions where discussed in the previous chapter). If you only want artists whose
-            name begins with 'Pablo', you might use the following qualifier expression:
-            <programlisting language="java">SelectQuery query = new SelectQuery(Artist.class, 
-        ExpressionFactory.likeExp(Artist.NAME_PROPERTY, "Pablo%"));
-List&lt;Artist> objects = context.performQuery(query);</programlisting>The
-            SQL will look different this
-            time:<programlisting language="java">INFO: SELECT t0.DATE_OF_BIRTH, t0.NAME, t0.ID FROM ARTIST t0 WHERE t0.NAME LIKE ?
-[bind: 1->NAME:'Pablo%']
-INFO: === returned 1 row. - took 6 ms.</programlisting></para>
-        <para>SelectQuery allows to append parts of qualifier to
-            self:<programlisting language="java">SelectQuery query = new SelectQuery(Artist.class);
-query.setQualifier(ExpressionFactory.likeExp(Artist.NAME_PROPERTY, "A%"));
-query.andQualifier(ExpressionFactory.greaterExp(Artist.DATE_OF_BIRTH_PROPERTY, someDate));</programlisting></para>
-        <para>To order the results of SelectQuery, one or more Orderings can be applied. Ordering
-            were already discussed earlier.
-            E.g.:<programlisting language="java">SelectQuery query = new SelectQuery(Artist.class);
-
-// create Ordering object explicitly
-query.addOrdering(new Ordering(Artist.DATE_OF_BIRTH_PROPERTY, SortOrder.DESCENDING));
-
-// or let SelectQuery create it behind the scenes
-query.addOrdering(Artist.NAME_PROPERTY, SortOrder.ASCENDING);</programlisting></para>
-        <para>There's a number of other useful properties in SelectQuery that define what to select
-            and how to optimize database interaction (prefetching, caching, fetch offset and limit,
-            pagination, etc.). Some of them are discussed in separate chapters on caching and
-            performance optimization. Others are fairly self-explanatory. Please check the API docs
-            for the full extent of the SelectQuery features.</para>
-    </section>
-    <section xml:id="ejbqlquery">
-        <title>EJBQLQuery</title>
-        <para>EJBQLQuery was created as a part of an experiment in adopting some of Java Persistence
-            API (JPA) approaches in Cayenne. It is a parameterized object query that is created from
-            query String. A String used to build EJBQLQuery must conform to JPQL (JPA query
-            language):<programlisting language="java">EJBQLQuery query = new EJBQLQuery("select a FROM Artist a");</programlisting></para>
-        <para>JPQL details can be found in any JPA manual. Here we'll mention only how this fits
-            into Cayenne and what are the differences between EJBQL and other Cayenne
-            queries.</para>
-        <para>Although most frequently EJBQLQuery is used as an alternative to SelectQuery, there
-            are also DELETE and UPDATE varieties available. <note>
-                <para>As of this version of Cayenne, DELETE and UPDATE do not change the state of
-                    objects in the ObjectContext. They are run directly against the database
-                    instead. </para>
-            </note><programlisting language="java">EJBQLQuery select = new EJBQLQuery("select a FROM Artist a WHERE a.name = 'Salvador Dali'");
-List&lt;Artist> artists = context.performQuery(select);</programlisting><programlisting language="java">EJBQLQuery delete = new EJBQLQuery("delete from Painting");
-context.performGenericQuery(delete);</programlisting><programlisting language="java">EJBQLQuery update = new EJBQLQuery("UPDATE Painting AS p SET p.name = 'P2' WHERE p.name = 'P1'");
-context.performGenericQuery(update);</programlisting>In
-            most cases SelectQuery is preferred to EJBQLQuery, as it is API-based, and provides you
-            with better compile-time checks. However sometimes you may want a completely scriptable
-            object query. This is when you might prefer EJBQL. A more practical reason for picking
-            EJBQL over SelectQuery though is that the former offers some extra selecting
-            capabilities, namely aggregate functions and
-            subqueries:<programlisting language="java">EJBQLQuery query = new EJBQLQuery("select a, COUNT(p) FROM Artist a JOIN a.paintings p GROUP BY a");
-List&lt;Object[]> result = context.performQuery(query);
-for(Object[] artistWithCount : result) {
-    Artist a = (Artist) artistWithCount[0];
-    int hasPaintings = (Integer) artistWithCount[1];
-}</programlisting>This
-            also demonstrates a previously unseen type of select result - a List of Object[]
-            elements, where each entry in an Object[] is either a DataObject or a scalar, depending
-            on the query SELECT clause. A result can also be a list of
-            scalars:<programlisting language="java">EJBQLQuery query = new EJBQLQuery("select a.name FROM Artist a");
-List&lt;String> names = context.performQuery(query);</programlisting>While
-            Cayenne Expressions discussed previously can be thought of as identical to JPQL WHERE
-            clause, and indeed they are very close, there are a few noteable differences:<itemizedlist>
-                <listitem>
-                    <para>Null handling: SelectQuery would translate the expressions matching NULL
-                        values to the corresponding "X IS NULL" or "X IS NOT NULL" SQL syntax.
-                        EJBQLQuery on the other hand requires explicit "IS NULL" (or "IS NOT NULL")
-                        syntax to be used, otherwise the generated SQL will look like "X = NULL" (or
-                        "X &lt;> NULL"), which will evaluate differently.</para>
-                </listitem>
-                <listitem>
-                    <para>Expression Parameters: SelectQuery uses "$" to denote named parameters
-                        (e.g. "$myParam"), while EJBQL uses ":" (e.g. ":myParam"). Also EJBQL
-                        supports positional parameters denoted by the question mark: "?3".</para>
-                </listitem>
-            </itemizedlist></para>
-    </section>
-    <section xml:id="sqltemplate">
-        <title>SQLTemplate</title>
-        <para>SQLTemplate is a query that allows to run native SQL from a Cayenne application. It
-            comes handy when the standard ORM concepts are not sufficient for a given query or an
-            update. SQL is too powerful and allows to manipulate data in ways that are not easily
-            described as a graph of related entities. Cayenne acknowledges this fact and provides
-            this facility to execute SQL, mapping the result to objects when possible. Here are
-            examples of selecting and non-selecting
-            SQLTemplates:<programlisting language="java">SQLTemplate select = new SQLTemplate(Artist.class, "select * from ARTIST"); 
-List&lt;Artist> result = context.performQuery(select);</programlisting><programlisting language="java">SQLTemplate update = new SQLTemplate(Artist.class, "delete from ARTIST");
-QueryResponse response = context.performGenericQuery(update);</programlisting></para>
-        <para>Cayenne doesn't make any attempt to make sense of the SQL semantics, so it doesn't
-            know whether a given query is performing a select or update, etc. It is the the user's
-            decision to run a given query as a selecting or "generic".</para>
-        <para>
-            <note>
-                <para>Any data modifications done to DB as a result of SQLTemplate execution do not
-                    change the state of objects in the ObjectContext. So some objects in the context
-                    may become stale as a result.</para>
-            </note>
-        </para>
-        <para>Another point to note is that the first argument to the SQLTemplate constructor - the
-            Java class - has the same meaning as in SelectQuery only when the result can be
-            converted to objects (e.g. when this is a selecting query and it is selecting all
-            columns from one table). In this case it denotes the "root" entity of this query result.
-            If the query does not denote a single entity result, this argument is only used for
-            query routing, i.e. determining which database it should be run against. You are free to
-            use any persistent class or even a DataMap instance in such situation. It will work as
-            long as the passed "root" maps to the same database as the current query.</para>
-        <para>To achieve interoperability between mutliple RDBMS a user can specify multiple SQL
-            statements for the same SQLTemplate, each corresponding to a native SQL dialect. A key
-            used to look up the right dialect during execution is a fully qualified class name of
-            the corresponding DbAdapter. If no DB-specific statement is present for a given DB, a
-            default generic statement is used. E.g. in all the examples above a default statement
-            will be used regardless of the runtime database. So in most cases you won't need to
-            explicitly "translate" your SQL to all possible dialects. Here is how this works in
-            practice:<programlisting language="java">SQLTemplate select = new SQLTemplate(Artist.class, "select * from ARTIST"); 
-
-// For Postgres it would be nice to trim padding of all CHAR columns.
-// Otherwise those will be returned with whitespace on the right.
-// assuming "NAME" is defined as CHAR...
-String pgSQL = "SELECT ARTIST_ID, RTRIM(NAME), DATE_OF_BIRTH FROM ARTIST";
-query.setTemplate(PostgresAdapter.class.getName(), pgSQL);</programlisting></para>
-        
-        <section xml:id="sqltemplate-scripting">
-            <title>Scripting SQLTemplate with Velocity</title>
-            <para>The most interesting aspect of SQLTemplate (and the reason why it is called a
-                "template") is that a SQL string is treated by Cayenne as an Apache Velocity
-                template. Before sending it to DB as a PreparedStatement, the String is evaluated in
-                the Velocity context, that does variable substitutions, and performs special
-                callbacks in response to various directives, thus controlling query interaction with
-                the JDBC layer. </para>
-            <para>Check Velocity docs for the syntax details. Here we'll just mention the two main
-                scripting elements - "variables" (that look like <code>$var</code>) and "directives"
-                (that look like <code>#directive(p1 p2 p3)</code>). All built-in Velocity directives
-                are supported. Additionally Cayenne defines a number of its own directives to bind
-                parameters to PreparedStatements and to control the structure of the ResultSet.
-                These directives are described in the following sections.</para>
-        </section>
-        <section xml:id="sqltemplate-parameters">
-            <title>Variable Substitution</title>
-            <para>All variables in the template string are replaced from query
-                parameters:<programlisting language="java">SQLTemplate query = new SQLTemplate(Artist.class, "delete from $tableName");
-query.setParameters(Collections.singletonMap("tableName", "mydb.PAINTING"));
-
-// this will generate SQL like this: "delete from mydb.PAINTING"</programlisting>The
-                example above demonstrates the point made earlier in this chapter - even if we don't
-                know upfront which table the query will run against, we can still use a fixed "root"
-                in constructor (<code>Artist.class</code> in this case) , as we are not planning on
-                converting the result to objects.</para>
-            <para>Variable substitution within the text uses "<code>object.toString()</code>" method to replace the
-                variable value. Keep in mind that this may not be appropriate in all situations.
-                E.g. passing a date object in a WHERE clause expression may be converted to a String
-                not understood by the target RDBMS SQL parser. In such cases variable should be wrapped in <code>#bind</code>
-                directive as described below.</para>
-        </section>
-        <section xml:id="sqltemplate-bind-directive">
-            <title>Directives</title>
-            <para>These are the Cayenne directives used to customize SQLTemplate parsing and
-                integrate it with the JDBC layer: </para>
-            <section>
-                <title>#bind</title>
-                <para>Creates a PreparedStatement positional parameter in place of the directive,
-                    binding the value to it before statement execution. <code>#bind</code> is
-                    allowed in places where a "?" would be allowed in a PreparedStatement. And in
-                    such places it almost always makes sense to pass objects to the template via
-                    this or other forms of <code>#bind</code> instead of inserting them
-                    inline.</para>
-                <para><emphasis role="italic">Semantics:</emphasis></para>
-                <programlisting language="java">#bind(value)
-#bind(value jdbcType)
-#bind(value jdbcType scale)</programlisting>
-                <para><emphasis role="italic">Arguments:</emphasis>
-                    <itemizedlist>
-                        <listitem>
-                            <para><code>value</code> - can either be a char constant or a variable
-                                that is resolved from the query parameters. Note that the variable
-                                can be a collection, that will be automatically expanded into a list
-                                of individual value bindings. This is useful for instance to build
-                                IN conditions. </para>
-                        </listitem>
-                        <listitem>
-                            <para><code>jdbcType</code> - is a JDBC data type of the parameter as
-                                defined in <code>java.sql.Types</code>.</para>
-                        </listitem>
-                        <listitem>
-                            <para><code>scale</code> - An optional scale of the numeric value. Same
-                                as "scale" in PreparedStatement.</para>
-                        </listitem>
-                    </itemizedlist></para>
-                <para>
-                    <emphasis role="italic"
-                    >Usage</emphasis>:<programlisting language="java">#bind($xyz)
-#bind('str')
-#bind($xyz 'VARCHAR')
-#bind($xyz 'DECIMAL' 2)</programlisting></para>
-                <para><emphasis role="italic">Full
-                    example:</emphasis><programlisting language="java">update ARTIST set NAME = #bind($name) where ID = #bind($id)</programlisting></para>
-            </section>
-            <section>
-                <title>#bindEqual</title>
-                <para>Same as #bind, but also includes the "=" sign in front of the value binding.
-                    Look at the example below - we took the #bind example and replaced "<code>ID =
-                        #bind(..)</code>" with "<code>ID #bindEqual(..)</code>". While it looks like
-                    a clumsy shortcut to eliminate the equal sign, the actual reason why this is
-                    useful is that it allows the value to be null. If the value is not null,
-                        "<code>= ?</code>" is generated, but if it is, the resulting chunk of the
-                    SQL would look like "<code>IS NULL</code>" and will be compilant with what the
-                    DB expects.</para>
-                <para><emphasis role="italic">Semantics:</emphasis></para>
-                <programlisting language="java">#bindEqual(value)
-#bindEqual(value jdbcType)
-#bindEqual(value jdbcType scale)</programlisting>
-                <para><emphasis role="italic">Arguments: (same as #bind)</emphasis>
-                </para>
-                <para>
-                    <emphasis role="italic"
-                    >Usage</emphasis>:<programlisting language="java">#bindEqual($xyz)
-#bindEqual('str')
-#bindEqual($xyz 'VARCHAR')
-#bindEqual($xyz 'DECIMAL' 2)</programlisting></para>
-                <para><emphasis role="italic">Full
-                    example:</emphasis><programlisting language="java">update ARTIST set NAME = #bind($name) where ID #bindEqual($id)</programlisting></para>
-            </section>
-            <section>
-                <title>#bindNotEqual</title>
-                <para>This directive deals with the same issue as <code>#bindEqual</code> above,
-                    only it generates "not equal" in front of the value (or IS NOT NULL).</para>
-                <para><emphasis role="italic">Semantics:</emphasis></para>
-                <programlisting language="java">#bindNotEqual(value)
-#bindNotEqual(value jdbcType)
-#bindNotEqual(value jdbcType scale)</programlisting>
-                <para><emphasis role="italic">Arguments: (same as #bind)</emphasis></para>
-                <para>
-                    <emphasis role="italic"
-                    >Usage</emphasis>:<programlisting language="java">#bindNotEqual($xyz)
-#bindNotEqual('str')
-#bindNotEqual($xyz 'VARCHAR')
-#bindNotEqual($xyz 'DECIMAL' 2)</programlisting></para>
-                <para><emphasis role="italic">Full
-                    example:</emphasis><programlisting language="java">update ARTIST set NAME = #bind($name) where ID #bindEqual($id)</programlisting></para>
-            </section>
-            <section>
-                <title>#bindObjectEqual</title>
-                <para>It can be tricky to use a Persistent object or an ObjectId in a binding,
-                    especially for tables with compound primary keys. This directive helps to handle
-                    such binding. It maps columns in the query to the names of Persistent object ID
-                    columns, extracts ID values from the object, and generates SQL like "COL1 = ?
-                    AND COL2 = ? ..." , binding positional parameters to ID values. It can also
-                    correctly handle null object. Also notice how we are specifying a Velocity array
-                    for multi-column PK.</para>
-                <para><emphasis role="italic">Semantics:</emphasis></para>
-                <programlisting language="java">#bindObjectEqual(value columns idColumns)</programlisting>
-                <para><emphasis role="italic">Arguments:</emphasis>
-                    <itemizedlist>
-                        <listitem>
-                            <para><code>value</code> - must be a variable that is resolved from the
-                                query parameters to a Persistent or ObjectId.</para>
-                        </listitem>
-                        <listitem>
-                            <para><code>columns</code> - the names of the columns to generate in the
-                                SQL.</para>
-                        </listitem>
-                        <listitem>
-                            <para><code>idColumn</code> - the names of the ID columns for a given
-                                entity. Must match the order of "columns" to match against.</para>
-                        </listitem>
-                    </itemizedlist></para>
-                <para>
-                    <emphasis role="italic"
-                    >Usage</emphasis>:<programlisting language="java">#bindObjectEqual($a 't0.ID' 'ID')
-#bindObjectEqual($b ['t0.FK1', 't0.FK2'] ['PK1', 'PK2'])</programlisting></para>
-                <para><emphasis role="italic">Full
-                    example:</emphasis><programlisting language="java">String sql = "SELECT * FROM PAINTING t0 WHERE #bindObjectEqual($a 't0.ARTIST_ID' 'ARTIST_ID' ) ORDER BY PAINTING_ID";
-SQLTemplate select = new SQLTemplate(Artist.class, sql);
-
-Artist a = ....
-select.setParameters(Collections.singletonMap("a", a)); </programlisting></para>
-            </section>
-            <section>
-                <title>#bindObjectNotEqual</title>
-                <para>Same as #bindObjectEqual above, only generates "not equal" operator for value
-                    comparison (or IS NOT NULL).</para>
-                <para><emphasis role="italic">Semantics:</emphasis></para>
-                <programlisting language="java">#bindObjectNotEqual(value columns idColumns)</programlisting>
-                <para><emphasis role="italic">Arguments: (same as #bindObjectEqual)</emphasis>
-                </para>
-                <para>
-                    <emphasis role="italic"
-                    >Usage</emphasis>:<programlisting language="java">#bindObjectNotEqual($a 't0.ID' 'ID')
-#bindObjectNotEqual($b ['t0.FK1', 't0.FK2'] ['PK1', 'PK2'])</programlisting></para>
-                <para><emphasis role="italic">Full
-                    example:</emphasis><programlisting language="java">String sql = "SELECT * FROM PAINTING t0 WHERE #bindObjectNotEqual($a 't0.ARTIST_ID' 'ARTIST_ID' ) ORDER BY PAINTING_ID";
-SQLTemplate select = new SQLTemplate(Artist.class, sql);
-
-Artist a = ....
-select.setParameters(Collections.singletonMap("a", a)); </programlisting></para>
-            </section>
-            <section>
-                <title>#result</title>
-                <para>Renders a column in SELECT clause of a query and maps it to a key in the
-                    result DataRow. Also ensures the value read is of the correct type. This allows
-                    to create a DataRow (and ultimately - a persistent object) from an arbitrary
-                    ResultSet.</para>
-                <para><emphasis role="italic">Semantics:</emphasis></para>
-                <programlisting language="java">#result(column)
-#result(column javaType)
-#result(column javaType alias)
-#result(column javaType alias dataRowKey)</programlisting>
-                <para><emphasis role="italic">Arguments:</emphasis>
-                    <itemizedlist>
-                        <listitem>
-                            <para><code>column</code> - the name of the column to render in SQL
-                                SELECT clause.</para>
-                        </listitem>
-                        <listitem>
-                            <para><code>javaType</code> - a fully-qualified Java class name for a
-                                given result column. For simplicity most common Java types used in
-                                JDBC can be specified without a package. These include all numeric
-                                types, primitives, String, SQL dates, BigDecimal and BigInteger. So
-                                    "<code>#result('A' 'String')</code>", "<code>#result('B'
-                                    'java.lang.String')</code>" and "<code>#result('C'
-                                'int')</code>" are all valid</para>
-                        </listitem>
-                        <listitem>
-                            <para><code>alias</code> - specifies both the SQL alias of the column
-                                and the value key in the DataRow. If omitted, "column" value is
-                                used.</para>
-                        </listitem>
-                        <listitem>
-                            <para><code>dataRowKey</code> - needed if SQL 'alias' is not appropriate
-                                as a DataRow key on the Cayenne side. One common case when this
-                                happens is when a DataRow retrieved from a query is mapped using
-                                joint prefetch keys (see below). In this case DataRow must use
-                                database path expressions for joint column keys, and their format is
-                                incompatible with most databases alias format. </para>
-                        </listitem>
-                    </itemizedlist></para>
-                <para>
-                    <emphasis role="italic"
-                    >Usage</emphasis>:<programlisting language="java">#result('NAME')
-#result('DATE_OF_BIRTH' 'java.util.Date') 
-#result('DOB' 'java.util.Date' 'DATE_OF_BIRTH')
-#result('DOB' 'java.util.Date' '' 'artist.DATE_OF_BIRTH') 
-#result('SALARY' 'float') </programlisting></para>
-                <para><emphasis role="italic">Full
-                    example:</emphasis><programlisting language="java">SELECT #result('ID' 'int'), #result('NAME' 'String'), #result('DATE_OF_BIRTH' 'java.util.Date') FROM ARTIST</programlisting></para>
-            </section>
-            <section>
-                <title>#chain and #chunk</title>
-                
-                    <para><code>#chain</code> and <code>#chunk</code> directives are used for
-                    conditional inclusion of SQL code. They are used together with
-                        <code>#chain</code> wrapping multiple <code>#chunks</code>. A chunk
-                    evaluates its parameter expression and if it is NULL suppresses rendering of the
-                    enclosed SQL block. A chain renders its prefix and its chunks joined by the
-                    operator. If all the chunks are suppressed, the chain itself is suppressed. This
-                    allows to work with otherwise hard to script SQL semantics. E.g. a WHERE clause
-                    can contain multiple conditions joined with AND or OR. Application code would
-                    like to exclude a condition if its right-hand parameter is not present (similar
-                    to Expression pruning discussed above). If all conditions are excluded, the
-                    entire WHERE clause should be excluded. chain/chunk allows to do that.</para>
-                    <para>
-                    <emphasis role="italic"
-                    >Semantics</emphasis>:<programlisting language="java">#chain(operator) ... #end
-#chain(operator prefix) ... #end
-#chunk() ... #end
-#chunk(param) ... #end </programlisting></para>
-                    <para><emphasis role="italic">Full
-                    example:</emphasis><programlisting language="java">#chain('OR' 'WHERE') 
-	#chunk($name) NAME LIKE #bind($name) #end" 
-	#chunk($id) ARTIST_ID > #bind($id) #end" 
-#end" </programlisting></para>
-          
-            </section>
-        </section>
-        <section>
-            <title>Mapping SQLTemplate Results</title>
-            <para>Here we'll discuss how to convert the data selected via SQLTemplate to some
-                useable format, compatible with other query results. It can either be very simple or
-                very complex, depending on the structure of the SQL, JDBC driver nature and the
-                desired result structure. This section presents various tips and tricks dealing with
-                result mapping. </para>
-            <para>By default SQLTemplate is expected to return a List of Persistent objects of its
-                root type. This is the simple
-                case:<programlisting language="java">SQLTemplate query = new SQLTemplate(Artist.class, "SELECT * FROM ARTIST");
-
-// List of Artists
-List&lt;Artist> artists = context.performQuery(query);</programlisting>Just
-                like SelectQuery, SQLTemplate can fetch DataRows. In fact DataRows option is very
-                useful with SQLTemplate, as the result type most often than not does not represent a
-                Cayenne entity, but instead may be some aggregated report or any other data whose
-                object structure is opaque to
-                Cayenne:<programlisting language="java">String sql = SELECT t0.NAME, COUNT(1) FROM ARTIST t0 JOIN PAINTING t1 ON (t0.ID = t1.ARTIST_ID) "
-    + "GROUP BY t0.NAME ORDER BY COUNT(1)";
-SQLTemplate query = new SQLTemplate(Artist.class, sql);
-
-// ensure we are fetching DataRows
-query.setFetchingDataRows(true);
-
-// List of DataRow
-List&lt;DataRow> rows = context.performQuery(query);</programlisting>In
-                the example above, even though the query root is Artist. the result is a list of
-                artist names with painting counts (as mentioned before in such case "root" is only
-                used to find the DB to fetch against, but has no bearning on the result). The
-                DataRows here are the most appropriate and desired result type.</para>
-            <para>In a more advanced case you may decide to fetch a list of scalars or a list of
-                Object[] with each array entry being either an entity or a scalar. You probably
-                won't be doing this too often and it requires quite a lot of work to setup, but if
-                you want your SQLTemplate to return results similar to EJBQLQuery, it is doable
-                using SQLResult as described
-                below:<programlisting language="java">SQLTemplate query = new SQLTemplate(Painting.class, "SELECT ESTIMATED_PRICE P FROM PAINTING");
-
-// let Cayenne know that result is a scalar
-SQLResult resultDescriptor = new SQLResult();
-resultDescriptor.addColumnResult("P");
-query.setResult(resultDescriptor);
-
-// List of BigDecimals
-List&lt;BigDecimal> prices = context.performQuery(query); </programlisting><programlisting language="java">SQLTemplate query = new SQLTemplate(Artist.class, "SELECT t0.ID, t0.NAME, t0.DATE_OF_BIRTH, COUNT(t1.PAINTING_ID) C " +
-      "FROM ARTIST t0 LEFT JOIN PAINTING t1 ON (t0.ID = t1.ARTIST_ID) " +
-      "GROUP BY t0.ID, t0.NAME, t0.DATE_OF_BIRTH");
-
-// let Cayenne know that result is a mix of Artist objects and the count of their paintings
-EntityResult artistResult = new EntityResult(Artist.class);
-artistResult.addDbField(Artist.ID_PK_COLUMN, "ARTIST_ID");
-artistResult.addObjectField(Artist.NAME_PROPERTY, "NAME");
-artistResult.addObjectField(Artist.DATE_OF_BIRTH_PROPERTY, "DATE_OF_BIRTH");
-
-SQLResult resultDescriptor = new SQLResult();
-resultDescriptor.addEntityResult(artistResult);
-resultDescriptor.addColumnResult("C");
-query.setResult(resultDescriptor);
-
-// List of Object[]
-List&lt;Object[]> data = context.performQuery(query);</programlisting></para>
-            <para>Another trick related to mapping result sets is making Cayenne recognize
-                prefetched entities in the result set. This emulates "joint" prefetching of
-                SelectQuery, and is achieved by special column naming. Columns belonging to the
-                "root" entity of the query should use unqualified names corresponding to the root
-                DbEntity columns. For each related entity column names must be prefixed with
-                relationship name and a dot (e.g. "toArtist.ID"). Column naming can be controlled
-                with "#result"
-                directive:<programlisting language="java">String sql = "SELECT distinct "
-    + "#result('t1.ESTIMATED_PRICE' 'BigDecimal' '' 'paintings.ESTIMATED_PRICE'), "
-    + "#result('t1.PAINTING_TITLE' 'String' '' 'paintings.PAINTING_TITLE'), "
-    + "#result('t1.GALLERY_ID' 'int' '' 'paintings.GALLERY_ID'), "
-    + "#result('t1.ID' 'int' '' 'paintings.ID'), "
-    + "#result('NAME' 'String'), "
-    + "#result('DATE_OF_BIRTH' 'java.util.Date'), "
-    + "#result('t0.ID' 'int' '' 'ID') "
-    + "FROM ARTIST t0, PAINTING t1 "
-    + "WHERE t0.ID = t1.ARTIST_ID";
-
-SQLTemplate q = new SQLTemplate(Artist.class, sql);
-q.addPrefetch(Artist.PAINTINGS_PROPERTY)
-List&lt;Artist> objects = context.performQuery(query);</programlisting></para>
-            <para>And the final tip deals with capitalization of the DataRow keys. Queries like
-                    "<code>SELECT * FROM...</code>" and even "<code>SELECT COLUMN1, COLUMN2, ...
-                    FROM ...</code>" can sometimes result in Cayenne exceptions on attempts to
-                convert fetched DataRows to objects. Essentially any query that is not using a
-                    <code>#result</code> directive to describe the result set is prone to this
-                problem, as different databases may produce different capitalization of the
-                java.sql.ResultSet columns. </para>
-            <para>The most universal way to address this issue is to describe each column explicitly
-                in the SQLTemplate via <code>#result</code>, e.g.: "<code>SELECT #result('column1'),
-                    #result('column2'), ..</code>". However this quickly becomes impractical for
-                tables with lots of columns. For such cases Cayenne provides a shortcut based on the
-                fact that an ORM mapping usually follows some naming convention for the column
-                names. Simply put, for case-insensitive databases developers normally use either all
-                lowercase or all uppercase column names. Here is the API that takes advantage of
-                that user knowledge and forces Cayenne to follow a given naming convention for the
-                DataRow keys (this is also available as a dropdown in the
-                Modeler):<programlisting language="java">SQLTemplate query = new SQLTemplate("SELECT * FROM ARTIST");
-query.setColumnNamesCapitalization(CapsStrategy.LOWER);
-List objects = context.performQuery(query);</programlisting></para>
-            <para>or<programlisting language="java">SQLTemplate query = new SQLTemplate("SELECT * FROM ARTIST");
-query.setColumnNamesCapitalization(CapsStrategy.UPPER);
-List objects = context.performQuery(query); </programlisting></para>
-            <para>None of this affects the generated SQL, but the resulting DataRows are using
-                correct capitalization. Note that you probably shouldn't bother with this unless you
-                are getting CayenneRuntimeExceptions when fetching with SQLTemplate.</para>
-        </section>
-    </section>
-    <section xml:id="procedurequery">
-        <title>ProcedureQuery</title>
-        <para>Stored procedures are mapped as separate objects in CayenneModeler. ProcedureQuery
-            provides a way to execute them with a certain set of parameters. Just like with
-            SQLTemplate, the outcome of a procedure can be anything - a single result set, mutliple
-            result sets, some data modification (returned as an update count), or a combination of
-            these. So use "performQuery" to get a single result set, and use "performGenericQuery"
-            for anything
-            else:<programlisting language="java">ProcedureQuery query = new ProcedureQuery("my_procedure", Artist.class);
-
-// Set "IN" parameter values
-query.addParam("p1", "abc");
-query.addParam("p2", 3000);
-
-List&lt;Artist> result = context.performQuery(query);</programlisting><programlisting language="java">// here we do not bother with root class. 
-// Procedure name gives us needed routing information
-ProcedureQuery query = new ProcedureQuery("my_procedure");
-
-query.addParam("p1", "abc");
-query.addParam("p2", 3000);
-
-QueryResponse response = context.performGenericQuery(query); </programlisting></para>
-        <para>A stored procedure can return data back to the application as result sets or via OUT
-            parameters. To simplify the processing of the query output, QueryResponse treats OUT
-            parameters as if it was a separate result set. If a stored procedure declares any OUT or
-            INOUT parameters, QueryResponse will contain their returned values in the very first
-            result
-            list:<programlisting language="java">ProcedureQuery query = new ProcedureQuery("my_procedure");
-QueryResponse response = context.performGenericQuery(query);
-
-// read OUT parameters
-List out = response.firstList();
-
-if(!out.isEmpty()) {
-    Map outParameterValues = (Map) outList.get(0);
-}</programlisting></para>
-        <para>There maybe a situation when a stored procedure handles its own transactions, but an
-            application is configured to use Cayenne-managed transactions. This is obviously
-            conflicting and undesirable behavior. In this case ProcedureQueries should be executed
-            explicitly wrapped in an "external" Transaction. This is one of the few cases when a
-            user should worry about transactions at all. See Transactions section for more
-            details.</para>
-    </section>
-    <section xml:id="namedquery">
-        <title>NamedQuery</title>
-        <para>NamedQuery is a query that is a reference to another query stored in the DataMap. The
-            actual stored query can be SelectQuery, SQLTemplate, EJBQLQuery, etc. It doesn't matter
-            - the API for calling them is the same - via a
-            NamedQuery:<programlisting language="java">String[] keys = new String[] {"loginid", "password"};
-Object[] values = new String[] {"joe", "secret"};
-
-NamedQuery query = new NamedQuery("Login", keys, values);
-
-List&lt;User> matchingUsers = context.performQuery(query); </programlisting></para>
-    </section>
-    <section xml:id="custom-queries">
-        <title>Custom Queries</title>
-        <para>If a user needs some extra functionality not addressed by the existing set of Cayenne
-            queries, he can write his own. The only requirement is to implement
-                <code>org.apache.cayenne.query.Query</code> interface. The easiest way to go about
-            it is to subclass some of the base queries in Cayenne. </para>
-        <para>E.g. to do something directly in the JDBC layer, you might subclass
-            AbstractQuery:<programlisting language="java">public class MyQuery extends AbstractQuery {
-
-    @Override
-    public SQLAction createSQLAction(SQLActionVisitor visitor) {
-        return new SQLAction() {
-
-            @Override
-            public void performAction(Connection connection, OperationObserver observer) throws SQLException, Exception {
-                // 1. do some JDBC work using provided connection... 
-                // 2. push results back to Cayenne via OperationObserver
-            }
-        };
-    }
-}</programlisting></para>
-        <para>To delegate the actual query execution to a standard Cayenne query, you may subclass
-            IndirectQuery:<programlisting language="java">public class MyDelegatingQuery extends IndirectQuery {
-    
-    @Override
-    protected Query createReplacementQuery(EntityResolver resolver) {
-        SQLTemplate delegate = new SQLTemplate(SomeClass.class, generateRawSQL());
-        delegate.setFetchingDataRows(true);
-        return delegate;
-    }
-    
-    protected String generateRawSQL() {
-        // build some SQL string
-    }
-}</programlisting></para>
-        <para>In fact many internal Cayenne queries are IndirectQueries, delegating to SelectQuery
-            or SQLTemplate after some preprocessing.</para>
-    </section>
-</chapter>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/7783cd34/docs/docbook/cayenne-guide/src/docbkx/rop-deployment.xml
----------------------------------------------------------------------
diff --git a/docs/docbook/cayenne-guide/src/docbkx/rop-deployment.xml b/docs/docbook/cayenne-guide/src/docbkx/rop-deployment.xml
deleted file mode 100644
index 3c327da..0000000
--- a/docs/docbook/cayenne-guide/src/docbkx/rop-deployment.xml
+++ /dev/null
@@ -1,47 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-    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.
--->
-<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink"
-    version="5.0" xml:id="rop-deployment">
-    <title>ROP Deployment</title>
-    <section xml:id="deploying-rop-server">
-        <title>Deploying ROP Server</title>
-
-        <note><para>Recent versions of Tomcat and Jetty containers (e.g. Tomcat 6 and 7, Jetty 8) contain code
-                addressing a security concern related to "session fixation problem" by resetting the
-                existing session ID of any request that requires BASIC authentcaition. If ROP
-                service is protected with declarative security (see the the ROP tutorial and the
-                following chapters on security), this feature prevents the ROP client from attaching
-                to its session, resulting in MissingSessionExceptions. To solve that you will need
-                to either switch to an alternative security mechanism, or disable "session fixation
-                problem" protections of the container. E.g. the later can be achieved in Tomcat 7 by
-                adding the following <emphasis>context.xml</emphasis> file to the webapp's META-INF/
-                directory:
-                <programlisting>&lt;Context>
-    &lt;Valve className="org.apache.catalina.authenticator.BasicAuthenticator"
-            changeSessionIdOnAuthentication="false" />
-&lt;/Context></programlisting>(The
-                &lt;Valve> tag can also be placed within the &lt;Context> in any other locations
-                used by Tomcat to load context configurations)</para></note>
-
-    </section>
-    <section xml:id="deploying-rop-client">
-        <title>Deploying ROP Client</title>
-    </section>
-    <section xml:id="rop-security">
-        <title>Security</title>
-    </section>
-</chapter>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/7783cd34/docs/docbook/cayenne-guide/src/docbkx/rop-introduction.xml
----------------------------------------------------------------------
diff --git a/docs/docbook/cayenne-guide/src/docbkx/rop-introduction.xml b/docs/docbook/cayenne-guide/src/docbkx/rop-introduction.xml
deleted file mode 100644
index fb32ca4..0000000
--- a/docs/docbook/cayenne-guide/src/docbkx/rop-introduction.xml
+++ /dev/null
@@ -1,98 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-	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.
--->
-<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink"
-    version="5.0" xml:id="introduction-to-rop">
-    <title>Introduction to ROP</title>
-    <section xml:id="what-is-rop">
-        <title>What is ROP</title>
-		<para>"Remote Object Persistence" is a low-overhead web services-based technology that
-			provides lightweight object persistence and query functionality to 'remote'
-			applications. In other words it provides familiar Cayenne API to applications that do
-			not have direct access to the database. Instead such applications would access Cayenne
-			Web Service (CWS). A single abstract data model (expressed as Cayenne XML DataMap) is
-			used on the server and on the client, while execution logic can be partitioned between
-			the tiers.The following picture compares a regular Cayenne web application and a rich
-			client application that uses remote object persistence technology:</para>
-    	<para><inlinemediaobject>
-    		<imageobject>
-    			<imagedata fileref="images/remote-object-persistence.jpg" scalefit="1" width="100%"/>
-    		</imageobject>
-    	</inlinemediaobject></para>
-		<para>Persistence stack above consists of the following parts:<itemizedlist>
-				<listitem>
-					<para>ORM Tier: a server-side Cayenne Java application that directly connects to
-						the database via JDBC.</para>
-				</listitem>
-				<listitem>
-					<para>CWS (Cayenne Web Service): A wrapper around an ORM tier that makes it
-						accessible to remote CWS clients.</para>
-				</listitem>
-				<listitem>
-					<para>Remote Tier (aka Client Tier): A Java application that has no direct DB
-						connection and persists its objects by connecting to remote Cayenne Web
-						Service (CWS). Note that CWS Client doesn't have to be a desktop
-						application. It can be another server-side application. The word "client"
-						means a client of Cayenne Web Service.</para>
-				</listitem>
-			</itemizedlist></para>
-    </section>
-    <section xml:id="main-features">
-        <title>Main Features</title>
-		<itemizedlist>
-			
-					<listitem>
-						<para>Unified approach to lightweight object persistence across multiple
-							tiers of a distributed system.</para>
-					</listitem>
-					<listitem>
-						<para>Same abstract object model on the server and on the client.</para>
-					</listitem>
-					<listitem>
-						<para>Client can "bootstrap" from the server by dynamically loading
-							persistence metadata.</para>
-					</listitem>
-					<listitem>
-						<para>An ability to define client objects differently than the server ones,
-							and still have seamless persistence.</para>
-					</listitem>
-					<listitem>
-						<para>Generic web service interface that doesn't change when object model
-							changes.</para>
-					</listitem>
-					<listitem>
-						<para>An ability to work in two modes: dedicated session mode or shared
-							("chat") mode when multiple remote clients collaboratively work on the
-							same data.</para>
-					</listitem>
-					<listitem>
-						<para>Lazy object and collection faulting.</para>
-					</listitem>
-					<listitem>
-						<para>Full context lifecycle</para>
-					</listitem>
-					<listitem>
-						<para>Queries, expressions, local query caching, paginated queries.</para>
-					</listitem>
-					<listitem>
-						<para>Validation</para>
-					</listitem>
-					<listitem>
-						<para>Delete Rules</para>
-					</listitem>
-		</itemizedlist>
-    </section>
-</chapter>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/7783cd34/docs/docbook/cayenne-guide/src/docbkx/rop-setup.xml
----------------------------------------------------------------------
diff --git a/docs/docbook/cayenne-guide/src/docbkx/rop-setup.xml b/docs/docbook/cayenne-guide/src/docbkx/rop-setup.xml
deleted file mode 100644
index dde1922..0000000
--- a/docs/docbook/cayenne-guide/src/docbkx/rop-setup.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-	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.
--->
-<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink"
-    version="5.0" xml:id="rop-setup">
-    <title>ROP Setup</title>
-    <section xml:id="rop-system-requirements">
-        <title>System Requirements</title>
-    </section>
-    <section xml:id="rop-jar-files-dependencies">
-        <title>Jar Files and Dependencies</title>
-    </section>
-</chapter>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/7783cd34/docs/docbook/cayenne-guide/src/docbkx/setup.xml
----------------------------------------------------------------------
diff --git a/docs/docbook/cayenne-guide/src/docbkx/setup.xml b/docs/docbook/cayenne-guide/src/docbkx/setup.xml
deleted file mode 100644
index 75847a4..0000000
--- a/docs/docbook/cayenne-guide/src/docbkx/setup.xml
+++ /dev/null
@@ -1,82 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-    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.
--->
-<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink"
-    version="5.0" xml:id="setup">
-    <title>Setup</title>
-    <section xml:id="system-requirements">
-        <title>System Requirements</title>
-        <para>
-            <itemizedlist>
-                <listitem>
-                    <para><emphasis role="italic">Java</emphasis>: Cayenne runtime framework and
-                        CayenneModeler GUI tool are written in 100% Java, and run on any
-                        Java-compatible platform. Required JDK version is 1.5 or higher. The last
-                        version of Cayenne compatible with JDK 1.4 is 1.2.x/2.0.x and JDK 1.3 is 1.1.x</para>
-                </listitem>
-            </itemizedlist>
-            <itemizedlist>
-                <listitem>
-                    <para><emphasis role="italic">JDBC Driver:</emphasis> An appropriate DB-specific
-                        JDBC driver is needed to access the database. It can be included in the
-                        application or used in web container DataSource configuration.</para>
-                </listitem>
-            </itemizedlist>
-            <itemizedlist>
-                <listitem>
-                    <para><emphasis role="italic">Third-party Libraries:</emphasis> Cayenne runtime
-                        framework has a minimal set of required and a few more optional dependencies
-                        on third-party open source packages. See "Including Cayenne in a Project"
-                        chapter for details.</para>
-                </listitem>
-            </itemizedlist>
-        </para>
-    </section>
-    <section xml:id="running-cayennemodeler">
-        <title>Running CayenneModeler</title>
-        <para>CayenneModeler GUI tool is intended to work with object relational mapping projects. While
-            you can edit your XML by hand, it is rarely needed, as the Modeler is a pretty advanced
-            tool included in Cayenne distribution. To obtain CayenneModeler, download Cayenne
-            distribution archive from <link xlink:href="http://cayenne.apache.org/download.html"
-                >http://cayenne.apache.org/download.html</link> matching the OS you are using. Of
-            course Java needs to be installed on the machine where you are going to run the
-            Modeler.</para>
-        <para>OS X distribution contains CayenneModeler.app at the root of the distribution disk
-            image.</para>
-        <para>Windows distribution contains CayenneModeler.exe file in the <code>bin</code>
-            directory.</para>
-        <para>Cross-platform distribution (targeting Linux, but as the name implies, compatible with any
-            OS) contains a runnable CayenneModeler.jar in the <code>bin</code> directory. It can be
-            executed either by double-clicking, or if the environment is not configured to execute
-            jars, by running from command-line:</para>
-        <programlisting>java -jar CayenneModeler.jar</programlisting>
-        <para>The Modeler can also be started from Maven. While it may look like an exotic way to start a
-            GUI application, it has its benefits - no need to download Cayenne distribution, the
-            version of the Modeler always matches the version of the framework, the plugin can find
-            mapping files in the project automatically. So is an attractive option to some
-            developers. Maven option requires a declaration in the
-            POM:<programlisting>&lt;build>
-    &lt;plugins>
-        &lt;plugin>
-            &lt;groupId>org.apache.cayenne.plugins&lt;/groupId>
-            &lt;artifactId>maven-cayenne-modeler-plugin&lt;/artifactId>
-            &lt;version>X.Y.Z&lt;/version>
-        &lt;/plugin>
-    &lt;/plugins>
-&lt;/build></programlisting></para>
-        <para>And then can be run as <programlisting>mvn cayenne-modeler:run</programlisting></para>
-    </section>
-</chapter>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/7783cd34/docs/docbook/cayenne-guide/src/docbkx/starting-cayenne.xml
----------------------------------------------------------------------
diff --git a/docs/docbook/cayenne-guide/src/docbkx/starting-cayenne.xml b/docs/docbook/cayenne-guide/src/docbkx/starting-cayenne.xml
deleted file mode 100644
index 4bb5cd2..0000000
--- a/docs/docbook/cayenne-guide/src/docbkx/starting-cayenne.xml
+++ /dev/null
@@ -1,158 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-    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.
--->
-<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink"
-    version="5.0" xml:id="starting-cayenne">
-    <title>Starting Cayenne</title>
-    <section xml:id="starting-serverruntime">
-        <title>Starting and Stopping ServerRuntime</title>
-        <para>In runtime Cayenne is accessed via
-                <code>org.apache.cayenne.configuration.server.ServerRuntime</code>. ServerRuntime is
-            created simply by calling a
-            constructor:<programlisting language="java">ServerRuntime runtime = new ServerRuntime("com/example/cayenne-project.xml");</programlisting></para>
-        <para>The parameter you pass to the constructor is a location of the main project file. Location
-            is a '/'-separated path (same path separator is used on UNIX and Windows) that is
-            resolved relative to the application classpath. The project file can be placed in the
-            root package or in a subpackage (e.g. in the code above it is in "com/example"
-            subpackage).</para>
-        <para>ServerRuntime encapsulates a single Cayenne stack. Most applications will just have
-            one ServerRuntime using it to create as many ObjectContexts as needed, access the
-            Dependency Injection (DI) container and work with other Cayenne features. Internally
-            ServerRuntime is just a thin wrapper around the DI container. Detailed features of the
-            container are discussed in "Customizing Cayenne Runtime" chapter. Here we'll just show
-            an example of how an application might replace a default implementation of a built-in
-            Cayenne service (in this case - QueryCache) with a different
-            class:<programlisting language="java">public class MyExtensionsModule implements Module {
-    public void configure(Binder binder) {
-        binder.bind(QueryCache.class).to(EhCacheQueryCache.class);
-    }
-}</programlisting><programlisting language="java">Module extensions = new MyExtensionsModule();
-ServerRuntime runtime = new ServerRuntime("com/example/cayenne-project.xml", extensions);</programlisting></para>
-        <para>It is a good idea to shut down the runtime when it is no longer needed, usually before the
-            application itself is shutdown: <programlisting language="java">runtime.shutdown();</programlisting>When
-            a runtime object has the same scope as the application, this may not be always
-            necessary, however in some cases it is essential, and is generally considered a good
-            practice. E.g. in a web container hot redeploy of a webapp will cause resource leaks and
-            eventual OutOfMemoryError if the application fails to shutdown CayenneRuntime.</para>
-    </section>
-    <section>
-        <title>Merging Multiple Projects</title>
-        <para>ServerRuntime requires at least one mapping project to run. But it can also take multiple
-            projects and merge them together in a single configuration. This way different parts of
-            a database can be mapped independenlty from each other (even by different software
-            providers), and combined in runtime when assembling an application. Doing it is as easy
-            as passing multiple project locations to ServerRuntime constructor:</para><programlisting language="java">ServerRuntime runtime = new ServerRuntime(new String[] {
-        "com/example/cayenne-project.xml",
-        "org/foo/cayenne-library1.xml",
-        "org/foo/cayenne-library2.xml"
-    }
-);</programlisting>
-        <para>When the projects are merged, the following rules are applied:<itemizedlist>
-                <listitem>
-                    <para>The order of projects matters during merge. If there are two conflicting
-                        metadata objects belonging to two projects, an object from the <emphasis
-                            role="italic">last</emphasis> project takes precedence over the object
-                        from the first one. This makes possible to override pieces of metadata. This
-                        is also similar to how DI modules are merged in Cayenne.</para>
-                </listitem>
-                <listitem>
-                    <para>Runtime DataDomain name is set to the name of the last project in the
-                        list.</para>
-                </listitem>
-                <listitem>
-                    <para>Runtime DataDomain properties are the same as the properties of the last
-                        project in the list. I.e. <emphasis role="italic">properties are not
-                            merged</emphasis> to avoid invalid combinations and unexpected runtime
-                        behavior.</para>
-                </listitem>
-                <listitem>
-                    <para>If there are two or more DataMaps with the same name, only one DataMap is
-                        used in the merged project, the rest are discarded. Same precedence rules
-                        apply - DataMap from the project with the highest index in the project list
-                        overrides all other DataMaps with the same name.</para>
-                </listitem>
-                <listitem>
-                    <para>If there are two or more DataNodes with the same name, only one DataNodes
-                        is used in the merged project, the rest are discarded. DataNode coming from
-                        project with the highest index in the project list is chosen per precedence
-                        rule above.</para>
-                </listitem>
-                <listitem>
-                    <para>There is a notion of "default" DataNode. After the merge if any DataMaps
-                        are not explicitly linked to DataNodes, their queries will be executed via a
-                        default DataNode. This makes it possible to build mapping "libraries" that
-                        are only associated with a specific database in runtime. If there's only one
-                        DataNode in the merged project, it will be automatically chosen as default.
-                        A possible way to explicitly designate a specific node as default is to
-                        override <code>DataDomainProvider.createAndInitDataDomain()</code>.</para>
-                </listitem>
-            </itemizedlist></para>
-    </section>
-    <section xml:id="webapps">
-        <title>Web Applications</title>
-        <para>Web applications can use a variety of mechanisms to configure and start the "services"
-            they need, Cayenne being one of such services. Configuration can be done within standard
-            Servlet specification objects like Servlets, Filters, or ServletContextListeners, or can
-            use Spring, JEE CDI, etc. This is a user's architectural choice and Cayenne is agnostic
-            to it and will happily work in any environment. As described above, all that is needed
-            is to create an instance of ServerRuntime somewhere and provide the application code
-            with means to access it. And shut it down when the application ends to avoid container
-            leaks.</para>
-        <para>Still Cayenne includes a piece of web app configuration code that can assist in
-            quickly setting up simple Cayenne-enabled web applications. We are talking about
-            CayenneFilter. It is declared in
-            web.xml:<programlisting>&lt;web-app>
-    ...
-    &lt;filter>
-        &lt;filter-name>cayenne-project&lt;/filter-name>
-        &lt;filter-class>org.apache.cayenne.configuration.web.CayenneFilter&lt;/filter-class>
-    &lt;/filter>
-     &lt;filter-mapping>
-        &lt;filter-name>cayenne-project&lt;/filter-name>
-        &lt;url-pattern>/*&lt;/url-pattern>
-     &lt;/filter-mapping>
-    ...
- &lt;/web-app>       </programlisting></para>
-        <para>When started by the web container, it creates a instance of ServerRuntime and stores
-            it in the ServletContext. Note that the name of Cayenne XML project file is derived from
-            the "filter-name". In the example above CayenneFilter will look for an XML file
-            "cayenne-project.xml". This can be overridden with "configuration-location" init
-            parameter.</para>
-        <para>When the application runs, all HTTP requests matching the filter url-pattern will have
-            access to a session-scoped ObjectContext like
-            this:<programlisting language="java">ObjectContext context = BaseContext.getThreadObjectContext();</programlisting>Of
-            course the ObjectContext scope, and other behavior of the Cayenne runtime can be
-            customized via dependency injection. For this another filter init parameter called
-            "extra-modules" is used. "extra-modules" is a comma or space-separated list of class
-            names, with each class implementing Module interface. These optional custom modules are
-            loaded after the the standard ones, which allows users to override all standard
-            definitions.</para>
-        <para>For those interested in the DI container contents of the runtime created by CayenneFilter,
-            it is the same ServerRuntime as would've been created by other means, but with an extra
-                <code>org.apache.cayenne.configuration.web.WebModule</code> module that provides
-                <code>org.apache.cayenne.configuration.web.RequestHandler</code> service. This is
-            the service to override in the custom modules if you need to provide a different
-            ObjectContext scope, etc.</para>
-        <para>
-            <note>
-                <para>You should not think of CayenneFilter as the only way to start and use Cayenne in a web
-                    application. In fact CayenneFilter is entirely optional. Use it if you don't
-                    have any special design for application service management. If you do, simply
-                    integrate Cayenne into that design.</para>
-            </note>
-        </para>
-    </section>
-</chapter>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/7783cd34/docs/docbook/cayenne-guide/src/images/.gitignore
----------------------------------------------------------------------
diff --git a/docs/docbook/cayenne-guide/src/images/.gitignore b/docs/docbook/cayenne-guide/src/images/.gitignore
deleted file mode 100644
index e69de29..0000000

http://git-wip-us.apache.org/repos/asf/cayenne/blob/7783cd34/docs/docbook/cayenne-guide/src/images/remote-object-persistence.jpg
----------------------------------------------------------------------
diff --git a/docs/docbook/cayenne-guide/src/images/remote-object-persistence.jpg b/docs/docbook/cayenne-guide/src/images/remote-object-persistence.jpg
deleted file mode 100644
index 43f820d..0000000
Binary files a/docs/docbook/cayenne-guide/src/images/remote-object-persistence.jpg and /dev/null differ

http://git-wip-us.apache.org/repos/asf/cayenne/blob/7783cd34/docs/docbook/docbook-stylesheets/pom.xml
----------------------------------------------------------------------
diff --git a/docs/docbook/docbook-stylesheets/pom.xml b/docs/docbook/docbook-stylesheets/pom.xml
deleted file mode 100644
index 66f7b84..0000000
--- a/docs/docbook/docbook-stylesheets/pom.xml
+++ /dev/null
@@ -1,47 +0,0 @@
-<?xml version="1.0"?>
-<!--
-    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.   
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.apache.cayenne.docs</groupId>
-        <artifactId>cayenne-docbook</artifactId>
-        <version>3.1.3-SNAPSHOT</version>
-    </parent>
-
-    <groupId>org.apache.cayenne.docs</groupId>
-    <artifactId>docbook-stylesheets</artifactId>
-    <version>3.1.3-SNAPSHOT</version>
-    <name>Docbook: Cayenne Stylesheets</name>
-
-    <properties>
-        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-    </properties>
-
-    <build>
-        <resources>
-            <resource>
-                <directory>src/main/resources</directory>
-                <filtering>true</filtering>
-            </resource>
-        </resources>
-    </build>
-
-</project>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/7783cd34/docs/docbook/docbook-stylesheets/src/main/resources/css/cayenne-doc.css
----------------------------------------------------------------------
diff --git a/docs/docbook/docbook-stylesheets/src/main/resources/css/cayenne-doc.css b/docs/docbook/docbook-stylesheets/src/main/resources/css/cayenne-doc.css
deleted file mode 100644
index 57f7ea6..0000000
--- a/docs/docbook/docbook-stylesheets/src/main/resources/css/cayenne-doc.css
+++ /dev/null
@@ -1,140 +0,0 @@
-@IMPORT url("highlight.css");
-
-html {
-    padding:       0pt;
-    margin:        0pt;
-}
-
-body, td {
-    margin-left:   10%;
-    margin-right:  10%;
-    font-family:   "Lucida Grande","Trebuchet MS",Verdana,sans-serif;
-    font-size: small;
-}
-
-div {
-    margin:        0pt;
-}
-
-p {
-    text-align:    justify;
-}
-
-hr {
-    border:        1px solid gray;
-    background:    gray;
-}
-
-h1, h2, h3, h4 {
-    font-family: "Trebuchet MS","Lucida Grande",Verdana,sans-serif;
-    font-weight: normal;
-    line-height: normal;
-    margin: 1em 0 0.5em;
-}
-
-h2 {
-    color: #660000;
-    font-size: 170%;
-    padding: 0;
-}
-
-h3 {
-    border-bottom: 1px solid #EAEAEA;
-    color: #CC4400;
-    font-size: 135%;
-    padding-bottom: 3px;
-}
-
-h4 {
-    color: #AAAA99;
-    font-size: 130%;
-}
-
-pre {
-    line-height:   1.0;
-    color:         black;
-
-    -moz-tab-size: 4;
-    -o-tab-size:   4;
-    tab-size:      4;
-}
-
-pre.programlisting {
-    font-size:     10pt;
-    padding:       7pt 3pt;
-    border:        1pt solid black;
-    background:    #F9F9F6;
-    clear:         both;
-}
-
-div.table {
-    margin:        1em;
-    padding:       0.5em;
-    text-align:    center;
-}
-
-table[frame=void] {
-    display:       table;
-    width:         100%;
-    border:        1px black solid;
-    border-collapse: collapse;
-    border-spacing: 0;
-}
-
-table[frame=void] td {
-    padding-left:  7px;
-    padding-right: 7px;
-    border:        1px black solid;
-}
-
-table[frame=void] th {
-    padding-left:  7px;
-    padding-right: 7px;
-    border:        1px black solid;
-}
-
-.sidebar {
-    float: right;
-    margin: 10px 0 10px 30px;
-    padding: 10px 20px 20px 20px;
-    width: 33%;
-    border: 1px solid black;
-    background-color: #F4F4F4;
-    font-size: 14px;
-}
-
-.code {
-    font-family: Courier New,monospace;
-}
-
-.mediaobject {
-    padding-top: 30px;
-    padding-bottom: 30px;
-}
-
-.legalnotice {
-    font-size: 12px;
-    font-style: italic;
-}
-
-p.releaseinfo {
-    font-size: 100%;
-    font-weight: bold;
-    padding-top: 10px;
-}
-
-p.pubdate {
-    font-size: 120%;
-    font-weight: bold;
-}
-
-span.productname {
-    font-size: 200%;
-    font-weight: bold;
-}
-
-th.versioninfo {
-    font-size: 10px;
-    font-weight: normal;
-    text-align: left;
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/7783cd34/docs/docbook/docbook-stylesheets/src/main/resources/css/highlight.css
----------------------------------------------------------------------
diff --git a/docs/docbook/docbook-stylesheets/src/main/resources/css/highlight.css b/docs/docbook/docbook-stylesheets/src/main/resources/css/highlight.css
deleted file mode 100644
index f6a057d..0000000
--- a/docs/docbook/docbook-stylesheets/src/main/resources/css/highlight.css
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
-   code highlight CSS resemblign the Eclipse IDE default color schema
-   @author Costin Leau
-*/
-
-.hl-keyword {
-    color: #7F0055;
-    font-weight: bold;
-}
-
-.hl-comment {
-    color: #3F5F5F;
-    font-style: italic;
-}
-
-.hl-multiline-comment {
-    color: #3F5FBF;
-    font-style: italic;
-}
-
-.hl-tag {
-    color: #3F7F7F;
-}
-
-.hl-attribute {
-    color: #7F007F;
-}
-
-.hl-value {
-    color: #2A00FF;
-}
-
-.hl-string {
-    color: #2A00FF !important;
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/7783cd34/docs/docbook/docbook-stylesheets/src/main/resources/stylesheets/common-customizations.xsl
----------------------------------------------------------------------
diff --git a/docs/docbook/docbook-stylesheets/src/main/resources/stylesheets/common-customizations.xsl b/docs/docbook/docbook-stylesheets/src/main/resources/stylesheets/common-customizations.xsl
deleted file mode 100644
index d51510d..0000000
--- a/docs/docbook/docbook-stylesheets/src/main/resources/stylesheets/common-customizations.xsl
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-	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.   
--->
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
-
-	<!-- The next line is needed to work with maven injecting the docbook stylesheets -->
-	<!---->
-	<!-- <xsl:import href="urn:docbkx:stylesheet/highlight.xsl"/> -->
-
-	<xsl:param name="keep.relative.image.uris" select="1"/>
-	<xsl:param name="toc.section.depth">1</xsl:param>
-
-	<!-- disable TOC for each part -->
-	<xsl:template name="generate.part.toc" />
-
-</xsl:stylesheet>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/7783cd34/docs/docbook/docbook-stylesheets/src/main/resources/stylesheets/highlight.xsl
----------------------------------------------------------------------
diff --git a/docs/docbook/docbook-stylesheets/src/main/resources/stylesheets/highlight.xsl b/docs/docbook/docbook-stylesheets/src/main/resources/stylesheets/highlight.xsl
deleted file mode 100644
index e25baf0..0000000
--- a/docs/docbook/docbook-stylesheets/src/main/resources/stylesheets/highlight.xsl
+++ /dev/null
@@ -1,104 +0,0 @@
-<?xml version="1.0" encoding="ASCII"?>
-<!--
-    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.
--->
-<!--This file was created automatically by html2xhtml-->
-<!--from the HTML stylesheets.-->
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:d="http://docbook.org/ns/docbook"
-                xmlns:xslthl="http://xslthl.sf.net" xmlns="http://www.w3.org/1999/xhtml" exclude-result-prefixes="xslthl d" version="1.0">
-
-    <xsl:import href="urn:docbkx:stylesheet/highlight.xsl"/>
-    <!-- ********************************************************************
-   $Id: highlight.xsl 8911 2010-09-28 17:02:06Z abdelazer $
-   ********************************************************************
-
-   This file is part of the XSL DocBook Stylesheet distribution.
-   See ../README or http://docbook.sf.net/release/xsl/current/ for
-   and other information.
-
-
-
-   ******************************************************************** -->
-    <!-- <xsl:import href="urn:/highlighting/common.xsl"/> -->
-    <xsl:template match="xslthl:keyword" mode="xslthl">
-        <span class="hl-keyword">
-            <xsl:apply-templates mode="xslthl"/>
-        </span>
-    </xsl:template>
-    <xsl:template match="xslthl:string" mode="xslthl">
-        <span class="hl-string">
-            <xsl:apply-templates mode="xslthl"/>
-        </span>
-    </xsl:template>
-    <xsl:template match="xslthl:comment" mode="xslthl">
-        <span class="hl-comment">
-            <xsl:apply-templates mode="xslthl"/>
-        </span>
-    </xsl:template>
-    <xsl:template match="xslthl:directive" mode="xslthl">
-        <span class="hl-directive">
-            <xsl:apply-templates mode="xslthl"/>
-        </span>
-    </xsl:template>
-    <xsl:template match="xslthl:tag" mode="xslthl">
-        <span class="hl-tag">
-            <xsl:apply-templates mode="xslthl"/>
-        </span>
-    </xsl:template>
-    <xsl:template match="xslthl:attribute" mode="xslthl">
-        <span class="hl-attribute">
-            <xsl:apply-templates mode="xslthl"/>
-        </span>
-    </xsl:template>
-    <xsl:template match="xslthl:value" mode="xslthl">
-        <span class="hl-value">
-            <xsl:apply-templates mode="xslthl"/>
-        </span>
-    </xsl:template>
-    <xsl:template match="xslthl:html" mode="xslthl">
-        <strong>
-            <span>
-                <xsl:apply-templates mode="xslthl"/>
-            </span>
-        </strong>
-    </xsl:template>
-    <xsl:template match="xslthl:xslt" mode="xslthl">
-        <span>
-            <xsl:apply-templates mode="xslthl"/>
-        </span>
-    </xsl:template>
-    <!-- Not emitted since XSLTHL 2.0 -->
-    <xsl:template match="xslthl:section" mode="xslthl">
-        <span>
-            <xsl:apply-templates mode="xslthl"/>
-        </span>
-    </xsl:template>
-    <xsl:template match="xslthl:number" mode="xslthl">
-        <span class="hl-number">
-            <xsl:apply-templates mode="xslthl"/>
-        </span>
-    </xsl:template>
-    <xsl:template match="xslthl:annotation" mode="xslthl">
-        <span class="hl-annotation">
-            <xsl:apply-templates mode="xslthl"/>
-        </span>
-    </xsl:template>
-    <!-- Not sure which element will be in final XSLTHL 2.0 -->
-    <xsl:template match="xslthl:doccomment|xslthl:doctype" mode="xslthl">
-        <strong class="hl-tag">
-            <xsl:apply-templates mode="xslthl"/>
-        </strong>
-    </xsl:template>
-</xsl:stylesheet>
\ No newline at end of file


Mime
View raw message