diff --git a/source/java/org/alfresco/util/schemacomp/DbToXML.java b/source/java/org/alfresco/util/schemacomp/DbToXML.java new file mode 100644 index 0000000000..4bbdc30070 --- /dev/null +++ b/source/java/org/alfresco/util/schemacomp/DbToXML.java @@ -0,0 +1,100 @@ +/* + * Copyright (C) 2005-2011 Alfresco Software Limited. + * + * This file is part of Alfresco + * + * Alfresco 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 3 of the License, or + * (at your option) any later version. + * + * Alfresco 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 Alfresco. If not, see . + */ +package org.alfresco.util.schemacomp; + +import java.io.File; + +import javax.xml.transform.stream.StreamResult; + +import org.alfresco.util.schemacomp.model.Schema; +import org.springframework.context.ApplicationContext; +import org.springframework.context.support.FileSystemXmlApplicationContext; + +/** + * Tool to export a database schema to an XML file. + * + * @author Matt Ward + */ +public class DbToXML +{ + private ApplicationContext context; + private File outputFile; + private String namePrefix = "alf_"; + + /** + * Constructor. Uses a default name prefix of 'alf_' during the export. + */ + public DbToXML(ApplicationContext context, File outputFile) + { + this.context = context; + this.outputFile = outputFile; + } + + + /** + * Constructor. Allows specification of a name prefix, e.g. "jpbm_", that + * will be used during the export. + */ + public DbToXML(ApplicationContext context, File outputFile, String namePrefix) + { + this(context, outputFile); + this.namePrefix = namePrefix; + } + + + public void execute() + { + ExportDb exporter = null; + try + { + exporter = new ExportDb(context); + exporter.setNamePrefix(namePrefix); + exporter.execute(); + } + catch (Exception e) + { + System.err.println("Unable to read database schema."); + e.printStackTrace(); + System.exit(1); + } + + if (exporter != null) + { + Schema schema = exporter.getSchema(); + SchemaToXML schemaToXML = new SchemaToXML(schema, new StreamResult(outputFile)); + schemaToXML.execute(); + } + } + + + public static void main(String[] args) + { + if (args.length != 2) + { + System.err.println("Usage:"); + System.err.println("java " + DbToXML.class.getName() + " "); + System.exit(1); + } + String contextPath = args[0]; + File outputFile = new File(args[1]); + ApplicationContext context = new FileSystemXmlApplicationContext(contextPath); + DbToXML dbToXML = new DbToXML(context, outputFile); + dbToXML.execute(); + } +} diff --git a/source/java/org/alfresco/util/schemacomp/DbToXMLTest.java b/source/java/org/alfresco/util/schemacomp/DbToXMLTest.java new file mode 100644 index 0000000000..e17692a5be --- /dev/null +++ b/source/java/org/alfresco/util/schemacomp/DbToXMLTest.java @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2005-2011 Alfresco Software Limited. + * + * This file is part of Alfresco + * + * Alfresco 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 3 of the License, or + * (at your option) any later version. + * + * Alfresco 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 Alfresco. If not, see . + */ +package org.alfresco.util.schemacomp; + + +import java.io.File; + +import org.alfresco.util.ApplicationContextHelper; +import org.alfresco.util.TempFileProvider; +import org.junit.Test; +import org.springframework.context.ApplicationContext; + +/** + * Tests for the DbToXML class. + * + * @author Matt Ward + */ +public class DbToXMLTest +{ + @Test + public void execute() + { + ApplicationContext ctx = ApplicationContextHelper.getApplicationContext(); + File outFile = new File(TempFileProvider.getTempDir(), getClass().getSimpleName() + ".xml"); + System.out.println("Writing to temp file: " + outFile); + DbToXML dbToXML = new DbToXML(ctx, outFile); + dbToXML.execute(); + } +} diff --git a/source/java/org/alfresco/util/schemacomp/ExportDb.java b/source/java/org/alfresco/util/schemacomp/ExportDb.java index 477707d865..753daf2882 100644 --- a/source/java/org/alfresco/util/schemacomp/ExportDb.java +++ b/source/java/org/alfresco/util/schemacomp/ExportDb.java @@ -57,6 +57,8 @@ public class ExportDb private Schema schema; private Dialect dialect; + + private String namePrefix = "%"; @@ -114,20 +116,34 @@ public class ExportDb - public void execute() throws Exception + public void execute() { PropertyCheck.mandatory(this, "dataSource", dataSource); - // Get a Connection - Connection connection = dataSource.getConnection(); + Connection connection = null; try { + connection = dataSource.getConnection(); connection.setAutoCommit(false); execute(connection); } + catch (Exception e) + { + throw new RuntimeException("Unable to execute export.", e); + } finally { - try { connection.close(); } catch (Throwable e) {} + try + { + if (connection != null) + { + connection.close(); + } + } + catch (Throwable e) + { + // Little can be done at this stage. + } } } @@ -154,7 +170,7 @@ public class ExportDb schema = new Schema(schemaName); - final ResultSet tables = dbmd.getTables(null, schemaName, "%", new String[] + final ResultSet tables = dbmd.getTables(null, schemaName, namePrefixFilter(), new String[] { "TABLE", "VIEW" }); @@ -282,6 +298,7 @@ public class ExportDb tables.close(); } + /** * Convert a boolean string as used in the database, to a boolean value. * @@ -356,9 +373,31 @@ public class ExportDb { return this.schema; } + + /** + * @return the namePrefix + */ + public String getNamePrefix() + { + return this.namePrefix; + } + + private String namePrefixFilter() + { + return namePrefix + "%"; + } + - + /** + * @param namePrefix the namePrefix to set + */ + public void setNamePrefix(String namePrefix) + { + this.namePrefix = namePrefix; + } + + public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException { ExportDb exportDb = null; diff --git a/source/java/org/alfresco/util/schemacomp/ExportDbTest.java b/source/java/org/alfresco/util/schemacomp/ExportDbTest.java index d163415e1b..1a4b099bed 100644 --- a/source/java/org/alfresco/util/schemacomp/ExportDbTest.java +++ b/source/java/org/alfresco/util/schemacomp/ExportDbTest.java @@ -19,6 +19,10 @@ package org.alfresco.util.schemacomp; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.fail; + import java.util.Iterator; import org.alfresco.util.ApplicationContextHelper; @@ -29,7 +33,6 @@ import org.alfresco.util.schemacomp.model.Index; import org.alfresco.util.schemacomp.model.Schema; import org.alfresco.util.schemacomp.model.Sequence; import org.alfresco.util.schemacomp.model.Table; -import static org.junit.Assert.*; import org.junit.Before; import org.junit.Test; import org.springframework.context.ApplicationContext; @@ -55,6 +58,7 @@ public class ExportDbTest @Test public void exportDb() throws Exception { + exporter.setNamePrefix("alf_"); exporter.execute(); Schema schema = exporter.getSchema(); @@ -80,11 +84,31 @@ public class ExportDbTest } } + checkResultsFiltered(schema, "alf_"); checkAppliedPatchTable(appliedPatchTable); checkQNameTable(qNameTable); // TODO: what to do about sequences? They can't easily be retrieved with JDBC's DatabaseMetaData //checkAuthoritySequence(authoritySeq); } + + + /** + * Check that all top level database objects are prefixed as expected + * (no other objects should have been retrieved) + * + * @param schema + * @param prefix + */ + private void checkResultsFiltered(Schema schema, String prefix) + { + for (DbObject dbo : schema) + { + if (!dbo.getName().startsWith(prefix)) + { + fail("Database object's name does not start with '" + prefix + "': " + dbo); + } + } + } /** diff --git a/source/java/org/alfresco/util/schemacomp/SchemaCompTestSuite.java b/source/java/org/alfresco/util/schemacomp/SchemaCompTestSuite.java index ea09a49a2e..3c55ca3251 100644 --- a/source/java/org/alfresco/util/schemacomp/SchemaCompTestSuite.java +++ b/source/java/org/alfresco/util/schemacomp/SchemaCompTestSuite.java @@ -31,6 +31,7 @@ import org.junit.runners.Suite; { DbObjectXMLTransformerTest.class, DbPropertyTest.class, + DbToXMLTest.class, DefaultComparisonUtilsTest.class, ExportDbTest.class, SchemaComparatorTest.class, diff --git a/source/java/org/alfresco/util/schemacomp/model/AbstractDbObject.java b/source/java/org/alfresco/util/schemacomp/model/AbstractDbObject.java index 186165ebae..1d0f445b3a 100644 --- a/source/java/org/alfresco/util/schemacomp/model/AbstractDbObject.java +++ b/source/java/org/alfresco/util/schemacomp/model/AbstractDbObject.java @@ -56,6 +56,10 @@ public abstract class AbstractDbObject implements DbObject */ public String getName() { + if (this.name == null) + { + return ""; + } return this.name; }