<!--
 Licensed to the Apache Software Foundation (ASF) under one
 or more contributor license agreements.  See the NOTICE file
 distributed with this work for additional information
 regarding copyright ownership.  The ASF licenses this file
 to you under the Apache License, Version 2.0 (the
 "License"); you may not use this file except in compliance
 with the License.  You may obtain a copy of the License at

 http://www.apache.org/licenses/LICENSE-2.0

 Unless required by applicable law or agreed to in writing,
 software distributed under the License is distributed on an
 "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 KIND, either express or implied.  See the License for the
 specific language governing permissions and limitations
 under the License.
-->
<html>
<body>
<p><strong>OpenJPA Abstract StoreManager Implementation</strong></p>

<p>
    This package provides some infrastructure classes to help in the creation
    of OpenJPA drivers for new non-relational data stores.
</p>

<p>
    To create support for a new data store:
    <ul>
        <li>
            <p>
                Extend <code>AbstractStoreManager</code> following the rules
                outlined in its documentation.
            </p>
        </li>
        <li>
            <p>
                Configure your org.apache.openjpa.properties file (or your
                resource archive
                configuration file) to use <code>
                AbstractStoreBrokerFactory</code>,
                and specify your <code>AbstractStore</code> extension as the
                <code>
                    org.apache.openjpa.abstractstore.AbstractStoreManager</code>
                class:
            </p>

            <p>
                <code>
                    openjpa.BrokerFactory: abstractstore<br/>
                    openjpa.abstractstore.AbstractStoreManager:
                    com.xyz.MyAbstractStoreManagerSubclass
                </code>
            </p>
        </li>
    </ul>
</p>

<p>
    Additionally, you can optionally extend <code>
    OpenJPAConfigurationImpl</code>
    to define your own configuration options, using the helper classes defined
    in the <a href="../../openjpa/conf/package.html">
    <code>org.apache.openjpa.lib.conf</code></a> package. To do this you must
    also
    override the <code>AbstractStoreManager.newConfiguration</code> method.
</p>

<p>
    For a sample of how to use this package, see the
    <a href="../xml/package.html"><code>org.apache.openjpa.xmlstore</code></a>
    abstract
    store implementation.
</p>
</body>
</html>
