Java tutorial
/* * Copyright (c) 2006-2014 by Public Library of Science * * http://plos.org * http://ambraproject.org * * 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 org.ambraproject.service.migration; import com.google.common.collect.ImmutableCollection; import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import java.util.Arrays; import java.util.Collection; import java.util.SortedMap; /** * Static class for declaring non-legacy migrations. */ class Migrations { private Migrations() { throw new AssertionError("Not instantiable"); } private static final ImmutableCollection<SchemaMigration> MIGRATIONS = ImmutableList .copyOf(new SchemaMigration[] { // New migrations may be added to the end of this array. // // For migrations that only require running one or more SQL scripts, add a line like this: // new ScriptMigration(1001, "migration_1001_part1.sql", "migration_1001_part2.sql"), // // For migrations that require more complex procedural logic on a Session, add an object like this: // new SchemaMigration(1001) { // @Override protected void execute(Session session) throws SQLException { // // Do stuff // } // }, new ScriptMigration(1001, "migrate_ambra_1001.sql"), new ScriptMigration(1002, "migrate_ambra_1002.sql"), new ScriptMigration(1003, "migrate_ambra_1003.sql"), new ScriptMigration(1004, "migrate_ambra_1004.sql"), new ScriptMigration(1005, "migrate_ambra_1005.sql"), new ScriptMigration(1006, "migrate_ambra_1006.sql"), new ScriptMigration(1007, "migrate_ambra_1007.sql"), new ScriptMigration(1008, "migrate_ambra_1008.sql"), new ScriptMigration(1009, "migrate_ambra_1009.sql"), new ScriptMigration(1010, "migrate_ambra_1010.sql") }); /** * Get all migrations (legacy and non-legacy) necessary to migrate the database schema from its earliest version to * the present version. * * @return the ordered list of all migrations */ static ImmutableList<Migration> getAllMigrations() { Collection<Migration> migrations = Lists.newArrayList(); migrations.addAll(Arrays.asList(LegacyMigration.values())); migrations.addAll(MIGRATIONS); return sort(migrations); } /** * Sort migrations by version, checking that each version is unique and conforms to convention. * * @param migrations distinct migration objects * @return the migrations, sorted by version * @throws RuntimeException if a migration violates the numbering convention */ private static ImmutableList<Migration> sort(Iterable<? extends Migration> migrations) { SortedMap<Integer, Migration> map = Maps.newTreeMap(); for (Migration migration : migrations) { int version = migration.getVersion(); // Validate that version number matches convention if (version <= SchemaMigration.THRESHOLD && !(migration instanceof LegacyMigration)) { String message = String.format( "Illegal migration version: %d; non-legacy migrations must have version > %d", version, SchemaMigration.THRESHOLD); throw new RuntimeException(message); } if (map.put(version, migration) != null) { throw new RuntimeException("Collision on migration version: " + version); } } return ImmutableList.copyOf(map.values()); } }