diff --git a/org.adempiere.base/META-INF/MANIFEST.MF b/org.adempiere.base/META-INF/MANIFEST.MF index 0bf65e808d..2b0853b931 100644 --- a/org.adempiere.base/META-INF/MANIFEST.MF +++ b/org.adempiere.base/META-INF/MANIFEST.MF @@ -274,6 +274,7 @@ Import-Package: com.sun.mail.auth;version="1.4.5", org.apache.commons.net.ftp, org.apache.ecs, org.apache.ecs.xhtml, + org.apache.felix.scr;version="1.6.0", org.apache.poi.hssf.usermodel, org.apache.poi.ss.usermodel, org.apache.tools.ant, diff --git a/org.adempiere.base/src/org/adempiere/base/BaseActivator.java b/org.adempiere.base/src/org/adempiere/base/BaseActivator.java index 0096e386f9..0b721650fc 100644 --- a/org.adempiere.base/src/org/adempiere/base/BaseActivator.java +++ b/org.adempiere.base/src/org/adempiere/base/BaseActivator.java @@ -42,6 +42,7 @@ import org.osgi.util.tracker.ServiceTracker; public class BaseActivator implements BundleActivator { private static BundleContext bundleContext = null; + private ComponentBlackListService blacklistService; /** * default constructor @@ -58,6 +59,8 @@ public class BaseActivator implements BundleActivator { loadInitProperties(Adempiere.getAdempiereHome()); bundleContext = context; context.registerService(CommandProvider.class.getName(), new StackTraceCommand(), null); + + blacklistService = new ComponentBlackListService(context); } /* @@ -114,6 +117,10 @@ public class BaseActivator implements BundleActivator { } } trackerCache.clear(); + if (blacklistService != null) { + blacklistService.stop(context); + blacklistService = null; + } Adempiere.stop(); } diff --git a/org.adempiere.base/src/org/adempiere/base/ComponentBlackListService.java b/org.adempiere.base/src/org/adempiere/base/ComponentBlackListService.java new file mode 100644 index 0000000000..ddefa16f38 --- /dev/null +++ b/org.adempiere.base/src/org/adempiere/base/ComponentBlackListService.java @@ -0,0 +1,129 @@ +/****************************************************************************** + * Copyright (C) 2012 Heng Sin Low * + * Copyright (C) 2012 Trek Global * + * 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 java.io.BufferedReader; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import org.apache.felix.scr.Component; +import org.apache.felix.scr.ScrService; +import org.compiere.util.Ini; +import org.compiere.util.Util; +import org.osgi.framework.BundleContext; +import org.osgi.framework.ServiceEvent; +import org.osgi.framework.ServiceListener; +import org.osgi.framework.ServiceReference; +import org.osgi.service.component.ComponentConstants; + +/** + * @author hengsin + * + */ +public class ComponentBlackListService implements ServiceListener { + + private ScrService scrService = null; + private List blackListComponentNames = null; + + protected ComponentBlackListService(BundleContext context) { + ServiceReference ref = context.getServiceReference(ScrService.class); + scrService = context.getService(ref); + blackListComponentNames = new ArrayList(); + retrieveBlacklistCandidates(); + if (!blackListComponentNames.isEmpty()) { + disableComponents(); + } + context.addServiceListener(this); + } + + public void stop(BundleContext context) { + scrService = null; + blackListComponentNames = null; + context.removeServiceListener(this); + } + + private void retrieveBlacklistCandidates() { + String path = Ini.getAdempiereHome(); + File file = new File(path, "components.blacklist"); + if (file.exists()) { + BufferedReader br = null; + try { + FileReader reader = new FileReader(file); + br = new BufferedReader(reader); + String s = null; + do { + s = br.readLine(); + if (!Util.isEmpty(s)) { + blackListComponentNames.add(s.trim()); + } + } while (s != null); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } finally { + if (br != null) { + try { + br.close(); + } catch (IOException e) {} + } + } + } + + } + + private void disableComponents() + { + Component[] comps = scrService.getComponents(); + for (Component comp : comps) { + if (blackListComponentNames.contains(comp.getName())) { + comp.disable(); + } + } + } + + private void disableComponent(String componentName) + { + Component[] comps = scrService.getComponents(); + for (Component comp : comps) { + if (comp.getName().equals(componentName)) { + comp.disable(); + break; + } + } + } + + /* (non-Javadoc) + * @see org.osgi.framework.ServiceListener#serviceChanged(org.osgi.framework.ServiceEvent) + */ + @Override + public void serviceChanged(ServiceEvent event) { + if (event.getType() == ServiceEvent.REGISTERED) { + if (scrService != null && !blackListComponentNames.isEmpty()) { + ServiceReference ref = event.getServiceReference(); + String name = (String) ref.getProperty(ComponentConstants.COMPONENT_NAME); + if (!Util.isEmpty(name)) { + if (blackListComponentNames.contains(name)) { + disableComponent(name); + } + } + } + } + } + +}