/****************************************************************************** * 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.Collection; import java.util.List; 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; import org.osgi.service.component.runtime.ServiceComponentRuntime; import org.osgi.service.component.runtime.dto.ComponentDescriptionDTO; /** * Service listener to block the loading of OSGi component.
* To block the loading of an OSGi component, append the OSGi component's component name to {IDEMPIERE_HOME}/components.blacklist file. * @author hengsin * */ public class ComponentBlackListService implements ServiceListener { private ServiceComponentRuntime scrService = null; private List blackListComponentNames = null; protected ComponentBlackListService(BundleContext context) { ServiceReference ref = context.getServiceReference(ServiceComponentRuntime.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() { Collection comps = scrService.getComponentDescriptionDTOs(); for (ComponentDescriptionDTO comp : comps) { if (blackListComponentNames.contains(comp.name)) { scrService.disableComponent(comp); } } } private void disableComponent(String componentName) { Collection comps = scrService.getComponentDescriptionDTOs(); for (ComponentDescriptionDTO comp : comps) { if (comp.name.equals(componentName)) { scrService.disableComponent(comp); 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); } } } } } }