public JDBCFindEntitiesCommand(JDBCCommandFactory factory) {
// Constructors --------------------------------------------------
this.factory = factory;
boolean debug = log.isDebugEnabled();
// If finder method uses custom implementation, then it is used. This overrides
// defined and automatic finders.
Class ejbClass = null;
try {
ejbClass =
factory.getContainer()
.getClassLoader()
.loadClass(factory.getMetaData().getEntity().getEjbClass());
Method[] customMethods = ejbClass.getMethods();
for (int i = 0; i < customMethods.length; i++)
{
Method m = customMethods[i];
String name = m.getName();
if (name.startsWith("ejbFindBy")) {
String remoteName = "f"+name.substring(4);
try {
knownFinderCommands.put(remoteName, new CustomFindByEntitiesCommand(m));
if (debug)
log.debug("Added custom finder " + remoteName +".");
} catch (IllegalArgumentException e) {
log.error("Could not create the custom finder " + remoteName+".", e);
}
}
}
} catch (Exception e) {
// for some reason, this failed; try to use defined or automatic instead
log.warn("Error initializing custom finder", e);
}
// Make commands for the defined finders
Iterator definedFinders = factory.getMetaData().getFinders();
while(definedFinders.hasNext())
{
FinderMetaData f = (FinderMetaData)definedFinders.next();
if ( !knownFinderCommands.containsKey(f.getName()) )
{
JPMFindEntitiesCommand finderCommand = null;
if (f.getName().equals("findAll")) {
finderCommand = factory.createFindAllCommand(f);
} else {
finderCommand = factory.createDefinedFinderCommand(f);
}
knownFinderCommands.put(f.getName(), finderCommand);
}
}
// Make commands for any autogenerated finders required
Method[] homeMethods;
Method[] localHomeMethods;
if (debug)
log.debug("AutoGenerated finders - Home="
+ factory.getContainer().getHomeClass()
+ " -- LocalHome=" + factory.getContainer().getLocalHomeClass());
if (factory.getContainer().getHomeClass() != null)
{
homeMethods = factory.getContainer().getHomeClass().getMethods();
}
else homeMethods = new Method[0] ;
if (factory.getContainer().getLocalHomeClass() != null)
{
localHomeMethods = factory.getContainer().getLocalHomeClass().getMethods();
}
else localHomeMethods = new Method[0] ;
Method[] allHomeMethods = new Method[homeMethods.length + localHomeMethods.length];
for (int i = 0; i < homeMethods.length; i++)
{
allHomeMethods[i] = homeMethods[i];
}
for (int i = 0; i < localHomeMethods.length; i++)
{
allHomeMethods[homeMethods.length + i] = localHomeMethods[i];
}
for (int i = 0; i < allHomeMethods.length; i++)
{
Method m = allHomeMethods[i];
String name = m.getName();
if (!knownFinderCommands.containsKey(name))
{
if (name.equals("findAll"))
{
if (debug)
log.debug("Save AutoGenerated "+name+" "+m);
FinderMetaData f = new FinderMetaData("findAll");
knownFinderCommands.put(name, factory.createFindAllCommand(f));
} else if (name.startsWith("findBy") && !name.equals("findByPrimaryKey"))
{
try
{
if (debug)
log.debug("Save AutoGenerated "+name+" "+m);
FinderMetaData f = new FinderMetaData(name);
knownFinderCommands.put(name, factory.createFindByCommand(m, f));
} catch (IllegalArgumentException e)
{
if (debug)
log.debug("Could not create the finder " + name +
", because no matching CMP field was found.", e);
}
}
}
}
}
|