package com.t3.xstreamversioned.migration;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.apache.commons.lang3.StringUtils;
import com.t3.xstreamversioned.model.GenericObject;
import com.t3.xstreamversioned.model.GenericObjectManager;
import com.t3.xstreamversioned.version.Version;
import com.t3.xstreamversioned.version.VersionElement;
import com.t3.xstreamversioned.version.VersionGenerator;
public class MigrationManager {
private HashMap<Version, Migrator> migrators=new HashMap<>();
private final boolean strict;
private Set<String> versionedPackages=new HashSet<>(1);
private GenericObjectManager genericObjectManager=new GenericObjectManager();
public MigrationManager(String versionedPackage, boolean strict) {
this.versionedPackages.add(versionedPackage);
this.strict=strict;
}
public boolean isStrict() {
return strict;
}
public void addVersionedPackage(String versionedPackage) {
this.versionedPackages.add(versionedPackage);
}
public void registerMigrator(Migrator migrator) {
migrators.put(migrator.getUpdatesFromVersion(), migrator);
}
public Set<String> getVersionedPackages() {
return Collections.unmodifiableSet(versionedPackages);
}
public void reset() {
genericObjectManager=new GenericObjectManager();
}
public GenericObject migrate(GenericObject go, Class<?> expectedClass) {
Version currentVersion=go.getCurrentVersion();
Version targetVersion=VersionGenerator.generateVersion(expectedClass, strict, versionedPackages);
if(targetVersion!=null) {
while(!targetVersion.equals(currentVersion)) {
Migrator migrator=migrators.get(currentVersion);
if(migrator==null)
throw new RuntimeException("There is a serialized object of type "+expectedClass+" that "
+ "could only be updated to version "+currentVersion+". There "
+ "are updaters missing to migrate it to "+ targetVersion);
else {
go=migrator.updateObject(this,go);
genericObjectManager.updateObject(go);
currentVersion=go.getCurrentVersion();
}
}
}
return go;
}
public GenericObjectManager getGenericObjectManager() {
return genericObjectManager;
}
}