diff --git a/src/main/java/com/avaje/ebean/config/ServerConfig.java b/src/main/java/com/avaje/ebean/config/ServerConfig.java index a9145a3c0..503a904cf 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..f53eeb602 --- /dev/null +++ b/src/main/java/com/avaje/ebean/event/BeanFindController.java @@ -0,0 +1,54 @@ +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); + + /** + * Return true if this controller should intercept and process this find request. + * + * Return false to allow the default behavior to process the request. + */ + boolean isInterceptFind(BeanQueryRequest request); + + /** + * Find a bean using its id or unique predicate. + */ + T find(BeanQueryRequest request); + + /** + * Return true if this controller should intercept and process this findMany request. + * + * Return false to allow the default behavior to process the request. + */ + boolean isInterceptFindMany(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); + +} 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..b9cc4f8b2 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,19 @@ public class BootupClasses implements ClassPathSearchMatcher { } } + /** + * Add BeanFindController instances. + */ + 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 +169,22 @@ public class BootupClasses implements ClassPathSearchMatcher { return queryAdapterInstances; } + public List getBeanFindControllers() { + // add class registered BeanFindController to the + // list of 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 +236,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 +356,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..5f302bc94 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/core/DefaultServer.java +++ b/src/main/java/com/avaje/ebeaninternal/server/core/DefaultServer.java @@ -198,19 +198,20 @@ 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) { + 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 +223,24 @@ 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); } 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/InternalConfiguration.java b/src/main/java/com/avaje/ebeaninternal/server/core/InternalConfiguration.java index 4dda623be..df971d8db 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/core/InternalConfiguration.java +++ b/src/main/java/com/avaje/ebeaninternal/server/core/InternalConfiguration.java @@ -182,7 +182,7 @@ public class InternalConfiguration { } public OrmQueryEngine createOrmQueryEngine() { - return new DefaultOrmQueryEngine(beanDescriptorManager, cQueryEngine); + return new DefaultOrmQueryEngine(cQueryEngine); } public Persister createPersister(SpiEbeanServer server) { 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..44eb97fb8 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/core/OrmQueryRequest.java +++ b/src/main/java/com/avaje/ebeaninternal/server/core/OrmQueryRequest.java @@ -9,7 +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.BeanFinder; +import com.avaje.ebean.event.BeanFindController; import com.avaje.ebean.event.BeanQueryRequest; import com.avaje.ebeaninternal.api.BeanIdList; import com.avaje.ebeaninternal.api.HashQuery; @@ -40,7 +40,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 +315,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 37d0df7e7..7c4fe9dd2 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..6ba7f7e6c 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,6 @@ 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.ebeaninternal.api.SpiEbeanServer; import com.avaje.ebeaninternal.api.TransactionEventTable; import com.avaje.ebeaninternal.server.core.*; @@ -161,8 +160,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 +405,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 +433,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 +454,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 +933,10 @@ public class BeanDescriptorManager implements BeanDescriptorMap { private void setBeanControllerFinderListener(DeployBeanDescriptor descriptor) { - Class beanType = descriptor.getBeanType(); - persistControllerManager.addPersistControllers(descriptor); persistListenerManager.addPersistListeners(descriptor); beanQueryAdapterManager.addQueryAdapter(descriptor); - - BeanFinder beanFinder = beanFinderManager.getBeanFinder(beanType); - if (beanFinder != null) { - descriptor.setBeanFinder(beanFinder); - logger.debug("BeanFinder on[" + descriptor.getFullName() + "] " + beanFinder.getClass().getName()); - } + beanFinderManager.addFindControllers(descriptor); } /** 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..b8c343827 --- /dev/null +++ b/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanFinderAdapter.java @@ -0,0 +1,45 @@ +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; + +/** + * Wraps the old BeanFinder to make it implement BeanFindController. + */ +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 boolean isInterceptFind(BeanQueryRequest request) { + // always intercept to support old behavior + return true; + } + + @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) { + // always intercept to support old behavior + 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..0960483c3 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,85 @@ 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); + + /** + * Register of BeanFinder instances. + */ + 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 addFindControllers(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..9b7fa2ef0 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,14 +4,10 @@ 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.*; -import com.avaje.ebeaninternal.server.properties.BeanPropertyInfo; import javax.persistence.Entity; import javax.persistence.MappedSuperclass; @@ -109,7 +105,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 +334,7 @@ public class DeployBeanDescriptor { /** * Return the beanFinder. Usually null unless overriding the finder. */ - public BeanFinder getBeanFinder() { + public BeanFindController getBeanFinder() { return beanFinder; } @@ -346,7 +342,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..654715bea 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/query/DefaultOrmQueryEngine.java +++ b/src/main/java/com/avaje/ebeaninternal/server/query/DefaultOrmQueryEngine.java @@ -1,18 +1,17 @@ package com.avaje.ebeaninternal.server.query; -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.BeanFinder; +import com.avaje.ebean.event.BeanFindController; import com.avaje.ebeaninternal.api.BeanIdList; import com.avaje.ebeaninternal.api.SpiQuery; import com.avaje.ebeaninternal.api.SpiTransaction; import com.avaje.ebeaninternal.server.core.OrmQueryEngine; import com.avaje.ebeaninternal.server.core.OrmQueryRequest; import com.avaje.ebeaninternal.server.deploy.BeanDescriptor; -import com.avaje.ebeaninternal.server.deploy.BeanDescriptorManager; + +import java.util.Collection; /** * Main Finder implementation. @@ -27,7 +26,7 @@ public class DefaultOrmQueryEngine implements OrmQueryEngine { /** * Create the Finder. */ - public DefaultOrmQueryEngine(BeanDescriptorManager descMgr, CQueryEngine queryEngine) { + public DefaultOrmQueryEngine(CQueryEngine queryEngine) { this.queryEngine = queryEngine; } @@ -70,11 +69,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,10 +105,10 @@ public class DefaultOrmQueryEngine implements OrmQueryEngine { flushJdbcBatchOnQuery(request); - BeanFinder finder = request.getBeanFinder(); + BeanFindController finder = request.getBeanFinder(); T result; - if (finder != null) { + if (finder != null && finder.isInterceptFind(request)) { result = finder.find(request); } else { result = queryEngine.find(request); 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);