diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DatabaseCreationUtil.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DatabaseCreationUtil.java index a7f90cdd2e1e44463de2b70dfe69dbee6c1ab3e4..e966e833546b096fd0dd942fac6a85367e03d2ae 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DatabaseCreationUtil.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DatabaseCreationUtil.java @@ -19,6 +19,7 @@ package ch.systemsx.cisd.openbis.generic.server.dataaccess.db; import java.io.File; import java.io.IOException; +import org.apache.commons.lang.StringUtils; import org.hibernate.SessionFactory; import org.springframework.beans.factory.BeanFactory; import org.springframework.context.support.AbstractApplicationContext; @@ -41,27 +42,66 @@ import ch.systemsx.cisd.openbis.generic.server.dataaccess.db.search.IndexMode; */ public final class DatabaseCreationUtil { + private static final String LUCENE_INDICES = "sourceTest/lucene/indices"; + private static BeanFactory beanFactory; + private static HibernateSearchContext hibernateSearchContext; + + static + { + LogInitializer.init(); + // Deactivate the indexing in the application context loaded by Spring. + System.setProperty("hibernate.search.index-mode", "NO_INDEX"); + System.setProperty("hibernate.search.index-base", LUCENE_INDICES); + } + public static void main(final String[] args) throws Exception { - if (args.length != 1) + if (args.length == 0 || args.length > 2) { System.out.println("Usage: java " + DatabaseCreationUtil.class.getName() - + " <database version>"); + + "[--reindex[=true|false]] <database version>"); System.exit(1); } - final String databaseVersion = args[0]; - createFilesFromADumpOfAMigratedDatabase(databaseVersion); + final String databaseVersion; + boolean reindex = false; + if (args.length == 1) + { + reindex = false; + databaseVersion = args[0]; + } else + { + if (args[0].startsWith("--reindex")) + { + if (args[0].indexOf('=') > -1) + { + reindex = Boolean.parseBoolean(StringUtils.split(args[0], '=')[1]); + } else + { + reindex = true; + } + } + databaseVersion = args[1]; + } + // If reindexing is asked, creating a HibernateSearchContext should be done before the + // Spring application context gets loaded because HibernateSearchContext removes the whole + // indices directory. + if (reindex) + { + hibernateSearchContext = createHibernateSearchContext(); + hibernateSearchContext.afterPropertiesSet(); + } + createFilesFromADumpOfAMigratedDatabase(databaseVersion, reindex); } - private final static BeanFactory getBeanFactory(final String xmlConfigurationContextName) + private final static BeanFactory getBeanFactory() { if (beanFactory == null) { final AbstractApplicationContext applicationContext = new ClassPathXmlApplicationContext(new String[] - { xmlConfigurationContextName }, true); + { "applicationContext.xml" }, true); DatabaseCreationUtil.beanFactory = applicationContext; } return beanFactory; @@ -70,11 +110,12 @@ public final class DatabaseCreationUtil /** * Creates all files in <code>sourceTest/sql/postgresql</code> necessary to set up a database * of the current version by dumping a database migrated from the specified version. + * + * @param reindex */ - private final static void createFilesFromADumpOfAMigratedDatabase(final String databaseVersion) - throws IOException + private final static void createFilesFromADumpOfAMigratedDatabase(final String databaseVersion, + final boolean reindex) throws Exception { - LogInitializer.init(); final String databaseKind = "migration_dump"; final DatabaseConfigurationContext context = createDatabaseConfigurationContext(databaseKind); @@ -83,38 +124,37 @@ public final class DatabaseCreationUtil DBMigrationEngine.createOrMigrateDatabaseAndGetScriptProvider(context, databaseVersion); context.setCreateFromScratch(false); - context.setScriptFolder("../openbis/source/sql"); + context.setScriptFolder("source/sql"); DBMigrationEngine.createOrMigrateDatabaseAndGetScriptProvider(context, DatabaseVersionHolder.getDatabaseVersion()); createDumpForJava(databaseKind, scriptProvider.getDumpFolder(DatabaseVersionHolder .getDatabaseVersion())); scriptProvider.markAsDumpRestorable(DatabaseVersionHolder.getDatabaseVersion()); - performFullTextIndex(databaseKind); + if (reindex) + { + performFullTextIndex(databaseKind); + } } /** * Performs a full text index because the test database has been migrated. */ - private final static void performFullTextIndex(final String databaseKind) + private final static void performFullTextIndex(final String databaseKind) throws Exception { - final BeanFactory factory = getBeanFactory("commonContext.xml"); + final BeanFactory factory = getBeanFactory(); final FullTextIndexerRunnable fullTextIndexer = new FullTextIndexerRunnable((SessionFactory) factory - .getBean("hibernate-session-factory"), - createHibernateSearchContext(factory)); + .getBean("hibernate-session-factory"), hibernateSearchContext); fullTextIndexer.run(); } /** - * Adapts the {@link HibernateSearchContext} laoded by <i>Spring</i>. - * - * @param factory + * Creates a freshly new {@link HibernateSearchContext} overriding the one loaded by <i>Spring</i>. */ - private final static HibernateSearchContext createHibernateSearchContext( - final BeanFactory factory) + private final static HibernateSearchContext createHibernateSearchContext() { final HibernateSearchContext context = new HibernateSearchContext(); - context.setIndexBase("sourceTest/lucene/indices"); + context.setIndexBase(LUCENE_INDICES); context.setIndexMode(IndexMode.INDEX_FROM_SCRATCH); return context; } @@ -126,7 +166,6 @@ public final class DatabaseCreationUtil private static final void createDumpForJava(final String databaseKind, final File destinationDir) throws IOException { - LogInitializer.init(); final String dataBaseName = "lims_" + databaseKind; final File dumpFile = new File("targets/dump.sql"); final boolean ok = DumpPreparator.createDatabaseDump(dataBaseName, dumpFile); @@ -143,7 +182,7 @@ public final class DatabaseCreationUtil public final static DatabaseConfigurationContext createDatabaseConfigurationContext( final String databaseKind) { - final BeanFactory factory = getBeanFactory("dbConfigurationContext.xml"); + final BeanFactory factory = getBeanFactory(); final DatabaseConfigurationContext configurationContext = (DatabaseConfigurationContext) factory.getBean("db-configuration-context"); configurationContext.setDatabaseKind(databaseKind);