diff --git a/config/alfresco/bootstrap-context.xml b/config/alfresco/bootstrap-context.xml index bf498f5eb5..8a34820730 100644 --- a/config/alfresco/bootstrap-context.xml +++ b/config/alfresco/bootstrap-context.xml @@ -72,6 +72,9 @@ ${system.hibernateMaxExecutions} + + ${db.schema.name} + ${db.schema.update} diff --git a/config/alfresco/repository.properties b/config/alfresco/repository.properties index 83a512d3a7..6559281e8e 100644 --- a/config/alfresco/repository.properties +++ b/config/alfresco/repository.properties @@ -349,6 +349,7 @@ lucene.defaultAnalyserResourceBundleName=alfresco/model/dataTypeAnalyzers transformer.Archive.includeContents=false # Database configuration +db.schema.name= db.schema.stopAfterSchemaBootstrap=false db.schema.update=true db.schema.update.lockRetryCount=24 diff --git a/source/java/org/alfresco/repo/domain/schema/SchemaBootstrap.java b/source/java/org/alfresco/repo/domain/schema/SchemaBootstrap.java index 611cee4703..cac0647cb6 100644 --- a/source/java/org/alfresco/repo/domain/schema/SchemaBootstrap.java +++ b/source/java/org/alfresco/repo/domain/schema/SchemaBootstrap.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2010 Alfresco Software Limited. + * Copyright (C) 2005-2013 Alfresco Software Limited. * * This file is part of Alfresco * @@ -75,10 +75,10 @@ import org.alfresco.repo.domain.hibernate.dialect.AlfrescoSQLServerDialect; import org.alfresco.repo.domain.hibernate.dialect.AlfrescoSybaseAnywhereDialect; import org.alfresco.repo.domain.patch.AppliedPatchDAO; import org.alfresco.service.cmr.repository.ContentWriter; -import org.alfresco.service.descriptor.Descriptor; import org.alfresco.service.descriptor.DescriptorService; import org.alfresco.util.DatabaseMetaDataHelper; import org.alfresco.util.LogUtil; +import org.alfresco.util.PropertyCheck; import org.alfresco.util.TempFileProvider; import org.alfresco.util.schemacomp.ExportDb; import org.alfresco.util.schemacomp.MultiFileDumper; @@ -259,7 +259,8 @@ public class SchemaBootstrap extends AbstractLifecycleBean private int schemaUpdateLockRetryWaitSeconds = DEFAULT_LOCK_RETRY_WAIT_SECONDS; private int maximumStringLength; private Properties globalProperties; - + private String dbSchemaName; + private ThreadLocal executedStatementsThreadLocal = new ThreadLocal(); public SchemaBootstrap() @@ -406,8 +407,18 @@ public class SchemaBootstrap extends AbstractLifecycleBean { ActionQueue.setMAX_EXECUTIONS_SIZE(hibernateMaxExecutions); } - - + + /** + * Set db.schema.name to be used + */ + public void setDbSchemaName(String dbSchemaName) + { + if (PropertyCheck.isValidPropertyString(dbSchemaName)) + { + this.dbSchemaName = dbSchemaName; + } + } + /** * Sets the properties map from which we look up some configuration settings. * @@ -552,7 +563,8 @@ public class SchemaBootstrap extends AbstractLifecycleBean */ private int countAppliedPatches(Configuration cfg, Connection connection) throws Exception { - String defaultSchema = DatabaseMetaDataHelper.getSchema(connection); + String defaultSchema = dbSchemaName != null ? dbSchemaName : DatabaseMetaDataHelper.getSchema(connection); + if (defaultSchema != null && defaultSchema.length() == 0) { defaultSchema = null; @@ -1008,9 +1020,10 @@ public class SchemaBootstrap extends AbstractLifecycleBean setHistory("full"). setJobExecutorActivate(false). buildProcessEngine(); - + + String schemaName = dbSchemaName != null ? dbSchemaName : DatabaseMetaDataHelper.getSchema(connection); // create or upgrade the DB schema - engine.getManagementService().databaseSchemaUpgrade(connection, null, DatabaseMetaDataHelper.getSchema(connection)); + engine.getManagementService().databaseSchemaUpgrade(connection, null, schemaName); } finally { @@ -1853,8 +1866,8 @@ public class SchemaBootstrap extends AbstractLifecycleBean XMLToSchema xmlToSchema = new XMLToSchema(is); xmlToSchema.parse(); Schema reference = xmlToSchema.getSchema(); - ExportDb exporter = new ExportDb(dataSource, dialect, descriptorService); + exporter.setDbSchemaName(dbSchemaName); // Ensure that the database objects we're validating are filtered // by the same prefix as the reference file. exporter.setNamePrefix(reference.getDbPrefix()); @@ -2030,11 +2043,11 @@ public class SchemaBootstrap extends AbstractLifecycleBean if (dbPrefixes == null) { - dumper = new MultiFileDumper(outputDir, fileNameTemplate, dbToXMLFactory); + dumper = new MultiFileDumper(outputDir, fileNameTemplate, dbToXMLFactory, dbSchemaName); } else { - dumper = new MultiFileDumper(dbPrefixes, outputDir, fileNameTemplate, dbToXMLFactory); + dumper = new MultiFileDumper(dbPrefixes, outputDir, fileNameTemplate, dbToXMLFactory, dbSchemaName); } List files = dumper.dumpFiles(); diff --git a/source/java/org/alfresco/util/schemacomp/DbToXML.java b/source/java/org/alfresco/util/schemacomp/DbToXML.java index 56d9645cf7..c347be0553 100644 --- a/source/java/org/alfresco/util/schemacomp/DbToXML.java +++ b/source/java/org/alfresco/util/schemacomp/DbToXML.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2011 Alfresco Software Limited. + * Copyright (C) 2005-2013 Alfresco Software Limited. * * This file is part of Alfresco * @@ -41,7 +41,8 @@ public class DbToXML private ApplicationContext context; private File outputFile; private String namePrefix = "alf_"; - + private String dbSchemaName; + /** * Constructor. Uses a default name prefix of 'alf_' during the export. */ @@ -61,12 +62,22 @@ public class DbToXML this(context, outputFile); this.namePrefix = namePrefix; } - + + /** + * Set an optional default schema name + * + * @param dbSchemaName + */ + public void setDbSchemaName(String dbSchemaName) + { + this.dbSchemaName = dbSchemaName; + } public void execute() { ExportDb exporter = new ExportDb(context); exporter.setNamePrefix(namePrefix); + exporter.setDbSchemaName(dbSchemaName); exporter.execute(); Schema schema = exporter.getSchema(); // Write to a string buffer and then write the results to a file diff --git a/source/java/org/alfresco/util/schemacomp/ExportDb.java b/source/java/org/alfresco/util/schemacomp/ExportDb.java index 98764cec41..53bbc83efd 100644 --- a/source/java/org/alfresco/util/schemacomp/ExportDb.java +++ b/source/java/org/alfresco/util/schemacomp/ExportDb.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2011 Alfresco Software Limited. + * Copyright (C) 2005-2013 Alfresco Software Limited. * * This file is part of Alfresco * @@ -70,6 +70,9 @@ public class ExportDb /** Only top-level tables starting with namePrefix will be exported, set to empty string for all objects */ private String namePrefix = "alf_"; + /** Default schema name to use */ + private String dbSchemaName; + private final static Log log = LogFactory.getLog(ExportDb.class); @@ -390,6 +393,11 @@ public class ExportDb */ private String getSchemaName(final DatabaseMetaData dbmd) throws SQLException { + if (this.dbSchemaName != null) + { + return this.dbSchemaName; + } + String schemaName = null; final ResultSet schemas = dbmd.getSchemas(); while (schemas.next()) @@ -512,4 +520,14 @@ public class ExportDb { this.namePrefix = namePrefix; } + + /** + * Set the default schema name + * + * @param dbSchemaName the default schema name + */ + public void setDbSchemaName(String dbSchemaName) + { + this.dbSchemaName = dbSchemaName; + } } diff --git a/source/java/org/alfresco/util/schemacomp/MultiFileDumper.java b/source/java/org/alfresco/util/schemacomp/MultiFileDumper.java index 66e3d0f79b..c04de0afbe 100644 --- a/source/java/org/alfresco/util/schemacomp/MultiFileDumper.java +++ b/source/java/org/alfresco/util/schemacomp/MultiFileDumper.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2012 Alfresco Software Limited. + * Copyright (C) 2005-2013 Alfresco Software Limited. * * This file is part of Alfresco * @@ -47,6 +47,7 @@ public class MultiFileDumper private final DbToXMLFactory dbToXMLFactory; private final static String fileNameSuffix = ".xml"; public final static String[] DEFAULT_PREFIXES = new String[] { "alf_", "avm_", "jbpm_", "act_" }; + private String defaultSchemaName; /** @@ -56,8 +57,9 @@ public class MultiFileDumper * @param directory * @param fileNameTemplate * @param dbToXMLFactory + * @param defaultSchemaName */ - public MultiFileDumper(String[] dbPrefixes, File directory, String fileNameTemplate, DbToXMLFactory dbToXMLFactory) + public MultiFileDumper(String[] dbPrefixes, File directory, String fileNameTemplate, DbToXMLFactory dbToXMLFactory, String defaultSchemaName) { ParameterCheck.mandatory("dbPrefixes", dbPrefixes); ParameterCheck.mandatory("directory", directory); @@ -72,6 +74,7 @@ public class MultiFileDumper this.directory = directory; this.fileNameTemplate = fileNameTemplate; this.dbToXMLFactory = dbToXMLFactory; + this.defaultSchemaName = defaultSchemaName; } @@ -82,10 +85,11 @@ public class MultiFileDumper * @param directory * @param fileNameTemplate * @param dbToXMLFactory + * @param defaultSchemaName can be null */ - public MultiFileDumper(File directory, String fileNameTemplate, DbToXMLFactory dbToXMLFactory) + public MultiFileDumper(File directory, String fileNameTemplate, DbToXMLFactory dbToXMLFactory, String defaultSchemaName) { - this(DEFAULT_PREFIXES, directory, fileNameTemplate, dbToXMLFactory); + this(DEFAULT_PREFIXES, directory, fileNameTemplate, dbToXMLFactory, defaultSchemaName); } @@ -99,6 +103,7 @@ public class MultiFileDumper File outputFile = TempFileProvider.createTempFile(fileNamePrefix, fileNameSuffix, directory); files.add(outputFile); DbToXML dbToXML = dbToXMLFactory.create(outputFile, dbPrefix); + dbToXML.setDbSchemaName(defaultSchemaName); dbToXML.execute(); } diff --git a/source/test-java/org/alfresco/util/schemacomp/MultiFileDumperTest.java b/source/test-java/org/alfresco/util/schemacomp/MultiFileDumperTest.java index f84d8e40ba..9468a7d35d 100644 --- a/source/test-java/org/alfresco/util/schemacomp/MultiFileDumperTest.java +++ b/source/test-java/org/alfresco/util/schemacomp/MultiFileDumperTest.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2012 Alfresco Software Limited. + * Copyright (C) 2005-2013 Alfresco Software Limited. * * This file is part of Alfresco * @@ -61,14 +61,14 @@ public class MultiFileDumperTest public void exceptionThrownWhenZeroPrefixesUsed() { // Shouldn't be able to construct a dumper with no prefixes to dump. - new MultiFileDumper(new String[] {}, TempFileProvider.getTempDir(), "", dbToXMLFactory); + new MultiFileDumper(new String[] {}, TempFileProvider.getTempDir(), "", dbToXMLFactory, null); } @Test(expected=IllegalArgumentException.class) public void exceptionThrownWhenNullPrefixListUsed() { // Shouldn't be able to construct a dumper with no prefixes to dump. - new MultiFileDumper(null, TempFileProvider.getTempDir(), "", dbToXMLFactory); + new MultiFileDumper(null, TempFileProvider.getTempDir(), "", dbToXMLFactory, null); } @@ -79,7 +79,7 @@ public class MultiFileDumperTest File directory = TempFileProvider.getTempDir(); String fileNamePattern = "SchemaDump-MySQL-{0}-"; - MultiFileDumper dumper = new MultiFileDumper(prefixes, directory, fileNamePattern, dbToXMLFactory); + MultiFileDumper dumper = new MultiFileDumper(prefixes, directory, fileNamePattern, dbToXMLFactory, null); when(dbToXMLFactory.create(argThat(isFileNameStartingWith("SchemaDump-MySQL-a_-")), eq("a_"))). thenReturn(dbToXMLForA); @@ -106,7 +106,7 @@ public class MultiFileDumperTest File directory = TempFileProvider.getTempDir(); String fileNamePattern = "SchemaDump-MySQL-{0}-"; - MultiFileDumper dumper = new MultiFileDumper(directory, fileNamePattern, dbToXMLFactory); + MultiFileDumper dumper = new MultiFileDumper(directory, fileNamePattern, dbToXMLFactory, null); Map xmlExporters = new HashMap(MultiFileDumper.DEFAULT_PREFIXES.length);