package org.jboss.tools.hibernate.runtime.common; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import org.jboss.tools.hibernate.runtime.spi.IDatabaseCollector; import org.jboss.tools.hibernate.runtime.spi.IJDBCReader; import org.jboss.tools.hibernate.runtime.spi.IProgressListener; public abstract class AbstractJDBCReaderFacade extends AbstractFacade implements IJDBCReader { public AbstractJDBCReaderFacade( IFacadeFactory facadeFactory, Object target) { super(facadeFactory, target); } @Override public void readDatabaseSchema( IDatabaseCollector databaseCollector, String defaultCatalogName, String defaultSchemaName, IProgressListener progressListener) { Object databaseCollectorTarget = Util.invokeMethod( databaseCollector, "getTarget", new Class[] {}, new Object[] {}); Util.invokeMethod( getTarget(), "readDatabaseSchema", new Class[] { getDatabaseCollectorClass(), String.class, String.class, getProgressListenerClass() }, new Object[] { databaseCollectorTarget, defaultCatalogName, defaultSchemaName, createProgressListener(progressListener) }); } public Class<?> getProgressListenerClass() { return Util.getClass( getProgressListenerClassName(), getFacadeFactoryClassLoader()); } public Class<?> getDatabaseCollectorClass() { return Util.getClass( getDatabaseCollectorClassName(), getFacadeFactoryClassLoader()); } public String getProgressListenerClassName() { return "org.hibernate.cfg.reveng.ProgressListener"; } public String getDatabaseCollectorClassName() { return "org.hibernate.cfg.reveng.DatabaseCollector"; } private Object createProgressListener(IProgressListener progressListener) { return Proxy.newProxyInstance( getFacadeFactoryClassLoader(), new Class[] { getProgressListenerClass() }, new ProgressListenerInvocationHandler(progressListener)); } private class ProgressListenerInvocationHandler implements InvocationHandler { public Object target; public ProgressListenerInvocationHandler(Object target) { this.target = target; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if ("startSubTask".equals(method.getName())) { Util.invokeMethod(target, "startSubTask", new Class[] { String.class }, args); } return null; } } }