package io.cattle.platform.extension.dynamic; import io.cattle.platform.extension.impl.ExtensionManagerImpl; import io.cattle.platform.util.type.PriorityUtils; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class DynamicExtensionManager extends ExtensionManagerImpl { private static final String DYNAMIC_HANDLER_KEY = "dynamic.extension.handler"; @SuppressWarnings("unchecked") @Override public <T> List<T> getExtensionList(String key, Class<T> type) { List<T> extensions = super.getExtensionList(key, type); if (type == null) { type = (Class<T>) getExpectedType(key); } if (DYNAMIC_HANDLER_KEY.equals(key) || DynamicExtensionHandler.class == type) { return extensions; } for (DynamicExtensionHandler handler : getExtensionList(DynamicExtensionHandler.class)) { List<T> additional = handler.getExtensionList(key, type); if (additional.size() == 0) { continue; } List<Object> merged = new ArrayList<Object>(extensions.size() + additional.size()); Iterator<T> iter = additional.iterator(); T current = iter.next(); for (Object obj : extensions) { while (current != null && PriorityUtils.getPriority(obj) > PriorityUtils.getPriority(current)) { merged.add(current); if (iter.hasNext()) { current = iter.next(); } else { current = null; } } merged.add(obj); } if (current != null) { merged.add(current); } while (iter.hasNext()) { merged.add(iter.next()); } return (List<T>) merged; } return extensions; } }