/** * Copyright (C) 2012 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.util.db.script; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.util.Comparator; import java.util.Enumeration; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Properties; import java.util.Set; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Lists; import com.google.common.collect.Maps; /** * Utilities around master database schema versions. */ public final class DbScriptUtils { private static final String METADATA_FILE = "ogdb-metadata.properties"; private static final String METADATA_RESOURCE_PATH = "db/" + METADATA_FILE; private static final Logger s_logger = LoggerFactory.getLogger(DbScriptUtils.class); private static final Map<String, DbSchemaGroupMetadata> s_dbSchemaGroupMetadata; static { Map<String, DbSchemaGroupMetadata> schemaGroupMetadata = Maps.newTreeMap(new Comparator<String>() { @Override public int compare(String schemaName1, String schemaName2) { if (schemaName1.contains("-") && schemaName2.contains("-")) { return schemaName1.compareTo(schemaName2); } if (schemaName1.contains("-")) { return 1; } if (schemaName2.contains("-")) { return -1; } return schemaName1.compareTo(schemaName2); } }); ClassLoader classLoader = DbScriptUtils.class.getClassLoader(); try { Enumeration<URL> metadataResourceUrls = classLoader.getResources(METADATA_RESOURCE_PATH); while (metadataResourceUrls.hasMoreElements()) { URL metadataResourceUrl = metadataResourceUrls.nextElement(); String metadataResourceUrlString = metadataResourceUrl.toExternalForm(); String baseResourceUrlString = metadataResourceUrlString.substring(0, metadataResourceUrlString.length() - METADATA_FILE.length() - 1); try { InputStream in = metadataResourceUrl.openStream(); try { Properties properties = new Properties(); properties.load(in); for (Map.Entry<Object, Object> metadata : properties.entrySet()) { String schemaGroupName = (String) metadata.getKey(); if (schemaGroupMetadata.containsKey(schemaGroupName)) { continue; } int currentVersion = Integer.parseInt((String) metadata.getValue()); schemaGroupMetadata.put(schemaGroupName, new DbSchemaGroupMetadata(schemaGroupName, baseResourceUrlString, currentVersion)); } } catch (Exception e) { s_logger.error("Error reading database metadata resource at " + metadataResourceUrl, e); } finally { in.close(); } } catch (IOException e) { s_logger.error("Error opening database metadata resource at " + metadataResourceUrl, e); } } } catch (IOException e) { s_logger.error("Error looking for database metadata resources", e); } s_dbSchemaGroupMetadata = ImmutableMap.copyOf(schemaGroupMetadata); } private DbScriptUtils() { } public static Integer getCurrentVersion(String schemaGroupName) { DbSchemaGroupMetadata metadata = getDbSchemaGroupMetadata(schemaGroupName); if (metadata == null) { return null; } return metadata.getCurrentVersion(); } public static Set<String> getAllSchemaNames() { return s_dbSchemaGroupMetadata.keySet(); } public static List<DbSchemaGroupMetadata> getAllSchemaGroupMetadata() { List<DbSchemaGroupMetadata> allSchemaGroupMetadata = Lists.newArrayListWithCapacity(s_dbSchemaGroupMetadata.size()); for (Entry<String, DbSchemaGroupMetadata> entry : s_dbSchemaGroupMetadata.entrySet()) { allSchemaGroupMetadata.add(entry.getValue()); } return allSchemaGroupMetadata; } public static DbSchemaGroupMetadata getDbSchemaGroupMetadata(String schemaGroupName) { return getDbSchemaGroupMetadata().get(schemaGroupName); } private static Map<String, DbSchemaGroupMetadata> getDbSchemaGroupMetadata() { return s_dbSchemaGroupMetadata; } }