You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by Apache Wiki <wi...@apache.org> on 2006/12/04 15:53:49 UTC
[Jackrabbit Wiki] Update of "ExamplesPage" by rkorbee
Dear Wiki user,
You have subscribed to a wiki page or wiki category on "Jackrabbit Wiki" for change notification.
The following page has been changed by rkorbee:
http://wiki.apache.org/jackrabbit/ExamplesPage
------------------------------------------------------------------------------
Repository repository = factory.getRepository("rmi://localhost:1100/jackrabbit");
}}}
+
+ === Patching the OracleFileSystem and OraclePersistenceManager for use with JNDI ==
+
+ * Use this pacth in Eclipse against jackrabbit-core-1.1.1
+ * This will fix jackrabbit-core to support an Oracle database over JNDI
+
+ {{{
+ Index: /home/nick/workspace/jackrabbit/jackrabbit/src/main/java/org/apache/jackrabbit/core/fs/db/DatabaseFileSystem.java
+ ===================================================================
+ --- /home/nick/workspace/jackrabbit/jackrabbit/src/main/java/org/apache/jackrabbit/core/fs/db/DatabaseFileSystem.java (revision 480910)
+ +++ /home/nick/workspace/jackrabbit/jackrabbit/src/main/java/org/apache/jackrabbit/core/fs/db/DatabaseFileSystem.java (working copy)
+ @@ -1251,6 +1251,9 @@
+ throws FileSystemException {
+ String parentDir = FileSystemPathUtil.getParentDir(folderPath);
+ String name = FileSystemPathUtil.getName(folderPath);
+ + if ("".equals(name)) {
+ + name = " ";
+ + }
+
+ if (!FileSystemPathUtil.denotesRoot(folderPath)) {
+ if (!exists(parentDir)) {
+ Index: /home/nick/workspace/jackrabbit/jackrabbit/src/main/java/org/apache/jackrabbit/core/fs/db/DbFileSystem.java
+ ===================================================================
+ --- /home/nick/workspace/jackrabbit/jackrabbit/src/main/java/org/apache/jackrabbit/core/fs/db/DbFileSystem.java (revision 480910)
+ +++ /home/nick/workspace/jackrabbit/jackrabbit/src/main/java/org/apache/jackrabbit/core/fs/db/DbFileSystem.java (working copy)
+ @@ -182,7 +182,7 @@
+ *
+ * @throws SQLException if an error occurs
+ */
+ - protected Connection getConnection() throws ClassNotFoundException, SQLException {
+ + protected Connection getConnection() throws Exception {
+ Class.forName(driver);
+ return DriverManager.getConnection(url, user, password);
+ }
+ Index: /home/nick/workspace/jackrabbit/jackrabbit/src/main/java/org/apache/jackrabbit/core/fs/db/JNDIOracleDatabaseFileSystem.java
+ ===================================================================
+ --- /home/nick/workspace/jackrabbit/jackrabbit/src/main/java/org/apache/jackrabbit/core/fs/db/JNDIOracleDatabaseFileSystem.java (revision 0)
+ +++ /home/nick/workspace/jackrabbit/jackrabbit/src/main/java/org/apache/jackrabbit/core/fs/db/JNDIOracleDatabaseFileSystem.java (revision 0)
+ @@ -0,0 +1,97 @@
+ +/*
+ + * 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.
+ + */
+ +package org.apache.jackrabbit.core.fs.db;
+ +
+ +import java.sql.Connection;
+ +import java.sql.SQLException;
+ +
+ +import javax.naming.InitialContext;
+ +import javax.naming.NamingException;
+ +import javax.sql.DataSource;
+ +
+ +import org.slf4j.Logger;
+ +import org.slf4j.LoggerFactory;
+ +
+ +import oracle.jdbc.driver.OracleConnection;
+ +import oracle.jdbc.pool.OracleDataSource;
+ +
+ +/**
+ + * Database file system that uses JNDI to acquire the database connection.
+ + * The JNDI location of the {@link OracleDataSource} to be used in given as
+ + * the <code>dataSourceLocation</code> configuration property. See the
+ + * {@link DbFileSystem} for more configuration details.
+ + * <p>
+ + * <strong>WARNING:</strong> The acquired database connection is kept
+ + * for the entire lifetime of the file system instance. The configured data
+ + * source should be prepared for this.
+ + */
+ +public class JNDIOracleDatabaseFileSystem extends OracleFileSystem {
+ +
+ + private static Logger log = LoggerFactory.getLogger(JNDIOracleDatabaseFileSystem.class);
+ +
+ + /**
+ + * JNDI location of the data source used to acquire database connections.
+ + */
+ + private String dataSourceLocation;
+ +
+ + //----------------------------------------------------< setters & getters >
+ +
+ + /**
+ + * 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;
+ + }
+ +
+ + //--------------------------------------------------< DatabaseFileSystem >
+ +
+ + /**
+ + * Returns a JDBC connection from a {@link OracleDataSource} acquired from JNDI
+ + * with the configured data source location.
+ + *
+ + * @return new database connection
+ + * @throws NamingException if the given data source location does not exist
+ + * @throws SQLException if a database access error occurs
+ + * @throws ClassNotFoundException
+ + */
+ + protected Connection getConnection() throws NamingException, SQLException, ClassNotFoundException {
+ + Class.forName(super.driver);
+ + InitialContext ic = new InitialContext();
+ +
+ + DataSource originalDS = (DataSource) ic.lookup(dataSourceLocation);
+ + log.debug("Type of datasource is: " + originalDS.getClass());
+ +
+ + Connection conn = originalDS.getConnection();
+ + log.debug("Type of Connection is: " + conn.getClass());
+ + if (conn instanceof OracleConnection) {
+ + return conn;
+ + } else {
+ + throw new ClassNotFoundException("Wrong type for Connection, expected OracleConnection, got: " + conn.getClass());
+ + }
+ + }
+ +}
+
+ Property changes on: /home/nick/workspace/jackrabbit/jackrabbit/src/main/java/org/apache/jackrabbit/core/fs/db/JNDIOracleDatabaseFileSystem.java
+ ___________________________________________________________________
+ Name: svn:eol-style
+ + native
+ Name: svn:keywords
+ + Id
+
+ Index: /home/nick/workspace/jackrabbit/jackrabbit/src/main/java/org/apache/jackrabbit/core/fs/db/OracleFileSystem.java
+ ===================================================================
+ --- /home/nick/workspace/jackrabbit/jackrabbit/src/main/java/org/apache/jackrabbit/core/fs/db/OracleFileSystem.java (revision 480910)
+ +++ /home/nick/workspace/jackrabbit/jackrabbit/src/main/java/org/apache/jackrabbit/core/fs/db/OracleFileSystem.java (working copy)
+ @@ -16,36 +16,30 @@
+ */
+ package org.apache.jackrabbit.core.fs.db;
+
+ -import org.apache.jackrabbit.util.Text;
+ -import org.apache.jackrabbit.util.TransientFileFactory;
+ +import java.io.File;
+ +import java.io.FileInputStream;
+ +import java.io.FileOutputStream;
+ +import java.io.FilterOutputStream;
+ +import java.io.IOException;
+ +import java.io.InputStream;
+ +import java.io.OutputStream;
+ +import java.io.RandomAccessFile;
+ +import java.sql.Blob;
+ +import java.sql.Connection;
+ +import java.sql.PreparedStatement;
+ +import java.sql.SQLException;
+ +import java.util.LinkedList;
+ +import java.util.List;
+ +
+ +import oracle.sql.BLOB;
+ +
+ import org.apache.jackrabbit.core.fs.FileSystemException;
+ import org.apache.jackrabbit.core.fs.FileSystemPathUtil;
+ import org.apache.jackrabbit.core.fs.RandomAccessOutputStream;
+ +import org.apache.jackrabbit.util.TransientFileFactory;
+ import org.slf4j.Logger;
+ import org.slf4j.LoggerFactory;
+
+ -import javax.jcr.RepositoryException;
+ -import java.sql.DatabaseMetaData;
+ -import java.sql.ResultSet;
+ -import java.sql.Statement;
+ -import java.sql.SQLException;
+ -import java.sql.Blob;
+ -import java.sql.Connection;
+ -import java.sql.PreparedStatement;
+ -import java.io.InputStream;
+ -import java.io.BufferedReader;
+ -import java.io.InputStreamReader;
+ -import java.io.OutputStream;
+ -import java.io.IOException;
+ -import java.io.File;
+ -import java.io.FilterOutputStream;
+ -import java.io.FileOutputStream;
+ -import java.io.FileInputStream;
+ -import java.io.RandomAccessFile;
+ -import java.util.List;
+ -import java.util.LinkedList;
+ -import java.lang.reflect.Method;
+ -
+ /**
+ * <code>OracleFileSystem</code> is a JDBC-based <code>FileSystem</code>
+ * implementation for Jackrabbit that persists file system entries in an
+ @@ -415,7 +409,9 @@
+ stmt.executeUpdate();
+ }
+
+ - } catch (Exception e) {
+ + } catch (SQLException e) {
+ + throw new IOException(e.getMessage());
+ + } catch (FileSystemException e) {
+ throw new IOException(e.getMessage());
+ } finally {
+ if (stmt != null) {
+ @@ -469,28 +465,14 @@
+ /**
+ * Creates a temporary oracle.sql.BLOB instance via reflection and spools
+ * the contents of the specified stream.
+ + * @throws SQLException
+ + * @throws IOException
+ */
+ - protected Blob createTemporaryBlob(InputStream in) throws Exception {
+ - /*
+ + protected Blob createTemporaryBlob(InputStream in) throws SQLException, IOException {
+ BLOB blob = BLOB.createTemporary(con, false, BLOB.DURATION_SESSION);
+ blob.open(BLOB.MODE_READWRITE);
+ OutputStream out = blob.getBinaryOutputStream();
+ - ...
+ - out.flush();
+ - out.close();
+ - blob.close();
+ - return blob;
+ - */
+ - Method createTemporary = blobClass.getMethod("createTemporary",
+ - new Class[]{Connection.class, Boolean.TYPE, Integer.TYPE});
+ - Object blob = createTemporary.invoke(null,
+ - new Object[]{con, Boolean.FALSE, DURATION_SESSION_CONSTANT});
+ - Method open = blobClass.getMethod("open", new Class[]{Integer.TYPE});
+ - open.invoke(blob, new Object[]{MODE_READWRITE_CONSTANT});
+ - Method getBinaryOutputStream =
+ - blobClass.getMethod("getBinaryOutputStream", new Class[0]);
+ - OutputStream out = (OutputStream) getBinaryOutputStream.invoke(blob, null);
+ - try {
+ + try {
+ int read;
+ byte[] buf = new byte[8192];
+ while ((read = in.read(buf, 0, buf.length)) > -1) {
+ @@ -503,9 +485,34 @@
+ }
+ out.close();
+ }
+ - Method close = blobClass.getMethod("close", new Class[0]);
+ - close.invoke(blob, null);
+ - return (Blob) blob;
+ + blob.close();
+ + return blob;
+ +
+ +// Method createTemporary = blobClass.getMethod("createTemporary",
+ +// new Class[]{Connection.class, Boolean.TYPE, Integer.TYPE});
+ +// Object blob = createTemporary.invoke(null,
+ +// new Object[]{con, Boolean.FALSE, DURATION_SESSION_CONSTANT});
+ +// Method open = blobClass.getMethod("open", new Class[]{Integer.TYPE});
+ +// open.invoke(blob, new Object[]{MODE_READWRITE_CONSTANT});
+ +// Method getBinaryOutputStream =
+ +// blobClass.getMethod("getBinaryOutputStream", new Class[0]);
+ +// OutputStream out = (OutputStream) getBinaryOutputStream.invoke(blob, null);
+ +// try {
+ +// int read;
+ +// byte[] buf = new byte[8192];
+ +// while ((read = in.read(buf, 0, buf.length)) > -1) {
+ +// out.write(buf, 0, read);
+ +// }
+ +// } finally {
+ +// try {
+ +// out.flush();
+ +// } catch (IOException ioe) {
+ +// }
+ +// out.close();
+ +// }
+ +// Method close = blobClass.getMethod("close", new Class[0]);
+ +// close.invoke(blob, null);
+ +// return (Blob) blob;
+ }
+
+ /**
+ @@ -511,9 +518,10 @@
+ /**
+ * Frees a temporary oracle.sql.BLOB instance via reflection.
+ */
+ - protected void freeTemporaryBlob(Object blob) throws Exception {
+ - // blob.freeTemporary();
+ - Method freeTemporary = blobClass.getMethod("freeTemporary", new Class[0]);
+ - freeTemporary.invoke(blob, null);
+ + protected void freeTemporaryBlob(Blob blob) throws Exception {
+ + BLOB obj = (BLOB) blob;
+ + obj.freeTemporary();
+ + //Method freeTemporary = blobClass.getMethod("freeTemporary", new Class[0]);
+ + //freeTemporary.invoke(blob, null);
+ }
+ }
+ Index: /home/nick/workspace/jackrabbit/jackrabbit/src/main/java/org/apache/jackrabbit/core/state/db/JNDIOracleDatabasePersistenceManager.java
+ ===================================================================
+ --- /home/nick/workspace/jackrabbit/jackrabbit/src/main/java/org/apache/jackrabbit/core/state/db/JNDIOracleDatabasePersistenceManager.java (revision 0)
+ +++ /home/nick/workspace/jackrabbit/jackrabbit/src/main/java/org/apache/jackrabbit/core/state/db/JNDIOracleDatabasePersistenceManager.java (revision 0)
+ @@ -0,0 +1,83 @@
+ +/*
+ + * 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.
+ + */
+ +package org.apache.jackrabbit.core.state.db;
+ +
+ +import java.sql.Connection;
+ +import java.sql.SQLException;
+ +
+ +import javax.naming.InitialContext;
+ +import javax.naming.NamingException;
+ +import javax.sql.DataSource;
+ +
+ +/**
+ + * Database persistence manager that uses JNDI to acquire the database
+ + * connection. The JNDI location of the {@link DataSource} to be used in
+ + * given as the <code>dataSourceLocation</code> configuration property.
+ + * See the {@link SimpleDbPersistenceManager} for more configuration
+ + * details.
+ + * <p>
+ + * <strong>WARNING:</strong> The acquired database connection is kept
+ + * for the entire lifetime of the persistence manager instance. The
+ + * configured data source should be prepared for this.
+ + */
+ +public class JNDIOracleDatabasePersistenceManager extends OraclePersistenceManager{
+ +
+ + /**
+ + * JNDI location of the data source used to acquire database connections.
+ + */
+ + private String dataSourceLocation;
+ +
+ + //----------------------------------------------------< setters & getters >
+ +
+ + /**
+ + * 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;
+ + }
+ +
+ + //-------------------------------------------< DatabasePersistenceManager >
+ +
+ + /**
+ + * Returns a JDBC connection from a {@link DataSource} acquired from JNDI
+ + * with the configured data source location.
+ + *
+ + * @return new database connection
+ + * @throws NamingException if the given data source location does not exist
+ + * @throws SQLException if a database access error occurs
+ + * @throws ClassNotFoundException
+ + * @see DatabasePersistenceManager#getConnection()
+ + */
+ + protected Connection getConnection() throws NamingException, SQLException, ClassNotFoundException {
+ + Class.forName(super.driver);
+ + InitialContext ic = new InitialContext();
+ + DataSource dataSource = (DataSource) ic.lookup(dataSourceLocation);
+ + return dataSource.getConnection();
+ + }
+ +
+ +}
+
+ Property changes on: /home/nick/workspace/jackrabbit/jackrabbit/src/main/java/org/apache/jackrabbit/core/state/db/JNDIOracleDatabasePersistenceManager.java
+ ___________________________________________________________________
+ Name: svn:eol-style
+ + native
+ Name: svn:keywords
+ + Id
+
+ Index: /home/nick/workspace/jackrabbit/jackrabbit/src/main/java/org/apache/jackrabbit/core/state/db/SimpleDbPersistenceManager.java
+ ===================================================================
+ --- /home/nick/workspace/jackrabbit/jackrabbit/src/main/java/org/apache/jackrabbit/core/state/db/SimpleDbPersistenceManager.java (revision 480910)
+ +++ /home/nick/workspace/jackrabbit/jackrabbit/src/main/java/org/apache/jackrabbit/core/state/db/SimpleDbPersistenceManager.java (working copy)
+ @@ -158,7 +158,7 @@
+ * @throws SQLException if a database access error occurs
+ * @see DatabasePersistenceManager#getConnection()
+ */
+ - protected Connection getConnection() throws ClassNotFoundException, SQLException {
+ + protected Connection getConnection() throws Exception {
+ Class.forName(driver);
+ Connection connection = DriverManager.getConnection(url, user, password);
+ return connection;
+
+
+ }}}
+