diff --git a/src/main/java/com/avaje/ebean/config/ServerConfig.java b/src/main/java/com/avaje/ebean/config/ServerConfig.java index 20f0ea183..ebac820b5 100644 --- a/src/main/java/com/avaje/ebean/config/ServerConfig.java +++ b/src/main/java/com/avaje/ebean/config/ServerConfig.java @@ -231,6 +231,7 @@ public class ServerConfig { private boolean uuidStoreAsBinary; + private List findControllers = new ArrayList(); private List persistControllers = new ArrayList(); private List persistListeners = new ArrayList(); private List queryAdapters = new ArrayList(); @@ -1540,6 +1541,14 @@ public class ServerConfig { persistControllers.add(beanPersistController); } + public List getFindControllers() { + return findControllers; + } + + public void setFindControllers(List findControllers) { + this.findControllers = findControllers; + } + /** * Return the BeanPersistController instances. */ diff --git a/src/main/java/com/avaje/ebean/event/BeanFindController.java b/src/main/java/com/avaje/ebean/event/BeanFindController.java new file mode 100644 index 000000000..2d12a7e52 --- /dev/null +++ b/src/main/java/com/avaje/ebean/event/BeanFindController.java @@ -0,0 +1,42 @@ +package com.avaje.ebean.event; + +import com.avaje.ebean.bean.BeanCollection; + +/** + * Used to override the finding implementation for a bean. + *

+ * For beans that are not in a JDBC data source you can implement this handle + * bean finding. For example, read a log file building each entry as a bean and + * returning that. + *

+ *

+ * There are a number of internal BeanFinders in Ebean to return meta data from + * Ebean at runtime such as query execution statistics etc. See the beans in + * com.avaje.ebean.meta and finders in com.avaje.ebean.server.meta. + *

+ */ +public interface BeanFindController { + + /** + * Return true if this BeanPersistController should be registered for events + * on this entity type. + */ + boolean isRegisterFor(Class cls); + + /** + * Find a bean using its id or unique predicate. + */ + T find(BeanQueryRequest request); + + /** + * Return a List, Set or Map for the given find request. + *

+ * Note the returning object is cast to a List Set or Map so you do need to + * get the return type right. + *

+ */ + BeanCollection findMany(BeanQueryRequest request); + + boolean isInterceptFindMany(BeanQueryRequest request); + +} diff --git a/src/main/java/com/avaje/ebeaninternal/api/SpiEbeanPlugin.java b/src/main/java/com/avaje/ebeaninternal/api/SpiEbeanPlugin.java index 4496b69d5..637a79e92 100644 --- a/src/main/java/com/avaje/ebeaninternal/api/SpiEbeanPlugin.java +++ b/src/main/java/com/avaje/ebeaninternal/api/SpiEbeanPlugin.java @@ -9,6 +9,7 @@ import com.avaje.ebean.config.dbplatform.DatabasePlatform; * author: Richard Vowles - http://gplus.to/RichardVowles */ public interface SpiEbeanPlugin { + /** * initializes the plugin. * @@ -16,7 +17,7 @@ public interface SpiEbeanPlugin { * @param dbPlatform - the database we are using - this is available from the server, but it is provided for convenience * @param serverConfig - the configured server information. It allows access to pre-collected information (but not the collector PropertySource, yet) */ - public void setup(SpiEbeanServer server, DatabasePlatform dbPlatform, ServerConfig serverConfig); + void setup(SpiEbeanServer server, DatabasePlatform dbPlatform, ServerConfig serverConfig); - public void execute(boolean online); + void execute(boolean online); } diff --git a/src/main/java/com/avaje/ebeaninternal/api/SpiEbeanPluginWithConfig.java b/src/main/java/com/avaje/ebeaninternal/api/SpiEbeanPluginWithConfig.java new file mode 100644 index 000000000..a15aa3a02 --- /dev/null +++ b/src/main/java/com/avaje/ebeaninternal/api/SpiEbeanPluginWithConfig.java @@ -0,0 +1,18 @@ +package com.avaje.ebeaninternal.api; + +import com.avaje.ebean.config.ServerConfig; +import com.avaje.ebean.config.dbplatform.DatabasePlatform; + +/** + * Extends SpiEbeanPlugin with an early call to setup configuration. + */ +public interface SpiEbeanPluginWithConfig extends SpiEbeanPlugin { + + /** + * Modify the ServerConfig. + * + * This occurs early prior to the EbeanServer being built. + */ + void modifyServerConfig(ServerConfig serverConfig); + +} diff --git a/src/main/java/com/avaje/ebeaninternal/server/core/BootupClasses.java b/src/main/java/com/avaje/ebeaninternal/server/core/BootupClasses.java index 3b4af8ed9..dff1e4110 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/core/BootupClasses.java +++ b/src/main/java/com/avaje/ebeaninternal/server/core/BootupClasses.java @@ -9,18 +9,13 @@ import javax.persistence.Embeddable; import javax.persistence.Entity; import javax.persistence.Table; +import com.avaje.ebean.event.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.avaje.ebean.config.CompoundType; import com.avaje.ebean.config.ScalarTypeConverter; import com.avaje.ebean.config.ServerConfig; -import com.avaje.ebean.event.BeanFinder; -import com.avaje.ebean.event.BeanPersistController; -import com.avaje.ebean.event.BeanPersistListener; -import com.avaje.ebean.event.BeanQueryAdapter; -import com.avaje.ebean.event.ServerConfigStartup; -import com.avaje.ebean.event.TransactionEventListener; import com.avaje.ebeaninternal.server.type.ScalarType; import com.avaje.ebeaninternal.server.util.ClassPathSearchMatcher; @@ -47,15 +42,15 @@ public class BootupClasses implements ClassPathSearchMatcher { private ArrayList> transactionEventListenerList = new ArrayList>(); private ArrayList> beanFinderList = new ArrayList>(); - - private ArrayList> beanListenerList = new ArrayList>(); - + private ArrayList> beanFindControllerList = new ArrayList>(); private ArrayList> beanQueryAdapterList = new ArrayList>(); + private ArrayList> beanListenerList = new ArrayList>(); private ArrayList> serverConfigStartupList = new ArrayList>(); private ArrayList serverConfigStartupInstances = new ArrayList(); + private List findControllerInstances = new ArrayList(); private List persistControllerInstances = new ArrayList(); private List persistListenerInstances = new ArrayList(); private List queryAdapterInstances = new ArrayList(); @@ -112,6 +107,16 @@ public class BootupClasses implements ClassPathSearchMatcher { } } + public void addFindControllers(List findControllers) { + if (findControllers != null) { + for (BeanFindController c : findControllers) { + this.findControllerInstances.add(c); + // don't automatically instantiate + this.beanFindControllerList.remove(c.getClass()); + } + } + } + /** * Add TransactionEventListeners instances. */ @@ -161,6 +166,22 @@ public class BootupClasses implements ClassPathSearchMatcher { return queryAdapterInstances; } + public List getBeanFindControllers() { + // add class registered BeanPersistController to the + // already created instances + for (Class cls : beanFindControllerList) { + try { + BeanFindController newInstance = (BeanFindController) cls.newInstance(); + findControllerInstances.add(newInstance); + } catch (Exception e) { + String msg = "Error creating BeanPersistController " + cls; + logger.error(msg, e); + } + } + + return findControllerInstances; + } + public List getBeanPersistListeners() { // add class registered BeanPersistController to the // already created instances @@ -212,63 +233,63 @@ public class BootupClasses implements ClassPathSearchMatcher { /** * Return the list of Embeddable classes. */ - public ArrayList> getEmbeddables() { + public List> getEmbeddables() { return embeddableList; } /** * Return the list of entity classes. */ - public ArrayList> getEntities() { + public List> getEntities() { return entityList; } /** * Return the list of ScalarTypes found. */ - public ArrayList> getScalarTypes() { + public List> getScalarTypes() { return scalarTypeList; } /** * Return the list of ScalarConverters found. */ - public ArrayList> getScalarConverters() { + public List> getScalarConverters() { return scalarConverterList; } /** * Return the list of ScalarConverters found. */ - public ArrayList> getCompoundTypes() { + public List> getCompoundTypes() { return compoundTypeList; } /** * Return the list of BeanControllers found. */ - public ArrayList> getBeanControllers() { + public List> getBeanControllers() { return beanControllerList; } /** * Return the list of TransactionEventListeners found */ - public ArrayList> getTransactionEventListenerList() { + public List> getTransactionEventListenerList() { return transactionEventListenerList; } /** * Return the list of BeanFinders found. */ - public ArrayList> getBeanFinders() { + public List> getBeanFinders() { return beanFinderList; } /** * Return the list of BeanListeners found. */ - public ArrayList> getBeanListeners() { + public List> getBeanListeners() { return beanListenerList; } @@ -332,6 +353,11 @@ public class BootupClasses implements ClassPathSearchMatcher { interesting = true; } + if (BeanFindController.class.isAssignableFrom(cls)) { + beanFindControllerList.add(cls); + interesting = true; + } + if (BeanPersistListener.class.isAssignableFrom(cls)) { beanListenerList.add(cls); interesting = true; diff --git a/src/main/java/com/avaje/ebeaninternal/server/core/DatabasePlatformFactory.java b/src/main/java/com/avaje/ebeaninternal/server/core/DatabasePlatformFactory.java index d2600ebc3..a65ba6b21 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/core/DatabasePlatformFactory.java +++ b/src/main/java/com/avaje/ebeaninternal/server/core/DatabasePlatformFactory.java @@ -80,7 +80,9 @@ public class DatabasePlatformFactory { if (dbName.equals("mysql")) { return new MySqlPlatform(); } - + if (dbName.equals("h2")) { + return new H2Platform(); + } if (dbName.equals("sqlite")) { return new SQLitePlatform(); } diff --git a/src/main/java/com/avaje/ebeaninternal/server/core/DefaultContainer.java b/src/main/java/com/avaje/ebeaninternal/server/core/DefaultContainer.java index fc03eb80f..41449ab7d 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/core/DefaultContainer.java +++ b/src/main/java/com/avaje/ebeaninternal/server/core/DefaultContainer.java @@ -233,6 +233,7 @@ public class DefaultContainer implements SpiContainer { BootupClasses bootupClasses = getBootupClasses1(serverConfig); bootupClasses.addPersistControllers(serverConfig.getPersistControllers()); + bootupClasses.addFindControllers(serverConfig.getFindControllers()); bootupClasses.addTransactionEventListeners(serverConfig.getTransactionEventListeners()); bootupClasses.addPersistListeners(serverConfig.getPersistListeners()); bootupClasses.addQueryAdapters(serverConfig.getQueryAdapters()); diff --git a/src/main/java/com/avaje/ebeaninternal/server/core/DefaultServer.java b/src/main/java/com/avaje/ebeaninternal/server/core/DefaultServer.java index b6ea67a9b..38db8c413 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/core/DefaultServer.java +++ b/src/main/java/com/avaje/ebeaninternal/server/core/DefaultServer.java @@ -147,6 +147,8 @@ public final class DefaultServer implements SpiEbeanServer { */ private List ebeanPlugins; + private List ebeanPluginsWithConfig; + private final boolean collectQueryOrigins; private final boolean collectQueryStatsByNode; @@ -161,6 +163,8 @@ public final class DefaultServer implements SpiEbeanServer { */ public DefaultServer(InternalConfiguration config, ServerCacheManager cache) { + // load any plugins that modify the serverConfig early + this.ebeanPluginsWithConfig = loadPluginsWithConfig(config.getServerConfig()); this.serverConfig = config.getServerConfig(); this.objectGraphStats = new ConcurrentHashMap(); this.metaInfoManager = new DefaultMetaInfoManager(this); @@ -198,19 +202,33 @@ public final class DefaultServer implements SpiEbeanServer { this.beanLoader = new DefaultBeanLoader(this); this.jsonContext = config.createJsonContext(this); - loadAndInitializePlugins(config); + // load normal plugins late and call setup on all + loadAndInitializePlugins(config.getServerConfig()); // Register with the JVM Shutdown hook ShutdownManager.registerEbeanServer(this); } - protected void loadAndInitializePlugins(InternalConfiguration config) { + /** + * load plugins with config adjustments. This occurs early + */ + protected List loadPluginsWithConfig(ServerConfig config) { + + List plugins = new ArrayList(); + for (SpiEbeanPluginWithConfig plugin : ServiceLoader.load(SpiEbeanPluginWithConfig.class)) { + plugins.add(plugin); + plugin.modifyServerConfig(config); + } + return plugins; + } + + protected void loadAndInitializePlugins(ServerConfig config) { List spiPlugins = new ArrayList(); for (SpiEbeanPlugin plugin : ServiceLoader.load(SpiEbeanPlugin.class)) { spiPlugins.add(plugin); - plugin.setup(this, this.getDatabasePlatform(), config.getServerConfig()); + plugin.setup(this, this.getDatabasePlatform(), config); if (plugin instanceof DdlGenerator) { // backwards compatible @@ -222,18 +240,30 @@ public final class DefaultServer implements SpiEbeanServer { // ServiceLoader not finding ddlGenerator (typically OSGi) ddlGenerator = new DdlGenerator(); spiPlugins.add(ddlGenerator); - ddlGenerator.setup(this, this.getDatabasePlatform(), config.getServerConfig()); + ddlGenerator.setup(this, this.getDatabasePlatform(), config); + } + + // also setup on any SpiEbeanPluginWithConfig + for (SpiEbeanPluginWithConfig plugin : ebeanPluginsWithConfig) { + plugin.setup(this, this.getDatabasePlatform(), config); + spiPlugins.add(plugin); } ebeanPlugins = Collections.unmodifiableList(spiPlugins); } + /** + * Return the list of registered plugins. + */ public List getSpiEbeanPlugins() { return ebeanPlugins; } + /** + * Execute all the plugins with an online flag indicating the DB is up or not. + */ public void executePlugins(boolean online) { - for(SpiEbeanPlugin plugin : ebeanPlugins) { + for (SpiEbeanPlugin plugin : ebeanPlugins) { plugin.execute(online); } } diff --git a/src/main/java/com/avaje/ebeaninternal/server/core/OrmQueryRequest.java b/src/main/java/com/avaje/ebeaninternal/server/core/OrmQueryRequest.java index 992198295..5fdf10e47 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/core/OrmQueryRequest.java +++ b/src/main/java/com/avaje/ebeaninternal/server/core/OrmQueryRequest.java @@ -9,6 +9,7 @@ import javax.persistence.PersistenceException; import com.avaje.ebean.*; import com.avaje.ebean.bean.BeanCollection; import com.avaje.ebean.bean.PersistenceContext; +import com.avaje.ebean.event.BeanFindController; import com.avaje.ebean.event.BeanFinder; import com.avaje.ebean.event.BeanQueryRequest; import com.avaje.ebeaninternal.api.BeanIdList; @@ -40,7 +41,7 @@ public final class OrmQueryRequest extends BeanRequest implements BeanQueryRe private final SpiQuery query; - private final BeanFinder finder; + private final BeanFindController finder; private final Boolean readOnly; @@ -315,7 +316,7 @@ public final class OrmQueryRequest extends BeanRequest implements BeanQueryRe /** * Return a bean specific finder if one has been set. */ - public BeanFinder getBeanFinder() { + public BeanFindController getBeanFinder() { return finder; } diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanDescriptor.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanDescriptor.java index af4db3894..23b382da2 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanDescriptor.java +++ b/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanDescriptor.java @@ -10,10 +10,7 @@ import com.avaje.ebean.bean.PersistenceContext; import com.avaje.ebean.config.EncryptKey; import com.avaje.ebean.config.dbplatform.IdGenerator; import com.avaje.ebean.config.dbplatform.IdType; -import com.avaje.ebean.event.BeanFinder; -import com.avaje.ebean.event.BeanPersistController; -import com.avaje.ebean.event.BeanPersistListener; -import com.avaje.ebean.event.BeanQueryAdapter; +import com.avaje.ebean.event.*; import com.avaje.ebean.meta.MetaBeanInfo; import com.avaje.ebean.meta.MetaQueryPlanStatistic; import com.avaje.ebeaninternal.api.*; @@ -153,7 +150,7 @@ public class BeanDescriptor implements MetaBeanInfo { /** * If set overrides the find implementation. Server side only. */ - private final BeanFinder beanFinder; + private final BeanFindController beanFinder; /** * The table joins for this bean. @@ -1514,7 +1511,7 @@ public class BeanDescriptor implements MetaBeanInfo { /** * Return the beanFinder. Usually null unless overriding the finder. */ - public BeanFinder getBeanFinder() { + public BeanFindController getBeanFinder() { return beanFinder; } diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanDescriptorManager.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanDescriptorManager.java index 081853f3a..894321298 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanDescriptorManager.java +++ b/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanDescriptorManager.java @@ -14,7 +14,7 @@ import com.avaje.ebean.config.dbplatform.DatabasePlatform; import com.avaje.ebean.config.dbplatform.DbIdentity; import com.avaje.ebean.config.dbplatform.IdGenerator; import com.avaje.ebean.config.dbplatform.IdType; -import com.avaje.ebean.event.BeanFinder; +import com.avaje.ebean.event.BeanFindController; import com.avaje.ebeaninternal.api.SpiEbeanServer; import com.avaje.ebeaninternal.api.TransactionEventTable; import com.avaje.ebeaninternal.server.core.*; @@ -161,8 +161,7 @@ public class BeanDescriptorManager implements BeanDescriptorMap { this.persistControllerManager = new PersistControllerManager(bootupClasses); this.persistListenerManager = new PersistListenerManager(bootupClasses); this.beanQueryAdapterManager = new BeanQueryAdapterManager(bootupClasses); - - this.beanFinderManager = new DefaultBeanFinderManager(); + this.beanFinderManager = new BeanFinderManager(bootupClasses); this.reflectFactory = createReflectionFactory(); this.transientProperties = new TransientProperties(); @@ -407,7 +406,7 @@ public class BeanDescriptorManager implements BeanDescriptorMap { int qa = beanQueryAdapterManager.getRegisterCount(); int cc = persistControllerManager.getRegisterCount(); int lc = persistListenerManager.getRegisterCount(); - int fc = beanFinderManager.createBeanFinders(bootupClasses.getBeanFinders()); + int fc = beanFinderManager.getRegisterCount(); logger.debug("BeanPersistControllers[" + cc + "] BeanFinders[" + fc + "] BeanPersistListeners[" + lc + "] BeanQueryAdapters[" + qa + "]"); } @@ -435,7 +434,7 @@ public class BeanDescriptorManager implements BeanDescriptorMap { */ private void readEmbeddedDeployment() { - ArrayList> embeddedClasses = bootupClasses.getEmbeddables(); + List> embeddedClasses = bootupClasses.getEmbeddables(); for (int i = 0; i < embeddedClasses.size(); i++) { Class cls = embeddedClasses.get(i); if (logger.isTraceEnabled()) { @@ -456,7 +455,7 @@ public class BeanDescriptorManager implements BeanDescriptorMap { */ private void readEntityDeploymentInitial() { - ArrayList> entityClasses = bootupClasses.getEntities(); + List> entityClasses = bootupClasses.getEntities(); for (Class entityClass : entityClasses) { DeployBeanInfo info = createDeployBeanInfo(entityClass); @@ -935,17 +934,18 @@ public class BeanDescriptorManager implements BeanDescriptorMap { private void setBeanControllerFinderListener(DeployBeanDescriptor descriptor) { - Class beanType = descriptor.getBeanType(); +// Class beanType = descriptor.getBeanType(); persistControllerManager.addPersistControllers(descriptor); persistListenerManager.addPersistListeners(descriptor); beanQueryAdapterManager.addQueryAdapter(descriptor); + beanFinderManager.addControllers(descriptor); - BeanFinder beanFinder = beanFinderManager.getBeanFinder(beanType); - if (beanFinder != null) { - descriptor.setBeanFinder(beanFinder); - logger.debug("BeanFinder on[" + descriptor.getFullName() + "] " + beanFinder.getClass().getName()); - } +// BeanFindController beanFinder = beanFinderManager.getBeanFinder(beanType); +// if (beanFinder != null) { +// descriptor.setBeanFinder(beanFinder); +// logger.debug("BeanFinder on[" + descriptor.getFullName() + "] " + beanFinder.getClass().getName()); +// } } /** diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanFinderAdapter.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanFinderAdapter.java new file mode 100644 index 000000000..ba1d41e64 --- /dev/null +++ b/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanFinderAdapter.java @@ -0,0 +1,39 @@ +package com.avaje.ebeaninternal.server.deploy; + +import com.avaje.ebean.bean.BeanCollection; +import com.avaje.ebean.event.BeanFindController; +import com.avaje.ebean.event.BeanFinder; +import com.avaje.ebean.event.BeanQueryRequest; + +/** + * Created by rob on 21/06/15. + */ +public class BeanFinderAdapter implements BeanFindController { + + final BeanFinder beanFinder; + + public BeanFinderAdapter(BeanFinder beanFinder) { + this.beanFinder = beanFinder; + } + + @Override + public boolean isRegisterFor(Class cls) { + return false; + } + + @Override + public T find(BeanQueryRequest request) { + return (T)beanFinder.find(request); + } + + + @Override + public BeanCollection findMany(BeanQueryRequest request) { + return beanFinder.findMany(request); + } + + @Override + public boolean isInterceptFindMany(BeanQueryRequest request) { + return true; + } +} diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanFinderManager.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanFinderManager.java index 8309a1f41..cf79be954 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanFinderManager.java +++ b/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanFinderManager.java @@ -1,26 +1,82 @@ package com.avaje.ebeaninternal.server.deploy; -import java.util.List; - +import com.avaje.ebean.event.BeanFindController; import com.avaje.ebean.event.BeanFinder; +import com.avaje.ebeaninternal.server.core.BootupClasses; +import com.avaje.ebeaninternal.server.deploy.meta.DeployBeanDescriptor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.persistence.PersistenceException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; /** - * Factory for controlling the construction of BeanFinders. + * Default implementation for BeanFinderFactory. */ -public interface BeanFinderManager { - - /** - * Return the number of beans with a registered finder. - */ - public int getRegisterCount(); +public class BeanFinderManager { - /** - * Create the appropriate BeanController. - */ - public int createBeanFinders(List> finderClassList); - - /** - * Return the BeanController for a given entity type. - */ - public BeanFinder getBeanFinder(Class entityType); + final Logger logger = LoggerFactory.getLogger(BeanFinderManager.class); + + final Map, BeanFinder> registerFor = new HashMap, BeanFinder>(); + + private final List list; + + public BeanFinderManager(BootupClasses bootupClasses) { + list = bootupClasses.getBeanFindControllers(); + + List> beanFinders = bootupClasses.getBeanFinders(); + for (Class cls : beanFinders) { + Class entityType = getEntityClass(cls); + try { + BeanFinder beanFinder = (BeanFinder) cls.newInstance(); + registerFor.put(entityType, beanFinder); + + } catch (Exception ex) { + throw new PersistenceException(ex); + } + } + } + + public int getRegisterCount() { + return registerFor.size() + list.size(); + } + + /** + * Return the BeanPersistController for a given entity type. + */ + public void addControllers(DeployBeanDescriptor deployDesc) { + + for (int i = 0; i < list.size(); i++) { + BeanFindController c = list.get(i); + if (c.isRegisterFor(deployDesc.getBeanType())) { + logger.debug("BeanFindController on[" + deployDesc.getFullName() + "] " + c.getClass().getName()); + deployDesc.setBeanFinder(c); + } + } + // support the deprecated BeanFinder + BeanFinder beanFinder = registerFor.get(deployDesc.getBeanType()); + if (beanFinder != null) { + deployDesc.setBeanFinder(new BeanFinderAdapter(beanFinder)); + logger.debug("BeanFinder on[" + deployDesc.getFullName() + "] " + beanFinder.getClass().getName()); + } + } + + /** + * Find the entity class given the controller class. + *

+ * This uses reflection to find the generics parameter type. + *

+ */ + private Class getEntityClass(Class controller) { + + Class cls = ParamTypeUtil.findParamType(controller, BeanFinder.class); + + if (cls == null) { + String msg = "Could not determine the entity class (generics parameter type) from " + controller + " using reflection."; + throw new PersistenceException(msg); + } + return cls; + } } diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/DefaultBeanFinderManager.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/DefaultBeanFinderManager.java deleted file mode 100644 index 169441f76..000000000 --- a/src/main/java/com/avaje/ebeaninternal/server/deploy/DefaultBeanFinderManager.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.avaje.ebeaninternal.server.deploy; - -import java.util.HashMap; -import java.util.List; - -import javax.persistence.PersistenceException; - -import com.avaje.ebean.event.BeanFinder; - -/** - * Default implementation for BeanFinderFactory. - */ -public class DefaultBeanFinderManager implements BeanFinderManager { - - HashMap, BeanFinder> registerFor = new HashMap, BeanFinder>(); - - public int createBeanFinders(List> finderClassList) { - - for (Class cls : finderClassList) { - Class entityType = getEntityClass(cls); - try { - BeanFinder beanFinder = (BeanFinder) cls.newInstance(); - registerFor.put(entityType, beanFinder); - - } catch (Exception ex) { - throw new PersistenceException(ex); - } - } - - return registerFor.size(); - } - - public int getRegisterCount() { - return registerFor.size(); - } - - /** - * Return the BeanFinder for a given entity type. - */ - @SuppressWarnings("unchecked") - public BeanFinder getBeanFinder(Class entityType) { - return (BeanFinder)registerFor.get(entityType); - } - - /** - * Find the entity class given the controller class. - *

- * This uses reflection to find the generics parameter type. - *

- */ - private Class getEntityClass(Class controller){ - - Class cls = ParamTypeUtil.findParamType(controller, BeanFinder.class); - - if (cls == null){ - String msg = "Could not determine the entity class (generics parameter type) from "+controller+" using reflection."; - throw new PersistenceException(msg); - } - return cls; - } -} diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/PersistControllerManager.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/PersistControllerManager.java index 32f2e28e2..acecde27e 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/deploy/PersistControllerManager.java +++ b/src/main/java/com/avaje/ebeaninternal/server/deploy/PersistControllerManager.java @@ -13,31 +13,31 @@ import org.slf4j.LoggerFactory; */ public class PersistControllerManager { - private static final Logger logger = LoggerFactory.getLogger(PersistControllerManager.class); + private static final Logger logger = LoggerFactory.getLogger(PersistControllerManager.class); - private final List list; - - public PersistControllerManager(BootupClasses bootupClasses){ - - list = bootupClasses.getBeanPersistControllers(); + private final List list; + + public PersistControllerManager(BootupClasses bootupClasses) { + + list = bootupClasses.getBeanPersistControllers(); + } + + public int getRegisterCount() { + return list.size(); + } + + /** + * Return the BeanPersistController for a given entity type. + */ + public void addPersistControllers(DeployBeanDescriptor deployDesc) { + + for (int i = 0; i < list.size(); i++) { + BeanPersistController c = list.get(i); + if (c.isRegisterFor(deployDesc.getBeanType())) { + logger.debug("BeanPersistController on[" + deployDesc.getFullName() + "] " + c.getClass().getName()); + deployDesc.addPersistController(c); + } } - - public int getRegisterCount() { - return list.size(); - } - - /** - * Return the BeanPersistController for a given entity type. - */ - public void addPersistControllers(DeployBeanDescriptor deployDesc){ - - for (int i = 0; i < list.size(); i++) { - BeanPersistController c = list.get(i); - if (c.isRegisterFor(deployDesc.getBeanType())){ - logger.debug("BeanPersistController on[" + deployDesc.getFullName() + "] " + c.getClass().getName()); - deployDesc.addPersistController(c); - } - } - } - + } + } diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/meta/DeployBeanDescriptor.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/meta/DeployBeanDescriptor.java index 071b00af4..d01c0a2ba 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/deploy/meta/DeployBeanDescriptor.java +++ b/src/main/java/com/avaje/ebeaninternal/server/deploy/meta/DeployBeanDescriptor.java @@ -4,10 +4,7 @@ import com.avaje.ebean.annotation.ConcurrencyMode; import com.avaje.ebean.config.TableName; import com.avaje.ebean.config.dbplatform.IdGenerator; import com.avaje.ebean.config.dbplatform.IdType; -import com.avaje.ebean.event.BeanFinder; -import com.avaje.ebean.event.BeanPersistController; -import com.avaje.ebean.event.BeanPersistListener; -import com.avaje.ebean.event.BeanQueryAdapter; +import com.avaje.ebean.event.*; import com.avaje.ebeaninternal.server.core.CacheOptions; import com.avaje.ebeaninternal.server.deploy.BeanDescriptor.EntityType; import com.avaje.ebeaninternal.server.deploy.*; @@ -109,7 +106,7 @@ public class DeployBeanDescriptor { /** * If set overrides the find implementation. Server side only. */ - private BeanFinder beanFinder; + private BeanFindController beanFinder; /** * The table joins for this bean. Server side only. @@ -338,7 +335,7 @@ public class DeployBeanDescriptor { /** * Return the beanFinder. Usually null unless overriding the finder. */ - public BeanFinder getBeanFinder() { + public BeanFindController getBeanFinder() { return beanFinder; } @@ -346,7 +343,7 @@ public class DeployBeanDescriptor { * Set the BeanFinder to use for beans of this type. This is set to override * the finding from the default. */ - public void setBeanFinder(BeanFinder beanFinder) { + public void setBeanFinder(BeanFindController beanFinder) { this.beanFinder = beanFinder; } diff --git a/src/main/java/com/avaje/ebeaninternal/server/query/DefaultOrmQueryEngine.java b/src/main/java/com/avaje/ebeaninternal/server/query/DefaultOrmQueryEngine.java index 5616ac538..6690aaa24 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/query/DefaultOrmQueryEngine.java +++ b/src/main/java/com/avaje/ebeaninternal/server/query/DefaultOrmQueryEngine.java @@ -5,6 +5,7 @@ import java.util.Collection; import com.avaje.ebean.QueryIterator; import com.avaje.ebean.bean.BeanCollection; import com.avaje.ebean.bean.EntityBean; +import com.avaje.ebean.event.BeanFindController; import com.avaje.ebean.event.BeanFinder; import com.avaje.ebeaninternal.api.BeanIdList; import com.avaje.ebeaninternal.api.SpiQuery; @@ -70,11 +71,11 @@ public class DefaultOrmQueryEngine implements OrmQueryEngine { flushJdbcBatchOnQuery(request); - BeanFinder finder = request.getBeanFinder(); + BeanFindController finder = request.getBeanFinder(); BeanCollection result; - if (finder != null) { - // this bean type has its own specific finder + if (finder != null && finder.isInterceptFindMany(request)) { + // intercept this request result = finder.findMany(request); } else { result = queryEngine.findMany(request); @@ -106,7 +107,7 @@ public class DefaultOrmQueryEngine implements OrmQueryEngine { flushJdbcBatchOnQuery(request); - BeanFinder finder = request.getBeanFinder(); + BeanFindController finder = request.getBeanFinder(); T result; if (finder != null) { diff --git a/src/main/java/com/avaje/ebeaninternal/server/type/DefaultTypeManager.java b/src/main/java/com/avaje/ebeaninternal/server/type/DefaultTypeManager.java index 24825de3c..98c17d00c 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/type/DefaultTypeManager.java +++ b/src/main/java/com/avaje/ebeaninternal/server/type/DefaultTypeManager.java @@ -609,7 +609,7 @@ public final class DefaultTypeManager implements TypeManager, KnownImmutable { protected void initialiseCompoundTypes(BootupClasses bootupClasses) { - ArrayList> compoundTypes = bootupClasses.getCompoundTypes(); + List> compoundTypes = bootupClasses.getCompoundTypes(); for (int j = 0; j < compoundTypes.size(); j++) { Class type = compoundTypes.get(j);