Author: bpoussin Date: 2013-09-23 15:32:53 +0200 (Mon, 23 Sep 2013) New Revision: 1574 Url: http://nuiton.org/projects/wikitty/repository/revisions/1574 Log: fixes #2854: Change upgrade data process Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyExtensionMigration.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyExtensionMigrationRename.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceEnhanced.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceStorage.java trunk/wikitty-api/src/test/java/org/nuiton/wikitty/services/WikittyExtensionMigrationTest.java Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyExtensionMigration.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyExtensionMigration.java 2013-08-09 09:04:14 UTC (rev 1573) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyExtensionMigration.java 2013-09-23 13:32:53 UTC (rev 1574) @@ -58,14 +58,16 @@ * Migrate wikitty data from oldExt version to newExt. * * @param service Wikitty service that do migration - * @param wikitty Wikitty object that contains data in old version + * @param oldWikitty Wikitty object that contains data in old version * extension format + * @param newWikitty Wikitty object that contains data in new version + * extension format after call * @param oldExt old extension definition * @param newExt new extension definition - * @return same wikitty as argument if nothing to do, or new wikitty - * if some modification is done + * @return newWikitty argument */ - public Wikitty migrate(WikittyService service, Wikitty wikitty, + public Wikitty migrate(WikittyService service, + Wikitty oldWikitty, Wikitty newWikitty, WikittyExtension oldExt, WikittyExtension newExt); } Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyExtensionMigrationRename.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyExtensionMigrationRename.java 2013-08-09 09:04:14 UTC (rev 1573) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyExtensionMigrationRename.java 2013-09-23 13:32:53 UTC (rev 1574) @@ -27,10 +27,7 @@ import org.nuiton.wikitty.entities.Wikitty; import org.nuiton.wikitty.entities.WikittyExtension; import org.nuiton.wikitty.entities.FieldType; -import org.nuiton.wikitty.entities.WikittyImpl; import java.util.Collection; -import java.util.List; -import java.util.Set; import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; @@ -42,8 +39,6 @@ * rename, not creation a new field, you should use tag value "renameFrom" with * name of use in before extension. * - * Since 1.5, this class also take care about extension order. - * * @author ruchaud */ public class WikittyExtensionMigrationRename implements WikittyExtensionMigration { @@ -52,67 +47,12 @@ public static final String TAG_RENAME = "renameFrom"; - /** - * Recursively add extension with requires ones (orderer). - * WikittyService used in this method must not have WikittyServiceAuthorisation - * in stack because we pass null as secuirtyToken to method. (TODO poussin - * 2010 verify this assertion, when we use Migration, we don't need - * Security) - * - * @param service service - * @param wikitty wikitty to add extension to - * @param newExt extension to add - */ - protected void addExtension( - WikittyService service, Wikitty wikitty, WikittyExtension newExt) { - - // manage requires before current - List<String> requires = newExt.getRequires(); - if (requires != null && !requires.isEmpty()) { - for (String require : requires) { - WikittyExtension newRequireExt = - service.restoreExtensionLastVersion(null, require); - addExtension(service, wikitty, newRequireExt); - } - } - - // add current extension - wikitty.addExtension(newExt); - } - @Override - public Wikitty migrate(WikittyService service, Wikitty wikitty, + public Wikitty migrate(WikittyService service, + Wikitty oldWikitty, Wikitty newWikitty, WikittyExtension oldExt, WikittyExtension newExt) { - String wikittyId = wikitty.getWikittyId(); - String wikittyVersion = wikitty.getWikittyVersion(); - - Wikitty result = new WikittyImpl(wikittyId); - result.setWikittyVersion(wikittyVersion); - - // Add all extension and replaceWith old by the new - for (WikittyExtension extension : wikitty.getExtensions()) { - // add one by one to manage require - - // during loop add new when old one is found - if (extension.equals(oldExt)) { - addExtension(service, result, newExt); - } - else { - addExtension(service, result, extension); - } - } - - // Copy other values - Set<String> fqFieldNames = wikitty.fieldNames(); String extName = newExt.getName(); - for (String fieldName : fqFieldNames) { - if(!fieldName.startsWith(extName + ".")) { - Object value = wikitty.getFqField(fieldName); - log.debug("Value " + fieldName + "=" + value); - result.setFqField(fieldName, value); - } - } // Migrate field name Collection<String> oldFieldNames = oldExt.getFieldNames(); @@ -124,19 +64,19 @@ log.debug("Scan rename migration on " + extName + "." + fieldName + ":" + TAG_RENAME + "=" + renameFrom); if(StringUtils.isNotBlank(renameFrom)) { - Object value = wikitty.getFieldAsObject(extName, renameFrom); + Object value = oldWikitty.getFieldAsObject(extName, renameFrom); log.debug("Rename " + extName + "." + fieldName + "=" + value); - result.setField(extName, fieldName, value); + newWikitty.setField(extName, fieldName, value); } else { if(oldFieldNames.contains(fieldName)) { - Object value = wikitty.getFieldAsObject(extName, fieldName); + Object value = oldWikitty.getFieldAsObject(extName, fieldName); log.debug("Copy " + extName + "." + fieldName + "=" + value); - result.setField(extName, fieldName, value); + newWikitty.setField(extName, fieldName, value); } } } - return result; + return newWikitty; } } Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceEnhanced.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceEnhanced.java 2013-08-09 09:04:14 UTC (rev 1573) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceEnhanced.java 2013-09-23 13:32:53 UTC (rev 1574) @@ -24,6 +24,7 @@ */ package org.nuiton.wikitty.services; +import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; @@ -56,6 +57,14 @@ return store(securityToken, Collections.singleton(wikitty), false); } + public WikittyEvent store(String securityToken, Wikitty w1, Wikitty w2, Wikitty ... wN) { + List<Wikitty> ws = new ArrayList<Wikitty>(wN.length + 2); + Collections.addAll(ws, w1, w2); + Collections.addAll(ws, wN); + + return store(securityToken, ws, false); + } + public WikittyEvent store(String securityToken, Collection<Wikitty> wikitties) { return store(securityToken, wikitties, false); Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceStorage.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceStorage.java 2013-08-09 09:04:14 UTC (rev 1573) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceStorage.java 2013-09-23 13:32:53 UTC (rev 1574) @@ -42,6 +42,7 @@ import org.apache.commons.logging.LogFactory; import org.nuiton.util.ApplicationConfig; import org.nuiton.util.TimeLog; +import org.nuiton.wikitty.WikittyClient; import org.nuiton.wikitty.WikittyException; import org.nuiton.wikitty.WikittyService; import org.nuiton.wikitty.WikittyUtil; @@ -49,6 +50,7 @@ import org.nuiton.wikitty.entities.FieldTypeConstaintChecker; import org.nuiton.wikitty.entities.Wikitty; import org.nuiton.wikitty.entities.WikittyExtension; +import org.nuiton.wikitty.entities.WikittyImpl; import org.nuiton.wikitty.entities.WikittyTreeNode; import org.nuiton.wikitty.entities.WikittyTreeNodeHelper; import org.nuiton.wikitty.query.WikittyQuery; @@ -647,11 +649,61 @@ } /** - * Upgrade wikitty but not saved it. + * Recursively add extension with requires ones (orderer). + * + * @param extNames Extension name to load with required ones + * @param exts collection to put all extension result + * @return result argument + */ + protected LinkedHashSet<WikittyExtension> getExtension( + Collection<String> extNames, LinkedHashSet<WikittyExtension> exts) { + for (String name : extNames) { + WikittyExtension ext = restoreExtensionLastVersion(null, name); + List<String> requires = ext.getRequires(); + if (CollectionUtils.isNotEmpty(requires)) { + getExtension(requires, exts); + } + exts.add(ext); + } + return exts; + } + + /** + * Donne la classe de migration a utiliser pour une extension particuliere + * @param extensionName le nom de l'extension dont on veut la classe de migration + * si aucune classe de migration n'est enregistrer pour l'extension demande + * la classe de migration par defaut est utilisee + * @return + */ + protected WikittyExtensionMigration getMigration(String extensionName) { + WikittyExtensionMigration result = null; + + WikittyExtensionMigrationRegistry registry = + config.getObject(WikittyExtensionMigrationRegistry.class); + result = registry.get(extensionName); + // @deprecated a supprimer lorsque ce sera supprime de l'api + if (result == null) { + result = WikittyExtensionMigration.migrationRegistry.get(extensionName); + } + + if (result == null) { + result = defaultExtensionMigration; + } + return result; + } + + /** + * Upgrade wikitty and saved it if a migration is done. * On passe directement de la version du wikitty a la derniere version connue * car une installation pourrait faire un upgrade de plusieurs version * et donc certaine version de l'extension pourrait ne pas exister en local * + * La sauvegarde des objets migrer est necessaire au cas on le developpeur + * qui a implanter la migration a besoin de creer de nouveau objet durant + * la migration. Si on ne sauve pas l'objet initial, alors celui-ci pourrait + * etre potentiellement migrer plusieurs fois et donc des objets annexes + * seraient crees a chaque migration, au lieu d'etre crees une seul fois. + * * @param securityToken security token previously returned by login. If * securityToken is not valid, this method do nothing * @param wikitty to upgrade @@ -660,45 +712,49 @@ protected Wikitty upgradeData(String securityToken, Wikitty wikitty) { Wikitty result = wikitty; - Collection<WikittyExtension> extensions = wikitty.getExtensions(); - for (WikittyExtension extension : extensions) { - String extensionName = extension.getName(); + LinkedHashSet<WikittyExtension> newExt = getExtension(wikitty.getExtensionNames(), new LinkedHashSet<WikittyExtension>()); + Collection diff = CollectionUtils.disjunction(wikitty.getExtensions(), newExt); + if (!diff.isEmpty()) { + // les extensions on change, il faut faire la migration + // on commence par cree le nouveau wikitty avec les nouvelles extensions + String wikittyId = wikitty.getWikittyId(); + String wikittyVersion = wikitty.getWikittyVersion(); - if (log.isDebugEnabled()) { - log.debug("extensionName=" + extensionName); - } - - WikittyExtension currentExtension = extension; - String currentExtensionVersion = currentExtension.getVersion(); + result = new WikittyImpl(wikittyId); + result.setWikittyVersion(wikittyVersion); + result.addExtension(newExt); - WikittyExtension lastExtension = restoreExtensionLastVersion( - securityToken, extensionName); - String lastExtensionVersion = lastExtension.getVersion(); + // on migre ou copie extension par extension tous les champs + Collection<WikittyExtension> extensions = wikitty.getExtensions(); + for (WikittyExtension extension : extensions) { + String extensionName = extension.getName(); - if (log.isDebugEnabled()) { - log.debug(String.format("Migrate extension '%s' from '%s' to '%s'", - extensionName, currentExtensionVersion, lastExtensionVersion)); - } + if (log.isDebugEnabled()) { + log.debug("extensionName=" + extensionName); + } + WikittyExtension currentExtension = extension; + String currentExtensionVersion = currentExtension.getVersion(); - WikittyExtensionMigration migration = null; + WikittyExtension lastExtension = result.getExtension(extensionName); + String lastExtensionVersion = lastExtension.getVersion(); - WikittyExtensionMigrationRegistry registry = - config.getObject(WikittyExtensionMigrationRegistry.class); - migration = registry.get(extensionName); - // @deprecated a supprimer lorsque ce sera supprime de l'api - if (migration == null) { - migration = WikittyExtensionMigration.migrationRegistry.get(extensionName); - } - - if (migration == null) { - migration = defaultExtensionMigration; - } + if (log.isDebugEnabled()) { + log.debug(String.format("Migrate extension '%s' from '%s' to '%s'", + extensionName, currentExtensionVersion, lastExtensionVersion)); + } - if(WikittyUtil.versionGreaterThan(lastExtensionVersion, currentExtensionVersion)) { - result = migration.migrate(this, result, + + WikittyExtensionMigration migration = getMigration(extensionName); + + // no condition on extension, version, otherwize field is not copied in result, all extension must be migrated + result = migration.migrate(this, wikitty, result, currentExtension, lastExtension); } + + // if migration is done, store modified version and return it + WikittyClient wc = new WikittyClient(config, this, securityToken); + result = wc.store(result); } return result; Modified: trunk/wikitty-api/src/test/java/org/nuiton/wikitty/services/WikittyExtensionMigrationTest.java =================================================================== --- trunk/wikitty-api/src/test/java/org/nuiton/wikitty/services/WikittyExtensionMigrationTest.java 2013-08-09 09:04:14 UTC (rev 1573) +++ trunk/wikitty-api/src/test/java/org/nuiton/wikitty/services/WikittyExtensionMigrationTest.java 2013-09-23 13:32:53 UTC (rev 1574) @@ -96,12 +96,13 @@ public static class DummyMigration extends WikittyExtensionMigrationRename { - public Wikitty migrate(WikittyService service, Wikitty wikitty, WikittyExtension oldExt, WikittyExtension newExt) { + @Override + public Wikitty migrate(WikittyService service, Wikitty oldWikitty, Wikitty newWikitty, WikittyExtension oldExt, WikittyExtension newExt) { System.out.println(String.format("migrate %s(%s) oldExt %s newExt %s", - wikitty.getWikittyId(), wikitty.getExtension(extensionName).getId(), + oldWikitty.getWikittyId(), oldWikitty.getExtension(extensionName).getId(), oldExt.getId(), newExt.getId())); - Wikitty result = super.migrate(service, wikitty, oldExt, newExt); + Wikitty result = super.migrate(service, oldWikitty, newWikitty, oldExt, newExt); result.setField(extensionName, "string", "hello"); result.setField(extensionName, "date", new Date());