Index: src/main/java/org/apache/jackrabbit/core/persistence/bundle/BundleDbPersistenceManager.java =================================================================== --- src/main/java/org/apache/jackrabbit/core/persistence/bundle/BundleDbPersistenceManager.java (revision 542914) +++ src/main/java/org/apache/jackrabbit/core/persistence/bundle/BundleDbPersistenceManager.java (working copy) @@ -16,32 +16,6 @@ */ package org.apache.jackrabbit.core.persistence.bundle; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.apache.jackrabbit.util.Text; -import org.apache.jackrabbit.core.state.ChangeLog; -import org.apache.jackrabbit.core.state.ItemStateException; -import org.apache.jackrabbit.core.state.NoSuchItemStateException; -import org.apache.jackrabbit.core.state.NodeReferencesId; -import org.apache.jackrabbit.core.state.NodeReferences; -import org.apache.jackrabbit.core.persistence.PMContext; -import org.apache.jackrabbit.core.persistence.AbstractPersistenceManager; -import org.apache.jackrabbit.core.persistence.bundle.util.TrackingInputStream; -import org.apache.jackrabbit.core.persistence.bundle.util.DbNameIndex; -import org.apache.jackrabbit.core.persistence.bundle.util.NodePropBundle; -import org.apache.jackrabbit.core.persistence.bundle.util.BundleBinding; -import org.apache.jackrabbit.core.persistence.bundle.util.ErrorHandling; -import org.apache.jackrabbit.core.persistence.bundle.util.StringIndex; -import org.apache.jackrabbit.core.persistence.util.Serializer; -import org.apache.jackrabbit.core.persistence.util.BLOBStore; -import org.apache.jackrabbit.core.persistence.util.FileSystemBLOBStore; -import org.apache.jackrabbit.core.fs.FileSystemResource; -import org.apache.jackrabbit.core.fs.FileSystem; -import org.apache.jackrabbit.core.fs.local.LocalFileSystem; -import org.apache.jackrabbit.core.NodeId; -import org.apache.jackrabbit.core.PropertyId; -import org.apache.jackrabbit.uuid.UUID; - import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; @@ -55,18 +29,46 @@ import java.sql.Blob; import java.sql.Connection; import java.sql.DatabaseMetaData; +import java.sql.Driver; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; -import java.sql.Driver; +import java.util.ArrayList; +import java.util.Collection; import java.util.Iterator; -import java.util.Collection; -import java.util.ArrayList; import javax.jcr.RepositoryException; +import javax.naming.InitialContext; +import javax.sql.DataSource; +import org.apache.jackrabbit.core.NodeId; +import org.apache.jackrabbit.core.PropertyId; +import org.apache.jackrabbit.core.fs.FileSystem; +import org.apache.jackrabbit.core.fs.FileSystemResource; +import org.apache.jackrabbit.core.fs.local.LocalFileSystem; +import org.apache.jackrabbit.core.persistence.AbstractPersistenceManager; +import org.apache.jackrabbit.core.persistence.PMContext; +import org.apache.jackrabbit.core.persistence.bundle.util.BundleBinding; +import org.apache.jackrabbit.core.persistence.bundle.util.DbNameIndex; +import org.apache.jackrabbit.core.persistence.bundle.util.ErrorHandling; +import org.apache.jackrabbit.core.persistence.bundle.util.NodePropBundle; +import org.apache.jackrabbit.core.persistence.bundle.util.StringIndex; +import org.apache.jackrabbit.core.persistence.bundle.util.TrackingInputStream; +import org.apache.jackrabbit.core.persistence.util.BLOBStore; +import org.apache.jackrabbit.core.persistence.util.FileSystemBLOBStore; +import org.apache.jackrabbit.core.persistence.util.Serializer; +import org.apache.jackrabbit.core.state.ChangeLog; +import org.apache.jackrabbit.core.state.ItemStateException; +import org.apache.jackrabbit.core.state.NoSuchItemStateException; +import org.apache.jackrabbit.core.state.NodeReferences; +import org.apache.jackrabbit.core.state.NodeReferencesId; +import org.apache.jackrabbit.util.Text; +import org.apache.jackrabbit.uuid.UUID; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + /** * This is a generic persistence manager that stores the {@link NodePropBundle}s * in a database. @@ -86,6 +88,20 @@ *
  • <param name="{@link #setSchemaObjectPrefix(String) schemaObjectPrefix}" value=""/> *
  • <param name="{@link #setErrorHandling(String) errorHandling}" value=""/> * + * + *

    + * Configuration using JNDI data source:
    + *

    */ public class BundleDbPersistenceManager extends AbstractBundlePersistenceManager { @@ -107,6 +123,9 @@ /** flag indicating if this manager was initialized */ protected boolean initialized = false; + + /** JNDI location of the data source used to acquire database connections */ + protected String dataSourceLocation; /** the jdbc driver name */ protected String driver; @@ -180,7 +199,24 @@ * the name of this persistence manager */ private String name = super.toString(); + + /** + * Returns the JNDI location of the data source. + * + * @return data source location + */ + public String getDataSourceLocation() { + return dataSourceLocation; + } + /** + * Sets the JNDI location of the data source. + * + * @param dataSourceLocation data source location + */ + public void setDataSourceLocation(String dataSourceLocation) { + this.dataSourceLocation = dataSourceLocation; + } /** * Returns the configured JDBC connection url. @@ -523,14 +559,7 @@ this.name = context.getHomeDir().getName(); - // setup jdbc connection - // Note: Explicit creation of new instance of the driver is required - // in order to re-register the driver in the DriverManager after a - // repository shutdown. - Driver drv = (Driver) Class.forName(driver).newInstance(); - log.info("JDBC driver created: {}", drv); - con = DriverManager.getConnection(url, user, password); - con.setAutoCommit(true); + initConnection(); // make sure schemaObjectPrefix consists of legal name characters only prepareSchemaObjectPrefix(); @@ -574,6 +603,25 @@ } } + protected void initConnection() throws Exception { + if (dataSourceLocation!=null) { + // if dataSourceLocation set, try to get connection from JNDI datasource + InitialContext ic = new InitialContext(); + DataSource dataSource = (DataSource) ic.lookup(dataSourceLocation); + con = dataSource.getConnection(); + } + else { + // setup jdbc connection + // Note: Explicit creation of new instance of the driver is required + // in order to re-register the driver in the DriverManager after a + // repository shutdown. + Driver drv = (Driver) Class.forName(driver).newInstance(); + log.info("JDBC driver created: {}", drv); + con = DriverManager.getConnection(url, user, password); + } + con.setAutoCommit(true); + } + /** * Creates a suitable blobstore * @return a blobstore