Topia-commits
Threads by month
- ----- 2026 -----
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2004 -----
- December
- November
- October
- September
- August
- July
- June
- May
July 2012
- 2 participants
- 16 discussions
r2597 - in trunk: topia-persistence/src/main/java/org/nuiton/topia/generator topia-persistence-tck/src/main/xmi
by athimel@users.nuiton.org July 3, 2012
by athimel@users.nuiton.org July 3, 2012
July 3, 2012
Author: athimel
Date: 2012-07-03 14:24:04 +0200 (Tue, 03 Jul 2012)
New Revision: 2597
Url: http://nuiton.org/repositories/revision/topia/2597
Log:
Fix association class DAO generation
Modified:
trunk/topia-persistence-tck/src/main/xmi/topia-tck-mapping.zargo
trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityDAOTransformer.java
Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityDAOTransformer.java
===================================================================
--- trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityDAOTransformer.java 2012-07-03 12:15:34 UTC (rev 2596)
+++ trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityDAOTransformer.java 2012-07-03 12:24:04 UTC (rev 2597)
@@ -947,11 +947,20 @@
boolean isAssoc) {
String attrName = attr.getName();
String attrType = attr.getType();
- String propertyName = attrName;
+ String propertyName = clazzName + "." + getConstantName(attrName);
if (!isAssoc && attr.hasAssociationClass()) {
- propertyName = TopiaGeneratorUtil.toLowerCaseFirstLetter(
- attr.getAssociationClass().getName()) + '.' + propertyName;
+ String assocClassName = attr.getAssociationClass().getName();
+ String assocAttrName = TopiaGeneratorUtil.getAssocAttrName(attr);
+ // It is about transitivity : use the property to access the
+ // associationClass + '.' + the property to access the expected
+ // attribute
+ // <class>.<attrAssoc> + '.' + <assocClass>.<attr>
+ propertyName =
+ clazzName + '.' + getConstantName(assocAttrName) +
+ " + '.' + " +
+ assocClassName + '.' + getConstantName(attrName);
}
+
ObjectModelOperation op;
op = addOperation(result,
getJavaBeanMethodName("findBy", attrName),
@@ -961,7 +970,7 @@
addParameter(op, attrType, "v");
setOperationBody(op, ""
/*{
- E result = findByProperty(<%=clazzName + "." + getConstantName(propertyName)%>, v);
+ E result = findByProperty(<%=propertyName%>, v);
return result;
}*/
);
@@ -974,14 +983,16 @@
addParameter(op, attrType, "v");
setOperationBody(op, ""
/*{
- List<E> result = findAllByProperty(<%=clazzName + "." + getConstantName(propertyName)%>, v);
+ List<E> result = findAllByProperty(<%=propertyName%>, v);
return result;
}*/
);
- if (attr.hasAssociationClass()) {
+ if (!isAssoc && attr.hasAssociationClass()) {
String assocClassName = attr.getAssociationClass().getName();
String assocClassFQN = attr.getAssociationClass().getQualifiedName();
+ String assocAttrName = TopiaGeneratorUtil.getAssocAttrName(attr);
+ String assocPropertyConstantName = getConstantName(assocAttrName);
op = addOperation(result,
getJavaBeanMethodName("findBy", assocClassName),
"E",
@@ -990,7 +1001,7 @@
addParameter(op, assocClassFQN, "value");
setOperationBody(op, ""
/*{
- E result = findByProperty(<%=clazzName + "." + getConstantName(TopiaGeneratorUtil.toLowerCaseFirstLetter(assocClassName))%>, value);
+ E result = findByProperty(<%=clazzName + "." + assocPropertyConstantName%>, value);
return result;
}*/
);
@@ -1003,7 +1014,7 @@
addParameter(op, assocClassFQN, "value");
setOperationBody(op, ""
/*{
- List<E> result = findAllByProperty(<%=clazzName + "." + getConstantName(TopiaGeneratorUtil.toLowerCaseFirstLetter(assocClassName))%>, value);
+ List<E> result = findAllByProperty(<%=clazzName + "." + assocPropertyConstantName%>, value);
return result;
}*/
);
Modified: trunk/topia-persistence-tck/src/main/xmi/topia-tck-mapping.zargo
===================================================================
(Binary files differ)
1
0
Author: athimel
Date: 2012-07-03 14:15:34 +0200 (Tue, 03 Jul 2012)
New Revision: 2596
Url: http://nuiton.org/repositories/revision/topia/2596
Log:
Include missing -orm.xml files in resources
Modified:
trunk/topia-service-migration/pom.xml
Modified: trunk/topia-service-migration/pom.xml
===================================================================
--- trunk/topia-service-migration/pom.xml 2012-07-02 15:48:39 UTC (rev 2595)
+++ trunk/topia-service-migration/pom.xml 2012-07-03 12:15:34 UTC (rev 2596)
@@ -110,6 +110,7 @@
<directory>${maven.src.dir}/main/resources</directory>
<includes>
<include>**/*.hbm.xml</include>
+ <include>**/*-orm.xml</include>
<include>**/*.properties</include>
</includes>
</resource>
1
0
r2595 - in trunk/topia-service-migration/src/test: java/org/nuiton/topia/migration resources resources/META-INF resources/META-INF/services
by athimel@users.nuiton.org July 2, 2012
by athimel@users.nuiton.org July 2, 2012
July 2, 2012
Author: athimel
Date: 2012-07-02 17:48:39 +0200 (Mon, 02 Jul 2012)
New Revision: 2595
Url: http://nuiton.org/repositories/revision/topia/2595
Log:
Use NG migration callbacks
Added:
trunk/topia-service-migration/src/test/java/org/nuiton/topia/migration/TckItMigrationTest.java
trunk/topia-service-migration/src/test/resources/META-INF/
trunk/topia-service-migration/src/test/resources/META-INF/services/
trunk/topia-service-migration/src/test/resources/META-INF/services/org.nuiton.topia.migration.TopiaMigrationCallbackByClassNG$MigrationCallBackForVersion
Removed:
trunk/topia-service-migration/src/test/java/org/nuiton/topia/migration/TckItMigration.java
Modified:
trunk/topia-service-migration/src/test/java/org/nuiton/topia/migration/TckItMigrationCallback.java
trunk/topia-service-migration/src/test/java/org/nuiton/topia/migration/TckItMigrationV1_2.java
Deleted: trunk/topia-service-migration/src/test/java/org/nuiton/topia/migration/TckItMigration.java
===================================================================
--- trunk/topia-service-migration/src/test/java/org/nuiton/topia/migration/TckItMigration.java 2012-07-02 15:35:24 UTC (rev 2594)
+++ trunk/topia-service-migration/src/test/java/org/nuiton/topia/migration/TckItMigration.java 2012-07-02 15:48:39 UTC (rev 2595)
@@ -1,114 +0,0 @@
-package org.nuiton.topia.migration;
-
-import com.google.common.io.Files;
-import com.google.common.io.InputSupplier;
-import junit.framework.Assert;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.junit.Before;
-import org.junit.Test;
-import org.nuiton.topia.TopiaContext;
-import org.nuiton.topia.TopiaContextFactory;
-import org.nuiton.topia.TopiaException;
-import org.nuiton.topia.migration.mappings.TMSVersionDAO;
-import org.nuiton.topia.persistence.TopiaEntity;
-import org.nuiton.topia.tck.TopiaDatabase;
-import org.nuiton.topia.tck.it.Company;
-import org.nuiton.topia.tck.it.CompanyDAO;
-import org.nuiton.topia.tck.it.TopiaTckItDAOHelper;
-import org.nuiton.util.Version;
-import org.nuiton.util.VersionUtil;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.List;
-import java.util.Properties;
-
-/**
- * @author Arnaud Thimel <thimel(a)codelutin.com>
- */
-public class TckItMigration {
-
- private static final Log log = LogFactory.getLog(TckItMigration.class);
-
- protected TopiaContext rootCtxt;
-
- protected final String getImplementationClassesAsString() {
- StringBuilder buffer = new StringBuilder();
- for (Class<? extends TopiaEntity> aClass : TopiaTckItDAOHelper.getImplementationClasses()) {
- buffer.append(',').append(aClass.getName());
- }
- return buffer.substring(1);
- }
-
- @Before
- public void setUpService() throws Exception {
- File testSpecificDirectory = TopiaDatabase.getTestSpecificDirectory(TckItMigration.class, "testMigrationDone");
-
- File dataCopyForTest = new File(testSpecificDirectory, "migration-test-db.h2.db");
- dataCopyForTest.getParentFile().mkdirs();
-
- Files.copy(new InputSupplier<InputStream>() {
- @Override
- public InputStream getInput() throws IOException {
- return getClass().getResourceAsStream("/migration-source-database.h2.db");
- }
- }, dataCopyForTest);
-
- String absolutePath = dataCopyForTest.getAbsolutePath();
- String path = absolutePath.substring(0, absolutePath.length()-6);
- String jdbcUrl = String.format("jdbc:h2:%s", path);
-
- if (log.isInfoEnabled()) {
- log.info("Use " + jdbcUrl);
- }
- log.debug("url de la copie de la base navision : " + jdbcUrl);
-
-
- Properties dbConfiguration = new Properties();
- InputStream stream =
- getClass().getResourceAsStream("/TopiaContext-it.properties");
-
- try {
- dbConfiguration.load(stream);
- } finally {
- stream.close();
- }
- dbConfiguration.setProperty(
- TopiaContextFactory.CONFIG_PERSISTENCE_CLASSES,
- getImplementationClassesAsString());
-
- dbConfiguration.setProperty(
- TopiaContextFactory.CONFIG_URL, jdbcUrl);
-
- rootCtxt = TopiaContextFactory.getContext(dbConfiguration);
-
- }
-
-
-
-
- @Test
- public void testMigrationDone() throws TopiaException {
- String expectedVersion = "1.2";
- Assert.assertEquals("Test is written for a specific version", expectedVersion, TopiaTckItDAOHelper.getModelVersion());
-
- TopiaContext context = rootCtxt.beginTransaction();
- CompanyDAO companyDAO = TopiaTckItDAOHelper.getCompanyDAO(context);
-
- // There is already 1 company in the DB
- Assert.assertEquals(1, companyDAO.count());
-
- // Value in database before migration was : 12345
- // Siret value is decreased by 12222 -> 123
-
- // Siret is 123 only if migration is done
- List<Company> bySiret = companyDAO.findAllBySiret(123);
- Assert.assertEquals(1, bySiret.size());
-
- Version version = TMSVersionDAO.getVersion(context, "tms_version");
- Assert.assertEquals(VersionUtil.valueOf(expectedVersion), version);
- }
-
-}
Modified: trunk/topia-service-migration/src/test/java/org/nuiton/topia/migration/TckItMigrationCallback.java
===================================================================
--- trunk/topia-service-migration/src/test/java/org/nuiton/topia/migration/TckItMigrationCallback.java 2012-07-02 15:35:24 UTC (rev 2594)
+++ trunk/topia-service-migration/src/test/java/org/nuiton/topia/migration/TckItMigrationCallback.java 2012-07-02 15:48:39 UTC (rev 2595)
@@ -1,38 +1,21 @@
package org.nuiton.topia.migration;
-import com.google.common.collect.Maps;
import org.nuiton.topia.tck.it.TopiaTckItDAOHelper;
import org.nuiton.util.Version;
import org.nuiton.util.VersionUtil;
import java.util.List;
-import java.util.Map;
/**
* @author Arnaud Thimel <thimel(a)codelutin.com>
*/
-public class TckItMigrationCallback extends TopiaMigrationCallbackByClass {
+public class TckItMigrationCallback extends TopiaMigrationCallbackByClassNG {
- public static final Version VERSION_1_2 = VersionUtil.valueOf("1.2");
-
- protected static MigrationCallBackForVersionResolverByMap resolver;
-
- static {
- Map<Version, Class<? extends MigrationCallBackForVersion>> callbacks = Maps.newHashMap();
- callbacks.put(VERSION_1_2, TckItMigrationV1_2.class);
- resolver = new MigrationCallBackForVersionResolverByMap(callbacks);
- }
-
public TckItMigrationCallback() {
- super(resolver);
+ super(new MigrationCallBackForVersionResolverByServiceLoader());
}
@Override
- public Version[] getAvailableVersions() {
- return new Version[]{VERSION_1_2};
- }
-
- @Override
public Version getApplicationVersion() {
return VersionUtil.valueOf(TopiaTckItDAOHelper.getModelVersion());
}
Copied: trunk/topia-service-migration/src/test/java/org/nuiton/topia/migration/TckItMigrationTest.java (from rev 2594, trunk/topia-service-migration/src/test/java/org/nuiton/topia/migration/TckItMigration.java)
===================================================================
--- trunk/topia-service-migration/src/test/java/org/nuiton/topia/migration/TckItMigrationTest.java (rev 0)
+++ trunk/topia-service-migration/src/test/java/org/nuiton/topia/migration/TckItMigrationTest.java 2012-07-02 15:48:39 UTC (rev 2595)
@@ -0,0 +1,112 @@
+package org.nuiton.topia.migration;
+
+import com.google.common.io.Files;
+import com.google.common.io.InputSupplier;
+import junit.framework.Assert;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.junit.Before;
+import org.junit.Test;
+import org.nuiton.topia.TopiaContext;
+import org.nuiton.topia.TopiaContextFactory;
+import org.nuiton.topia.TopiaException;
+import org.nuiton.topia.migration.mappings.TMSVersionDAO;
+import org.nuiton.topia.persistence.TopiaEntity;
+import org.nuiton.topia.tck.TopiaDatabase;
+import org.nuiton.topia.tck.it.Company;
+import org.nuiton.topia.tck.it.CompanyDAO;
+import org.nuiton.topia.tck.it.TopiaTckItDAOHelper;
+import org.nuiton.util.Version;
+import org.nuiton.util.VersionUtil;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.List;
+import java.util.Properties;
+
+/**
+ * @author Arnaud Thimel <thimel(a)codelutin.com>
+ */
+public class TckItMigrationTest {
+
+ private static final Log log = LogFactory.getLog(TckItMigrationTest.class);
+
+ protected TopiaContext rootCtxt;
+
+ protected final String getImplementationClassesAsString() {
+ StringBuilder buffer = new StringBuilder();
+ for (Class<? extends TopiaEntity> aClass : TopiaTckItDAOHelper.getImplementationClasses()) {
+ buffer.append(',').append(aClass.getName());
+ }
+ return buffer.substring(1);
+ }
+
+ @Before
+ public void setUpService() throws Exception {
+ File testSpecificDirectory = TopiaDatabase.getTestSpecificDirectory(TckItMigrationTest.class, "testMigrationDone");
+
+ File dataCopyForTest = new File(testSpecificDirectory, "migration-test-db.h2.db");
+ dataCopyForTest.getParentFile().mkdirs();
+
+ Files.copy(new InputSupplier<InputStream>() {
+ @Override
+ public InputStream getInput() throws IOException {
+ return getClass().getResourceAsStream("/migration-source-database.h2.db");
+ }
+ }, dataCopyForTest);
+
+ String absolutePath = dataCopyForTest.getAbsolutePath();
+ String path = absolutePath.substring(0, absolutePath.length() - 6);
+ String jdbcUrl = String.format("jdbc:h2:%s", path);
+
+ if (log.isInfoEnabled()) {
+ log.info("Use " + jdbcUrl);
+ }
+ log.debug("url de la copie de la base navision : " + jdbcUrl);
+
+
+ Properties dbConfiguration = new Properties();
+ InputStream stream =
+ getClass().getResourceAsStream("/TopiaContext-it.properties");
+
+ try {
+ dbConfiguration.load(stream);
+ } finally {
+ stream.close();
+ }
+ dbConfiguration.setProperty(
+ TopiaContextFactory.CONFIG_PERSISTENCE_CLASSES,
+ getImplementationClassesAsString());
+
+ dbConfiguration.setProperty(
+ TopiaContextFactory.CONFIG_URL, jdbcUrl);
+
+ rootCtxt = TopiaContextFactory.getContext(dbConfiguration);
+
+ }
+
+
+ @Test
+ public void testMigrationDone() throws TopiaException {
+ String expectedVersion = "1.2";
+ Assert.assertEquals("Test is written for a specific version", expectedVersion, TopiaTckItDAOHelper.getModelVersion());
+
+ TopiaContext context = rootCtxt.beginTransaction();
+ CompanyDAO companyDAO = TopiaTckItDAOHelper.getCompanyDAO(context);
+
+ // There is already 1 company in the DB
+ Assert.assertEquals(1, companyDAO.count());
+
+ // Value in database before migration was : 12345
+ // Siret value is decreased by 12222 -> 123
+
+ // Siret is 123 only if migration is done
+ List<Company> bySiret = companyDAO.findAllBySiret(123);
+ Assert.assertEquals(1, bySiret.size());
+
+ Version version = TMSVersionDAO.getVersion(context, "tms_version");
+ Assert.assertEquals(VersionUtil.valueOf(expectedVersion), version);
+ }
+
+}
Modified: trunk/topia-service-migration/src/test/java/org/nuiton/topia/migration/TckItMigrationV1_2.java
===================================================================
--- trunk/topia-service-migration/src/test/java/org/nuiton/topia/migration/TckItMigrationV1_2.java 2012-07-02 15:35:24 UTC (rev 2594)
+++ trunk/topia-service-migration/src/test/java/org/nuiton/topia/migration/TckItMigrationV1_2.java 2012-07-02 15:48:39 UTC (rev 2595)
@@ -3,16 +3,18 @@
import org.nuiton.topia.TopiaException;
import org.nuiton.topia.framework.TopiaContextImplementor;
import org.nuiton.util.Version;
+import org.nuiton.util.VersionUtil;
import java.util.List;
/**
* @author Arnaud Thimel <thimel(a)codelutin.com>
*/
-public class TckItMigrationV1_2 extends TopiaMigrationCallbackByClass.MigrationCallBackForVersion {
+public class TckItMigrationV1_2 extends TopiaMigrationCallbackByClassNG.MigrationCallBackForVersion {
- public TckItMigrationV1_2(Version version, TopiaMigrationCallbackByClass callBack) {
- super(version, callBack);
+ @Override
+ public Version getVersion() {
+ return VersionUtil.valueOf("1.2");
}
@Override
Added: trunk/topia-service-migration/src/test/resources/META-INF/services/org.nuiton.topia.migration.TopiaMigrationCallbackByClassNG$MigrationCallBackForVersion
===================================================================
--- trunk/topia-service-migration/src/test/resources/META-INF/services/org.nuiton.topia.migration.TopiaMigrationCallbackByClassNG$MigrationCallBackForVersion (rev 0)
+++ trunk/topia-service-migration/src/test/resources/META-INF/services/org.nuiton.topia.migration.TopiaMigrationCallbackByClassNG$MigrationCallBackForVersion 2012-07-02 15:48:39 UTC (rev 2595)
@@ -0,0 +1 @@
+org.nuiton.topia.migration.TckItMigrationV1_2
\ No newline at end of file
1
0
r2594 - trunk/topia-service-migration/src/test/java/org/nuiton/topia/migration
by athimel@users.nuiton.org July 2, 2012
by athimel@users.nuiton.org July 2, 2012
July 2, 2012
Author: athimel
Date: 2012-07-02 17:35:24 +0200 (Mon, 02 Jul 2012)
New Revision: 2594
Url: http://nuiton.org/repositories/revision/topia/2594
Log:
Check TMSVersion#version from the database
Modified:
trunk/topia-service-migration/src/test/java/org/nuiton/topia/migration/TckItMigration.java
Modified: trunk/topia-service-migration/src/test/java/org/nuiton/topia/migration/TckItMigration.java
===================================================================
--- trunk/topia-service-migration/src/test/java/org/nuiton/topia/migration/TckItMigration.java 2012-07-02 15:15:56 UTC (rev 2593)
+++ trunk/topia-service-migration/src/test/java/org/nuiton/topia/migration/TckItMigration.java 2012-07-02 15:35:24 UTC (rev 2594)
@@ -10,11 +10,14 @@
import org.nuiton.topia.TopiaContext;
import org.nuiton.topia.TopiaContextFactory;
import org.nuiton.topia.TopiaException;
+import org.nuiton.topia.migration.mappings.TMSVersionDAO;
import org.nuiton.topia.persistence.TopiaEntity;
import org.nuiton.topia.tck.TopiaDatabase;
import org.nuiton.topia.tck.it.Company;
import org.nuiton.topia.tck.it.CompanyDAO;
import org.nuiton.topia.tck.it.TopiaTckItDAOHelper;
+import org.nuiton.util.Version;
+import org.nuiton.util.VersionUtil;
import java.io.File;
import java.io.IOException;
@@ -49,7 +52,7 @@
Files.copy(new InputSupplier<InputStream>() {
@Override
public InputStream getInput() throws IOException {
- return TckItMigration.class.getResourceAsStream("/migration-source-database.h2.db");
+ return getClass().getResourceAsStream("/migration-source-database.h2.db");
}
}, dataCopyForTest);
@@ -88,7 +91,8 @@
@Test
public void testMigrationDone() throws TopiaException {
- Assert.assertEquals("Test is written for model 1.2", "1.2", TopiaTckItDAOHelper.getModelVersion());
+ String expectedVersion = "1.2";
+ Assert.assertEquals("Test is written for a specific version", expectedVersion, TopiaTckItDAOHelper.getModelVersion());
TopiaContext context = rootCtxt.beginTransaction();
CompanyDAO companyDAO = TopiaTckItDAOHelper.getCompanyDAO(context);
@@ -102,6 +106,9 @@
// Siret is 123 only if migration is done
List<Company> bySiret = companyDAO.findAllBySiret(123);
Assert.assertEquals(1, bySiret.size());
+
+ Version version = TMSVersionDAO.getVersion(context, "tms_version");
+ Assert.assertEquals(VersionUtil.valueOf(expectedVersion), version);
}
}
1
0
July 2, 2012
Author: athimel
Date: 2012-07-02 17:15:56 +0200 (Mon, 02 Jul 2012)
New Revision: 2593
Url: http://nuiton.org/repositories/revision/topia/2593
Log:
Add a simple test on topia-migration-service
Added:
trunk/topia-service-migration/src/main/resources/org/nuiton/topia/migration/mappings/TMSVersion-orm.xml
trunk/topia-service-migration/src/test/java/org/nuiton/topia/migration/TckItMigration.java
trunk/topia-service-migration/src/test/java/org/nuiton/topia/migration/TckItMigrationCallback.java
trunk/topia-service-migration/src/test/java/org/nuiton/topia/migration/TckItMigrationV1_2.java
trunk/topia-service-migration/src/test/resources/TopiaContext-it.properties
trunk/topia-service-migration/src/test/resources/log4j.properties
trunk/topia-service-migration/src/test/resources/migration-source-database.h2.db
Removed:
trunk/topia-service-migration/src/test/resources/ConfigurationAdapterTest-hibernate.cfg.xml
Modified:
trunk/topia-persistence-hibernate/src/main/java/org/nuiton/topia/persistence/TopiaHibernatePersistenceProvider.java
trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaContextImpl.java
trunk/topia-service-migration/pom.xml
trunk/topia-service-migration/src/main/java/org/nuiton/topia/migration/TopiaMigrationEngine.java
trunk/topia-service-migration/src/site/rst/index.rst
Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaContextImpl.java
===================================================================
--- trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaContextImpl.java 2012-07-02 13:24:27 UTC (rev 2592)
+++ trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaContextImpl.java 2012-07-02 15:15:56 UTC (rev 2593)
@@ -1006,9 +1006,10 @@
@Override
public boolean isSchemaEmpty() {
try {
- Metamodel metamodel = getEntityManager().getMetamodel();
- Set<EntityType<?>> entities = metamodel.getEntities();
- for (EntityType<?> entity : entities) {
+ // Force configuration read
+ getJPAConfiguration();
+ Set<Class<?>> entities = getPersistenceClasses();
+ for (Class<?> entity : entities) {
String entityName = entity.getName();
Class entityClass = Class.forName(entityName);
if (isTableExists(entityClass)) {
Modified: trunk/topia-persistence-hibernate/src/main/java/org/nuiton/topia/persistence/TopiaHibernatePersistenceProvider.java
===================================================================
--- trunk/topia-persistence-hibernate/src/main/java/org/nuiton/topia/persistence/TopiaHibernatePersistenceProvider.java 2012-07-02 13:24:27 UTC (rev 2592)
+++ trunk/topia-persistence-hibernate/src/main/java/org/nuiton/topia/persistence/TopiaHibernatePersistenceProvider.java 2012-07-02 15:15:56 UTC (rev 2593)
@@ -124,26 +124,34 @@
return result;
}
+ public static Map<String, Object> buildHibernateProperties(Map<String, Object> topiaProperties) {
+
+ Map<String, Object> result = Maps.newHashMap(topiaProperties);
+
+ // Convert everything from topia.* to hibernate.*
+ for (String key : topiaProperties.keySet()) {
+ if (key.startsWith("topia.")) {
+ Object value = topiaProperties.get(key);
+ String hibernateKey = "hibernate." + key.substring(6);
+ result.put(hibernateKey, value);
+ }
+ }
+ return result;
+ }
+
public static Ejb3Configuration loadConfiguration(
String entityManagerName, Map<String, Object> properties,
Set<Class<?>> entities) {
- Map<String, Object> hibernateProperties = Maps.newHashMap(properties);
+ Map<String, Object> hibernateProperties = buildHibernateProperties(properties);
boolean useHibernateMapping = false;
- // Convert everything from topia.* to hibernate.*
- // and find out if use orm (jpa) or legacy hibernate mapping files
- for (String key : properties.keySet()) {
- if (key.startsWith("topia.")) {
- Object value = properties.get(key);
- String hibernateKey = "hibernate." + key.substring(6);
- hibernateProperties.put(hibernateKey, value);
- } else if (USE_HIBERNATE_MAPPING_FILES.equals(key)) {
- String value = String.valueOf(properties.get(key));
- if (Boolean.valueOf(value)) {
- // use hibernate mapping
- useHibernateMapping = true;
- }
+ // Find out if use orm (jpa) or legacy hibernate mapping files
+ if (hibernateProperties.containsKey(USE_HIBERNATE_MAPPING_FILES)) {
+ String value = String.valueOf(properties.get(USE_HIBERNATE_MAPPING_FILES));
+ if (Boolean.valueOf(value)) {
+ // use hibernate mapping
+ useHibernateMapping = true;
}
}
Modified: trunk/topia-service-migration/pom.xml
===================================================================
--- trunk/topia-service-migration/pom.xml 2012-07-02 13:24:27 UTC (rev 2592)
+++ trunk/topia-service-migration/pom.xml 2012-07-02 15:15:56 UTC (rev 2593)
@@ -70,6 +70,12 @@
<artifactId>hibernate-core</artifactId>
</dependency>
+ <dependency>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>topia-persistence-hibernate</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+
<!-- Depencies for test-->
<dependency>
<groupId>com.h2database</groupId>
@@ -84,6 +90,13 @@
<artifactId>junit</artifactId>
</dependency>
+ <dependency>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>topia-persistence-tck</artifactId>
+ <version>${project.version}</version>
+ <scope>test</scope>
+ </dependency>
+
</dependencies>
<name>ToPIA :: Service Migration</name>
Modified: trunk/topia-service-migration/src/main/java/org/nuiton/topia/migration/TopiaMigrationEngine.java
===================================================================
--- trunk/topia-service-migration/src/main/java/org/nuiton/topia/migration/TopiaMigrationEngine.java 2012-07-02 13:24:27 UTC (rev 2592)
+++ trunk/topia-service-migration/src/main/java/org/nuiton/topia/migration/TopiaMigrationEngine.java 2012-07-02 15:15:56 UTC (rev 2593)
@@ -39,12 +39,14 @@
import org.nuiton.topia.framework.TopiaContextImplementor;
import org.nuiton.topia.migration.mappings.TMSVersion;
import org.nuiton.topia.migration.mappings.TMSVersionDAO;
+import org.nuiton.topia.persistence.TopiaHibernatePersistenceProvider;
import org.nuiton.util.Version;
import org.nuiton.util.VersionUtil;
import org.nuiton.util.VersionUtil.VersionComparator;
import java.util.Arrays;
import java.util.List;
+import java.util.Map;
import java.util.Properties;
import java.util.SortedSet;
import java.util.TreeSet;
@@ -616,11 +618,13 @@
* @since 2.5.3
*/
protected Configuration createHibernateConfiguration(Configuration configuration) {
- Properties config = rootContext.getConfig();
+ Map<String, Object> jpaConfig = rootContext.getJPAConfiguration();
+ Map<String, Object> hibernateConfig =
+ TopiaHibernatePersistenceProvider.buildHibernateProperties(jpaConfig);
Properties prop = new Properties();
prop.putAll(configuration.getProperties());
- prop.putAll(config);
+ prop.putAll(hibernateConfig);
configuration.setProperties(prop);
configuration.buildMappings();
Added: trunk/topia-service-migration/src/main/resources/org/nuiton/topia/migration/mappings/TMSVersion-orm.xml
===================================================================
--- trunk/topia-service-migration/src/main/resources/org/nuiton/topia/migration/mappings/TMSVersion-orm.xml (rev 0)
+++ trunk/topia-service-migration/src/main/resources/org/nuiton/topia/migration/mappings/TMSVersion-orm.xml 2012-07-02 15:15:56 UTC (rev 2593)
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<entity-mappings version="2.0" xmlns="http://java.sun.com/xml/ns/persistence/orm" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_2_0.xsd">
+
+ <entity class="org.nuiton.topia.migration.mappings.TMSVersion">
+ <table name="tms_version" />
+ <attributes>
+ <id name="version" />
+ </attributes>
+ </entity>
+
+</entity-mappings>
Modified: trunk/topia-service-migration/src/site/rst/index.rst
===================================================================
--- trunk/topia-service-migration/src/site/rst/index.rst 2012-07-02 13:24:27 UTC (rev 2592)
+++ trunk/topia-service-migration/src/site/rst/index.rst 2012-07-02 15:15:56 UTC (rev 2593)
@@ -143,10 +143,10 @@
effectue la migration si besoin.
Dans le cas où la version ne peut pas être deterninée, il considère que le
-schema en base est en version V0 (les mppings de cette version doivent être
-fournit). Dans ce cas, il effectue en plus une détection des tables pour
+schema en base est en version V0 (les mappings de cette version doivent être
+fournis). Dans ce cas, il effectue en plus une détection des tables pour
savoir si le schéma existe deja. S'il n'existe pas, il ne tente donc pas
-d'effetuer une migration.
+d'effectuer une migration.
Classes de migration
~~~~~~~~~~~~~~~~~~~~
Added: trunk/topia-service-migration/src/test/java/org/nuiton/topia/migration/TckItMigration.java
===================================================================
--- trunk/topia-service-migration/src/test/java/org/nuiton/topia/migration/TckItMigration.java (rev 0)
+++ trunk/topia-service-migration/src/test/java/org/nuiton/topia/migration/TckItMigration.java 2012-07-02 15:15:56 UTC (rev 2593)
@@ -0,0 +1,107 @@
+package org.nuiton.topia.migration;
+
+import com.google.common.io.Files;
+import com.google.common.io.InputSupplier;
+import junit.framework.Assert;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.junit.Before;
+import org.junit.Test;
+import org.nuiton.topia.TopiaContext;
+import org.nuiton.topia.TopiaContextFactory;
+import org.nuiton.topia.TopiaException;
+import org.nuiton.topia.persistence.TopiaEntity;
+import org.nuiton.topia.tck.TopiaDatabase;
+import org.nuiton.topia.tck.it.Company;
+import org.nuiton.topia.tck.it.CompanyDAO;
+import org.nuiton.topia.tck.it.TopiaTckItDAOHelper;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.List;
+import java.util.Properties;
+
+/**
+ * @author Arnaud Thimel <thimel(a)codelutin.com>
+ */
+public class TckItMigration {
+
+ private static final Log log = LogFactory.getLog(TckItMigration.class);
+
+ protected TopiaContext rootCtxt;
+
+ protected final String getImplementationClassesAsString() {
+ StringBuilder buffer = new StringBuilder();
+ for (Class<? extends TopiaEntity> aClass : TopiaTckItDAOHelper.getImplementationClasses()) {
+ buffer.append(',').append(aClass.getName());
+ }
+ return buffer.substring(1);
+ }
+
+ @Before
+ public void setUpService() throws Exception {
+ File testSpecificDirectory = TopiaDatabase.getTestSpecificDirectory(TckItMigration.class, "testMigrationDone");
+
+ File dataCopyForTest = new File(testSpecificDirectory, "migration-test-db.h2.db");
+ dataCopyForTest.getParentFile().mkdirs();
+
+ Files.copy(new InputSupplier<InputStream>() {
+ @Override
+ public InputStream getInput() throws IOException {
+ return TckItMigration.class.getResourceAsStream("/migration-source-database.h2.db");
+ }
+ }, dataCopyForTest);
+
+ String absolutePath = dataCopyForTest.getAbsolutePath();
+ String path = absolutePath.substring(0, absolutePath.length()-6);
+ String jdbcUrl = String.format("jdbc:h2:%s", path);
+
+ if (log.isInfoEnabled()) {
+ log.info("Use " + jdbcUrl);
+ }
+ log.debug("url de la copie de la base navision : " + jdbcUrl);
+
+
+ Properties dbConfiguration = new Properties();
+ InputStream stream =
+ getClass().getResourceAsStream("/TopiaContext-it.properties");
+
+ try {
+ dbConfiguration.load(stream);
+ } finally {
+ stream.close();
+ }
+ dbConfiguration.setProperty(
+ TopiaContextFactory.CONFIG_PERSISTENCE_CLASSES,
+ getImplementationClassesAsString());
+
+ dbConfiguration.setProperty(
+ TopiaContextFactory.CONFIG_URL, jdbcUrl);
+
+ rootCtxt = TopiaContextFactory.getContext(dbConfiguration);
+
+ }
+
+
+
+
+ @Test
+ public void testMigrationDone() throws TopiaException {
+ Assert.assertEquals("Test is written for model 1.2", "1.2", TopiaTckItDAOHelper.getModelVersion());
+
+ TopiaContext context = rootCtxt.beginTransaction();
+ CompanyDAO companyDAO = TopiaTckItDAOHelper.getCompanyDAO(context);
+
+ // There is already 1 company in the DB
+ Assert.assertEquals(1, companyDAO.count());
+
+ // Value in database before migration was : 12345
+ // Siret value is decreased by 12222 -> 123
+
+ // Siret is 123 only if migration is done
+ List<Company> bySiret = companyDAO.findAllBySiret(123);
+ Assert.assertEquals(1, bySiret.size());
+ }
+
+}
Added: trunk/topia-service-migration/src/test/java/org/nuiton/topia/migration/TckItMigrationCallback.java
===================================================================
--- trunk/topia-service-migration/src/test/java/org/nuiton/topia/migration/TckItMigrationCallback.java (rev 0)
+++ trunk/topia-service-migration/src/test/java/org/nuiton/topia/migration/TckItMigrationCallback.java 2012-07-02 15:15:56 UTC (rev 2593)
@@ -0,0 +1,45 @@
+package org.nuiton.topia.migration;
+
+import com.google.common.collect.Maps;
+import org.nuiton.topia.tck.it.TopiaTckItDAOHelper;
+import org.nuiton.util.Version;
+import org.nuiton.util.VersionUtil;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author Arnaud Thimel <thimel(a)codelutin.com>
+ */
+public class TckItMigrationCallback extends TopiaMigrationCallbackByClass {
+
+ public static final Version VERSION_1_2 = VersionUtil.valueOf("1.2");
+
+ protected static MigrationCallBackForVersionResolverByMap resolver;
+
+ static {
+ Map<Version, Class<? extends MigrationCallBackForVersion>> callbacks = Maps.newHashMap();
+ callbacks.put(VERSION_1_2, TckItMigrationV1_2.class);
+ resolver = new MigrationCallBackForVersionResolverByMap(callbacks);
+ }
+
+ public TckItMigrationCallback() {
+ super(resolver);
+ }
+
+ @Override
+ public Version[] getAvailableVersions() {
+ return new Version[]{VERSION_1_2};
+ }
+
+ @Override
+ public Version getApplicationVersion() {
+ return VersionUtil.valueOf(TopiaTckItDAOHelper.getModelVersion());
+ }
+
+ @Override
+ public boolean askUser(Version dbVersion, List<Version> versions) {
+ return true;
+ }
+
+}
Added: trunk/topia-service-migration/src/test/java/org/nuiton/topia/migration/TckItMigrationV1_2.java
===================================================================
--- trunk/topia-service-migration/src/test/java/org/nuiton/topia/migration/TckItMigrationV1_2.java (rev 0)
+++ trunk/topia-service-migration/src/test/java/org/nuiton/topia/migration/TckItMigrationV1_2.java 2012-07-02 15:15:56 UTC (rev 2593)
@@ -0,0 +1,29 @@
+package org.nuiton.topia.migration;
+
+import org.nuiton.topia.TopiaException;
+import org.nuiton.topia.framework.TopiaContextImplementor;
+import org.nuiton.util.Version;
+
+import java.util.List;
+
+/**
+ * @author Arnaud Thimel <thimel(a)codelutin.com>
+ */
+public class TckItMigrationV1_2 extends TopiaMigrationCallbackByClass.MigrationCallBackForVersion {
+
+ public TckItMigrationV1_2(Version version, TopiaMigrationCallbackByClass callBack) {
+ super(version, callBack);
+ }
+
+ @Override
+ protected void prepareMigrationScript(TopiaContextImplementor tx,
+ List<String> queries,
+ boolean showSql,
+ boolean showProgression)
+ throws TopiaException {
+ // Actual value is 12345
+ // 12345 - 12222 = 123
+ queries.add("update company set siret = siret - 12222;");
+ }
+
+}
Deleted: trunk/topia-service-migration/src/test/resources/ConfigurationAdapterTest-hibernate.cfg.xml
===================================================================
--- trunk/topia-service-migration/src/test/resources/ConfigurationAdapterTest-hibernate.cfg.xml 2012-07-02 13:24:27 UTC (rev 2592)
+++ trunk/topia-service-migration/src/test/resources/ConfigurationAdapterTest-hibernate.cfg.xml 2012-07-02 15:15:56 UTC (rev 2593)
@@ -1,43 +0,0 @@
-<?xml version='1.0' encoding='utf-8'?>
-<!--
- #%L
- ToPIA :: Service Migration
-
- $Id$
- $HeadURL$
- %%
- Copyright (C) 2004 - 2010 CodeLutin
- %%
- This program 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.
-
- 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 Lesser Public License for more details.
-
- You should have received a copy of the GNU General Lesser Public
- License along with this program. If not, see
- <http://www.gnu.org/licenses/lgpl-3.0.html>.
- #L%
- -->
-
-<!DOCTYPE hibernate-configuration
- PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN"
- "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
-
-<hibernate-configuration>
-
- <session-factory>
-
- <!--property name="connection.datasource">java:comp/env/atelier-content-lmfr</property-->
- <property name="show_sql">false</property>
- <property name="dialect">org.hibernate.dialect.H2Dialect</property>
-
- <!-- Mapping files -->
-
- </session-factory>
-
-</hibernate-configuration>
Copied: trunk/topia-service-migration/src/test/resources/TopiaContext-it.properties (from rev 2591, trunk/topia-persistence-hibernate/src/test/resources/TopiaContext-it.properties)
===================================================================
--- trunk/topia-service-migration/src/test/resources/TopiaContext-it.properties (rev 0)
+++ trunk/topia-service-migration/src/test/resources/TopiaContext-it.properties 2012-07-02 15:15:56 UTC (rev 2593)
@@ -0,0 +1,41 @@
+###
+# #%L
+# ToPIA :: Persistence :: Hibernate
+# $Id$
+# $HeadURL$
+# %%
+# Copyright (C) 2004 - 2012 CodeLutin
+# %%
+# This program 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.
+#
+# 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 Lesser Public License for more details.
+#
+# You should have received a copy of the GNU General Lesser Public
+# License along with this program. If not, see
+# <http://www.gnu.org/licenses/lgpl-3.0.html>.
+# #L%
+###
+# Proprietes par defaut pour une base de donnees de type H2 et le model it
+hibernate.hbm2ddl.auto=update
+hibernate.show_sql=false
+
+hibernate.dialect=org.hibernate.dialect.H2Dialect
+
+topia.use.hibernate.mapping.files=false
+topia.connection.username=sa
+topia.connection.password=sa
+topia.connection.driver_class=org.h2.Driver
+
+#Not necessary, but useful
+hibernate.connection.provider_class=org.nuiton.topia.framework.TopiaHibernateConnectionProvider
+
+# Migration configuration
+topia.service.migration=org.nuiton.topia.migration.TopiaMigrationEngine
+topia.service.migration.callback=org.nuiton.topia.migration.TckItMigrationCallback
+topia.service.migration.showSql=true
\ No newline at end of file
Copied: trunk/topia-service-migration/src/test/resources/log4j.properties (from rev 2591, trunk/topia-persistence-hibernate/src/test/resources/log4j.properties)
===================================================================
--- trunk/topia-service-migration/src/test/resources/log4j.properties (rev 0)
+++ trunk/topia-service-migration/src/test/resources/log4j.properties 2012-07-02 15:15:56 UTC (rev 2593)
@@ -0,0 +1,36 @@
+###
+# #%L
+# ToPIA :: Persistence
+#
+# $Id$
+# $HeadURL$
+# %%
+# Copyright (C) 2004 - 2010 CodeLutin
+# %%
+# This program 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.
+#
+# 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 Lesser Public License for more details.
+#
+# You should have received a copy of the GNU General Lesser Public
+# License along with this program. If not, see
+# <http://www.gnu.org/licenses/lgpl-3.0.html>.
+# #L%
+###
+#\u00a0This log is used to display trace in generation
+
+# Global logging configuration
+log4j.rootLogger=WARN, stdout
+# Console output...
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) %M - %m%n
+# package level
+log4j.logger.org.nuiton.topia=INFO
+#log4j.logger.org.nuiton.topiatest=DEBUG
+log4j.logger.org.nuiton.topia.persistence.util=INFO
Added: trunk/topia-service-migration/src/test/resources/migration-source-database.h2.db
===================================================================
(Binary files differ)
Property changes on: trunk/topia-service-migration/src/test/resources/migration-source-database.h2.db
___________________________________________________________________
Added: svn:mime-type
+ application/octet-stream
1
0
r2592 - trunk/topia-service-migration/src/main/java/org/nuiton/topia/migration
by tchemit@users.nuiton.org July 2, 2012
by tchemit@users.nuiton.org July 2, 2012
July 2, 2012
Author: tchemit
Date: 2012-07-02 15:24:27 +0200 (Mon, 02 Jul 2012)
New Revision: 2592
Url: http://nuiton.org/repositories/revision/topia/2592
Log:
refs #2122 (implments from 2.6.11 to 3.0)
Added:
trunk/topia-service-migration/src/main/java/org/nuiton/topia/migration/TopiaMigrationCallbackByClassNG.java
Copied: trunk/topia-service-migration/src/main/java/org/nuiton/topia/migration/TopiaMigrationCallbackByClassNG.java (from rev 2591, branches/topia-2.6.x/topia-service-migration/src/main/java/org/nuiton/topia/migration/TopiaMigrationCallbackByClassNG.java)
===================================================================
--- trunk/topia-service-migration/src/main/java/org/nuiton/topia/migration/TopiaMigrationCallbackByClassNG.java (rev 0)
+++ trunk/topia-service-migration/src/main/java/org/nuiton/topia/migration/TopiaMigrationCallbackByClassNG.java 2012-07-02 13:24:27 UTC (rev 2592)
@@ -0,0 +1,194 @@
+/*
+ * #%L
+ * ToPIA :: Service Migration
+ *
+ * $Id$
+ * $HeadURL$
+ * %%
+ * Copyright (C) 2004 - 2010 CodeLutin, Tony chemit
+ * %%
+ * This program 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.
+ *
+ * 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 Lesser Public License for more details.
+ *
+ * You should have received a copy of the GNU General Lesser Public
+ * License along with this program. If not, see
+ * <http://www.gnu.org/licenses/lgpl-3.0.html>.
+ * #L%
+ */
+package org.nuiton.topia.migration;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.nuiton.topia.TopiaException;
+import org.nuiton.topia.framework.TopiaContextImplementor;
+import org.nuiton.util.Version;
+import org.nuiton.util.VersionUtil;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.ServiceLoader;
+import java.util.Set;
+import java.util.TreeMap;
+
+/**
+ * Migration callback which use a different class for each version to migrate.
+ * <p/>
+ * You must fill in the constructor the mapping for each version of
+ * {@link #getAvailableVersions()} a matching migrator for version which
+ * extends {@link MigrationCallBackForVersion}.
+ * <p/>
+ * Use the callback when you have a lot of version to migrate and the
+ * {@link TopiaMigrationCallbackByMethod} begins to be messy.
+ *
+ * @author tchemit <chemit(a)codelutin.com>
+ * @version $Id$
+ * @since 2.9.11
+ */
+public abstract class TopiaMigrationCallbackByClassNG extends AbstractTopiaMigrationCallback {
+
+ /** Logger. */
+ private static final Log log =
+ LogFactory.getLog(TopiaMigrationCallbackByClassNG.class);
+
+ protected MigrationCallBackForVersionResolver callBackResolver;
+
+ protected TopiaMigrationCallbackByClassNG(MigrationCallBackForVersionResolver callBackResolver) {
+
+ this.callBackResolver = callBackResolver;
+ }
+
+ @Override
+ public Version[] getAvailableVersions() {
+ Set<Version> allVersions = callBackResolver.getAllVersions();
+ return allVersions.toArray(new Version[allVersions.size()]);
+ }
+
+ @Override
+ protected void migrateForVersion(Version version,
+ TopiaContextImplementor tx,
+ boolean showSql,
+ boolean showProgression) throws Exception {
+
+ MigrationCallBackForVersion migrator = callBackResolver.getCallBack(version);
+
+ migrator.setCallBack(this);
+
+ String[] queries = migrator.prepareMigration(tx, showSql, showProgression);
+
+ executeSQL(tx, showSql, showProgression, queries);
+
+ }
+
+ /**
+ * Call back for a given version.
+ *
+ * @author tchemit <chemit(a)codelutin.com>
+ * @since 2.5
+ */
+ public abstract static class MigrationCallBackForVersion {
+
+ protected TopiaMigrationCallbackByClassNG callBack;
+
+ public abstract Version getVersion();
+
+ public void setCallBack(TopiaMigrationCallbackByClassNG callBack) {
+ this.callBack = callBack;
+ }
+
+ protected String[] prepareMigration(TopiaContextImplementor tx,
+ boolean showSql,
+ boolean showProgression) throws TopiaException {
+
+ List<String> queries = new ArrayList<String>();
+
+ prepareMigrationScript(tx, queries, showSql, showProgression);
+
+ return queries.toArray(new String[queries.size()]);
+ }
+
+ protected abstract void prepareMigrationScript(TopiaContextImplementor tx,
+ List<String> queries,
+ boolean showSql,
+ boolean showProgression) throws TopiaException;
+
+ public void executeSQL(TopiaContextImplementor tx,
+ String... sqls) throws TopiaException {
+ callBack.executeSQL(tx, sqls);
+ }
+
+ public void executeSQL(TopiaContextImplementor tx,
+ boolean showSql,
+ boolean showProgression,
+ String... sqls) throws TopiaException {
+ callBack.executeSQL(tx, showSql, showProgression, sqls);
+ }
+
+ }
+
+ /**
+ * Resolver to obtain the correct migration class for a given version.
+ *
+ * @since 2.6.11
+ */
+ public interface MigrationCallBackForVersionResolver {
+
+ /**
+ * Returns all detected versions.
+ *
+ * @return all detected versions.
+ */
+ Set<Version> getAllVersions();
+
+ /**
+ * for a given version, returns his migration callback.
+ *
+ * @param version the version to migrate
+ * @return the migration call for the given version, or {@code null}
+ * if no such migration callback exists for the version
+ */
+ MigrationCallBackForVersion getCallBack(Version version);
+ }
+
+ /**
+ * A simple call back resolver via a service loader.
+ *
+ * @author tchemit <chemit(a)codelutin.com>
+ * @since 2.9.11
+ */
+ public static class MigrationCallBackForVersionResolverByServiceLoader implements MigrationCallBackForVersionResolver {
+
+ protected final Map<Version, MigrationCallBackForVersion> versionMigrationMapping;
+
+ public MigrationCallBackForVersionResolverByServiceLoader() {
+ this.versionMigrationMapping = new TreeMap<Version, MigrationCallBackForVersion>(
+ new VersionUtil.VersionComparator());
+ ServiceLoader<MigrationCallBackForVersion> load = ServiceLoader.load(MigrationCallBackForVersion.class);
+ for (MigrationCallBackForVersion callBackForVersion : load) {
+ Version version = callBackForVersion.getVersion();
+ if (log.isInfoEnabled()) {
+ log.info("Detects migration version " + version + " [" +
+ callBackForVersion + "]");
+ }
+ versionMigrationMapping.put(version, callBackForVersion);
+ }
+ }
+
+ @Override
+ public MigrationCallBackForVersion getCallBack(Version version) {
+ return versionMigrationMapping.get(version);
+ }
+
+ @Override
+ public Set<Version> getAllVersions() {
+ return versionMigrationMapping.keySet();
+ }
+ }
+}
\ No newline at end of file
1
0