package org.molgenis.migrate.version; import org.molgenis.framework.MolgenisUpgrade; import org.molgenis.framework.MolgenisUpgradeService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.List; import static java.util.Objects.requireNonNull; /** * Upgrades the data backends to the current version. * <p> * Gets the current version from the {@link MolgenisVersionService}. */ @Service public class MolgenisUpgradeServiceImpl implements MolgenisUpgradeService { private final Logger LOG = LoggerFactory.getLogger(getClass()); private final MolgenisVersionService versionService; private final List<MolgenisUpgrade> upgrades = new ArrayList<>(); @Autowired public MolgenisUpgradeServiceImpl(MolgenisVersionService versionService) { this.versionService = requireNonNull(versionService); } public void addUpgrade(MolgenisUpgrade upgrade) { upgrades.add(upgrade); } /** * Executes MOLGENIS MetaData version upgrades. * * @return true if an upgrade was necessary, false if not */ @Override public boolean upgrade() { if (versionService.getMolgenisVersionFromServerProperties() < 19) { throw new UnsupportedOperationException( "Upgrading from versions below 1.10 (metadataversion 19) is not supported, please update to 1.10 first."); } if (versionService.getMolgenisVersionFromServerProperties() < MolgenisVersionService.CURRENT_VERSION) { LOG.info("MetaData version:{}, current version:{} upgrade needed", versionService.getMolgenisVersionFromServerProperties(), MolgenisVersionService.CURRENT_VERSION); upgrades.stream().filter(upgrade -> upgrade.getFromVersion() >= versionService .getMolgenisVersionFromServerProperties()).forEach(this::runUpgrade); versionService.updateToCurrentVersion(); LOG.info("MetaData upgrade done."); return true; } else { LOG.debug("MetaData version:{}, current version:{} upgrade not needed", versionService.getMolgenisVersionFromServerProperties(), MolgenisVersionService.CURRENT_VERSION); return false; } } private void runUpgrade(MolgenisUpgrade upgrade) { LOG.info("Upgrading from {} to {}...", upgrade.getFromVersion(), upgrade.getToVersion()); upgrade.upgrade(); LOG.debug("Upgraded from {} to {}.", upgrade.getFromVersion(), upgrade.getToVersion()); versionService.updateToVersion(upgrade.getToVersion()); } }