/* * 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 org.apache.jackrabbit.core.util.db.ConnectionFactory; import org.apache.jackrabbit.core.util.db.DatabaseAware; import javax.sql.DataSource; /** * <code>DbFileSystem</code> is a generic JDBC-based <code>FileSystem</code> * implementation for Jackrabbit that persists file system entries in a * database table. * <p> * It is configured through the following properties: * <ul> * <li><code>driver</code>: the FQN name of the JDBC driver class</li> * <li><code>url</code>: the database url of the form <code>jdbc:subprotocol:subname</code></li> * <li><code>user</code>: the database user</li> * <li><code>password</code>: the user's password</li> * <li><code>schema</code>: type of schema to be used * (e.g. <code>mysql</code>, <code>mssql</code>, etc.); </li> * <li><code>schemaObjectPrefix</code>: prefix to be prepended to schema objects</li> * </ul> * The required schema objects are automatically created by executing the DDL * statements read from the [schema].ddl file. The .ddl file is read from the * resources by calling <code>getClass().getResourceAsStream(schema + ".ddl")</code>. * Every line in the specified .ddl file is executed separatly by calling * <code>java.sql.Statement.execute(String)</code> where every occurence of the * the string <code>"${schemaObjectPrefix}"</code> has been replaced with the * value of the property <code>schemaObjectPrefix</code>. * <p> * The following is a fragment from a sample configuration using MySQL: * <pre> * <FileSystem class="org.apache.jackrabbit.core.fs.db.DbFileSystem"> * <param name="driver" value="com.mysql.jdbc.Driver"/> * <param name="url" value="jdbc:mysql:///test?autoReconnect=true"/> * <param name="schema" value="mysql"/> * <param name="schemaObjectPrefix" value="rep_"/> * </FileSystem> * </pre> * The following is a fragment from a sample configuration using Daffodil One$DB Embedded: * <pre> * <FileSystem class="org.apache.jackrabbit.core.fs.db.DbFileSystem"> * <param name="driver" value="in.co.daffodil.db.jdbc.DaffodilDBDriver"/> * <param name="url" value="jdbc:daffodilDB_embedded:rep;path=${rep.home}/databases;create=true"/> * <param name="user" value="daffodil"/> * <param name="password" value="daffodil"/> * <param name="schema" value="daffodil"/> * <param name="schemaObjectPrefix" value="rep_"/> * </FileSystem> * </pre> * The following is a fragment from a sample configuration using MSSQL: * <pre> * <FileSystem class="org.apache.jackrabbit.core.fs.db.DbFileSystem"> * <param name="driver" value="com.microsoft.jdbc.sqlserver.SQLServerDriver"/> * <param name="url" value="jdbc:microsoft:sqlserver://localhost:1433;;DatabaseName=test;SelectMethod=Cursor;"/> * <param name="schema" value="mssql"/> * <param name="user" value="sa"/> * <param name="password" value=""/> * <param name="schemaObjectPrefix" value="rep_"/> * </FileSystem> * </pre> * The following is a fragment from a sample configuration using Ingres: * <pre> * <FileSystem class="org.apache.jackrabbit.core.fs.db.DbFileSystem"> * <param name="driver" value="com.ingres.jdbc.IngresDriver"/> * <param name="url" value="jdbc:ingres://localhost:II7/test"/> * <param name="schema" value="ingres"/> * <param name="user" value="ingres"/> * <param name="password" value="ingres"/> * <param name="schemaObjectPrefix" value="rep_"/> * </FileSystem> * </pre> * The following is a fragment from a sample configuration using PostgreSQL: * <pre> * <FileSystem class="org.apache.jackrabbit.core.fs.db.DbFileSystem"> * <param name="driver" value="org.postgresql.Driver"/> * <param name="url" value="jdbc:postgresql://localhost/test"/> * <param name="schema" value="postgresql"/> * <param name="user" value="postgres"/> * <param name="password" value="postgres"/> * <param name="schemaObjectPrefix" value="rep_"/> * </FileSystem> * </pre> * JNDI can be used to get the connection. In this case, use the javax.naming.InitialContext as the driver, * and the JNDI name as the URL. If the user and password are configured in the JNDI resource, * they should not be configured here. Example JNDI settings: * <pre> * <param name="driver" value="javax.naming.InitialContext" /> * <param name="url" value="java:comp/env/jdbc/Test" /> * </pre> * See also {@link DerbyFileSystem}, {@link DB2FileSystem}, {@link OracleFileSystem}. */ public class DbFileSystem extends DatabaseFileSystem implements DatabaseAware { /** * the full qualified JDBC driver name */ protected String driver; /** * the JDBC connection URL */ protected String url; /** * the JDBC connection user */ protected String user; /** * the JDBC connection password */ protected String password; protected String dataSourceName; /** * The repositories {@link ConnectionFactory}. */ private ConnectionFactory connectionFactory; /** * {@inheritDoc} */ public void setConnectionFactory(ConnectionFactory connnectionFactory) { this.connectionFactory = connnectionFactory; } //----------------------------------------------------< setters & getters > public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public String getUser() { return user; } public void setUser(String user) { this.user = user; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getDriver() { return driver; } public void setDriver(String driver) { this.driver = driver; } public String getDataSourceName() { return dataSourceName; } public void setDataSourceName(String dataSourceName) { this.dataSourceName = dataSourceName; } //-------------------------------------------< java.lang.Object overrides > /** * {@inheritDoc} */ public boolean equals(Object obj) { if (this == obj) { return true; } if (obj instanceof DbFileSystem) { DbFileSystem other = (DbFileSystem) obj; if (((driver != null) ? driver.equals(other.driver) : other.driver == null) && ((url != null) ? url.equals(other.url) : other.url == null) && ((user != null) ? user.equals(other.user) : other.user == null) && ((password != null) ? password.equals(other.password) : other.password == null) && super.equals(other)) { return true; } } return false; } /** * Returns zero to satisfy the Object equals/hashCode contract. * This class is mutable and not meant to be used as a hash key. * * @return always zero * @see Object#hashCode() */ public int hashCode() { return 0; } //--------------------------------------------------< DatabaseFileSystem > /** * {@inheritDoc} */ @Override protected final DataSource getDataSource() throws Exception { if (getDataSourceName() == null || "".equals(getDataSourceName())) { return connectionFactory.getDataSource(getDriver(), getUrl(), getUser(), getPassword()); } else { String dbType = connectionFactory.getDataBaseType(dataSourceName); if (DatabaseFileSystem.class.getResourceAsStream(dbType + ".ddl") != null) { setSchema(dbType); } return connectionFactory.getDataSource(dataSourceName); } } }