dataSourceSet = new HashHolder(4);
while (dataSourceItr.hasNext())
{
DataSource ds = (DataSource)dataSourceItr.next();
SchemaVersion dsVersion = ((PersistenceAdapter)ds.getComponent()
.getInstance(m_context)).getVersion(ds.getSchema());
if (dsVersion != null)
{
if (version == null)
{
version = dsVersion;
if (!ObjUtil.equal(metadata.getNamespace(), version.getNamespace()))
{
throw new IllegalStateException("Namespace mismatch in data source \"" +
ds.getName() + "\" (expected \"" + metadata.getNamespace() +
"\", got \"" + version.getNamespace() + "\")");
}
}
else
{
if (!ObjUtil.equal(version.getNamespace(), dsVersion.getNamespace()))
{
throw new IllegalStateException("Namespace mismatch in data source \"" +
ds.getName() + "\" (expected \"" + version.getNamespace() +
"\", got \"" + dsVersion.getNamespace() + "\")");
}
if (!ObjUtil.equal(version.getVersion(), dsVersion.getVersion()))
{
throw new IllegalStateException("Version mismatch in data source \"" +
ds.getName() + "\" (expected \"" + version.getVersion() +
"\", got \"" + dsVersion.getVersion() + "\")");
}
}
if (dsVersion.isUpgradable() || bForce)
{
dataSourceSet.add(ds);
}
}
}
if (dataSourceSet.isEmpty())
{
throw new IllegalStateException("No upgradable data sources");
}
if (version == null)
{
throw new IllegalStateException("Unavailable persistent storage version");
}
VersionUpgrade lastUpgrade = upgrade.getVersion(version.getVersion());
Lookup/*<Object, UpgradeState>*/ stateMap = Upgrade.getInitialState(lastUpgrade);
version.setUpgradable(true);
lastUpgrade.apply(Upgrade.getState(stateMap, lastUpgrade)); // advance to finished current ver
for (VersionUpgrade u = lastUpgrade.getNext(); u != null; u = u.getNext())
{
DataSource dataSource = null;
version.setVersion(u.getName());
version.setStep(0);
if (u.getName() == null)
{
u.apply(Upgrade.getState(stateMap, u));
continue;
}
if (u instanceof SchemaUpgrade)
{
SchemaUpgrade su = (SchemaUpgrade)u;
dataSource = su.getDataSource();
if (dataSourceSet.contains(dataSource))
{
PersistenceAdapter adapter = (PersistenceAdapter)dataSource.getComponent().getInstance(m_context);
adapter.upgrade(su, Upgrade.getState(stateMap, su), version);
}
else
{
su.apply(Upgrade.getState(stateMap, su));
}
}
else if (u instanceof ScriptUpgrade)
{
Function fun = ((ScriptUpgrade)u).getFunction();
if (fun != null)
{
if (u.getNext() == null)
{
// Script upgrade must be run with metadata matching the final or previous data version
m_context.getMachine().invoke(fun, (Pair)null);
m_context.getUnitOfWork().commit(false); // precommit the UOW
}
else
{
throw new UnsupportedOperationException(
"Unable to run script upgrade for version " + u.getName() +
", temporarily revert metadata used by the upgrade to version "
+ u.getName() + " before retrying upgrade.");
}
}
}
version.setStep(-1);
for (Iterator itr = dataSourceSet.iterator(); itr.hasNext();)
{
DataSource ds = (DataSource)itr.next();
if (ds != dataSource)
{
((PersistenceAdapter)ds.getComponent().getInstance(m_context))
.setVersion(ds.getSchema(), version);
}
}
}
for (Lookup.Iterator itr = stateMap.valueIterator(); itr.hasNext();)