[exo-jcr-commits] exo-jcr SVN: r5461 - in jcr/branches/1.15.x: exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/clean/rdbms and 4 other directories.
do-not-reply at jboss.org
do-not-reply at jboss.org
Tue Jan 17 05:16:34 EST 2012
Author: tolusha
Date: 2012-01-17 05:16:32 -0500 (Tue, 17 Jan 2012)
New Revision: 5461
Added:
jcr/branches/1.15.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/clean/rdbms/DBCleanException.java
jcr/branches/1.15.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/clean/rdbms/DBCleanerTool.java
jcr/branches/1.15.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/clean/rdbms/DummyDBCleanerTool.java
jcr/branches/1.15.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/clean/rdbms/scripts/
Removed:
jcr/branches/1.15.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/clean/rdbms/DBCleaner.java
jcr/branches/1.15.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/clean/rdbms/DummyDBCleaner.java
Modified:
jcr/branches/1.15.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/backup/rdbms/DBRestore.java
jcr/branches/1.15.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/clean/rdbms/DBCleanService.java
jcr/branches/1.15.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/cacheable/AbstractCacheableLockManager.java
jcr/branches/1.15.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/JDBCWorkspaceDataContainer.java
jcr/branches/1.15.x/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/backup/impl/JobExistingRepositorySameConfigRestore.java
jcr/branches/1.15.x/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/ext/backup/usecase/TestBackupRestore.java
Log:
EXOJCR-1707: Refactoring DBCleanService
Modified: jcr/branches/1.15.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/backup/rdbms/DBRestore.java
===================================================================
--- jcr/branches/1.15.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/backup/rdbms/DBRestore.java 2012-01-17 10:14:22 UTC (rev 5460)
+++ jcr/branches/1.15.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/backup/rdbms/DBRestore.java 2012-01-17 10:16:32 UTC (rev 5461)
@@ -29,7 +29,8 @@
import org.exoplatform.services.jcr.impl.Constants;
import org.exoplatform.services.jcr.impl.backup.BackupException;
import org.exoplatform.services.jcr.impl.backup.DataRestore;
-import org.exoplatform.services.jcr.impl.clean.rdbms.DBCleaner;
+import org.exoplatform.services.jcr.impl.clean.rdbms.DBCleanException;
+import org.exoplatform.services.jcr.impl.clean.rdbms.DBCleanerTool;
import org.exoplatform.services.jcr.impl.dataflow.serialization.ObjectZipReaderImpl;
import org.exoplatform.services.jcr.impl.storage.jdbc.DBConstants;
import org.exoplatform.services.jcr.impl.storage.jdbc.JDBCWorkspaceDataContainer;
@@ -113,7 +114,7 @@
/**
* Database cleaner.
*/
- private final DBCleaner dbCleaner;
+ private final DBCleanerTool dbCleaner;
/**
* Database dialect.
@@ -133,7 +134,7 @@
* @throws RepositoryConfigurationException
*/
public DBRestore(File storageDir, Connection jdbcConn, Map<String, RestoreTableRule> tables,
- WorkspaceEntry wsConfig, FileCleaner fileCleaner, DBCleaner dbCleaner) throws NamingException,
+ WorkspaceEntry wsConfig, FileCleaner fileCleaner, DBCleanerTool dbCleaner) throws NamingException,
SQLException, RepositoryConfigurationException
{
this.jdbcConn = jdbcConn;
@@ -155,9 +156,9 @@
{
try
{
- dbCleaner.executeCleanScripts();
+ dbCleaner.clean();
}
- catch (SQLException e)
+ catch (DBCleanException e)
{
throw new BackupException(e);
}
@@ -195,14 +196,17 @@
{
try
{
- dbCleaner.executeCommitScripts();
-
+ dbCleaner.commit();
jdbcConn.commit();
}
catch (SQLException e)
{
throw new BackupException(e);
}
+ catch (DBCleanException e)
+ {
+ throw new BackupException(e);
+ }
}
/**
@@ -214,13 +218,17 @@
{
jdbcConn.rollback();
- dbCleaner.executeRollbackScripts();
+ dbCleaner.rollback();
jdbcConn.commit();
}
catch (SQLException e)
{
throw new BackupException(e);
}
+ catch (DBCleanException e)
+ {
+ throw new BackupException(e);
+ }
}
/**
Added: jcr/branches/1.15.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/clean/rdbms/DBCleanException.java
===================================================================
--- jcr/branches/1.15.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/clean/rdbms/DBCleanException.java (rev 0)
+++ jcr/branches/1.15.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/clean/rdbms/DBCleanException.java 2012-01-17 10:16:32 UTC (rev 5461)
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2012 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.exoplatform.services.jcr.impl.clean.rdbms;
+
+/**
+ * @author <a href="abazko at exoplatform.com">Anatoliy Bazko</a>
+ * @version $Id: DBCleanException.java 34360 2009-07-22 23:58:59Z tolusha $
+ */
+public class DBCleanException extends Exception
+{
+
+ /**
+ * DBCleanException constructor.
+ *
+ * @param message
+ * the message to display.
+ */
+ public DBCleanException(String message)
+ {
+ super(message);
+ }
+
+ /**
+ * DBCleanException constructor.
+ *
+ * @param cause
+ * the caused exception
+ */
+ public DBCleanException(Throwable cause)
+ {
+ super(cause);
+ }
+
+ /**
+ * DBCleanException constructor.
+ *
+ * @param message
+ * the message to display.
+ * @param cause
+ * the caused exception
+ */
+ public DBCleanException(String message, Throwable cause)
+ {
+ super(message, cause);
+ }
+}
Modified: jcr/branches/1.15.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/clean/rdbms/DBCleanService.java
===================================================================
--- jcr/branches/1.15.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/clean/rdbms/DBCleanService.java 2012-01-17 10:14:22 UTC (rev 5460)
+++ jcr/branches/1.15.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/clean/rdbms/DBCleanService.java 2012-01-17 10:16:32 UTC (rev 5461)
@@ -16,30 +16,25 @@
*/
package org.exoplatform.services.jcr.impl.clean.rdbms;
-import org.exoplatform.commons.utils.IOUtil;
-import org.exoplatform.commons.utils.PrivilegedFileHelper;
import org.exoplatform.commons.utils.SecurityHelper;
+import org.exoplatform.services.database.utils.DialectConstants;
import org.exoplatform.services.database.utils.DialectDetecter;
-import org.exoplatform.services.database.utils.JDBCUtils;
import org.exoplatform.services.jcr.config.RepositoryConfigurationException;
import org.exoplatform.services.jcr.config.RepositoryEntry;
import org.exoplatform.services.jcr.config.WorkspaceEntry;
import org.exoplatform.services.jcr.core.security.JCRRuntimePermissions;
+import org.exoplatform.services.jcr.impl.clean.rdbms.scripts.DBCleaningScripts;
+import org.exoplatform.services.jcr.impl.clean.rdbms.scripts.DBCleaningScriptsFactory;
import org.exoplatform.services.jcr.impl.storage.jdbc.DBConstants;
import org.exoplatform.services.jcr.impl.storage.jdbc.JDBCWorkspaceDataContainer;
-import org.exoplatform.services.jcr.impl.util.jdbc.DBInitializerHelper;
import org.exoplatform.services.log.ExoLogger;
import org.exoplatform.services.log.Log;
-import java.io.IOException;
import java.security.PrivilegedExceptionAction;
import java.sql.Connection;
import java.sql.SQLException;
-import java.util.ArrayList;
-import java.util.List;
import javax.naming.InitialContext;
-import javax.naming.NameNotFoundException;
import javax.naming.NamingException;
import javax.sql.DataSource;
@@ -59,55 +54,42 @@
protected static final Log LOG = ExoLogger.getLogger("exo.jcr.component.core.DBCleanService");
/**
- * Old object suffix. Will using in rename.
- */
- public static final String OLD_OBJECT_SUFFIX = "_OLD";
-
- /**
- * The constraint name is limited by 18 symbols.
- */
- private static final int DB2_CONSTRAINT_NAME_LENGTH_LIMIT = 18;
-
- /**
* Cleans workspace data from database.
*
* @param wsEntry
* workspace configuration
- * @throws RepositoryConfigurationException
- * @throws NamingException
- * @throws SQLException
+ * @throws DBCleanException
*/
- public static void cleanWorkspaceData(WorkspaceEntry wsEntry) throws RepositoryConfigurationException,
- NamingException, SQLException
+ public static void cleanWorkspaceData(WorkspaceEntry wsEntry) throws DBCleanException
{
- // Need privileges to manage repository.
- SecurityManager security = System.getSecurityManager();
- if (security != null)
- {
- security.checkPermission(JCRRuntimePermissions.MANAGE_REPOSITORY_PERMISSION);
- }
+ SecurityHelper
+ .validateSecurityPermissions(new RuntimePermission[]{JCRRuntimePermissions.MANAGE_REPOSITORY_PERMISSION});
- String dsName = wsEntry.getContainer().getParameterValue(JDBCWorkspaceDataContainer.SOURCE_NAME);
+ Connection jdbcConn = getConnection(wsEntry);
+ boolean autoCommit = DialectConstants.DB_DIALECT_SYBASE.equalsIgnoreCase(resolveDialect(wsEntry));
- final DataSource ds = (DataSource)new InitialContext().lookup(dsName);
- if (ds == null)
+ try
{
- throw new NameNotFoundException("Data source " + dsName + " not found");
- }
+ jdbcConn.setAutoCommit(autoCommit);
- Connection jdbcConn = SecurityHelper.doPrivilegedSQLExceptionAction(new PrivilegedExceptionAction<Connection>()
+ DBCleanerTool dbCleaner = getWorkspaceDBCleaner(jdbcConn, wsEntry);
+ doClean(dbCleaner);
+ }
+ catch (SQLException e)
{
- public Connection run() throws Exception
+ throw new DBCleanException(e);
+ }
+ finally
+ {
+ try
{
- return ds.getConnection();
-
+ jdbcConn.close();
}
- });
-
- jdbcConn.setAutoCommit(false);
- DBCleaner dbCleaner = getWorkspaceDBCleaner(jdbcConn, wsEntry);
-
- processingClean(dbCleaner, jdbcConn);
+ catch (SQLException e)
+ {
+ LOG.error("Can not close connection", e);
+ }
+ }
}
/**
@@ -115,844 +97,238 @@
*
* @param rEntry
* the repository configuration
- * @throws RepositoryConfigurationException
- * @throws NamingException
- * @throws SQLException
+ * @throws DBCleanException
*/
- public static void cleanRepositoryData(RepositoryEntry rEntry) throws RepositoryConfigurationException,
- NamingException, SQLException
+ public static void cleanRepositoryData(RepositoryEntry rEntry) throws DBCleanException
{
- // Need privileges to manage repository.
- SecurityManager security = System.getSecurityManager();
- if (security != null)
- {
- security.checkPermission(JCRRuntimePermissions.MANAGE_REPOSITORY_PERMISSION);
- }
+ SecurityHelper
+ .validateSecurityPermissions(new RuntimePermission[]{JCRRuntimePermissions.MANAGE_REPOSITORY_PERMISSION});
- if (rEntry.getWorkspaceEntries().size() == 0)
- {
- // nothing to clean
- return;
- }
+ WorkspaceEntry wsEntry = rEntry.getWorkspaceEntries().get(0);
- String dsName =
- rEntry.getWorkspaceEntries().get(0).getContainer().getParameterValue(JDBCWorkspaceDataContainer.SOURCE_NAME);
-
- final DataSource ds = (DataSource)new InitialContext().lookup(dsName);
- if (ds == null)
+ boolean multiDB = getMultiDbParameter(wsEntry);
+ if (multiDB)
{
- throw new NameNotFoundException("Data source " + dsName + " not found");
- }
-
- Connection jdbcConn = SecurityHelper.doPrivilegedSQLExceptionAction(new PrivilegedExceptionAction<Connection>()
- {
- public Connection run() throws Exception
+ for (WorkspaceEntry entry : rEntry.getWorkspaceEntries())
{
- return ds.getConnection();
-
+ cleanWorkspaceData(entry);
}
- });
-
- jdbcConn.setAutoCommit(false);
- DBCleaner dbCleaner = getRepositoryDBCleaner(jdbcConn, rEntry);
- if (dbCleaner != null)
- {
- processingClean(dbCleaner, jdbcConn);
}
else
{
- for (WorkspaceEntry wsEntry : rEntry.getWorkspaceEntries())
+ Connection jdbcConn = getConnection(wsEntry);
+ boolean autoCommit = DialectConstants.DB_DIALECT_SYBASE.equalsIgnoreCase(resolveDialect(wsEntry));
+
+ try
{
- cleanWorkspaceData(wsEntry);
+ jdbcConn.setAutoCommit(autoCommit);
+
+ DBCleanerTool dbCleaner = getRepositoryDBCleaner(jdbcConn, rEntry);
+ doClean(dbCleaner);
}
+ catch (SQLException e)
+ {
+ throw new DBCleanException(e);
+ }
+ finally
+ {
+ try
+ {
+ jdbcConn.close();
+ }
+ catch (SQLException e)
+ {
+ LOG.error("Can not close connection", e);
+ }
+ }
}
}
/**
- * Returns database cleaner of repository.
+ * Returns database cleaner for repository.
*
* @param jdbcConn
* database connection which need to use
- * @param wsEntry
- * workspace configuration
- * @return database cleaner or null in case of multi-db configuration
- * @throws SQLException
- * @throws RepositoryConfigurationException
+ * @param rEntry
+ * repository configuration
+ * @return DBCleanerTool
+ * @throws DBCleanException
*/
- public static DBCleaner getRepositoryDBCleaner(Connection jdbcConn, RepositoryEntry repoEntry) throws SQLException,
- RepositoryConfigurationException
+ public static DBCleanerTool getRepositoryDBCleaner(Connection jdbcConn, RepositoryEntry rEntry)
+ throws DBCleanException
{
- // Need privileges to manage repository.
- SecurityManager security = System.getSecurityManager();
- if (security != null)
- {
- security.checkPermission(JCRRuntimePermissions.MANAGE_REPOSITORY_PERMISSION);
- }
+ SecurityHelper
+ .validateSecurityPermissions(new RuntimePermission[]{JCRRuntimePermissions.MANAGE_REPOSITORY_PERMISSION});
- final boolean isMultiDB =
- Boolean.parseBoolean(repoEntry.getWorkspaceEntries().get(0).getContainer()
- .getParameterValue(JDBCWorkspaceDataContainer.MULTIDB));
+ WorkspaceEntry wsEntry = rEntry.getWorkspaceEntries().get(0);
- if (isMultiDB)
+ boolean multiDb = getMultiDbParameter(wsEntry);
+ if (multiDb)
{
- return null;
+ throw new DBCleanException(
+ "It is not possible to create cleaner with common connection for multi database repository configuration");
}
- String dialect =
- repoEntry.getWorkspaceEntries().get(0).getContainer()
- .getParameterValue(JDBCWorkspaceDataContainer.DB_DIALECT, DBConstants.DB_DIALECT_AUTO);
- if (DBConstants.DB_DIALECT_GENERIC.equalsIgnoreCase(dialect)
- || DBConstants.DB_DIALECT_AUTO.equalsIgnoreCase(dialect))
- {
- dialect = DialectDetecter.detect(jdbcConn.getMetaData());
- }
+ String dialect = resolveDialect(wsEntry);
- if (dialect.equalsIgnoreCase(DBConstants.DB_DIALECT_DB2)
- || dialect.equalsIgnoreCase(DBConstants.DB_DIALECT_DB2V8)
- || dialect.equalsIgnoreCase(DBConstants.DB_DIALECT_MSSQL)
- || dialect.equalsIgnoreCase(DBConstants.DB_DIALECT_PGSQL))
- {
- List<String> dbCleanerScripts = new ArrayList<String>();
- dbCleanerScripts.addAll(getDropTableScripts(isMultiDB, dialect));
- dbCleanerScripts.addAll(getInitializationDBScripts(isMultiDB, dialect));
- dbCleanerScripts.addAll(getRemoveIndexesScripts(isMultiDB, dialect));
+ DBCleaningScripts scripts = DBCleaningScriptsFactory.prepareScripts(dialect, rEntry);
- return new DBCleaner(jdbcConn, dbCleanerScripts, new ArrayList<String>(), getRestoreIndexesScripts(isMultiDB,
- dialect), false);
- }
-
- List<String> dbCleanerScripts = new ArrayList<String>();
- dbCleanerScripts.addAll(getRenameScripts(isMultiDB, dialect));
- dbCleanerScripts.addAll(getInitializationDBScripts(isMultiDB, dialect));
- dbCleanerScripts.addAll(getRemoveIndexesScripts(isMultiDB, dialect));
-
- List<String> afterRestoreScript = new ArrayList<String>();
- afterRestoreScript.addAll(getRemoveOldObjectsScripts(isMultiDB, dialect));
- afterRestoreScript.addAll(getRestoreIndexesScripts(isMultiDB, dialect));
-
- return new DBCleaner(jdbcConn, dbCleanerScripts, getRollbackScripts(isMultiDB, dialect), afterRestoreScript,
- dialect.equalsIgnoreCase(DBConstants.DB_DIALECT_SYBASE));
+ return new DBCleanerTool(jdbcConn, scripts.getCleaningScripts(), scripts.getCommittingScripts(),
+ scripts.getRollbackingScripts());
}
/**
- * Prepare of restore tables. (Drop constraint, etc...)
+ * Returns database cleaner for workspace.
*
- * @param isMultiDb
- * boolean
- * @param dialect
- * String, dialect of DB
+ * @param jdbcConn
+ * database connection which need to use
+ * @param wsEntry
+ * workspace configuration
+ * @return DBCleanerTool
+ * @throws DBCleanException
*/
- private static List<String> getRemoveIndexesScripts(boolean isMultiDB, String dialect)
+ public static DBCleanerTool getWorkspaceDBCleaner(Connection jdbcConn, WorkspaceEntry wsEntry) throws DBCleanException
{
- ArrayList<String> dropScript = new ArrayList<String>();
+ SecurityHelper
+ .validateSecurityPermissions(new RuntimePermission[]{JCRRuntimePermissions.MANAGE_REPOSITORY_PERMISSION});
- String multiDb = isMultiDB ? "M" : "S";
- String constraintName;
+ boolean multiDb = getMultiDbParameter(wsEntry);
- if (dialect.equalsIgnoreCase(DBConstants.DB_DIALECT_MYSQL)
- || dialect.equalsIgnoreCase(DBConstants.DB_DIALECT_MYSQL_UTF8)
- || dialect.equalsIgnoreCase(DBConstants.DB_DIALECT_MYSQL_MYISAM)
- || dialect.equalsIgnoreCase(DBConstants.DB_DIALECT_MYSQL_MYISAM_UTF8))
- {
- return dropScript;
- }
+ String dialect = resolveDialect(wsEntry);
+
+ DBCleaningScripts scripts = DBCleaningScriptsFactory.prepareScripts(dialect, wsEntry);
- constraintName = validateConstraintName("JCR_FK_" + multiDb + "ITEM_PARENT", dialect);
- dropScript.add("ALTER TABLE JCR_" + multiDb + "ITEM " + dropCommand(false, constraintName, dialect));
-
- if (dialect.equalsIgnoreCase(DBConstants.DB_DIALECT_ORACLE)
- || dialect.equalsIgnoreCase(DBConstants.DB_DIALECT_ORACLEOCI))
- {
- constraintName = validateConstraintName("JCR_PK_" + multiDb + "VALUE", dialect);
- dropScript.add("ALTER TABLE JCR_" + multiDb + "VALUE " + dropCommand(true, constraintName, dialect));
-
- constraintName = validateConstraintName("JCR_FK_" + multiDb + "VALUE_PROPERTY", dialect);
- dropScript.add("ALTER TABLE JCR_" + multiDb + "VALUE " + dropCommand(false, constraintName, dialect));
-
- constraintName = validateConstraintName("JCR_PK_" + multiDb + "ITEM", dialect);
- dropScript.add("ALTER TABLE JCR_" + multiDb + "ITEM " + dropCommand(true, constraintName, dialect));
-
- constraintName = validateConstraintName("JCR_PK_" + multiDb + "REF", dialect);
- dropScript.add("ALTER TABLE JCR_" + multiDb + "REF " + dropCommand(true, constraintName, dialect));
-
- dropScript.add("DROP INDEX JCR_IDX_" + multiDb + "ITEM_PARENT_FK");
- dropScript.add("DROP INDEX JCR_IDX_" + multiDb + "ITEM_PARENT");
- dropScript.add("DROP INDEX JCR_IDX_" + multiDb + "ITEM_PARENT_ID");
- dropScript.add("DROP INDEX JCR_IDX_" + multiDb + "ITEM_N_ORDER_NUM");
- dropScript.add("DROP INDEX JCR_IDX_" + multiDb + "VALUE_PROPERTY");
- dropScript.add("DROP INDEX JCR_IDX_" + multiDb + "REF_PROPERTY");
- }
- else if (dialect.equalsIgnoreCase(DBConstants.DB_DIALECT_SYBASE))
- {
- dropScript.add("ALTER TABLE JCR_" + multiDb + "VALUE DROP CONSTRAINT JCR_FK_" + multiDb + "VALUE_PROPERTY");
- dropScript.add("ALTER TABLE JCR_" + multiDb + "ITEM DROP CONSTRAINT JCR_PK_" + multiDb + "ITEM");
- dropScript.add("ALTER TABLE JCR_" + multiDb + "VALUE DROP CONSTRAINT JCR_PK_" + multiDb + "VALUE");
- dropScript.add("DROP INDEX JCR_" + multiDb + "ITEM.JCR_IDX_" + multiDb + "ITEM_PARENT");
- dropScript.add("DROP INDEX JCR_" + multiDb + "ITEM.JCR_IDX_" + multiDb + "ITEM_PARENT_ID");
- dropScript.add("DROP INDEX JCR_" + multiDb + "ITEM.JCR_IDX_" + multiDb + "ITEM_N_ORDER_NUM");
- dropScript.add("DROP INDEX JCR_" + multiDb + "VALUE.JCR_IDX_" + multiDb + "VALUE_PROPERTY");
- dropScript.add("DROP INDEX JCR_" + multiDb + "REF.JCR_IDX_" + multiDb + "REF_PROPERTY");
- }
-
- return dropScript;
+ return new DBCleanerTool(jdbcConn, scripts.getCleaningScripts(), scripts.getCommittingScripts(),
+ scripts.getRollbackingScripts());
}
/**
- * After of restore tables. (Add constraint, etc...)
+ * Cleaning.
*
- * @param isMultiDb
- * boolean
- * @param dialect
- * String, dialect of DB
+ * @throws SQLException
*/
- private static List<String> getRestoreIndexesScripts(boolean isMultiDB, String dialect)
- throws RepositoryConfigurationException
+ private static void doClean(DBCleanerTool dbCleaner) throws DBCleanException, SQLException
{
- ArrayList<String> addScript = new ArrayList<String>();
-
- String multiDb = isMultiDB ? "M" : "S";
-
- String constraintName;
- String constraint;
-
- if (dialect.equalsIgnoreCase(DBConstants.DB_DIALECT_SYBASE))
+ Connection jdbcConn = dbCleaner.getConnection();
+ try
{
- addScript.add("ALTER TABLE JCR_" + multiDb + "ITEM ADD CONSTRAINT JCR_PK_" + multiDb
- + "ITEM PRIMARY KEY(ID)");
- addScript.add("ALTER TABLE JCR_" + multiDb + "VALUE ADD CONSTRAINT JCR_PK_" + multiDb
- + "VALUE PRIMARY KEY(ID)");
+ dbCleaner.clean();
+ dbCleaner.commit();
- constraintName = validateConstraintName("JCR_FK_" + multiDb + "ITEM_PARENT", dialect);
- constraint = "CONSTRAINT " + constraintName + " FOREIGN KEY(PARENT_ID) REFERENCES JCR_" + multiDb + "ITEM(ID)";
- addScript.add("ALTER TABLE JCR_" + multiDb + "ITEM ADD " + constraint);
-
- addScript.add("ALTER TABLE JCR_" + multiDb + "VALUE ADD CONSTRAINT JCR_FK_" + multiDb
- + "VALUE_PROPERTY FOREIGN KEY(PROPERTY_ID) REFERENCES JCR_" + multiDb + "ITEM(ID)");
-
- addScript.add(DBInitializerHelper.getObjectScript("CREATE UNIQUE INDEX JCR_IDX_" + multiDb
- + "ITEM_PARENT ON JCR_" + multiDb + "ITEM", isMultiDB, dialect));
- addScript.add(DBInitializerHelper.getObjectScript("CREATE UNIQUE INDEX JCR_IDX_" + multiDb
- + "ITEM_PARENT_ID ON JCR_" + multiDb + "ITEM", isMultiDB, dialect));
- addScript.add(DBInitializerHelper.getObjectScript("CREATE UNIQUE INDEX JCR_IDX_" + multiDb
- + "ITEM_N_ORDER_NUM ON JCR_" + multiDb + "ITEM", isMultiDB, dialect));
- addScript.add(DBInitializerHelper.getObjectScript("CREATE UNIQUE INDEX JCR_IDX_" + multiDb
- + "VALUE_PROPERTY ON JCR_" + multiDb + "VALUE", isMultiDB, dialect));
- addScript.add(DBInitializerHelper.getObjectScript("CREATE UNIQUE INDEX JCR_IDX_" + multiDb
- + "REF_PROPERTY ON JCR_" + multiDb + "REF", isMultiDB, dialect));
-
- return addScript;
+ jdbcConn.commit();
}
-
- if (dialect.equalsIgnoreCase(DBConstants.DB_DIALECT_MYSQL)
- || dialect.equalsIgnoreCase(DBConstants.DB_DIALECT_MYSQL_UTF8)
- || dialect.equalsIgnoreCase(DBConstants.DB_DIALECT_MYSQL_MYISAM)
- || dialect.equalsIgnoreCase(DBConstants.DB_DIALECT_MYSQL_MYISAM_UTF8))
+ catch (SQLException e)
{
- constraintName = validateConstraintName("JCR_FK_" + multiDb + "VALUE_PROPERTY", dialect);
- constraint =
- "CONSTRAINT " + constraintName + " FOREIGN KEY(PROPERTY_ID) REFERENCES JCR_" + multiDb + "ITEM(ID)";
- addScript.add("ALTER TABLE JCR_" + multiDb + "VALUE ADD " + constraint);
- }
+ jdbcConn.rollback();
- if (dialect.equalsIgnoreCase(DBConstants.DB_DIALECT_ORACLE)
- || dialect.equalsIgnoreCase(DBConstants.DB_DIALECT_ORACLEOCI))
- {
- constraintName = validateConstraintName("JCR_PK_" + multiDb + "VALUE", dialect);
- constraint = "CONSTRAINT " + constraintName + " PRIMARY KEY(ID)";
- addScript.add("ALTER TABLE JCR_" + multiDb + "VALUE ADD " + constraint);
+ dbCleaner.rollback();
- constraintName = validateConstraintName("JCR_PK_" + multiDb + "ITEM", dialect);
- constraint = "CONSTRAINT " + constraintName + " PRIMARY KEY(ID)";
- addScript.add("ALTER TABLE JCR_" + multiDb + "ITEM ADD " + constraint);
-
- constraintName = validateConstraintName("JCR_FK_" + multiDb + "VALUE_PROPERTY", dialect);
- constraint =
- "CONSTRAINT " + constraintName + " FOREIGN KEY(PROPERTY_ID) REFERENCES JCR_" + multiDb + "ITEM(ID)";
- addScript.add("ALTER TABLE JCR_" + multiDb + "VALUE ADD " + constraint);
-
- constraintName = validateConstraintName("JCR_PK_" + multiDb + "REF", dialect);
- constraint = "CONSTRAINT " + constraintName + " PRIMARY KEY(NODE_ID, PROPERTY_ID, ORDER_NUM)";
- addScript.add("ALTER TABLE JCR_" + multiDb + "REF ADD " + constraint);
-
- addScript.add(DBInitializerHelper.getObjectScript("JCR_IDX_" + multiDb + "ITEM_PARENT_FK ON JCR_" + multiDb
- + "ITEM", isMultiDB, dialect));
- addScript.add(DBInitializerHelper.getObjectScript("JCR_IDX_" + multiDb + "ITEM_PARENT ON JCR_" + multiDb
- + "ITEM", isMultiDB, dialect));
- addScript.add(DBInitializerHelper.getObjectScript("JCR_IDX_" + multiDb + "ITEM_PARENT_ID ON JCR_" + multiDb
- + "ITEM", isMultiDB, dialect));
- addScript.add(DBInitializerHelper.getObjectScript("JCR_IDX_" + multiDb + "ITEM_N_ORDER_NUM ON JCR_" + multiDb
- + "ITEM", isMultiDB, dialect));
- addScript.add(DBInitializerHelper.getObjectScript("JCR_IDX_" + multiDb + "VALUE_PROPERTY ON JCR_" + multiDb
- + "VALUE", isMultiDB, dialect));
- addScript.add(DBInitializerHelper.getObjectScript("JCR_IDX_" + multiDb + "REF_PROPERTY ON JCR_" + multiDb
- + "REF", isMultiDB, dialect));
+ jdbcConn.commit();
}
-
- constraintName = validateConstraintName("JCR_FK_" + multiDb + "ITEM_PARENT", dialect);
- constraint = "CONSTRAINT " + constraintName + " FOREIGN KEY(PARENT_ID) REFERENCES JCR_" + multiDb + "ITEM(ID)";
- addScript.add("ALTER TABLE JCR_" + multiDb + "ITEM ADD " + constraint);
-
- return addScript;
}
/**
- * Validate name of constraint. For some DBs constrains name is limited.
- *
- * @param string
- * the constraint name
- * @param dialect
- * String, dialect of DB
- * @return the constraint name accepted for specific DB
+ * Opens connection to database underlying a workspace.
*/
- private static String validateConstraintName(String string, String dialect)
+ private static Connection getConnection(WorkspaceEntry wsEntry) throws DBCleanException
{
- if (dialect.equalsIgnoreCase(DBConstants.DB_DIALECT_DB2)
- || dialect.equalsIgnoreCase(DBConstants.DB_DIALECT_DB2V8))
- {
- return string.substring(0, DB2_CONSTRAINT_NAME_LENGTH_LIMIT);
- }
- else
- {
- return string;
- }
- }
+ String dsName = getSourceNameParameter(wsEntry);
- /**
- * Return the SQL script for drop primary or foreign key.
- *
- * @param isPrimaryKey
- * boolean
- * @param dialect
- * String, dialect of DB
- * @return String
- */
- protected static String dropCommand(boolean isPrimaryKey, String constraintName, String dialect)
- {
- if (dialect.equalsIgnoreCase(DBConstants.DB_DIALECT_MYSQL)
- || dialect.equalsIgnoreCase(DBConstants.DB_DIALECT_MYSQL_UTF8)
- || dialect.equalsIgnoreCase(DBConstants.DB_DIALECT_MYSQL_MYISAM)
- || dialect.equalsIgnoreCase(DBConstants.DB_DIALECT_MYSQL_MYISAM_UTF8))
+ DataSource ds;
+ try
{
- return isPrimaryKey == true ? "DROP PRIMARY KEY" : "DROP FOREIGN KEY " + constraintName;
+ ds = (DataSource)new InitialContext().lookup(dsName);
}
- else
+ catch (NamingException e)
{
- return "DROP CONSTRAINT " + constraintName;
+ throw new DBCleanException(e);
}
- }
- /**
- * Create list with queries to drop tables, etc...
- *
- * @param multiDb
- * @return List
- * return list with query
- */
- protected static List<String> getDropTableScripts(boolean multiDb, String dialect)
- {
- final String isMultiDB = (multiDb ? "M" : "S");
-
- List<String> cleanScripts = new ArrayList<String>();
-
- if (dialect.equalsIgnoreCase(DBConstants.DB_DIALECT_ORACLE)
- || dialect.equalsIgnoreCase(DBConstants.DB_DIALECT_ORACLEOCI))
+ if (ds == null)
{
- cleanScripts.add("DROP TRIGGER BI_JCR_" + isMultiDB + "VALUE");
- cleanScripts.add("DROP SEQUENCE JCR_" + isMultiDB + "VALUE_SEQ");
+ throw new DBCleanException("Data source " + dsName + " not found");
}
- cleanScripts.add("DROP TABLE JCR_" + isMultiDB + "VALUE");
- cleanScripts.add("DROP TABLE JCR_" + isMultiDB + "ITEM");
- cleanScripts.add("DROP TABLE JCR_" + isMultiDB + "REF");
+ final DataSource dsF = ds;
- return cleanScripts;
- }
-
- /**
- * Create script to rename tables, indexes, etc...
- *
- * @param multiDb
- * boolean
- * @param dialect
- * string
- * @return List
- * return list with query
- */
- protected static List<String> getRenameScripts(boolean multiDb, String dialect)
- {
- final String isMultiDB = (multiDb ? "M" : "S");
-
- List<String> renameScripts = new ArrayList<String>();
-
- if (dialect.equalsIgnoreCase(DBConstants.DB_DIALECT_ORACLE)
- || dialect.equalsIgnoreCase(DBConstants.DB_DIALECT_ORACLEOCI))
+ Connection jdbcConn;
+ try
{
- // JCR_[S,M]VALUE
- renameScripts.add("ALTER TABLE JCR_" + isMultiDB + "VALUE RENAME TO JCR_" + isMultiDB + "VALUE"
- + OLD_OBJECT_SUFFIX);
- renameScripts.add("ALTER TABLE JCR_" + isMultiDB + "VALUE" + OLD_OBJECT_SUFFIX + " RENAME CONSTRAINT JCR_PK_"
- + isMultiDB + "VALUE TO JCR_PK_" + isMultiDB + "VALUE" + OLD_OBJECT_SUFFIX);
- renameScripts.add("ALTER TABLE JCR_" + isMultiDB + "VALUE" + OLD_OBJECT_SUFFIX + " RENAME CONSTRAINT JCR_FK_"
- + isMultiDB + "VALUE_PROPERTY TO JCR_FK_" + isMultiDB + "VALUE_PROPERTY" + OLD_OBJECT_SUFFIX);
- renameScripts.add("ALTER INDEX JCR_PK_" + isMultiDB + "VALUE RENAME TO JCR_PK_" + isMultiDB + "VALUE"
- + OLD_OBJECT_SUFFIX);
- renameScripts.add("ALTER INDEX JCR_IDX_" + isMultiDB + "VALUE_PROPERTY RENAME TO JCR_IDX_" + isMultiDB
- + "VALUE_PROPERTY" + OLD_OBJECT_SUFFIX);
-
- renameScripts.add("RENAME JCR_" + isMultiDB + "VALUE_SEQ TO JCR_" + isMultiDB + "VALUE_SEQ"
- + OLD_OBJECT_SUFFIX);
- renameScripts.add("ALTER TRIGGER BI_JCR_" + isMultiDB + "VALUE RENAME TO BI_JCR_" + isMultiDB + "VALUE"
- + OLD_OBJECT_SUFFIX);
-
- // JCR_[S,M]ITEM
- renameScripts.add("ALTER TABLE JCR_" + isMultiDB + "ITEM RENAME TO JCR_" + isMultiDB + "ITEM"
- + OLD_OBJECT_SUFFIX);
- renameScripts.add("ALTER TABLE JCR_" + isMultiDB + "ITEM" + OLD_OBJECT_SUFFIX + " RENAME CONSTRAINT JCR_PK_"
- + isMultiDB + "ITEM TO JCR_PK_" + isMultiDB + "ITEM" + OLD_OBJECT_SUFFIX);
- renameScripts.add("ALTER TABLE JCR_" + isMultiDB + "ITEM" + OLD_OBJECT_SUFFIX + " RENAME CONSTRAINT JCR_FK_"
- + isMultiDB + "ITEM_PARENT TO JCR_FK_" + isMultiDB + "ITEM_PARENT" + OLD_OBJECT_SUFFIX);
- renameScripts.add("ALTER INDEX JCR_PK_" + isMultiDB + "ITEM RENAME TO JCR_PK_" + isMultiDB + "ITEM"
- + OLD_OBJECT_SUFFIX);
- renameScripts.add("ALTER INDEX JCR_IDX_" + isMultiDB + "ITEM_PARENT_FK RENAME TO JCR_IDX_" + isMultiDB
- + "ITEM_PARENT_FK" + OLD_OBJECT_SUFFIX);
- renameScripts.add("ALTER INDEX JCR_IDX_" + isMultiDB + "ITEM_PARENT RENAME TO JCR_IDX_" + isMultiDB
- + "ITEM_PARENT" + OLD_OBJECT_SUFFIX);
- renameScripts.add("ALTER INDEX JCR_IDX_" + isMultiDB + "ITEM_PARENT_ID RENAME TO JCR_IDX_" + isMultiDB
- + "ITEM_PARENT_ID" + OLD_OBJECT_SUFFIX);
- renameScripts.add("ALTER INDEX JCR_IDX_" + isMultiDB + "ITEM_N_ORDER_NUM RENAME TO JCR_IDX_" + isMultiDB
- + "ITEM_N_ORDER_NUM" + OLD_OBJECT_SUFFIX);
-
- // JCR_[S,M]REF
- renameScripts.add("ALTER TABLE JCR_" + isMultiDB + "REF RENAME TO JCR_" + isMultiDB + "REF"
- + OLD_OBJECT_SUFFIX);
- renameScripts.add("ALTER TABLE JCR_" + isMultiDB + "REF" + OLD_OBJECT_SUFFIX + " RENAME CONSTRAINT JCR_PK_"
- + isMultiDB + "REF TO JCR_PK_" + isMultiDB + "REF" + OLD_OBJECT_SUFFIX);
- renameScripts.add("ALTER INDEX JCR_PK_" + isMultiDB + "REF RENAME TO JCR_PK_" + isMultiDB + "REF"
- + OLD_OBJECT_SUFFIX);
- renameScripts.add("ALTER INDEX JCR_IDX_" + isMultiDB + "REF_PROPERTY RENAME TO JCR_IDX_" + isMultiDB
- + "REF_PROPERTY" + OLD_OBJECT_SUFFIX);
+ jdbcConn = SecurityHelper.doPrivilegedSQLExceptionAction(new PrivilegedExceptionAction<Connection>()
+ {
+ public Connection run() throws Exception
+ {
+ return dsF.getConnection();
+ }
+ });
}
- else if (dialect.equalsIgnoreCase(DBConstants.DB_DIALECT_MYSQL)
- || dialect.equalsIgnoreCase(DBConstants.DB_DIALECT_MYSQL_UTF8)
- || dialect.equalsIgnoreCase(DBConstants.DB_DIALECT_MYSQL_MYISAM)
- || dialect.equalsIgnoreCase(DBConstants.DB_DIALECT_MYSQL_MYISAM_UTF8))
+ catch (SQLException e)
{
- renameScripts.add("ALTER TABLE JCR_" + isMultiDB + "VALUE RENAME TO JCR_" + isMultiDB + "VALUE"
- + OLD_OBJECT_SUFFIX);
- renameScripts.add("ALTER TABLE JCR_" + isMultiDB + "ITEM RENAME TO JCR_" + isMultiDB + "ITEM"
- + OLD_OBJECT_SUFFIX);
-
- renameScripts.add("ALTER TABLE JCR_" + isMultiDB + "REF RENAME TO JCR_" + isMultiDB + "REF"
- + OLD_OBJECT_SUFFIX);
+ throw new DBCleanException(e);
}
- else if (dialect.equalsIgnoreCase(DBConstants.DB_DIALECT_SYBASE))
- {
- renameScripts.add("sp_rename JCR_" + isMultiDB + "VALUE, JCR_" + isMultiDB + "VALUE" + OLD_OBJECT_SUFFIX);
- renameScripts.add("sp_rename JCR_" + isMultiDB + "ITEM, JCR_" + isMultiDB + "ITEM" + OLD_OBJECT_SUFFIX);
- renameScripts.add("sp_rename JCR_" + isMultiDB + "REF, JCR_" + isMultiDB + "REF" + OLD_OBJECT_SUFFIX);
- renameScripts.add("sp_rename JCR_FK_" + isMultiDB + "VALUE_PROPERTY, JCR_FK_" + isMultiDB + "VALUE_PROPERTY"
- + OLD_OBJECT_SUFFIX);
- renameScripts.add("sp_rename JCR_FK_" + isMultiDB + "ITEM_PARENT, JCR_FK_" + isMultiDB + "ITEM_PARENT_OLD");
- }
- else if (dialect.equalsIgnoreCase(DBConstants.DB_DIALECT_HSQLDB))
- {
- renameScripts.add("ALTER TABLE JCR_" + isMultiDB + "VALUE RENAME TO JCR_" + isMultiDB + "VALUE"
- + OLD_OBJECT_SUFFIX);
- renameScripts.add("ALTER TABLE JCR_" + isMultiDB + "ITEM RENAME TO JCR_" + isMultiDB + "ITEM"
- + OLD_OBJECT_SUFFIX);
- renameScripts
- .add("ALTER TABLE JCR_" + isMultiDB + "REF RENAME TO JCR_" + isMultiDB + "REF" + OLD_OBJECT_SUFFIX);
- renameScripts.add("ALTER TABLE JCR_" + isMultiDB + "VALUE" + OLD_OBJECT_SUFFIX + " DROP CONSTRAINT JCR_FK_"
- + isMultiDB + "VALUE_PROPERTY");
-
- renameScripts.add("ALTER TABLE JCR_" + isMultiDB + "ITEM" + OLD_OBJECT_SUFFIX + " DROP CONSTRAINT JCR_FK_"
- + isMultiDB + "ITEM_PARENT");
-
- renameScripts.add("ALTER TABLE JCR_" + isMultiDB + "ITEM" + OLD_OBJECT_SUFFIX + " DROP CONSTRAINT JCR_PK_"
- + isMultiDB + "ITEM");
-
- renameScripts.add("ALTER TABLE JCR_" + isMultiDB + "VALUE" + OLD_OBJECT_SUFFIX + " DROP CONSTRAINT JCR_PK_"
- + isMultiDB + "VALUE");
-
- renameScripts.add("ALTER TABLE JCR_" + isMultiDB + "REF" + OLD_OBJECT_SUFFIX + " DROP CONSTRAINT JCR_PK_"
- + isMultiDB + "REF");
-
- renameScripts.add("ALTER INDEX JCR_IDX_" + isMultiDB + "ITEM_PARENT RENAME TO JCR_IDX_" + isMultiDB
- + "ITEM_PARENT" + OLD_OBJECT_SUFFIX);
-
- renameScripts.add("ALTER INDEX JCR_IDX_" + isMultiDB + "ITEM_PARENT_ID RENAME TO JCR_IDX_" + isMultiDB
- + "ITEM_PARENT_ID" + OLD_OBJECT_SUFFIX);
-
- renameScripts.add("ALTER INDEX JCR_IDX_" + isMultiDB + "ITEM_N_ORDER_NUM RENAME TO JCR_IDX_" + isMultiDB
- + "ITEM_N_ORDER_NUM" + OLD_OBJECT_SUFFIX);
-
- renameScripts.add("ALTER INDEX JCR_IDX_" + isMultiDB + "VALUE_PROPERTY RENAME TO JCR_IDX_" + isMultiDB
- + "VALUE_PROPERTY" + OLD_OBJECT_SUFFIX);
-
- renameScripts.add("ALTER INDEX JCR_IDX_" + isMultiDB + "REF_PROPERTY RENAME TO JCR_IDX_" + isMultiDB
- + "REF_PROPERTY" + OLD_OBJECT_SUFFIX);
- }
-
- return renameScripts;
+ return jdbcConn;
}
/**
- * Create script to rollback changes after rename.
- *
- * @param multiDb
- * boolean
- * @param dialect
- * string
- * @return List
- * return list with query
- * @throws RepositoryConfigurationException
+ * Return {@link JDBCWorkspaceDataContainer#SOURCE_NAME} parameter from workspace configuration.
*/
- protected static List<String> getRollbackScripts(boolean multiDb, String dialect)
- throws RepositoryConfigurationException
+ private static String getSourceNameParameter(WorkspaceEntry wsEntry) throws DBCleanException
{
- final String isMultiDB = (multiDb ? "M" : "S");
-
- List<String> rollbackScripts = new ArrayList<String>();
-
- rollbackScripts.addAll(getDropTableScripts(multiDb, dialect));
-
- if (dialect.equalsIgnoreCase(DBConstants.DB_DIALECT_ORACLE)
- || dialect.equalsIgnoreCase(DBConstants.DB_DIALECT_ORACLEOCI))
+ try
{
- // JCR_[S,M]VALUE
- rollbackScripts.add("ALTER TABLE JCR_" + isMultiDB + "VALUE" + OLD_OBJECT_SUFFIX + " RENAME TO JCR_" + isMultiDB
- + "VALUE");
- rollbackScripts.add("ALTER TABLE JCR_" + isMultiDB + "VALUE RENAME CONSTRAINT JCR_PK_" + isMultiDB
- + "VALUE" + OLD_OBJECT_SUFFIX + " TO JCR_PK_" + isMultiDB + "VALUE");
- rollbackScripts.add("ALTER TABLE JCR_" + isMultiDB + "VALUE RENAME CONSTRAINT JCR_FK_" + isMultiDB
- + "VALUE_PROPERTY" + OLD_OBJECT_SUFFIX + " TO JCR_FK_" + isMultiDB + "VALUE_PROPERTY");
- rollbackScripts.add("ALTER INDEX JCR_PK_" + isMultiDB + "VALUE" + OLD_OBJECT_SUFFIX + " RENAME TO JCR_PK_"
- + isMultiDB + "VALUE");
- rollbackScripts.add("ALTER INDEX JCR_IDX_" + isMultiDB + "VALUE_PROPERTY" + OLD_OBJECT_SUFFIX
- + " RENAME TO JCR_IDX_" + isMultiDB + "VALUE_PROPERTY");
-
- rollbackScripts.add("RENAME JCR_" + isMultiDB + "VALUE_SEQ" + OLD_OBJECT_SUFFIX + " TO JCR_" + isMultiDB
- + "VALUE_SEQ");
- rollbackScripts.add("ALTER TRIGGER BI_JCR_" + isMultiDB + "VALUE" + OLD_OBJECT_SUFFIX + " RENAME TO BI_JCR_"
- + isMultiDB + "VALUE");
-
- // JCR_[S,M]ITEM
- rollbackScripts.add("ALTER TABLE JCR_" + isMultiDB + "ITEM" + OLD_OBJECT_SUFFIX + " RENAME TO JCR_" + isMultiDB
- + "ITEM");
- rollbackScripts.add("ALTER TABLE JCR_" + isMultiDB + "ITEM RENAME CONSTRAINT JCR_PK_" + isMultiDB
- + "ITEM" + OLD_OBJECT_SUFFIX + " TO JCR_PK_" + isMultiDB + "ITEM");
- rollbackScripts.add("ALTER TABLE JCR_" + isMultiDB + "ITEM RENAME CONSTRAINT JCR_FK_" + isMultiDB
- + "ITEM_PARENT" + OLD_OBJECT_SUFFIX + " TO JCR_FK_" + isMultiDB + "ITEM_PARENT");
- rollbackScripts.add("ALTER INDEX JCR_PK_" + isMultiDB + "ITEM" + OLD_OBJECT_SUFFIX + " RENAME TO JCR_PK_"
- + isMultiDB + "ITEM");
- rollbackScripts.add("ALTER INDEX JCR_IDX_" + isMultiDB + "ITEM_PARENT_FK" + OLD_OBJECT_SUFFIX
- + " RENAME TO JCR_IDX_" + isMultiDB + "ITEM_PARENT_FK");
- rollbackScripts.add("ALTER INDEX JCR_IDX_" + isMultiDB + "ITEM_PARENT" + OLD_OBJECT_SUFFIX
- + " RENAME TO JCR_IDX_" + isMultiDB + "ITEM_PARENT");
- rollbackScripts.add("ALTER INDEX JCR_IDX_" + isMultiDB + "ITEM_PARENT_ID" + OLD_OBJECT_SUFFIX
- + " RENAME TO JCR_IDX_" + isMultiDB + "ITEM_PARENT_ID");
- rollbackScripts.add("ALTER INDEX JCR_IDX_" + isMultiDB + "ITEM_N_ORDER_NUM" + OLD_OBJECT_SUFFIX
- + " RENAME TO JCR_IDX_" + isMultiDB + "ITEM_N_ORDER_NUM");
-
- // JCR_[S,M]REF
- rollbackScripts.add("ALTER TABLE JCR_" + isMultiDB + "REF" + OLD_OBJECT_SUFFIX + " RENAME TO JCR_" + isMultiDB
- + "REF");
- rollbackScripts.add("ALTER TABLE JCR_" + isMultiDB + "REF RENAME CONSTRAINT JCR_PK_" + isMultiDB
- + "REF" + OLD_OBJECT_SUFFIX + " TO JCR_PK_" + isMultiDB + "REF");
- rollbackScripts.add("ALTER INDEX JCR_PK_" + isMultiDB + "REF" + OLD_OBJECT_SUFFIX + " RENAME TO JCR_PK_"
- + isMultiDB + "REF");
- rollbackScripts.add("ALTER INDEX JCR_IDX_" + isMultiDB + "REF_PROPERTY" + OLD_OBJECT_SUFFIX
- + " RENAME TO JCR_IDX_" + isMultiDB + "REF_PROPERTY");
+ return wsEntry.getContainer().getParameterValue(JDBCWorkspaceDataContainer.SOURCE_NAME);
}
- else if (dialect.equalsIgnoreCase(DBConstants.DB_DIALECT_MYSQL)
- || dialect.equalsIgnoreCase(DBConstants.DB_DIALECT_MYSQL_UTF8)
- || dialect.equalsIgnoreCase(DBConstants.DB_DIALECT_MYSQL_MYISAM)
- || dialect.equalsIgnoreCase(DBConstants.DB_DIALECT_MYSQL_MYISAM_UTF8))
+ catch (RepositoryConfigurationException e)
{
- rollbackScripts.add("ALTER TABLE JCR_" + isMultiDB + "ITEM" + OLD_OBJECT_SUFFIX + " RENAME TO JCR_"
- + isMultiDB + "ITEM");
-
- rollbackScripts.add("ALTER TABLE JCR_" + isMultiDB + "VALUE" + OLD_OBJECT_SUFFIX + " RENAME TO JCR_"
- + isMultiDB + "VALUE");
- rollbackScripts.add("ALTER TABLE JCR_" + isMultiDB + "REF" + OLD_OBJECT_SUFFIX + " RENAME TO JCR_" + isMultiDB
- + "REF");
+ throw new DBCleanException(e);
}
- else if (dialect.equalsIgnoreCase(DBConstants.DB_DIALECT_SYBASE))
- {
- rollbackScripts.add("sp_rename JCR_" + isMultiDB + "VALUE" + OLD_OBJECT_SUFFIX + ", JCR_" + isMultiDB
- + "VALUE");
- rollbackScripts.add("sp_rename JCR_" + isMultiDB + "ITEM" + OLD_OBJECT_SUFFIX + ", JCR_" + isMultiDB + "ITEM");
- rollbackScripts.add("sp_rename JCR_" + isMultiDB + "REF" + OLD_OBJECT_SUFFIX + ", JCR_" + isMultiDB + "REF");
-
- rollbackScripts.add("sp_rename JCR_FK_" + isMultiDB + "VALUE_PROPERTY" + OLD_OBJECT_SUFFIX + ", JCR_FK_"
- + isMultiDB + "VALUE_PROPERTY");
-
- rollbackScripts.add("sp_rename JCR_FK_" + isMultiDB + "ITEM_PARENT" + OLD_OBJECT_SUFFIX + ", JCR_FK_"
- + isMultiDB + "ITEM_PARENT");
- }
- else if (dialect.equalsIgnoreCase(DBConstants.DB_DIALECT_HSQLDB))
- {
- rollbackScripts.add("ALTER TABLE JCR_" + isMultiDB + "VALUE" + OLD_OBJECT_SUFFIX + " RENAME TO JCR_"
- + isMultiDB + "VALUE");
- rollbackScripts.add("ALTER TABLE JCR_" + isMultiDB + "ITEM" + OLD_OBJECT_SUFFIX + " RENAME TO JCR_"
- + isMultiDB + "ITEM");
- rollbackScripts.add("ALTER TABLE JCR_" + isMultiDB + "REF" + OLD_OBJECT_SUFFIX + " RENAME TO JCR_" + isMultiDB
- + "REF");
-
- rollbackScripts.add("ALTER TABLE JCR_" + isMultiDB + "ITEM ADD CONSTRAINT JCR_PK_" + isMultiDB
- + "ITEM PRIMARY KEY(ID)");
-
- rollbackScripts.add("ALTER TABLE JCR_" + isMultiDB + "VALUE ADD CONSTRAINT JCR_FK_" + isMultiDB
- + "VALUE_PROPERTY FOREIGN KEY(PROPERTY_ID) REFERENCES JCR_" + isMultiDB + "ITEM(ID)");
-
- rollbackScripts.add("ALTER TABLE JCR_" + isMultiDB + "ITEM ADD CONSTRAINT JCR_FK_" + isMultiDB
- + "ITEM_PARENT FOREIGN KEY(PARENT_ID) REFERENCES JCR_" + isMultiDB + "ITEM(ID)");
-
- rollbackScripts.add("ALTER TABLE JCR_" + isMultiDB + "VALUE ADD CONSTRAINT JCR_PK_" + isMultiDB
- + "VALUE PRIMARY KEY(ID)");
-
- rollbackScripts.add("ALTER TABLE JCR_" + isMultiDB + "REF ADD CONSTRAINT JCR_PK_" + isMultiDB
- + "REF PRIMARY KEY(NODE_ID, PROPERTY_ID, ORDER_NUM)");
-
- rollbackScripts.add("ALTER INDEX JCR_IDX_" + isMultiDB + "ITEM_PARENT" + OLD_OBJECT_SUFFIX
- + " RENAME TO JCR_IDX_" + isMultiDB + "ITEM_PARENT");
-
- rollbackScripts.add("ALTER INDEX JCR_IDX_" + isMultiDB + "ITEM_PARENT_ID" + OLD_OBJECT_SUFFIX
- + " RENAME TO JCR_IDX_" + isMultiDB + "ITEM_PARENT_ID");
-
- rollbackScripts.add("ALTER INDEX JCR_IDX_" + isMultiDB + "ITEM_N_ORDER_NUM" + OLD_OBJECT_SUFFIX
- + " RENAME TO JCR_IDX_" + isMultiDB + "ITEM_N_ORDER_NUM");
-
- rollbackScripts.add("ALTER INDEX JCR_IDX_" + isMultiDB + "VALUE_PROPERTY" + OLD_OBJECT_SUFFIX
- + " RENAME TO JCR_IDX_" + isMultiDB + "VALUE_PROPERTY");
-
- rollbackScripts.add("ALTER INDEX JCR_IDX_" + isMultiDB + "REF_PROPERTY" + OLD_OBJECT_SUFFIX
- + " RENAME TO JCR_IDX_" + isMultiDB + "REF_PROPERTY");
- }
-
- return rollbackScripts;
}
/**
- * Create script to drop old tables, indexes, etc...after successful restore DB.
- *
- * @param multiDb
- * boolean
- * @param dialect
- * string
- * @return List
- * return list with query
+ * Return {@link JDBCWorkspaceDataContainer#MULTIDB} parameter from workspace configuration.
*/
- protected static List<String> getRemoveOldObjectsScripts(boolean multiDb, String dialect)
+ private static boolean getMultiDbParameter(WorkspaceEntry wsEntry) throws DBCleanException
{
- List<String> afterRetoreScripts = new ArrayList<String>();
-
- for (String query : getDropTableScripts(multiDb, dialect))
- {
- afterRetoreScripts.add(query + OLD_OBJECT_SUFFIX);
- }
-
- return afterRetoreScripts;
- }
-
- /**
- * Create list with queries to initialization database.
- *
- * @param isMultiDb
- * @param dialect
- * @return
- * @throws RepositoryConfigurationException
- */
- protected static List<String> getInitializationDBScripts(boolean isMultiDb, String dialect)
- throws RepositoryConfigurationException
- {
- String multiDb = isMultiDb ? "M" : "S";
-
- String scriptsPath = DBInitializerHelper.scriptPath(dialect, isMultiDb);
- String script;
try
{
- script = IOUtil.getStreamContentAsString(PrivilegedFileHelper.getResourceAsStream(scriptsPath));
+ return Boolean.parseBoolean(wsEntry.getContainer().getParameterValue(JDBCWorkspaceDataContainer.MULTIDB));
}
- catch (IOException e)
+ catch (RepositoryConfigurationException e)
{
- throw new RepositoryConfigurationException("Can not read script file " + scriptsPath, e);
+ throw new DBCleanException(e);
}
-
- List<String> scripts = new ArrayList<String>();
- for (String query : JDBCUtils.splitWithSQLDelimiter(script))
- {
- // Skip creation JCR_S(M)CONTAINER TABLE
- if (!query.contains("CREATE TABLE JCR_" + multiDb + "CONTAINER"))
- {
- scripts.add(JDBCUtils.cleanWhitespaces(query));
- }
- }
-
- scripts.add(DBInitializerHelper.getRootNodeInitializeScript(isMultiDb));
-
- // Filter scripts
- if (dialect.equalsIgnoreCase(DBConstants.DB_DIALECT_MYSQL)
- || dialect.equalsIgnoreCase(DBConstants.DB_DIALECT_MYSQL_UTF8)
- || dialect.equalsIgnoreCase(DBConstants.DB_DIALECT_MYSQL_MYISAM)
- || dialect.equalsIgnoreCase(DBConstants.DB_DIALECT_MYSQL_MYISAM_UTF8))
- {
- for (int i = 0; i < scripts.size(); i++)
- {
- String query = scripts.get(i);
- if (query.contains("JCR_PK_" + multiDb + "ITEM PRIMARY KEY(ID),"))
- {
- // removing foreign key creation from initialization scripts for table JCR_S(M)ITEM
- // it is not possible to create table with such foreign key if the same key exists in
- // another table of database
- query =
- query.replace("JCR_PK_" + multiDb + "ITEM PRIMARY KEY(ID),", "JCR_PK_" + multiDb
- + "ITEM PRIMARY KEY(ID)");
- query =
- query.replace("CONSTRAINT JCR_FK_" + multiDb + "ITEM_PARENT FOREIGN KEY(PARENT_ID) REFERENCES JCR_"
- + multiDb + "ITEM(ID)", "");
- scripts.set(i, query);
- }
- else if (query.contains("CONSTRAINT JCR_PK_" + multiDb + "VALUE PRIMARY KEY(ID),"))
- {
- // removing foreign key creation for table JCR_S(M)VALUE
- // it is not possible to create table with such foreign key if the same key exists in
- // another table of database
- query =
- query.replace("CONSTRAINT JCR_PK_" + multiDb + "VALUE PRIMARY KEY(ID),", "CONSTRAINT JCR_PK_"
- + multiDb + "VALUE PRIMARY KEY(ID)");
- query =
- query.replace("CONSTRAINT JCR_FK_" + multiDb
- + "VALUE_PROPERTY FOREIGN KEY(PROPERTY_ID) REFERENCES JCR_" + multiDb + "ITEM(ID)", "");
- scripts.set(i, query);
- }
- }
- }
-
- return scripts;
}
/**
- * Returns database cleaner of workspace.
+ * Resolves dialect which it is used in workspace configuration. First of all,
+ * method will try to get parameter {@link JDBCWorkspaceDataContainer#DB_DIALECT} from
+ * a configuration. And only then method will try to detect dialect using {@link DialectDetecter} in case
+ * if dialect is set as {@link DialectConstants#DB_DIALECT_AUTO}.
*
- * @param jdbcConn
- * database connection which need to use
* @param wsEntry
* workspace configuration
- * @return
- * @throws SQLException
- * @throws RepositoryConfigurationException
+ * @return dialect
+ * @throws DBCleanException
*/
- public static DBCleaner getWorkspaceDBCleaner(Connection jdbcConn, WorkspaceEntry wsEntry) throws SQLException,
- RepositoryConfigurationException
+ private static String resolveDialect(WorkspaceEntry wsEntry) throws DBCleanException
{
- // Need privileges to manage repository.
- SecurityManager security = System.getSecurityManager();
- if (security != null)
- {
- security.checkPermission(JCRRuntimePermissions.MANAGE_REPOSITORY_PERMISSION);
- }
-
- boolean isMultiDB =
- Boolean.parseBoolean(wsEntry.getContainer().getParameterValue(JDBCWorkspaceDataContainer.MULTIDB));
-
String dialect =
wsEntry.getContainer().getParameterValue(JDBCWorkspaceDataContainer.DB_DIALECT, DBConstants.DB_DIALECT_AUTO);
- if (DBConstants.DB_DIALECT_GENERIC.equalsIgnoreCase(dialect)
- || DBConstants.DB_DIALECT_AUTO.equalsIgnoreCase(dialect))
- {
- dialect = DialectDetecter.detect(jdbcConn.getMetaData());
- }
- if (!isMultiDB)
+ if (DBConstants.DB_DIALECT_AUTO.equalsIgnoreCase(dialect))
{
- String containerName = wsEntry.getName();
- String multiDb = isMultiDB ? "M" : "S";
-
- List<String> cleanScripts = new ArrayList<String>();
- List<String> commitScripts = new ArrayList<String>();
- List<String> rollbackScripts = new ArrayList<String>();
-
- String constraintName = validateConstraintName("JCR_FK_" + multiDb + "ITEM_PARENT", dialect);
- cleanScripts.add("ALTER TABLE JCR_" + multiDb + "ITEM " + dropCommand(false, constraintName, dialect));
-
- String constraint =
- "CONSTRAINT " + constraintName + " FOREIGN KEY(PARENT_ID) REFERENCES JCR_" + multiDb + "ITEM(ID)";
- commitScripts.add("ALTER TABLE JCR_" + multiDb + "ITEM ADD " + constraint);
-
- // PostgreSQL, DB2 and MSSQL on connection.rollback() will restore all removed constrains
- if (!dialect.equalsIgnoreCase(DBConstants.DB_DIALECT_PGSQL)
- && !dialect.equalsIgnoreCase(DBConstants.DB_DIALECT_DB2)
- && !dialect.equalsIgnoreCase(DBConstants.DB_DIALECT_DB2V8)
- && !dialect.equalsIgnoreCase(DBConstants.DB_DIALECT_MSSQL))
+ try
{
- rollbackScripts.add("ALTER TABLE JCR_" + multiDb + "ITEM ADD " + constraint);
+ Connection jdbcConn = getConnection(wsEntry);
+ dialect = DialectDetecter.detect(jdbcConn.getMetaData());
}
-
- cleanScripts
- .add("delete from JCR_SVALUE where PROPERTY_ID IN (select ID from JCR_SITEM where CONTAINER_NAME='"
- + containerName + "')");
- cleanScripts.add("delete from JCR_SREF where PROPERTY_ID IN (select ID from JCR_SITEM where CONTAINER_NAME='"
- + containerName + "')");
- cleanScripts.add("delete from JCR_SITEM where CONTAINER_NAME='" + containerName + "'");
-
- return new DBCleaner(jdbcConn, cleanScripts, rollbackScripts, commitScripts,
- dialect.equalsIgnoreCase(DBConstants.DB_DIALECT_SYBASE));
- }
- else
- {
- // PostgreSQL, DB2 and MSSQL on connection.rollback() will restore all removed tables
- if (dialect.equalsIgnoreCase(DBConstants.DB_DIALECT_DB2)
- || dialect.equalsIgnoreCase(DBConstants.DB_DIALECT_DB2V8)
- || dialect.equalsIgnoreCase(DBConstants.DB_DIALECT_MSSQL)
- || dialect.equalsIgnoreCase(DBConstants.DB_DIALECT_PGSQL))
+ catch (SQLException e)
{
- List<String> cleanScripts = new ArrayList<String>();
-
- cleanScripts.addAll(getDropTableScripts(isMultiDB, dialect));
- cleanScripts.addAll(getInitializationDBScripts(isMultiDB, dialect));
- cleanScripts.addAll(getRemoveIndexesScripts(isMultiDB, dialect));
-
- return new DBCleaner(jdbcConn, cleanScripts, new ArrayList<String>(), getRestoreIndexesScripts(isMultiDB,
- dialect), false);
+ throw new DBCleanException(e);
}
- else
- {
- ArrayList<String> cleanScripts = new ArrayList<String>();
- cleanScripts.addAll(getRenameScripts(isMultiDB, dialect));
- cleanScripts.addAll(getInitializationDBScripts(isMultiDB, dialect));
- cleanScripts.addAll(getRemoveIndexesScripts(isMultiDB, dialect));
-
- ArrayList<String> commitScript = new ArrayList<String>();
- commitScript.addAll(getRemoveOldObjectsScripts(isMultiDB, dialect));
- commitScript.addAll(getRestoreIndexesScripts(isMultiDB, dialect));
-
- return new DBCleaner(jdbcConn, cleanScripts, getRollbackScripts(isMultiDB, dialect), commitScript,
- dialect.equalsIgnoreCase(DBConstants.DB_DIALECT_SYBASE));
- }
}
- }
- private static void processingClean(DBCleaner dbCleaner, Connection jdbcConn) throws SQLException
- {
- try
- {
- dbCleaner.executeCleanScripts();
- dbCleaner.executeCommitScripts();
-
- jdbcConn.commit();
- }
- catch (SQLException e)
- {
- jdbcConn.rollback();
-
- dbCleaner.executeRollbackScripts();
- jdbcConn.commit();
- }
- finally
- {
- jdbcConn.close();
- }
+ return dialect;
}
}
Deleted: jcr/branches/1.15.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/clean/rdbms/DBCleaner.java
===================================================================
--- jcr/branches/1.15.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/clean/rdbms/DBCleaner.java 2012-01-17 10:14:22 UTC (rev 5460)
+++ jcr/branches/1.15.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/clean/rdbms/DBCleaner.java 2012-01-17 10:16:32 UTC (rev 5461)
@@ -1,202 +0,0 @@
-/*
- * Copyright (C) 2003-2010 eXo Platform SAS.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Affero General Public License
- * as published by the Free Software Foundation; either version 3
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, see<http://www.gnu.org/licenses/>.
- */
-package org.exoplatform.services.jcr.impl.clean.rdbms;
-
-import org.exoplatform.commons.utils.SecurityHelper;
-import org.exoplatform.services.database.utils.JDBCUtils;
-import org.exoplatform.services.jcr.core.security.JCRRuntimePermissions;
-import org.exoplatform.services.log.ExoLogger;
-import org.exoplatform.services.log.Log;
-
-import java.security.PrivilegedExceptionAction;
-import java.sql.Connection;
-import java.sql.SQLException;
-import java.sql.Statement;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * The goal of this class is removing data from database.
- *
- * @author <a href="karpenko.sergiy at gmail.com">Karpenko Sergiy</a>
- * @version $Id: DBCleaner.java 3769 2011-01-04 15:36:06Z areshetnyak $
- */
-public class DBCleaner
-{
- /**
- * Logger.
- */
- protected final static Log LOG = ExoLogger.getLogger("exo.jcr.component.core.DBClean");
-
- /**
- * Connection to database.
- */
- protected final Connection connection;
-
- /**
- * Common clean scripts for database.
- */
- protected final List<String> cleanScripts = new ArrayList<String>();
-
- /**
- * Rollback scripts for database.
- */
- protected final List<String> rollbackScripts = new ArrayList<String>();
-
- /**
- * Commit scripts for database.
- */
- protected final List<String> commitScripts = new ArrayList<String>();
-
- /**
- * Idicates if executing scripts should be done in autoCommit mode.
- */
- protected final boolean autoCommit;
-
- /**
- * DBCleaner constructor.
- *
- * @param connection
- * connection to database where workspace tables is placed
- * @param cleanScripts
- * scripts for cleaning database
- * @param rollbackScripts
- * scripts for execution when something failed
- * @param commitScripts
- * scripts for removing temporary objects
- * @param dbCleanHelper
- * class which help to clean database by executing special queries
- * @param autoCommit
- * indicates if executing scripts should be done in autoCommit mode
- */
- public DBCleaner(Connection connection, List<String> cleanScripts, List<String> rollbackScripts,
- List<String> commitScripts, boolean autoCommit)
- {
- this.connection = connection;
- this.cleanScripts.addAll(cleanScripts);
- this.rollbackScripts.addAll(rollbackScripts);
- this.commitScripts.addAll(commitScripts);
- this.autoCommit = autoCommit;
- }
-
- /**
- * Clean data from database. The method doesn't close connection or perform commit.
- *
- * @throws SQLException
- * if any errors occurred
- */
- public void executeCleanScripts() throws SQLException
- {
- executeScripts(cleanScripts);
- }
-
- /**
- * Rollback changes. The method doesn't close connection or perform commit.
- *
- * @throws SQLException
- * if any errors occurred
- */
- public void executeRollbackScripts() throws SQLException
- {
- executeScripts(rollbackScripts);
- }
-
- /**
- * Cleaning temporary objects. The method doesn't close connection or perform commit.
- *
- * @throws SQLException
- * if any errors occurred
- */
- public void executeCommitScripts() throws SQLException
- {
- executeScripts(commitScripts);
- }
-
- /**
- * Execute script on database.
- *
- * @param scripts
- * the scripts for execution
- * @param isSkipSQLExceprion
- * boolean, skipping SQLException on rollback.
- * @throws SQLException
- * if any exception occurred
- */
- protected void executeScripts(List<String> scripts) throws SQLException
- {
- SecurityManager security = System.getSecurityManager();
- if (security != null)
- {
- security.checkPermission(JCRRuntimePermissions.MANAGE_REPOSITORY_PERMISSION);
- }
-
- // set the new autoCommit mode if need
- // for example, the Sybase is not allowed DDL query (CREATE TABLE, DROP TABLE, etc. ) within a multi-statement transaction
- boolean autoCommit = connection.getAutoCommit();
- if (this.autoCommit != autoCommit)
- {
- connection.setAutoCommit(this.autoCommit);
- }
-
- Statement st = connection.createStatement();
- try
- {
- for (String scr : scripts)
- {
- String sql = JDBCUtils.cleanWhitespaces(scr.trim());
- if (sql.length() > 0)
- {
- if (LOG.isDebugEnabled())
- {
- LOG.debug("Execute script: \n[" + sql + "]");
- }
-
- executeQuery(st, sql);
- }
- }
- }
- finally
- {
- try
- {
- st.close();
- }
- catch (SQLException e)
- {
- LOG.error("Can't close the Statement." + e);
- }
-
- // restore previous autoCommit mode
- if (this.autoCommit != autoCommit)
- {
- connection.setAutoCommit(autoCommit);
- }
- }
- }
-
- protected void executeQuery(final Statement statement, final String sql) throws SQLException
- {
- SecurityHelper.doPrivilegedSQLExceptionAction(new PrivilegedExceptionAction<Object>()
- {
- public Object run() throws Exception
- {
- statement.executeUpdate(sql);
- return null;
- }
- });
- }
-}
Added: jcr/branches/1.15.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/clean/rdbms/DBCleanerTool.java
===================================================================
--- jcr/branches/1.15.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/clean/rdbms/DBCleanerTool.java (rev 0)
+++ jcr/branches/1.15.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/clean/rdbms/DBCleanerTool.java 2012-01-17 10:16:32 UTC (rev 5461)
@@ -0,0 +1,200 @@
+/*
+ * Copyright (C) 2003-2010 eXo Platform SAS.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Affero General Public License
+ * as published by the Free Software Foundation; either version 3
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see<http://www.gnu.org/licenses/>.
+ */
+package org.exoplatform.services.jcr.impl.clean.rdbms;
+
+import org.exoplatform.commons.utils.SecurityHelper;
+import org.exoplatform.services.database.utils.JDBCUtils;
+import org.exoplatform.services.jcr.core.security.JCRRuntimePermissions;
+import org.exoplatform.services.log.ExoLogger;
+import org.exoplatform.services.log.Log;
+
+import java.security.PrivilegedExceptionAction;
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * The goal of this class is removing data from database.
+ *
+ * @author <a href="karpenko.sergiy at gmail.com">Karpenko Sergiy</a>
+ * @version $Id: DBCleanerTool.java 3769 2011-01-04 15:36:06Z areshetnyak $
+ */
+public class DBCleanerTool
+{
+ /**
+ * Logger.
+ */
+ protected final static Log LOG = ExoLogger.getLogger("exo.jcr.component.core.DBCleaner");
+
+ protected final Connection connection;
+
+ protected final List<String> rollbackingScripts = new ArrayList<String>();
+
+ protected final List<String> committingScripts = new ArrayList<String>();
+
+ protected final List<String> cleaningScripts = new ArrayList<String>();
+
+ /**
+ * DBCleanerTool constructor.
+ *
+ * @param connection
+ * connection to database which will be used in cleaning, take in account DBCleanerTool does not
+ * close connection
+ */
+ DBCleanerTool(Connection connection, Collection<String> cleaningScripts, Collection<String> committingScripts,
+ Collection<String> rollbackingScripts)
+ {
+ this.connection = connection;
+
+ this.cleaningScripts.addAll(cleaningScripts);
+ this.committingScripts.addAll(committingScripts);
+ this.rollbackingScripts.addAll(rollbackingScripts);
+ }
+
+ /**
+ * Clean JCR tables, can't contain some indexes or constraints,
+ * should be added on {@link #commit}. It done for possibility to restore
+ * data without any violations.
+ *
+ * <br>
+ * This method does not invoke commit or rollback on {@link Connection}.
+ *
+ * @throws DBCleanException
+ */
+ public void clean() throws DBCleanException
+ {
+ try
+ {
+ execute(cleaningScripts);
+ }
+ catch (SQLException e)
+ {
+ throw new DBCleanException(e);
+ }
+ }
+
+ /**
+ * Executes SQL scripts for finishing clean operations if needed.
+ * It can be adding indexes, constraints, removing temporary objects etc
+ * (related to specific database) or does nothing.
+ *
+ * <br>
+ * This method does not invoke commit or rollback on {@link Connection}.
+ *
+ * @throws DBCleanException
+ */
+ public void commit() throws DBCleanException
+ {
+ try
+ {
+ execute(committingScripts);
+ }
+ catch (SQLException e)
+ {
+ throw new DBCleanException(e);
+ }
+ }
+
+ /**
+ * Tries to restore previous data by renaming tables etc
+ * (related to specific database) or does nothing.
+ *
+ * <br>
+ * This method does not invoke commit or rollback on {@link Connection}.
+ *
+ * @throws DBCleanException
+ */
+ public void rollback() throws DBCleanException
+ {
+ try
+ {
+ execute(rollbackingScripts);
+ }
+ catch (SQLException e)
+ {
+ throw new DBCleanException(e);
+ }
+ }
+
+ /**
+ * Return connection which it is used in cleaner.
+ */
+ public Connection getConnection()
+ {
+ return connection;
+ }
+
+ /**
+ * Execute script on database.
+ *
+ * @param scripts
+ * the scripts for execution
+ * @throws SQLException
+ */
+ protected void execute(List<String> scripts) throws SQLException
+ {
+ SecurityManager security = System.getSecurityManager();
+ if (security != null)
+ {
+ security.checkPermission(JCRRuntimePermissions.MANAGE_REPOSITORY_PERMISSION);
+ }
+
+ Statement st = connection.createStatement();
+ try
+ {
+ for (String scr : scripts)
+ {
+ String sql = JDBCUtils.cleanWhitespaces(scr.trim());
+ if (!sql.isEmpty())
+ {
+ if (LOG.isDebugEnabled())
+ {
+ LOG.debug("Execute script: \n[" + sql + "]");
+ }
+
+ executeQuery(st, sql);
+ }
+ }
+ }
+ finally
+ {
+ try
+ {
+ st.close();
+ }
+ catch (SQLException e)
+ {
+ LOG.error("Can't close the Statement." + e);
+ }
+ }
+ }
+
+ protected void executeQuery(final Statement statement, final String sql) throws SQLException
+ {
+ SecurityHelper.doPrivilegedSQLExceptionAction(new PrivilegedExceptionAction<Object>()
+ {
+ public Object run() throws Exception
+ {
+ statement.executeUpdate(sql);
+ return null;
+ }
+ });
+ }
+}
Deleted: jcr/branches/1.15.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/clean/rdbms/DummyDBCleaner.java
===================================================================
--- jcr/branches/1.15.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/clean/rdbms/DummyDBCleaner.java 2012-01-17 10:14:22 UTC (rev 5460)
+++ jcr/branches/1.15.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/clean/rdbms/DummyDBCleaner.java 2012-01-17 10:16:32 UTC (rev 5461)
@@ -1,61 +0,0 @@
-/*
- * Copyright (C) 2003-2011 eXo Platform SAS.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Affero General Public License
- * as published by the Free Software Foundation; either version 3
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, see<http://www.gnu.org/licenses/>.
- */
-package org.exoplatform.services.jcr.impl.clean.rdbms;
-
-import java.sql.SQLException;
-import java.util.ArrayList;
-
-/**
- * Created by The eXo Platform SAS.
- *
- * <br/>Date: 2011
- *
- * @author <a href="mailto:alex.reshetnyak at exoplatform.com.ua">Alex Reshetnyak</a>
- * @version $Id: DummyDBCleaner.java 111 2011-11-11 11:11:11Z rainf0x $
- */
-public class DummyDBCleaner extends DBCleaner
-{
-
- /**
- * DummyDBCleaner constructor.
- */
- public DummyDBCleaner()
- {
- super(null, new ArrayList<String>(), new ArrayList<String>(), new ArrayList<String>(), false);
- }
-
- /**
- * {@inheritDoc}
- */
- public void executeCleanScripts() throws SQLException
- {
- }
-
- /**
- * {@inheritDoc}
- */
- public void executeCommitScripts() throws SQLException
- {
- }
-
- /**
- * {@inheritDoc}
- */
- public void executeRollbackScripts() throws SQLException
- {
- }
-}
Added: jcr/branches/1.15.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/clean/rdbms/DummyDBCleanerTool.java
===================================================================
--- jcr/branches/1.15.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/clean/rdbms/DummyDBCleanerTool.java (rev 0)
+++ jcr/branches/1.15.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/clean/rdbms/DummyDBCleanerTool.java 2012-01-17 10:16:32 UTC (rev 5461)
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2003-2011 eXo Platform SAS.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Affero General Public License
+ * as published by the Free Software Foundation; either version 3
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see<http://www.gnu.org/licenses/>.
+ */
+package org.exoplatform.services.jcr.impl.clean.rdbms;
+
+import java.util.ArrayList;
+
+/**
+ * Created by The eXo Platform SAS.
+ *
+ * <br/>Date: 2011
+ *
+ * @author <a href="mailto:alex.reshetnyak at exoplatform.com.ua">Alex Reshetnyak</a>
+ * @version $Id: DummyDBCleaner.java 111 2011-11-11 11:11:11Z rainf0x $
+ */
+public class DummyDBCleanerTool extends DBCleanerTool
+{
+
+ /**
+ * DummyDBCleanerTool constructor.
+ */
+ public DummyDBCleanerTool()
+ {
+ super(null, new ArrayList<String>(), new ArrayList<String>(), new ArrayList<String>());
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void clean() throws DBCleanException
+ {
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void commit() throws DBCleanException
+ {
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void rollback() throws DBCleanException
+ {
+ }
+}
Modified: jcr/branches/1.15.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/cacheable/AbstractCacheableLockManager.java
===================================================================
--- jcr/branches/1.15.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/cacheable/AbstractCacheableLockManager.java 2012-01-17 10:14:22 UTC (rev 5460)
+++ jcr/branches/1.15.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/cacheable/AbstractCacheableLockManager.java 2012-01-17 10:16:32 UTC (rev 5461)
@@ -18,6 +18,7 @@
import org.exoplatform.commons.utils.PrivilegedFileHelper;
import org.exoplatform.commons.utils.PrivilegedSystemHelper;
+import org.exoplatform.commons.utils.SecurityHelper;
import org.exoplatform.management.annotations.Managed;
import org.exoplatform.management.annotations.ManagedDescription;
import org.exoplatform.services.jcr.config.RepositoryConfigurationException;
@@ -67,6 +68,7 @@
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
+import java.security.PrivilegedAction;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
@@ -925,7 +927,15 @@
*/
public void clean() throws BackupException
{
- actualLocks.addAll(getLockList());
+ SecurityHelper.doPrivilegedAction(new PrivilegedAction<Void>()
+ {
+ public Void run()
+ {
+ actualLocks.addAll(getLockList());
+ return null;
+ }
+ });
+
doClean();
}
Modified: jcr/branches/1.15.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/JDBCWorkspaceDataContainer.java
===================================================================
--- jcr/branches/1.15.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/JDBCWorkspaceDataContainer.java 2012-01-17 10:14:22 UTC (rev 5460)
+++ jcr/branches/1.15.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/JDBCWorkspaceDataContainer.java 2012-01-17 10:16:32 UTC (rev 5461)
@@ -39,8 +39,9 @@
import org.exoplatform.services.jcr.impl.backup.rdbms.DataRestoreContext;
import org.exoplatform.services.jcr.impl.backup.rdbms.DirectoryRestore;
import org.exoplatform.services.jcr.impl.backup.rdbms.RestoreTableRule;
+import org.exoplatform.services.jcr.impl.clean.rdbms.DBCleanException;
import org.exoplatform.services.jcr.impl.clean.rdbms.DBCleanService;
-import org.exoplatform.services.jcr.impl.clean.rdbms.DBCleaner;
+import org.exoplatform.services.jcr.impl.clean.rdbms.DBCleanerTool;
import org.exoplatform.services.jcr.impl.core.lock.cacheable.AbstractCacheableLockManager;
import org.exoplatform.services.jcr.impl.core.query.NodeDataIndexingIterator;
import org.exoplatform.services.jcr.impl.core.query.Reindexable;
@@ -1032,18 +1033,14 @@
{
throw new BackupException(e);
}
- catch (NamingException e)
+ catch (IOException e)
{
throw new BackupException(e);
}
- catch (SQLException e)
+ catch (DBCleanException e)
{
throw new BackupException(e);
}
- catch (IOException e)
- {
- throw new BackupException(e);
- }
}
/**
@@ -1275,14 +1272,21 @@
}
tables.put(dstTableName, restoreTableRule);
- DBCleaner dbCleaner = null;
+ DBCleanerTool dbCleaner;
if (context.getObject(DataRestoreContext.DB_CLEANER) != null)
{
- dbCleaner = (DBCleaner)context.getObject(DataRestoreContext.DB_CLEANER);
+ dbCleaner = (DBCleanerTool)context.getObject(DataRestoreContext.DB_CLEANER);
}
else
{
- dbCleaner = DBCleanService.getWorkspaceDBCleaner(jdbcConn, wsConfig);
+ try
+ {
+ dbCleaner = DBCleanService.getWorkspaceDBCleaner(jdbcConn, wsConfig);
+ }
+ catch (DBCleanException e)
+ {
+ throw new BackupException(e);
+ }
}
restorers.add(new DBRestore(storageDir, jdbcConn, tables, wsConfig, swapCleaner, dbCleaner));
Modified: jcr/branches/1.15.x/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/backup/impl/JobExistingRepositorySameConfigRestore.java
===================================================================
--- jcr/branches/1.15.x/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/backup/impl/JobExistingRepositorySameConfigRestore.java 2012-01-17 10:14:22 UTC (rev 5460)
+++ jcr/branches/1.15.x/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/backup/impl/JobExistingRepositorySameConfigRestore.java 2012-01-17 10:16:32 UTC (rev 5461)
@@ -32,8 +32,8 @@
import org.exoplatform.services.jcr.impl.backup.JCRRestore;
import org.exoplatform.services.jcr.impl.backup.rdbms.DataRestoreContext;
import org.exoplatform.services.jcr.impl.clean.rdbms.DBCleanService;
-import org.exoplatform.services.jcr.impl.clean.rdbms.DBCleaner;
-import org.exoplatform.services.jcr.impl.clean.rdbms.DummyDBCleaner;
+import org.exoplatform.services.jcr.impl.clean.rdbms.DBCleanerTool;
+import org.exoplatform.services.jcr.impl.clean.rdbms.DummyDBCleanerTool;
import org.exoplatform.services.jcr.impl.dataflow.persistent.WorkspacePersistentDataManager;
import org.exoplatform.services.jcr.impl.storage.jdbc.JDBCWorkspaceDataContainer;
import org.exoplatform.services.jcr.impl.util.io.FileCleanerHolder;
@@ -89,7 +89,7 @@
Connection jdbcConn = null;
// define one common database cleaner for all restores for single db case
- DBCleaner dbCleaner = null;
+ DBCleanerTool dbCleaner = null;
Boolean isMultiDb =
Boolean.parseBoolean(wsEntry.getContainer().getParameterValue(JDBCWorkspaceDataContainer.MULTIDB));
@@ -143,11 +143,9 @@
if (jdbcConn != null)
{
- if (dbCleaner != null)
+ if (!isMultiDb)
{
- if (isSharedDbCleaner)
- {
- context = new DataRestoreContext(
+ context = new DataRestoreContext(
new String[]{
DataRestoreContext.STORAGE_DIR,
DataRestoreContext.DB_CONNECTION,
@@ -155,22 +153,9 @@
new Object[]{
fullBackupDir,
jdbcConn,
- new DummyDBCleaner()});
- }
- else
- {
- context = new DataRestoreContext(
- new String[]{
- DataRestoreContext.STORAGE_DIR,
- DataRestoreContext.DB_CONNECTION,
- DataRestoreContext.DB_CLEANER},
- new Object[]{
- fullBackupDir,
- jdbcConn,
- dbCleaner});
+ isSharedDbCleaner ? new DummyDBCleanerTool() : dbCleaner});
- isSharedDbCleaner = true;
- }
+ isSharedDbCleaner = true;
}
else
{
Modified: jcr/branches/1.15.x/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/ext/backup/usecase/TestBackupRestore.java
===================================================================
--- jcr/branches/1.15.x/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/ext/backup/usecase/TestBackupRestore.java 2012-01-17 10:14:22 UTC (rev 5460)
+++ jcr/branches/1.15.x/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/ext/backup/usecase/TestBackupRestore.java 2012-01-17 10:16:32 UTC (rev 5461)
@@ -39,8 +39,9 @@
import org.exoplatform.services.jcr.ext.backup.impl.JobRepositoryRestore;
import org.exoplatform.services.jcr.ext.backup.impl.JobWorkspaceRestore;
import org.exoplatform.services.jcr.impl.backup.Backupable;
+import org.exoplatform.services.jcr.impl.clean.rdbms.DBCleanException;
import org.exoplatform.services.jcr.impl.clean.rdbms.DBCleanService;
-import org.exoplatform.services.jcr.impl.clean.rdbms.DBCleaner;
+import org.exoplatform.services.jcr.impl.clean.rdbms.DBCleanerTool;
import org.exoplatform.services.jcr.impl.core.SessionImpl;
import org.exoplatform.services.jcr.impl.core.SessionRegistry;
import org.exoplatform.services.jcr.impl.storage.jdbc.JDBCWorkspaceDataContainer;
@@ -703,28 +704,38 @@
Connection conn = ds.getConnection();
conn.setAutoCommit(false);
- DBCleaner repositoryDBCleaner = DBCleanService.getRepositoryDBCleaner(conn, repository.getConfiguration());
try
{
if (repositoryName.equals("db3"))
{
+ DBCleanerTool repositoryDBCleaner =
+ DBCleanService.getRepositoryDBCleaner(conn, repository.getConfiguration());
+
// clean and rollback first
- repositoryDBCleaner.executeCleanScripts();
+ repositoryDBCleaner.clean();
conn.rollback();
- repositoryDBCleaner.executeRollbackScripts();
+ repositoryDBCleaner.rollback();
conn.commit();
checkConent(repositoryName);
// clean
- repositoryDBCleaner.executeCleanScripts();
- repositoryDBCleaner.executeCommitScripts();
+ repositoryDBCleaner.clean();
+ repositoryDBCleaner.commit();
conn.commit();
}
else
{
- assertNull(repositoryDBCleaner);
+ try
+ {
+ DBCleanerTool repositoryDBCleaner =
+ DBCleanService.getRepositoryDBCleaner(conn, repository.getConfiguration());
+ fail("Exception should be thrown");
+ }
+ catch (DBCleanException e)
+ {
+ }
}
}
finally
@@ -752,22 +763,22 @@
conn = ds.getConnection();
conn.setAutoCommit(false);
- DBCleaner workspaceDBCleaner = DBCleanService.getWorkspaceDBCleaner(conn, wsEntry);
+ DBCleanerTool workspaceDBCleaner = DBCleanService.getWorkspaceDBCleaner(conn, wsEntry);
try
{
// clean and rollback first
- workspaceDBCleaner.executeCleanScripts();
+ workspaceDBCleaner.clean();
conn.rollback();
- workspaceDBCleaner.executeRollbackScripts();
+ workspaceDBCleaner.rollback();
conn.commit();
checkConent(repositoryName);
// clean
- workspaceDBCleaner.executeCleanScripts();
- workspaceDBCleaner.executeCommitScripts();
+ workspaceDBCleaner.clean();
+ workspaceDBCleaner.commit();
conn.commit();
}
finally
More information about the exo-jcr-commits
mailing list