From da35b57376e0875feba3e26e2f2db7df77222e90 Mon Sep 17 00:00:00 2001 From: Thomas Bayen Date: Wed, 8 Jan 2014 13:32:59 -0500 Subject: [PATCH] IDEMPIERE-1545 There is no OSGi interface for a BankStatementLoader --- .../src/org/adempiere/base/Core.java | 35 ++++++++++++++++ .../base/IBankStatementLoaderFactory.java | 40 +++++++++++++++++++ .../compiere/model/MBankStatementLoader.java | 10 ++++- 3 files changed, 83 insertions(+), 2 deletions(-) create mode 100644 org.adempiere.base/src/org/adempiere/base/IBankStatementLoaderFactory.java diff --git a/org.adempiere.base/src/org/adempiere/base/Core.java b/org.adempiere.base/src/org/adempiere/base/Core.java index 58f18f345a..11acd69359 100644 --- a/org.adempiere.base/src/org/adempiere/base/Core.java +++ b/org.adempiere.base/src/org/adempiere/base/Core.java @@ -29,6 +29,7 @@ import org.adempiere.model.IAddressValidation; import org.adempiere.model.IShipmentProcessor; import org.adempiere.model.ITaxProvider; import org.adempiere.model.MShipperFacade; +import org.compiere.impexp.BankStatementLoaderInterface; import org.compiere.model.MAddressValidation; import org.compiere.model.MBankAccountProcessor; import org.compiere.model.MPaymentProcessor; @@ -174,6 +175,40 @@ public class Core { return myProcessor; } + /** + * get BankStatementLoader instance + * + * @param className + * @return instance of the BankStatementLoaderInterface or null + */ + public static BankStatementLoaderInterface getBankStatementLoader(String className){ + if (className == null || className.length() == 0) { + s_log.log(Level.SEVERE, "No BankStatementLoaderInterface class name"); + return null; + } + + BankStatementLoaderInterface myBankStatementLoader = null; + + List factoryList = + Service.locator().list(IBankStatementLoaderFactory.class).getServices(); + if (factoryList != null) { + for(IBankStatementLoaderFactory factory : factoryList) { + BankStatementLoaderInterface loader = factory.newBankStatementLoaderInstance(className); + if (loader != null) { + myBankStatementLoader = loader; + break; + } + } + } + + if (myBankStatementLoader == null) { + s_log.log(Level.SEVERE, "Not found in service/extension registry and classpath"); + return null; + } + + return myBankStatementLoader; + } + /** * * @param sf diff --git a/org.adempiere.base/src/org/adempiere/base/IBankStatementLoaderFactory.java b/org.adempiere.base/src/org/adempiere/base/IBankStatementLoaderFactory.java new file mode 100644 index 0000000000..6b5839824b --- /dev/null +++ b/org.adempiere.base/src/org/adempiere/base/IBankStatementLoaderFactory.java @@ -0,0 +1,40 @@ +/****************************************************************************** + * Copyright (C) 2013 Thomas Bayen * + * Copyright (C) 2013 Jakob Bayen KG * + * This program is free software; you can redistribute it and/or modify it * + * under the terms version 2 of the GNU General Public License as published * + * by the Free Software Foundation. This program is distributed in the hope * + * that it will be useful, but WITHOUT ANY WARRANTY; without even the implied * + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * + * See the GNU General Public License for more details. * + * You should have received a copy of the GNU General Public License along * + * with this program; if not, write to the Free Software Foundation, Inc., * + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. * + *****************************************************************************/ +package org.adempiere.base; + +import org.compiere.impexp.BankStatementLoaderInterface; + +/** + * Factory Interface for plugins to connect to the iDempiere core and provide a + * way to load BankStatement lines. This can be used e.g. by a HBCI importer + * plugin or just by a plugin to connect via csv or a webservice (or whatever) + * to your bank. + * + * @author tbayen + */ +public interface IBankStatementLoaderFactory { + + /** + * This class will be implemented in OSGi plugins. Every plugin that + * provides this service may or may not provide an BankStatementLoader + * depending on the given classname. The classname can be given by the user + * in the "Bank" window in the "Bank Satement Loader" tab. By convention + * this classname is the fully qualified classname of the Loader class you + * want to use. + * + * @param className + * @return BankStatementLoader instance + */ + public BankStatementLoaderInterface newBankStatementLoaderInstance(String className); +} diff --git a/org.adempiere.base/src/org/compiere/model/MBankStatementLoader.java b/org.adempiere.base/src/org/compiere/model/MBankStatementLoader.java index c6ce85bf55..c2a653771d 100644 --- a/org.adempiere.base/src/org/compiere/model/MBankStatementLoader.java +++ b/org.adempiere.base/src/org/compiere/model/MBankStatementLoader.java @@ -20,6 +20,7 @@ import java.sql.ResultSet; import java.util.Properties; import java.util.logging.Level; +import org.adempiere.base.Core; import org.compiere.impexp.BankStatementLoaderInterface; @@ -118,8 +119,13 @@ import org.compiere.impexp.BankStatementLoaderInterface; try { if (log.isLoggable(Level.INFO)) log.info( "MBankStatementLoader Class Name=" + getStmtLoaderClass()); - Class bsrClass = Class.forName(getStmtLoaderClass()); - m_loader = (BankStatementLoaderInterface) bsrClass.newInstance(); + // load the BankStatementLoader class via OSGi Service definition from a plugin + m_loader = Core.getBankStatementLoader(getStmtLoaderClass()); + if(m_loader==null){ + // if no OSGi plugin is found try the legacy way (in my own classpath) + Class bsrClass = Class.forName(getStmtLoaderClass()); + m_loader = (BankStatementLoaderInterface) bsrClass.newInstance(); + } } catch(Exception e) {