/* * Copyright 2015 Robert von Burg <eitch@eitchnet.ch> * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package li.strolch.migrations; import static li.strolch.migrations.Migration.BAG_PARAMETERS; import static li.strolch.migrations.Migration.MIGRATIONS_ID; import static li.strolch.migrations.Migration.MIGRATIONS_TYPE; import static li.strolch.migrations.Migration.PARAM_CURRENT_DATA_VERSION; import static li.strolch.migrations.Migration.PARAM_CURRENT_CODE_VERSION; import java.util.HashMap; import java.util.Map; import li.strolch.agent.api.ComponentContainer; import li.strolch.agent.api.StrolchRealm; import li.strolch.model.Resource; import li.strolch.model.parameter.StringParameter; import li.strolch.persistence.api.StrolchTransaction; import li.strolch.privilege.model.Certificate; import li.strolch.runtime.configuration.StrolchConfigurationException; import li.strolch.utils.Version; public class CurrentMigrationVersionQuery { private ComponentContainer container; private Map<String, MigrationVersion> currentVersions; /** * @param container */ public CurrentMigrationVersionQuery(ComponentContainer container) { this.container = container; } public void doQuery(Certificate cert) { this.currentVersions = new HashMap<>(); for (String realmName : this.container.getRealmNames()) { StrolchRealm realm = this.container.getRealm(realmName); try (StrolchTransaction tx = realm.openTx(cert, getClass())) { tx.setSuppressDoNothingLogging(true); Resource migrationsRes = tx.getResourceBy(MIGRATIONS_TYPE, MIGRATIONS_ID); if (migrationsRes == null) { this.currentVersions.put(realmName, new MigrationVersion(Version.emptyVersion,Version.emptyVersion)); continue; } StringParameter currentDataVersionP = migrationsRes.getParameter(BAG_PARAMETERS, PARAM_CURRENT_DATA_VERSION); StringParameter currentCodeVersionP = migrationsRes.getParameter(BAG_PARAMETERS, PARAM_CURRENT_CODE_VERSION); if (currentDataVersionP == null && currentCodeVersionP == null) { this.currentVersions.put(realmName, new MigrationVersion(Version.emptyVersion,Version.emptyVersion)); } else if(currentDataVersionP == null && currentCodeVersionP != null) { Version codeVersion = getVersionFromParam(currentCodeVersionP); this.currentVersions.put(realmName, new MigrationVersion(Version.emptyVersion,codeVersion)); } else if (currentDataVersionP != null && currentCodeVersionP == null) { Version dataVersion = getVersionFromParam(currentDataVersionP); this.currentVersions.put(realmName, new MigrationVersion(dataVersion,Version.emptyVersion)); } else { Version dataVersion = getVersionFromParam(currentDataVersionP); Version codeVersion = getVersionFromParam(currentCodeVersionP); this.currentVersions.put(realmName, new MigrationVersion(dataVersion,codeVersion)); } } } } /** * @param versionS * @return */ private Version getVersionFromParam(StringParameter versionP) { String versionS = versionP.getValue(); if (!Version.isParseable(versionS)) { throw new StrolchConfigurationException("Version value " + versionS + " is not valid for " + versionP.getLocator()); } Version version = Version.valueOf(versionS); return version; } public Map<String, MigrationVersion> getCurrentVersions() { return this.currentVersions; } }