/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package com.wcs.netbeans.liquiface.change.applier.provider; /* * #%L * Liquiface - GUI for Liquibase * %% * Copyright (C) 2013 Webstar Csoport Kft. * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * <http://www.gnu.org/licenses/gpl-3.0.html>. * #L% */ import com.wcs.netbeans.liquiface.change.applier.ApplyChange; import com.wcs.netbeans.liquiface.change.applier.ChangeApplier; import com.wcs.netbeans.liquiface.util.ClassUtil; import java.util.HashMap; import java.util.Map; import liquibase.change.Change; /** * * @author tveki */ public class LiquibaseChangeApplierProvider implements ChangeApplierProvider { private Map<Class<? extends Change>, ChangeApplier> applierMap; public LiquibaseChangeApplierProvider() { applierMap = new HashMap<Class<? extends Change>, ChangeApplier>(); } @Override public ChangeApplier getApplier(Change change) throws Exception { return getApplier(change.getClass()); } ChangeApplier getApplier(Class<? extends Change> changeClass) throws Exception{ ChangeApplier applier = applierMap.get(changeClass); if (applier == null){ applier = lookupApplier(changeClass); if (applier != null){ applierMap.put(changeClass, applier); } } return applier; } private ChangeApplier lookupApplier(Class<? extends Change> changeClass) throws Exception{ Class<? extends ChangeApplier> applierClass = null; for (Class klass : ClassUtil.getAllClassesRecursivelyFromPackageOf(ChangeApplier.class)){ if (isApplierMatchForChange(klass, changeClass)){ applierClass = klass; break; } } if (applierClass == null){ return null; } return applierClass.newInstance(); } private boolean isApplierMatchForChange(Class klass, Class<? extends Change> changeClass){ if (!ChangeApplier.class.isAssignableFrom(klass)){ return false; } if (!klass.isAnnotationPresent(ApplyChange.class)){ return false; } ApplyChange annotation = (ApplyChange) klass.getAnnotation(ApplyChange.class); if (annotation.value() == null){ return false; } return changeClass.equals(annotation.value()); } }