/*
* 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.scripts;
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.impl.clean.rdbms.DBCleanException;
import org.exoplatform.services.jcr.impl.storage.jdbc.DBConstants;
import org.exoplatform.services.jcr.impl.util.jdbc.DBInitializerHelper;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
/**
* @author <a href="abazko@exoplatform.com">Anatoliy Bazko</a>
* @version $Id: DBCleanScipts.java 34360 2009-07-22 23:58:59Z tolusha $
*/
public abstract class DBCleaningScripts
{
protected String itemTableName;
protected String valueTableName;
protected String refTableName;
protected String itemTableSuffix;
protected String valueTableSuffix;
protected String refTableSuffix;
protected boolean useSequence;
protected final String dialect;
protected final String workspaceName;
protected final boolean multiDb;
protected final List<String> cleaningScripts = new ArrayList<String>();
protected final List<String> committingScripts = new ArrayList<String>();
protected final List<String> rollbackingScripts = new ArrayList<String>();
protected final WorkspaceEntry wsEntry;
/**
* DBCleaningScripts constructor.
*
* @throws DBCleanException
*/
DBCleaningScripts(String dialect, RepositoryEntry rEntry) throws DBCleanException
{
for (WorkspaceEntry wsEntry : rEntry.getWorkspaceEntries())
{
try
{
if (DBInitializerHelper.getDatabaseType(wsEntry).isMultiDatabase())
{
throw new DBCleanException("Not supported operation.");
}
}
catch (RepositoryConfigurationException e)
{
throw new DBCleanException(e);
}
}
this.multiDb = false;
this.workspaceName = null;
this.dialect = dialect;
this.wsEntry = rEntry.getWorkspaceEntries().get(0);
initTableNames(wsEntry);
}
/**
* DBCleaningScripts constructor.
*
* @throws DBCleanException
*/
DBCleaningScripts(String dialect, WorkspaceEntry wsEntry) throws DBCleanException
{
try
{
this.multiDb = DBInitializerHelper.getDatabaseType(wsEntry).isMultiDatabase();
}
catch (RepositoryConfigurationException e)
{
throw new DBCleanException(e);
}
this.workspaceName = wsEntry.getName();
this.dialect = dialect;
this.wsEntry = wsEntry;
initTableNames(wsEntry);
}
/**
* Returns {@link #cleaningScripts}.
*/
public Collection<String> getCleaningScripts()
{
return cleaningScripts;
}
/**
* Returns {@link #committingScripts}.
*/
public Collection<String> getCommittingScripts()
{
return committingScripts;
}
/**
* Returns {@link #rollbackingScripts}.
*/
public Collection<String> getRollbackingScripts()
{
return rollbackingScripts;
}
/**
* Prepares scripts for renaming approach database cleaning.
*
* @throws DBCleanException
*/
protected void prepareRenamingApproachScripts() throws DBCleanException
{
cleaningScripts.addAll(getTablesRenamingScripts());
cleaningScripts.addAll(getDBInitializationScripts());
cleaningScripts.addAll(getFKRemovingScripts());
cleaningScripts.addAll(getConstraintsRemovingScripts());
cleaningScripts.addAll(getIndexesDroppingScripts());
committingScripts.addAll(getOldTablesDroppingScripts());
committingScripts.addAll(getIndexesAddingScripts());
committingScripts.addAll(getConstraintsAddingScripts());
committingScripts.addAll(getFKAddingScripts());
rollbackingScripts.addAll(getTablesDroppingScripts());
rollbackingScripts.addAll(getOldTablesRenamingScripts());
}
/**
* Prepares scripts for dropping tables approach database cleaning.
*
* @throws DBCleanException
*/
protected void prepareDroppingTablesApproachScripts() throws DBCleanException
{
cleaningScripts.addAll(getTablesDroppingScripts());
cleaningScripts.addAll(getDBInitializationScripts());
cleaningScripts.addAll(getFKRemovingScripts());
cleaningScripts.addAll(getIndexesDroppingScripts());
committingScripts.addAll(getIndexesAddingScripts());
committingScripts.addAll(getFKAddingScripts());
}
/**
* Prepares scripts for simple cleaning database.
*/
protected void prepareSimpleCleaningApproachScripts()
{
cleaningScripts.addAll(getFKRemovingScripts());
cleaningScripts.addAll(getSingleDbWorkspaceCleaningScripts());
committingScripts.addAll(getFKAddingScripts());
rollbackingScripts.addAll(getFKAddingScripts());
}
/**
* Returns SQL scripts for adding constraints.
*/
protected Collection<String> getConstraintsAddingScripts()
{
return new ArrayList<String>();
}
/**
* Returns SQL scripts for removing constraints.
*/
protected Collection<String> getConstraintsRemovingScripts()
{
return new ArrayList<String>();
}
/**
* Returns SQL scripts for renaming new JCR tables to new ones.
*/
protected Collection<String> getOldTablesRenamingScripts() throws DBCleanException
{
return new ArrayList<String>();
}
/**
* Returns SQL scripts for renaming JCR tables to new ones.
*/
protected Collection<String> getTablesRenamingScripts()
{
return new ArrayList<String>();
}
/**
* Returns SQL scripts for removing indexes.
*/
protected Collection<String> getIndexesDroppingScripts()
{
return new ArrayList<String>();
}
/**
* Returns SQL scripts for adding indexes.
*
* @throws DBCleanException
*/
protected Collection<String> getIndexesAddingScripts() throws DBCleanException
{
return new ArrayList<String>();
}
/**
* Returns SQL scripts for removing FK on JCR_ITEM table.
*/
protected Collection<String> getFKRemovingScripts()
{
List<String> scripts = new ArrayList<String>();
String constraintName = "JCR_FK_" + itemTableSuffix + "_PARENT";
scripts.add("ALTER TABLE " + itemTableName + " " + constraintDroppingSyntax() + " " + constraintName);
return scripts;
}
/**
* Returns SQL scripts for adding FK on JCR_ITEM table.
*/
protected Collection<String> getFKAddingScripts()
{
List<String> scripts = new ArrayList<String>();
String constraintName =
"JCR_FK_" + itemTableSuffix + "_PARENT FOREIGN KEY(PARENT_ID) REFERENCES " + itemTableName + "(ID)";
scripts.add("ALTER TABLE " + itemTableName + " ADD CONSTRAINT " + constraintName);
return scripts;
}
/**
* Returns SQL scripts for dropping existed old JCR tables.
*/
protected Collection<String> getOldTablesDroppingScripts()
{
List<String> scripts = new ArrayList<String>();
scripts.add("DROP TABLE " + valueTableName + "_OLD");
scripts.add("DROP TABLE " + refTableName + "_OLD");
scripts.add("DROP TABLE " + itemTableName + "_OLD");
return scripts;
}
/**
* Returns SQL scripts for dropping existed JCR tables.
*/
protected Collection<String> getTablesDroppingScripts()
{
List<String> scripts = new ArrayList<String>();
scripts.add("DROP TABLE " + valueTableName);
scripts.add("DROP TABLE " + refTableName);
scripts.add("DROP TABLE " + itemTableName);
return scripts;
}
/**
*
* @return
*/
protected Collection<String> getSingleDbWorkspaceCleaningScripts()
{
List<String> scripts = new ArrayList<String>();
scripts.add("delete from JCR_SVALUE where PROPERTY_ID IN (select ID from JCR_SITEM where CONTAINER_NAME='"
+ workspaceName + "')");
scripts.add("delete from JCR_SREF where PROPERTY_ID IN (select ID from JCR_SITEM where CONTAINER_NAME='"
+ workspaceName + "')");
scripts.add("delete from JCR_SITEM where CONTAINER_NAME='" + workspaceName + "'");
return scripts;
}
/**
* Returns SQL scripts for database initalization.
* @throws DBCleanException
*/
protected Collection<String> getDBInitializationScripts() throws DBCleanException
{
String dbScripts;
try
{
dbScripts = DBInitializerHelper.prepareScripts(wsEntry, dialect);
}
catch (IOException e)
{
throw new DBCleanException(e);
}
catch (RepositoryConfigurationException e)
{
throw new DBCleanException(e);
}
List<String> scripts = new ArrayList<String>();
for (String query : JDBCUtils.splitWithSQLDelimiter(dbScripts))
{
if (query.contains(itemTableName + "_SEQ") || query.contains(itemTableName + "_NEXT_VAL"))
{
continue;
}
scripts.add(JDBCUtils.cleanWhitespaces(query));
}
scripts.add(DBInitializerHelper.getRootNodeInitializeScript(itemTableName, multiDb));
return scripts;
}
/**
* Returns the syntax for dropping constraint on database.
*/
protected String constraintDroppingSyntax()
{
return "DROP CONSTRAINT";
}
private void initTableNames(WorkspaceEntry wsConfig) throws DBCleanException
{
try
{
itemTableName = DBInitializerHelper.getItemTableName(wsConfig);
refTableName = DBInitializerHelper.getRefTableName(wsConfig);
valueTableName = DBInitializerHelper.getValueTableName(wsConfig);
itemTableSuffix = DBInitializerHelper.getItemTableSuffix(wsConfig);
valueTableSuffix = DBInitializerHelper.getValueTableSuffix(wsConfig);
refTableSuffix = DBInitializerHelper.getRefTableSuffix(wsConfig);
useSequence= DBInitializerHelper.useSequenceForOrderNumber(wsConfig,this.dialect) ;
}
catch (RepositoryConfigurationException e)
{
throw new DBCleanException(e);
}
}
}