That's superb Johannes. Thanks for sharing that with me. I'll give you
credit if we go with eXist :)

Alistair

-- 
Alistair Young
Senior Software Engineer
[EMAIL PROTECTED] Mòr Ostaig
Isle of Skye
Scotland

> Well, I wrote some DAOs to call when I want to save the current state of
> my bean. I am relying on the XML:DB-Api thus the code should work with
> xindice as well. But I have not tried it with another database other
> than eXist. Below you can see some sample code - SensorProfileDocument
> was generated with XMLBeans.
>
> Hope this is helpful,
> Johannes
>
>
> import org.apache.log4j.Logger;
> import org.x52North.sps.v100.pm.SensorProfileDocument;
> import org.xml.sax.ContentHandler;
> import org.xmldb.api.DatabaseManager;
> import org.xmldb.api.base.Collection;
> import org.xmldb.api.base.XMLDBException;
> import org.xmldb.api.modules.XMLResource;
>
> /**
>  * DAO for persisting the profiles of the sensors registered at the
> service in
>  * an XML database that implements the XMLDB:API.
>  *
>  * @author Johannes Echterhoff
>  */
> public class PMXMLdbSensorProfileDAO implements PMSensorProfileDAO {
>
>    private static Logger logger =
> Logger.getLogger(PMXMLdbSensorProfileDAO.class);
>
>    /**
>     * Array containing username (index 0) and password (index 1) for
>     * authentication or null if authentication is not necessary.
>     */
>    private String[] loginData;
>
>    /**
>     * URI to the collection that contains the SensorProfiles.
>     */
>    private String spColUri;
>
>    /**
>     * true if authentication is necessary, else false.
>     */
>    private boolean useAuthentication = true;
>
>    /**
>     * Creates a new PMXMLdbSensorProfileDAO that operates on the given
>     * collection and authenticates itself with the given login data.
>     *
>     * @param spColUri
>     *           URI to the collection that contains the SensorProfiles.
>     * @param loginData
>     *           Array containing username (index 0) and password (index
> 1) for
>     *           authentication or null if authentication is not necessary.
>     */
>    public PMXMLdbSensorProfileDAO(String spColUri, String[] loginData) {
>
>       this.spColUri = spColUri;
>       this.loginData = loginData;
>
>       if (loginData == null) {
>          useAuthentication = false;
>       }
>    }
>
>    /**
>     * @see
> org.n52.sps.pm.PMSensorProfileDAO#deleteSensorProfileDocument(java.lang.String)
>     */
>    public void deleteSensorProfileDocument(String id) throws Exception {
>
>       Collection spcol = null;
>
>       try {
>          if (this.useAuthentication)
>             spcol = DatabaseManager.getCollection(spColUri, loginData[0],
>                   loginData[1]);
>          else
>             spcol = DatabaseManager.getCollection(spColUri);
>
>          XMLResource r = (XMLResource) spcol.createResource(id,
> "XMLResource");
>          spcol.removeResource(r);
>
>       } catch (XMLDBException e) {
>          logger.debug(
>                "deleteSensorProfileDocument(): XMLDBException occurred. "
>                      + e.errorCode + " " + e.getMessage(), e);
>          throw e;
>       } finally {
>          if (spcol != null) {
>             spcol.close();
>          }
>       }
>
>    }
>
>    /**
>     * @see
> org.n52.sps.pm.PMSensorProfileDAO#findSensorProfile(java.lang.String)
>     */
>    public SensorProfileDocument findSensorProfile(String id) throws
> Exception {
>
>       Collection spcol = null;
>
>       try {
>          if (this.useAuthentication)
>             spcol = DatabaseManager.getCollection(spColUri, loginData[0],
>                   loginData[1]);
>          else
>             spcol = DatabaseManager.getCollection(spColUri);
>
>          XMLResource res = (XMLResource) spcol.getResource(id);
>
>          if (res == null)
>             return null;
>
>          SensorProfileDocument spd =
> SensorProfileDocument.Factory.parse(res.getContentAsDOM());
>          return spd;
>
>       } catch (XMLDBException e) {
>          logger.debug("findSensorProfile(): XMLDBException occurred. "
>                + e.errorCode + " " + e.getMessage(), e);
>          throw e;
>       } finally {
>          if (spcol != null) {
>             spcol.close();
>          }
>       }
>    }
>
>    /**
>     * @see
> org.n52.sps.pm.PMSensorProfileDAO#saveSensorProfileDocument(org.x52North.sps.v100.pm.SensorProfileDocument)
>     */
>    public void saveSensorProfileDocument(SensorProfileDocument
> sensorprofile)
>          throws Exception {
>
>       Collection spcol = null;
>
>       try {
>          if (this.useAuthentication)
>             spcol = DatabaseManager.getCollection(spColUri, loginData[0],
>                   loginData[1]);
>          else
>             spcol = DatabaseManager.getCollection(spColUri);
>
>          XMLResource r = (XMLResource) spcol.createResource(
>
> sensorprofile.getSensorProfile().getSensorID().getStringValue(),
>                "XMLResource");
>          ContentHandler ch = r.setContentAsSAX();
>          sensorprofile.save(ch, null);
>          spcol.storeResource(r);
>
>       } catch (XMLDBException e) {
>          logger.debug("saveSensorProfileDocument(): XMLDBException
> occurred. "
>                + e.errorCode + " " + e.getMessage(), e);
>          throw e;
>       } finally {
>          if (spcol != null) {
>             spcol.close();
>          }
>       }
>    }
> }
>
> -----------------------------------------------------------------
> In the DAOFactory I am retrieving the DAO.
> -----------------------------------------------------------------
>
> import java.util.Properties;
> import java.util.StringTokenizer;
>
> import org.apache.log4j.Logger;
> import org.xmldb.api.DatabaseManager;
> import org.xmldb.api.base.Collection;
> import org.xmldb.api.base.Database;
> import org.xmldb.api.base.XMLDBException;
> import org.xmldb.api.modules.CollectionManagementService;
>
> /**
>  * Factory that creates DAOs using the XMLDB:API for accessing the PMs
>  * ressources.
>  *
>  * @author Johannes Echterhoff
>  */
> public class PMXMLdbDAOFactory implements PMDAOFactory {
>
>    private static Logger logger =
> Logger.getLogger(PMXMLdbDAOFactory.class);
>
>    /**
>     * path relative to the root of the XML database that point to the
> collection
>     * where the CapabilitiesBase information is stored.
>     */
>    private String capbaseColPath = null;
>
>    /**
>     * true if the factory has been configured without failures, else
> false.
>     */
>    private boolean configured = false;
>
>    /**
>     * URI to the XML database.
>     */
>    private String databaseUri = null;
>
>    /**
>     * Password used for authentication.
>     */
>    private String psswd;
>
>    /**
>     * path relative to the root of the XML database that point to the
> collection
>     * where the SensorProfiles are stored.
>     */
>    private String sensorprofilesColPath = null;
>
>    /**
>     * path relative to the root of the XML database that point to the
> collection
>     * where the sensorML documents are stored.
>     */
>    private String smlColPath = null;
>
>    /**
>     * true if authentication is necessary, else false.
>     */
>    private boolean useAuthentication = true;
>
>    /**
>     * Username used for authentication.
>     */
>    private String user;
>
>    /**
>     * Creates a new PMXMLdbDAOFactory. Configuration is performed with
>     * properties retrieved from PMInitParamContainer.
>     */
>    public PMXMLdbDAOFactory() {
>
>       // initialise Factory
>       PMInitParamContainer initParams =
> PMInitParamContainer.getInstance();
>       try {
>          this.configureFactory(initParams.getPMDAOFactoryProperties());
>       } catch (Exception e) {
>          logger.debug("Could not configure factory.", e);
>          // TODO correct handling??
>          return;
>       }
>    }
>
>    /**
>     * Configures the factory.
>     *
>     * @param conf
>     *           contain required configuration data.
>     * @throws Exception
>     *            if the factory could not be configured.
>     */
>    private void configureFactory(Properties conf) throws Exception {
>
>       // TODO howto automatically create the collections if they do not
> exist
>       // yet?
>
>       String databaseDriver = conf.getProperty("pm.database.driver");
>
>       databaseUri = conf.getProperty("pm.database.uri");
>       capbaseColPath =
> conf.getProperty("pm.database.collections.capbase");
>       sensorprofilesColPath =
> conf.getProperty("pm.database.collections.sensorprofiles");
>       smlColPath =
> conf.getProperty("pm.database.collections.sensormldescriptions");
>
>       if (databaseUri.endsWith("/")) {
>          databaseUri = databaseUri.substring(0, databaseUri.length() - 1);
>       }
>       if (!capbaseColPath.startsWith("/")) {
>          capbaseColPath = "/".concat(capbaseColPath);
>       }
>       if (!sensorprofilesColPath.startsWith("/")) {
>          sensorprofilesColPath = "/".concat(sensorprofilesColPath);
>       }
>       if (!smlColPath.startsWith("/")) {
>          smlColPath = "/".concat(smlColPath);
>       }
>
>       user = conf.getProperty("pm.database.username");
>       psswd = conf.getProperty("pm.database.password");
>
>       // check whether authentication is necessary or not
>       if (user == null || user.length() == 0) {
>          logger.debug("Username not defined for accessing pm-database. "
>                + "Using no authentication for accessing database.");
>          useAuthentication = false;
>       } else {
>          if (psswd == null) {
>             logger.debug("password was null: using '" + user
>                   + "' as username and '' as password.");
>             psswd = "";
>          } else {
>             logger.debug("using '" + user + "' as username and '" + psswd
>                   + "' as password.");
>          }
>          useAuthentication = true;
>       }
>
>       // check whether the database is accessible and the collections
> exist
>       // otherwise initialise collections if possible
>       Class c = Class.forName(databaseDriver);
>       Database database = (Database) c.newInstance();
>       DatabaseManager.registerDatabase(database);
>
>       Collection capbaseCol = null;
>       Collection profilesCol = null;
>       Collection smlCol = null;
>
>       try {
>
>          if (this.useAuthentication) {
>             capbaseCol = DatabaseManager.getCollection(databaseUri
>                   + capbaseColPath, user, psswd);
>          } else {
>             capbaseCol = DatabaseManager.getCollection(databaseUri
>                   + capbaseColPath);
>          }
>
>          if (capbaseCol == null) {
>             // capbaseCol does not exist -> try to initialise it
>             this.createCollection(databaseUri, capbaseColPath);
>          }
>
>          if (this.useAuthentication) {
>             profilesCol = DatabaseManager.getCollection(databaseUri
>                   + sensorprofilesColPath, user, psswd);
>          } else {
>             profilesCol = DatabaseManager.getCollection(databaseUri
>                   + sensorprofilesColPath);
>          }
>
>          if (profilesCol == null) {
>             // profilesCol does not exist -> try to initialise it
>             this.createCollection(databaseUri, sensorprofilesColPath);
>          }
>
>          if (this.useAuthentication) {
>             smlCol = DatabaseManager.getCollection(databaseUri +
> smlColPath,
>                   user, psswd);
>          } else {
>             smlCol = DatabaseManager.getCollection(databaseUri +
> smlColPath);
>          }
>
>          if (smlCol == null) {
>             // smlCol does not exist -> try to initialise it
>             this.createCollection(databaseUri, smlColPath);
>          }
>
>       } catch (XMLDBException e) {
>          logger.debug("configureFactory - XML:DB Exception occured "
>                + e.errorCode + " " + e.getMessage(), e);
>          throw e;
>       } finally {
>          if (profilesCol != null) {
>             profilesCol.close();
>          }
>          if (capbaseCol != null) {
>             capbaseCol.close();
>          }
>          if (smlCol != null) {
>             smlCol.close();
>          }
>       }
>
>       // if everything is fine:
>       configured = true;
>    }
>
>    /**
>     * Creates a new collection in the given database with the given
> relative
>     * path.
>     *
>     * @param databaseUri
>     *           uri to the root collection of the database. E.g. for a
> remote
>     *           eXist database:
> xmldb:exist://localhost:8080/exist/xmlrpc/db
>     * @param collPath
>     *           relative path to the collection that shall be created,
> e.g.
>     *           /sub1/sub2
>     * @throws XMLDBException
>     *            if the collection could not be created.
>     */
>    private void createCollection(String databaseUri, String collPath)
>          throws XMLDBException {
>
>       // TODO do the Collections that are created and accessed have to be
>       // closed??
>       Collection current;
>       if (this.useAuthentication) {
>          current = DatabaseManager.getCollection(databaseUri, user,
> psswd);
>       } else {
>          current = DatabaseManager.getCollection(databaseUri);
>       }
>
>       logger.debug("creating " + collPath);
>
>       CollectionManagementService mgtService;
>       Collection c = null;
>       String p = "", token;
>       StringTokenizer tok = new StringTokenizer(collPath, "/");
>       while (tok.hasMoreTokens()) {
>          token = tok.nextToken();
>          p = p + '/' + token;
>          if (this.useAuthentication) {
>             c = DatabaseManager.getCollection(databaseUri + p, user,
> psswd);
>          } else {
>             c = DatabaseManager.getCollection(databaseUri + p);
>          }
>          if (c == null) {
>             mgtService = (CollectionManagementService) current.getService(
>                   "CollectionManagementService", "1.0");
>             current = mgtService.createCollection(token);
>          } else
>             current = c;
>       }
>    }
>
>    /**
>     * @see org.n52.sps.pm.PMDAOFactory#getCapBaseDAO()
>     */
>    public PMCapBaseDAO getCapBaseDAO() {
>
>       if (this.useAuthentication)
>          return new PMXMLdbCapBaseDAO(databaseUri + capbaseColPath,
>                new String[] {user, psswd});
>       else
>          return new PMXMLdbCapBaseDAO(databaseUri + capbaseColPath, null);
>    }
>
>    /**
>     * @see org.n52.sps.pm.PMDAOFactory#getSensorMLDAO()
>     */
>    public PMSensorMLDAO getSensorMLDAO() {
>
>       if (this.useAuthentication)
>          return new PMXMLdbSensorMLDAO(databaseUri + smlColPath, new
> String[] {
>                user, psswd});
>       else
>          return new PMXMLdbSensorMLDAO(databaseUri + smlColPath, null);
>    }
>
>    /**
>     * @see org.n52.sps.pm.PMDAOFactory#getSensorProfileDAO()
>     */
>    public PMSensorProfileDAO getSensorProfileDAO() {
>
>       if (this.useAuthentication)
>          return new PMXMLdbSensorProfileDAO(
>                databaseUri + sensorprofilesColPath, new String[] {user,
> psswd});
>       else
>          return new PMXMLdbSensorProfileDAO(
>                databaseUri + sensorprofilesColPath, null);
>    }
>
>    /**
>     * @see org.n52.sps.pm.PMDAOFactory#getSensorProfileIDs()
>     */
>    public String[] getSensorProfileIDs() throws Exception {
>
>       if (!configured)
>          throw new Exception("The Factory has not been configured yet");
>
>       // Collections should exist, because factory has been configured
>       // so do not test again
>
>       Collection profilesCol = null;
>
>       try {
>
>          if (this.useAuthentication)
>             profilesCol = DatabaseManager.getCollection(databaseUri
>                   + sensorprofilesColPath, user, psswd);
>          else
>             profilesCol = DatabaseManager.getCollection(databaseUri
>                   + sensorprofilesColPath);
>
>          String[] storedProfilesIDs = profilesCol.listResources();
>          if (storedProfilesIDs == null || storedProfilesIDs.length == 0)
>             return null;
>          else
>             return storedProfilesIDs;
>
>       } catch (XMLDBException e) {
>          logger.debug("XMLDBException occured " + e.errorCode + " "
>                + e.getMessage(), e);
>          throw e;
>       } finally {
>          if (profilesCol != null) {
>             profilesCol.close();
>          }
>       }
>    }
> }
>
> -----------------------------------------------------------------
> The properties file might look like this:
> -----------------------------------------------------------------
>
> # identifies the class which implements the XML:DB-Database-Interface
> pm.database.driver=org.exist.xmldb.DatabaseImpl
>
> # points to the root-collection of the d
> atabase
> # pm.database.uri + pm.database.collections.* must result in a valid
> collection path
> pm.database.uri=xmldb:exist://localhost:8080/exist/xmlrpc/db
>
> # username and password to use for accessing collections
> # leave empty or delete if the database does not support usernames and
> passwords
> pm.database.username=pm
> pm.database.password=pm
>
> # define the collection for storing the CapabilitiesBaseType
> pm.database.collections.capbase=/sps/pm/capbase
>
> # define the collection for storing SensorProfiles
> pm.database.collections.sensorprofiles=/sps/pm/sensorprofiles
>
> # define the collection for storing SensorML descriptions
> pm.database.collections.sensormldescriptions=/sps/pm/sensorml
>
>
> Alistair Young wrote:
>
>> That sounds like something that would work! Can you explain a bit
>> about the hardcoding? I don't think that would be a problem.
>>
>> thanks,
>>
>> Alistair
>>
>> On 30 Mar 2006, at 14:54, Johannes Echterhoff wrote:
>>
>>> Hi.
>>>
>>> I am using eXist to store and retrieve my XMLBeans-generated
>>> objects. However, persisting is hardcoded - i.e. I call the methods
>>> to store my beans explicitly in the code. Don't know if this is  what
>>> you want exactly.
>>>
>>> Johannes
>>>
>>> Alistair Young wrote:
>>>
>>>> thanks - I'll take a look at xindice
>>>>
>>>> Alistair
>>>>
>>>> On 30 Mar 2006, at 14:42, Alex Soto wrote:
>>>>
>>>>> no it is not possible directly. If you want a binder of xml that
>>>>> also stores the data, you can use Castor, or XmlBeans + Xindice.
>>>>>
>>>>> I suppose there is other ways but i only knows what i have
>>>>> explained to you.
>>>>>
>>>>> El dj 30 de 03 del 2006 a les 14:36 +0100, en/na Alistair Young  va
>>>>> escriure:
>>>>>
>>>>>> Is XMLBeans capable of persisting beans to the eXist XML database?
>>>>>>
>>>>>> thanks,
>>>>>>
>>>>>> Alistair
>>>>>>
>>>>>>
>>>>>> -------------------------------------------------------------------
>>>>>> --
>>>>>> To unsubscribe, e-mail: [EMAIL PROTECTED]
>>>>>> <mailto:[EMAIL PROTECTED]>
>>>>>> For additional commands, e-mail: [EMAIL PROTECTED]
>>>>>> <mailto:[EMAIL PROTECTED]>
>>>>>>
>>>>>>
>>>>>
>>>>> La información contenida en el presente e-mail es confidencial y
>>>>> está reservada para el uso exclusivo de su destinatario. Se
>>>>> prohíbe estrictamente la distribución, copia o utilización de  esta
>>>>> información sin el previo permiso de su destinatario. Si  usted no
>>>>> fuera el destinatario, por favor notifíquelo  inmediatamente al
>>>>> remitente y elimine el presente mensaje de su  sistema informático.
>>>>>
>>>>> Information contained in this e-mail is confidential and is
>>>>> intended for the use of the addressee only. Any dissemination,
>>>>> distribution, copying or use of this communication without prior
>>>>> permission of the addressee is strictly prohibited. If you are  not
>>>>> the intended addressee, please notify the sender immediately  by
>>>>> reply and then delete this message from your computer system.
>>>>>
>>>>
>>>
>>>
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: [EMAIL PROTECTED]
>>> For additional commands, e-mail: [EMAIL PROTECTED]
>>>
>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: [EMAIL PROTECTED]
>> For additional commands, e-mail: [EMAIL PROTECTED]
>>
>>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
>


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to