package com.goodworkalan.addendum; import static com.goodworkalan.addendum.Addendum.ENTITY_EXISTS; import static com.goodworkalan.addendum.Addendum.ENTITY_MISSING; import static com.goodworkalan.addendum.Addendum.TABLE_MISSING; import java.util.HashMap; import java.util.Map; import com.goodworkalan.danger.Danger; /** * A schema used to track the changes to the database. This tracking schema is * the authoritative schema. Schema information is obtained by tracking the * changes specified the addenda. * <p> * Column alterations that specify only attributes to change use the tracking * schema to obtain the missing attributes instead of selecting meta data from * the underlying database. * * @author Alan Gutierrez */ class Schema { /** The map of entities by table name. */ public final Map<String, Entity> entities = new HashMap<String, Entity>(); /** The map of entity names to table names. */ public final Map<String, String> aliases = new HashMap<String, String>(); /** * Get the entity definition with the given entity name. The entity is found * by looking up the given name in the aliases map, then by looking up the * entity in the entities map with the name found in the aliases map. If * either lookup returns null, an exception is thrown. * * @param name * The entity name. * @return The entity associated with the name. * @exception Addendum * If the entity alias does not exist or the entity * definition does not exist. */ public Entity getEntity(String name) { String tableName = aliases.get(name); if (tableName == null) { throw new Danger(Addendum.class, ENTITY_MISSING, name); } Entity entity = entities.get(tableName); if (entity == null) { throw new Danger(Addendum.class, TABLE_MISSING, tableName); } return entity; } /** * Return the entity name mapped to the given table name. * * @param tableName * The table name. * @return The entity name. */ public String getEntityName(String tableName) { for (Map.Entry<String, String> entry : aliases.entrySet()) { if (entry.getValue().equals(tableName)) { return entry.getKey(); } } return null; } /** * Renames the entity with the name given by from to the name given by to. * Throws an exception if the entity does not exist in the schema. * * @param from * The name to rename from. * @param to * The name to rename to. * @exception Addendum * If the entity does not exist in the schema. */ public void rename(String from, String to) { if (aliases.containsKey(to)) { throw new Danger(Addendum.class, ENTITY_EXISTS, to); } aliases.put(to, aliases.remove(from)); } }