PluginManager.java
- /* This file is part of Openrouteservice.
- *
- * Openrouteservice is free software; you can redistribute it and/or modify it under the terms of the
- * GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1
- * of the License, or (at your option) any later version.
- * This library 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 Lesser General Public License for more details.
- * You should have received a copy of the GNU Lesser General Public License along with this library;
- * if not, see <https://www.gnu.org/licenses/>.
- */
- package org.heigit.ors.plugins;
- import org.apache.log4j.Logger;
- import java.lang.reflect.InvocationTargetException;
- import java.util.*;
- public class PluginManager<T extends Plugin> {
- private static final Logger LOGGER = Logger.getLogger(PluginManager.class.getName());
- private final ServiceLoader<T> loader;
- private final Object lockObj;
- private static final Map<String, Object> pluginMgrCache = new HashMap<>();
- @SuppressWarnings("unchecked")
- public static synchronized <T extends Plugin> PluginManager<T> getPluginManager(Class<?> cls) throws Exception {
- PluginManager<T> pmgr = null;
- pmgr = (PluginManager<T>) pluginMgrCache.get(cls.getName());
- if (pmgr == null) {
- pmgr = new PluginManager<>(cls);
- pluginMgrCache.put(cls.getName(), pmgr);
- }
- return pmgr;
- }
- @SuppressWarnings("unchecked")
- public PluginManager(Class<?> cls) throws Exception {
- if (cls.equals(getClass()))
- throw new Exception("Wrong class parameter");
- loader = (ServiceLoader<T>) ServiceLoader.load(cls);
- lockObj = new Object();
- }
- public List<T> createInstances(Map<String, Map<String, String>> parameters) {
- List<T> result = new ArrayList<>(parameters.size());
- if (!parameters.isEmpty()) {
- for (Map.Entry<String, Map<String, String>> storageEntry : parameters.entrySet()) {
- T instance = createInstance(storageEntry.getKey(), storageEntry.getValue());
- if (instance != null) {
- result.add(instance);
- } else
- LOGGER.warn("'%s' was not found.".formatted(storageEntry.getKey()));
- }
- }
- return result;
- }
- @SuppressWarnings("unchecked")
- public T createInstance(String name, Map<String, String> params) {
- T instance = null;
- try {
- // ServiceLoader is not threadsafe
- synchronized (lockObj) {
- Iterator<T> entries = loader.iterator();
- while (entries.hasNext()) {
- T entry = entries.next();
- if (entry.getName().equalsIgnoreCase(name)) {
- instance = ((Class<T>) entry.getClass()).getDeclaredConstructor().newInstance();
- instance.setParameters(params);
- break;
- }
- }
- }
- } catch (ServiceConfigurationError | InstantiationException | IllegalAccessException | NoSuchMethodException |
- InvocationTargetException se) {
- instance = null;
- LOGGER.error(se);
- }
- return instance;
- }
- }