From 234b5786a4b14aa5f36eafa528f2b3a3c70e4078 Mon Sep 17 00:00:00 2001 From: Dirk Niemeyer Date: Fri, 28 Aug 2015 17:19:58 +0200 Subject: [PATCH] IDEMPIERE-2732 Make Callouts replaceable by Factory approach refined to check on requested method in class provided by factory --- .../src/org/adempiere/base/Core.java | 5 +++-- .../org/adempiere/base/DefaultCalloutFactory.java | 14 ++++++++++++-- .../src/org/adempiere/base/ICalloutFactory.java | 3 ++- .../src/org/compiere/model/GridTab.java | 4 ++-- 4 files changed, 19 insertions(+), 7 deletions(-) diff --git a/org.adempiere.base/src/org/adempiere/base/Core.java b/org.adempiere.base/src/org/adempiere/base/Core.java index 20e1a156f5..91a36a2fb9 100644 --- a/org.adempiere.base/src/org/adempiere/base/Core.java +++ b/org.adempiere.base/src/org/adempiere/base/Core.java @@ -99,13 +99,14 @@ public class Core { /** * * @param className + * @param method * @return callout for className */ - public static Callout getCallout(String className) { + public static Callout getCallout(String className, String methodName) { List factories = Service.locator().list(ICalloutFactory.class).getServices(); if (factories != null) { for(ICalloutFactory factory : factories) { - Callout callout = factory.getCallout(className); + Callout callout = factory.getCallout(className, methodName); if (callout != null) { return callout; } diff --git a/org.adempiere.base/src/org/adempiere/base/DefaultCalloutFactory.java b/org.adempiere.base/src/org/adempiere/base/DefaultCalloutFactory.java index 8665ad8e0b..9d74a6249f 100644 --- a/org.adempiere.base/src/org/adempiere/base/DefaultCalloutFactory.java +++ b/org.adempiere.base/src/org/adempiere/base/DefaultCalloutFactory.java @@ -13,6 +13,7 @@ *****************************************************************************/ package org.adempiere.base; +import java.lang.reflect.Method; import java.util.logging.Level; import org.adempiere.base.equinox.EquinoxExtensionLocator; @@ -39,7 +40,7 @@ public class DefaultCalloutFactory implements ICalloutFactory { * @see org.adempiere.base.ICalloutFactory#getCallout(java.lang.String) */ @Override - public Callout getCallout(String className) { + public Callout getCallout(String className, String methodName) { Callout callout = null; callout = EquinoxExtensionLocator.instance().locate(Callout.class, Callout.class.getName(), className, (ServiceQuery)null).getExtension(); if (callout == null) { @@ -86,8 +87,17 @@ public class DefaultCalloutFactory implements ICalloutFactory { log.log(Level.WARNING, "Instance for " + className, ex); return null; } + + //Check if callout method does really exist + Method[] methods = calloutClass.getDeclaredMethods(); + for (int i = 0; i < methods.length; i++) { + if (methods[i].getName().equals(methodName)) { + return callout; + } + } } - return callout; + log.log(Level.FINE, "Required method " + methodName + " not found in class " + className); + return null; } } diff --git a/org.adempiere.base/src/org/adempiere/base/ICalloutFactory.java b/org.adempiere.base/src/org/adempiere/base/ICalloutFactory.java index f768632840..701f6c3dd0 100644 --- a/org.adempiere.base/src/org/adempiere/base/ICalloutFactory.java +++ b/org.adempiere.base/src/org/adempiere/base/ICalloutFactory.java @@ -25,8 +25,9 @@ public interface ICalloutFactory { /** * * @param className + * @param methodName * @return matching Callout */ - public Callout getCallout(String className); + public Callout getCallout(String className, String methodName); } diff --git a/org.adempiere.base/src/org/compiere/model/GridTab.java b/org.adempiere.base/src/org/compiere/model/GridTab.java index 4556fb7b19..534593da28 100644 --- a/org.adempiere.base/src/org/compiere/model/GridTab.java +++ b/org.adempiere.base/src/org/compiere/model/GridTab.java @@ -2910,15 +2910,15 @@ public class GridTab implements DataStatusListener, Evaluatee, Serializable { String className = cmd.substring(0,methodStart); // IDEMPIERE-2732 + method = cmd.substring(methodStart+1); // get corresponding callout - call = Core.getCallout(className); + call = Core.getCallout(className, method); // end IDEMPIERE-2732 if (call == null) { //no match from factory, check java classpath Class cClass = Class.forName(className); call = (Callout)cClass.newInstance(); } - method = cmd.substring(methodStart+1); } } catch (Exception e)