<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
<book>
  <bookinfo>
    <title>Objectwiz - User's manual</title>

    <author>
      <firstname>Benoît</firstname>

      <surname>Del Basso</surname>

      <email>benoit.delbasso at helmet.fr</email>
    </author>

    <copyright>
      <year>Creative Commons</year>
    </copyright>

    <pubdate>2 February 2010</pubdate>
  </bookinfo>

  <chapter>
    <title>Preface</title>

    <section>
      <title>Introduction</title>

      <para>The <ulink
      url="http://en.wikipedia.org/wiki/Object-oriented_programming">object
      paradigm</ulink> is widely used for developping software applications.
      One of the reasons for its popularity is that it's great for mapping
      real-world concepts into data models. A classic architecture for a
      software application that use this paradigm is the <ulink
      url="http://en.wikipedia.org/wiki/Multitier_architecture#Three-tier_architecture">Three-tier
      architecture</ulink> (separation of the application in three layers:
      data, logic and presentation).</para>

      <para>The task of the data layer is to provide an abstraction for
      storing objects into databases, for making them
      <emphasis>persistent</emphasis>. In many programming languages, this
      type of layer has been normalized in what is usually called a
      <emphasis>persistence layer</emphasis>. Let's mention <ulink
      url="http://en.wikipedia.org/wiki/Java_Persistence_API">JPA</ulink> as
      an example. Those framework may rely on <ulink
      url="http://en.wikipedia.org/wiki/Relational_database">relational
      databases</ulink> (in that case they are called <ulink
      url="http://en.wikipedia.org/wiki/Object-relational_mapping">Object-relational
      frameworks</ulink> - ORM), <ulink
      url="http://en.wikipedia.org/wiki/Object_database">object-oriented
      databases</ulink> or any other system. Their job is to make sure that
      the data is stored, can be retrieved, queried and modified.</para>

      <para>Objectwiz is a dynamic front-end for administrating such
      applications. It is possible to browse interactively the graph of
      objects and to manipulate data (<ulink
      url="http://en.wikipedia.org/wiki/Create,_read,_update_and_delete">CRUD</ulink>
      operations, call to methods from the logic layer, etc.) directly from
      within the graph. Objectwiz stands between a database administration
      tool (such as phpMyAdmin) and a CRUD application generated from a data
      model.</para>

      <para><emphasis>IMPORTANT NOTES:</emphasis></para>

      <para><emphasis>1. Objectwiz is very generic in its design and the
      concepts are independent of any programming language, still it can
      currently only be connected to JEE enterprise applications. The reason
      is simple: Java offers a wide range of standards (JPA, EJBs, JNDI, JMX,
      etc.) that greatly simplify the task of discovering the data model,
      retrieving the connection to the database, etc. If you are interested in
      connecting Objectwiz to applications from other programming languages,
      please get in touch with the <ulink
      url="http://sourceforge.net/projects/objectwiz/support">development
      team</ulink>.</emphasis></para>

      <para id="note2-connectors"><emphasis>2. Despite all these standards,
      some operations performed by Objectwiz are tied to the application
      server and the persistence provider that is used in the target
      application. Therefore Objectwiz needs a few lines of code for each
      server and persistence provider. Currently, only <ulink
      url="http://www.jboss.org/">JBoss</ulink> and <ulink
      url="https://www.hibernate.org/">Hibernate</ulink> are supported, but
      with little effort Objectwiz could be connected to other JEE application
      servers or JPA-compliant providers as well. Please open a discussion on
      the <ulink
      url="http://sourceforge.net/projects/objectwiz/forums/forum/1001890">forums</ulink>
      about the particular server and/or provider that you are targetting if
      you would like it to get supported.</emphasis></para>

      <para>If you are new to object-oriented programming, Java or to the
      concept of persistence, enterprise beans, you might also consider to
      read the following articles:</para>

      <itemizedlist>
        <listitem>
          <para><ulink type=""
          url="http://java.sun.com/docs/books/tutorial/java/concepts/">Java
          Lesson: Object-Oriented Programming Concepts</ulink></para>
        </listitem>

        <listitem>
          <para><ulink
          url="http://en.wikipedia.org/wiki/Java_Platform,_Enterprise_Edition">Java
          Platform, Enterprise Edition (Wikipedia)</ulink></para>
        </listitem>

        <listitem>
          <para><ulink
          url="http://java.sun.com/blueprints/guidelines/designing_enterprise_applications_2e/">Designing
          Enterprise Applications with the JEE Platform, Second
          Edition</ulink></para>
        </listitem>

        <listitem>
          <para><ulink url="https://www.hibernate.org/397.html">Java
          Persistence with Hibernate</ulink></para>
        </listitem>
      </itemizedlist>
    </section>

    <section>
      <title>Feedback</title>

      <para>Use the <ulink
      url="http://sourceforge.net/projects/objectwiz/support">project
      page</ulink> on Sourceforge to report errors or request enhancements to
      this documentation.</para>
    </section>
  </chapter>

  <chapter>
    <title>Setting up Objectwiz with a sample application: the DVD
    Store</title>

    <para>The DVD Store (from <ulink url="http://seamframework.org">Seam
    framework</ulink>) is a classic example of EJB3 three-tier application.
    This chapter explains how to set up Objectwiz to administrate the data of
    the DVD store, however these steps apply for any other JEE enterprise
    application.<mediaobject>
        <imageobject>
          <imagedata fileref="screenshots/seam_dvdstore.jpg" scale="50" />
        </imageobject>

        <caption><para>The DVD Store</para></caption>
      </mediaobject><mediaobject>
        <imageobject>
          <imagedata fileref="screenshots/richclient_graph1.jpg" scale="50" />
        </imageobject>

        <caption><para>Browsing the object graph (current object: the film
        "The Nun's Story" with Audrey Hepburn)</para></caption>
      </mediaobject></para>

    <section>
      <title>Prerequisites</title>

      <para>In order to follow this tutorial, you will need the following
      items:</para>

      <itemizedlist>
        <listitem>
          <para>A <emphasis><ulink url="http://www.jboss.org">JBoss</ulink>
          server</emphasis> instance.</para>

          <para>JBoss 4.x is recommended since there are some issues with 5.x
          versions and a version 6 is still a milestone version at the moment.
          Latest available community version is then <ulink type=""
          url="http://sourceforge.net/projects/jboss/files/JBoss/JBoss-4.2.3.GA/">4.2.3.GA</ulink>.</para>
        </listitem>

        <listitem>
          <para>The DVD Store application.</para>

          <para>It is available in the releases of <ulink
          url="http://seamframework.org">Seam</ulink>. <ulink
          url="http://sourceforge.net/projects/jboss/files/JBoss%20Seam/jboss-seam-2.1.2.zip/download">Seam
          2.1.2</ulink> is the recommended version to download when targetting
          a JBoss 4.2 server.</para>
        </listitem>

        <listitem>
          <para>The latest release of Objectwiz.</para>

          <para>It is available <ulink
          url="http://sourceforge.net/projects/objectwiz/files/">here</ulink>.</para>
        </listitem>
      </itemizedlist>

      <para>After downloading the files, extract them to separate directories.
      These directories will be refered below as <code>jboss/</code>,
      <code>seam/</code> and <code>objectwiz/</code>.</para>
    </section>

    <section>
      <title>Add shared libraries to JBoss.</title>

      <para>Copy <code>objectwiz-core.jar</code> to
      <code>jboss/server/default/lib</code>.</para>
    </section>

    <section>
      <title>Deploy the DVD Store with embedded agent.</title>

      <para>The DVD store can be built and deployed to JBoss using the
      provided ant script.</para>

      <para>First, update <code>jboss.dir</code> to the correct path in
      <code>seam/build/default.build.properties</code>.</para>

      <para>Then, change directory to <code>seam/example/dvdstore</code> and
      run <code>ant explode</code>.</para>

      <para>This will build the DVD store sample application and deploy it as
      an EAR application in
      <code>jboss/server/default/deploy/jboss-seam-dvdstore.ear</code>.</para>

      <para>Go to this newly created directory and follow the three steps
      below to embed <emphasis>Objectwiz Agent</emphasis> into the
      application. The agent is a very lightweight Java module that exposes
      the application and interacts with Objectwiz front-end.</para>

      <para><orderedlist>
          <listitem>
            <para>Copy <code>objectwiz-agent.jar</code> and
            <code>objectwiz.conf.xml.sample</code> to this directory (the root
            of the EAR application).</para>
          </listitem>

          <listitem>
            <para>Rename objectwiz.conf.xml.sample to
            <code>objectwiz.conf.xml</code> and update it so that the
            <code>&lt;application&gt;</code> tag contains the name of the
            application (<code>jboss-seam-dvdstore</code> for the sample
            application). The configuration file should then look like:</para>

            <blockquote>
              <para>&lt;?xml version="1.0" encoding="UTF-8"?&gt;</para>

              <para>&lt;objectwiz&gt;</para>

              <para>&lt;application&gt;jboss-seam-dvdstore&lt;/application&gt;</para>

              <para>&lt;/objectwiz&gt;</para>
            </blockquote>
          </listitem>

          <listitem>
            <para>Add <code>objectwiz-agent.jar</code> as an EJB module in
            <code>META-INF/application.xml</code>, under the
            <code>&lt;application&gt;</code> tag.</para>

            <blockquote>
              <para>&lt;module&gt;</para>

              <para>&lt;ejb&gt;objectwiz-agent.jar&lt;/ejb&gt;</para>

              <para>&lt;/module&gt;</para>
            </blockquote>
          </listitem>
        </orderedlist></para>
    </section>

    <section>
      <title>Deploy Objectwiz front-end</title>

      <para>Copy <code>objectwiz.ear</code> to
      <code><code>jboss/server/default/deploy</code></code>.</para>
    </section>

    <section>
      <title>Launch the server and check the applications</title>

      <para>Execute <code>jboss/bin/run.sh</code> to run the server.</para>

      <para>You should get a WARNING [1] along with an incomplete deployment
      listing [2], but that's normal behavior for the first run.</para>

      <blockquote>
        <para>[1] java.lang.Exception: Agent corresponding to the current
        application was not detected: objectwiz</para>

        <para>[2] --- MBEANS THAT ARE THE ROOT CAUSE OF THE PROBLEM ---</para>

        <para>ObjectName:
        jboss.jca:name=objectwizDatasource,service=DataSourceBinding</para>

        <para>State: NOTYETINSTALLED</para>

        <para>Depends On Me:
        persistence.units:ear=objectwiz.ear,unitName=objectwiz</para>
      </blockquote>

      <para>Wait until the two applications are deployed and check they are up
      and running:</para>

      <itemizedlist>
        <listitem>
          <para><code>http://localhost:8080/seam-dvdstore</code>. You should
          see a "Welcome to the DVD Store" screen.</para>
        </listitem>

        <listitem>
          <para><code>http://localhost:8080/objectwiz</code>. You should see a
          "Welcome to Objectwiz!" screen.</para>
        </listitem>
      </itemizedlist>

      <para>On the Objectwiz splash screen, click on "Create internal
      database".</para>

      <para>After a few seconds, you should be able to see a "Launch" button.
      If that's not the case, please refer to the <link
      linkend="troubleshooting">troubleshooting</link> chapter.</para>

      <mediaobject>
        <imageobject>
          <imagedata fileref="screenshots/welcome_firstrun.jpg" scale="50" />
        </imageobject>

        <caption><para>Running Objectwiz from the first time</para></caption>
      </mediaobject>

      <mediaobject>
        <imageobject>
          <imagedata fileref="screenshots/welcome_splashscreen.jpg" scale="50" />
        </imageobject>

        <caption><para>Splash screen of the front-end (once the internal
        database is successfully created)</para></caption>
      </mediaobject>
    </section>

    <section>
      <title>Configure access rights</title>

      <para>Access control in Objectwiz is based on the roles supplied by the
      application server.</para>

      <para>To be able to successfully log in to Objectwiz, a user must have
      the role: <code>objectwizUser</code>. To get write-access to the data of
      an application, a user must also have the role <code>&lt;name of the
      application&gt;-RW</code> (e.g. <code>jboss-seam-dvdstore-RW</code> for
      accessing the DVD Store sample application).</para>

      <para>The default realm for objectwiz web application is the one of the
      JMX console (<code>jmx-console</code>). Therefore, users/passwords/roles
      can be configured in the two following files:</para>

      <blockquote>
        <para>jboss/server/default/conf/props/jmx-console-users.properties</para>

        <para>jboss/server/default/conf/props/jmx-console-roles.properties</para>
      </blockquote>

      <para>NOTE: JBoss must be restarted for changes to take effect.</para>
    </section>

    <section>
      <title>Launch the rich client</title>

      <para>On the web front-end
      (<code>http://localhost:8080/objectwiz</code>), click
      <emphasis>Launch</emphasis> and open the file that pops up (jnlp.jsp)
      using "Java Web Start".</para>

      <para>On the login screen, supply the credentials that you defined at
      Step 6. After logging in, you should see a list of two applications:
      objectwiz and jboss-seam-dvdstore.</para>

      <para>If that is not the case, please refer to the <link
      linkend="troubleshooting">troubleshooting</link> chapter.</para>

      <para>NOTE: You must have Java &gt; 1.6 Update 12 installed on your
      computer.</para>

      <para>NOTE: The security certificate is currently self-signed, which
      means that you should expect a security warning: "The application
      digital signature cannot be verified". Just skip it by clicking
      "Run".</para>

      <para>NOTE: If this is the first time you run a JavaFX application, you
      may get some additionnal splash screens.</para>
    </section>

    <section>
      <title>Play with the DVD Store.</title>

      <para>The DVD store is a simple front-end for an online-shop that sells
      DVDs and does not provide any administration back-end.</para>

      <para>You can use Objectwiz to create new films, actors and see how it's
      reflected in the front-end.</para>

      <para>Likewise, you can also order DVDs on the front-end and browse the
      associated orders in Objectwiz.</para>
    </section>
  </chapter>

  <chapter>
    <title>Using Objectwiz</title>

    <para>This chapter describes the various functionalities of Objectwiz
    using examples from the DVD Store. Please refer to the previous chapter
    for instructions on how to set up this sample application.</para>

    <section>
      <title>Description of the user interface</title>

      <para>The user interface of Objectwiz is composed of a toolbar and a tab
      panel that lets the user perform several actions at a time.</para>

      <section>
        <title>Home panel</title>

        <para>The home panel is the first tab of the interface. You cannot
        close it.</para>

        <para>It shows the list of persistence units that the user can
        manage.</para>

        <para><emphasis>A persistence unit is the combination of the object
        data model and the actual data (i.e. the connection to the
        database).</emphasis></para>

        <para>Click on one element of the list to access to all the available
        actions for the corresponding persistence unit.</para>

        <mediaobject>
          <imageobject>
            <imagedata fileref="screenshots/richclient_home.jpg" scale="50" />
          </imageobject>
        </mediaobject>
      </section>

      <section>
        <title>Toolbar</title>

        <para>The toolbar provides shortcut for performing actions on the
        current persistence unit: look for objects, create new instances,
        perform queries, call methods from the logic layer, etc.</para>

        <mediaobject>
          <imageobject>
            <imagedata fileref="screenshots/richclient_toolbar.jpg" />
          </imageobject>
        </mediaobject>
      </section>

      <section>
        <title>Persistence unit panel</title>

        <para>After selecting a persistence unit on the home panel, you are
        redirected to a panel that offers you basically all the actions that
        you can perform from the toolbar, with further explanations.</para>

        <mediaobject>
          <imageobject>
            <imagedata fileref="screenshots/richclient_unitpanel.jpg"
                       scale="50" />
          </imageobject>
        </mediaobject>
      </section>

      <section>
        <title id="listview">Lists of objects</title>

        <para>A screen that users will often encounter is the one that
        displays lists of objects (usually called <emphasis>list
        view</emphasis>).</para>

        <para>This view is very similar to classic relational administration
        tools although in Objectwiz clicking on a row will most of the time
        lead the user to the <emphasis>graph view</emphasis> where it is
        possible to interactively navigate the object graph (see
        below).</para>

        <mediaobject>
          <imageobject>
            <imagedata fileref="screenshots/richclient_listofobjects.jpg"
                       scale="50" />
          </imageobject>
        </mediaobject>
      </section>

      <section>
        <title id="graphview">The object graph</title>

        <para>Objectwiz will most of the time redirect to this view when the
        user selects an object.</para>

        <para>This view shows the current object in the middle of the screen
        and the connected objects on the surrounding ellipse.</para>

        <mediaobject>
          <imageobject>
            <imagedata fileref="screenshots/richclient_graph1.jpg" scale="50" />
          </imageobject>
        </mediaobject>

        <para>This graph is <emphasis>customizable</emphasis> (see <link
        linkend="customization">related section</link>): on the screenshot
        above it is possible to see the picture because the following HTML
        template has been set:</para>

        <blockquote>
          <para>&lt;div style="height: 150px";&gt;</para>

          <para>&lt;b&gt;#{title}&lt;/b&gt; ($#{price})&lt;br/&gt;</para>

          <para>&lt;img src="#{imageURL}" alt="Image" /&gt;</para>

          <para>&lt;/div&gt;</para>
        </blockquote>

        <para>Without this template, the central node would look like:</para>

        <mediaobject>
          <imageobject>
            <imagedata fileref="screenshots/richclient_skin1.jpg" />
          </imageobject>
        </mediaobject>

        <para>Moving the mouse over the central node will expand it and make
        action icons available. Using these icons, it is possible to
        manipulate the object (edit it, call a method from the business logic
        with this object as one of the parameters, etc.). Leave the mouse over
        an action icon for a few seconds to get a tooltip explaining its
        effect.</para>

        <mediaobject>
          <imageobject>
            <imagedata fileref="screenshots/richclient_graph2-small.jpg" />
          </imageobject>
        </mediaobject>

        <para>Last but not least, this graph is
        <emphasis>interactive</emphasis> since clicking on one object on the
        ellipse will make it become the current object (= the central object).
        On the previous screenshot, clicking on Feature Film-drama will lead
        to the next screenshot.</para>

        <mediaobject>
          <imageobject>
            <imagedata fileref="screenshots/richclient_graph3-small.jpg" />
          </imageobject>
        </mediaobject>

        <para>NOTE: If the data model contains unidirectional associations,
        Objectwiz automatically generates the opposite property for the
        purpose of browsing the graph. The link from films to categories in
        the DVD Store is an example of unidirectional association: categories
        do not have an attribute that references all the corresponding films
        but it is automatically generated (see above screenshot where the
        label was customized for clarity).</para>
      </section>
    </section>

    <section>
      <title>Scenarios</title>

      <section>
        <title>Searching for specific objects</title>

        <section>
          <title>Using filters</title>

          <para>Choose "Look for one or several existing entities" in the
          persistence unit panel or click on "Search entity" in the toolbar to
          access this search screen.</para>

          <para>Choose a class and add filters to find the desired objects.
          Use the arrows to navigate between pages if there are too many
          results.</para>

          <para>The tree with checkboxes on the right controls which columns
          shall be displayed. It is possible to save/load display settings for
          the columns (position and relative size in %) using the blue
          drop-down and green "plus" button on the right-hand side.</para>

          <para>Double-clicking on one row will open a new tab with the <link
          linkend="graphview">graph view</link> of the corresponding
          object.</para>

          <mediaobject>
            <imageobject>
              <imagedata fileref="screenshots/richclient_searchpanel.jpg"
                         scale="50" />
            </imageobject>
          </mediaobject>
        </section>

        <section>
          <title id="using-custom-queries">Using custom queries</title>

          <para>Choose "Perform a custom query" in the panel related to a
          persistence unit or click on "Perform Query" in the toolbar to
          access this screen.</para>

          <para>Enter a query string in one the of available languages and
          click "Perform query" to see the results.</para>

          <para>It is possible to use ordinal or named parameters if the query
          language supports it. The user will be asked to input these
          parameters.</para>

          <para>It is also possible to save/load queries as
          <emphasis>bookmarks</emphasis> that are currently shared with all
          the other users.</para>

          <para>The combination of <link
          linkend="querybookmarks">bookmarks</link> and parameters can be a
          nice entry point for accessing data from the model very
          quickly.</para>

          <mediaobject>
            <imageobject>
              <imagedata fileref="screenshots/richclient_query1.jpg"
                         scale="50" />
            </imageobject>

            <caption><para>HQL query without any parameters</para></caption>
          </mediaobject>

          <mediaobject>
            <imageobject>
              <imagedata fileref="screenshots/richclient_parameterizedquery.jpg"
                         scale="50" />
            </imageobject>

            <caption><para>HQL query with one parameter</para></caption>
          </mediaobject>
        </section>
      </section>

      <section>
        <title>Updating objects</title>

        <section>
          <title>Creating new persistent instances</title>

          <para>Creating new objects is possible from different locations in
          Objectwiz.</para>

          <para>You can either:</para>

          <itemizedlist>
            <listitem>
              <para>Choose "Create a new entity" in the panel related to a
              persistence unit;</para>
            </listitem>

            <listitem>
              <para>Click on "Create entity" in the toolbar to create an
              object from the same unit than the current tab.</para>
            </listitem>

            <listitem>
              <para>Click on the corresponding action button in nodes of the
              graph that correspond to collections of objects.</para>
            </listitem>
          </itemizedlist>

          <para>You will be asked to choose which class the new object shall
          be an instance, or redirected directly to the corresponding form if
          there is no ambiguity.</para>

          <mediaobject>
            <imageobject>
              <imagedata fileref="screenshots/richclient_chooseclass.jpg"
                         scale="50" />
            </imageobject>
          </mediaobject>

          <mediaobject>
            <imageobject>
              <imagedata fileref="screenshots/richclient_edit1.jpg" scale="50" />
            </imageobject>
          </mediaobject>
        </section>

        <section>
          <title>Creating links between objects</title>

          <para>It is possible to link objects directly on the graph by using
          the corresponding action icons (see two screenshots below).</para>

          <para>Depending on the type of property, these actions will either
          assign the value choosen by the user or add it as another element of
          the collection.</para>

          <para>Using the green "plus" button, the value is created from
          scratch while when using the blue "down arrow" button an existing
          value is assigned.</para>

          <mediaobject>
            <imageobject>
              <imagedata fileref="screenshots/richclient_collection_actionbutton1.jpg" />
            </imageobject>
          </mediaobject>

          <mediaobject>
            <imageobject>
              <imagedata fileref="screenshots/richclient_collection_actionbutton2.jpg" />
            </imageobject>
          </mediaobject>
        </section>

        <section>
          <title>Removing objects</title>

          <para>To remove an object, just click on the "red cross" action
          button on nodes of the graph or choose "Remove element(s)" from a
          <link linkend="listview">list view</link>.</para>
        </section>
      </section>

      <section>
        <title>Calling business logic</title>

        <para>To call a method from the logic/business layer, first choose
        "Call a business method" from the panel related to a persistence unit,
        or click "Run method" in the toolbar.</para>

        <para>The methods are these of the EJB session beans that were
        discovered by Objectwiz in the JNDI context of the application.</para>

        <para>Choose a method, provide the required parameters (if any) and
        click "Submit".</para>

        <para>The results will be shown in a <link linkend="listview">list
        view</link> below.</para>

        <para>When the return type is an array of bytes, the user will be
        proposed to download the corresponding file.</para>

        <para>NOTE: if the method returns objects from the model, you can
        double-click on one object of the list to open the <link
        linkend="graphview">graph view</link>.</para>

        <mediaobject>
          <imageobject>
            <imagedata fileref="screenshots/richclient_methodcall.jpg"
                       scale="50" />
          </imageobject>
        </mediaobject>
      </section>
    </section>

    <section>
      <title id="customization">Customization</title>

      <section>
        <title>Customizing classes and properties</title>

        <para>It is possible to change the labels of the classes and their
        properties, and the order of properties.</para>

        <para>Click on "Browse unit metadata" on the panel corresponding to a
        persistence unit to get a tree of the classes/properties of the data
        model.</para>

        <para>Fields on the right can be used to change label/order of the
        selected object in the tree.</para>

        <para>NOTE: this look'n feel is not very friendly, it is going to be
        improved in upcoming version.</para>

        <mediaobject>
          <imageobject>
            <imagedata fileref="screenshots/richclient_customization1.jpg"
                       role="" scale="50" />
          </imageobject>
        </mediaobject>
      </section>

      <section>
        <title id="querybookmarks">Creating and using query bookmarks</title>

        <para>On the panel for performing <link
        linkend="using-custom-queries">custom queries</link>, you can either
        save/load bookmarks using the corresponding buttons.</para>

        <para>When saving a bookmark, the user is asked to input a short
        description and a name/id (NOTE: the name will be removed from
        upcoming versions).</para>

        <para>A list of all the bookmarks is available by selecting "Perform a
        bookmarked query" on the panel related to a persistence unit, or by
        clicking on the "Use bookmark" toolbar icon.</para>
      </section>
    </section>
  </chapter>

  <chapter>
    <title id="troubleshooting">Troubleshooting</title>

    <section>
      <title>Recommended additional setup</title>

      <para>For easier troubleshooting, configure log service
      (server/default/conf/jboss-log4j.xml) to route log messages from
      Objectwiz (package org.objectwiz) to an independent log file (e.g.
      objectwiz.log).</para>

      <blockquote>
        <para>&lt;appender name="OBJECTWIZ"
        class="org.jboss.logging.appender.DailyRollingFileAppender"&gt;</para>

        <para>&lt;errorHandler
        class="org.jboss.logging.util.OnlyOnceErrorHandler"/&gt;</para>

        <para>&lt;param name="File"
        value="${jboss.server.log.dir}/objectwiz.log"/&gt;</para>

        <para>&lt;param name="Append" value="false"/&gt;</para>

        <para>&lt;!-- Rollover at midnight each day --&gt;</para>

        <para>&lt;param name="DatePattern" value="'.'yyyy-MM-dd"/&gt;</para>

        <para>&lt;layout class="org.apache.log4j.PatternLayout"&gt;</para>

        <para>&lt;param name="ConversionPattern" value="%d %-5p [%c]
        %m%n"/&gt;</para>

        <para>&lt;/layout&gt;</para>

        <para>&lt;/appender&gt;</para>

        <para>(...)</para>

        <para>&lt;category name="org.objectwiz" additivity="false"&gt;</para>

        <para>&lt;priority value="INFO" /&gt;</para>

        <para>&lt;appender-ref ref="OBJECTWIZ" /&gt;</para>

        <para>&lt;/category&gt;</para>
      </blockquote>
    </section>

    <section>
      <title>FAQ</title>

      <para>This FAQ is to be completed.</para>

      <para>Feel free to ask for help on the <ulink
      url="https://lists.sourceforge.net/lists/listinfo/objectwiz-users">mailing
      list</ulink> or on <ulink
      url="http://sourceforge.net/projects/objectwiz/support">the project
      page</ulink>.</para>
    </section>
  </chapter>
</book>
