/** * Dianping.com Inc. * Copyright (c) 2003-2013 All Rights Reserved. */ package com.dianping.pigeon.extension; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.ServiceLoader; import java.util.concurrent.ConcurrentHashMap; /** * * @author xiangwu * @Sep 11, 2013 * */ public final class ExtensionLoader { private static Map<Class<?>, Object> extensionMap = new ConcurrentHashMap<Class<?>, Object>(); private static Map<Class<?>, List<?>> extensionListMap = new ConcurrentHashMap<Class<?>, List<?>>(); private ExtensionLoader() { } public static <T> T getExtension(Class<T> clazz) { T extension = (T) extensionMap.get(clazz); if (extension == null) { extension = newExtension(clazz); if (extension != null) { extensionMap.put(clazz, extension); } } return extension; } public static <T> List<T> getExtensionList(Class<T> clazz) { List<T> extensions = (List<T>) extensionListMap.get(clazz); if (extensions == null) { extensions = newExtensionList(clazz); if (!extensions.isEmpty()) { extensionListMap.put(clazz, extensions); } } return extensions; } public static <T> T newExtension(Class<T> clazz) { ServiceLoader<T> serviceLoader = ServiceLoader.load(clazz); for (T service : serviceLoader) { return service; } return null; } public static <T> List<T> newExtensionList(Class<T> clazz) { ServiceLoader<T> serviceLoader = ServiceLoader.load(clazz); List<T> extensions = new ArrayList<T>(); for (T service : serviceLoader) { extensions.add(service); } return extensions; } }