package org.nightlabs.jfire.trade.ui.articlecontainer.detail.action; import java.util.ArrayList; import java.util.Collection; import org.nightlabs.base.ui.action.registry.ActionDescriptor; import org.nightlabs.jfire.trade.ArticleContainer; import org.nightlabs.util.CollectionUtil; public class ArticleContainerActionDescriptor extends ActionDescriptor { private String articleContainerClass; public String getArticleContainerClass() { return articleContainerClass; } public void setArticleContainerClass(String articleContainerClass) { this.articleContainerClass = articleContainerClass; } private int calculateInterfaceDistance(Class<?> clazz) { int interfaceInheritanceLevel = 0; // first search in the current interfaceInheritanceLevel Class<?>[] interfaces = clazz.getInterfaces(); while (interfaces.length > 0) { int interfaceOrderIndex = -1; Collection<Class<?>> superInterfaces = new ArrayList<Class<?>>(); for (Class<?> iface : interfaces) { ++interfaceOrderIndex; if (articleContainerClass.equals(iface.getName())) return interfaceInheritanceLevel * INTERFACE_INHERITANCE_DISTANCE_MULTIPLIER + interfaceOrderIndex; superInterfaces.addAll(CollectionUtil.array2ArrayList(iface.getInterfaces())); } ++interfaceInheritanceLevel; interfaces = superInterfaces.toArray(new Class<?>[superInterfaces.size()]); } return -1; } public int calculateArticleContainerClassMatchDistance(Class<? extends ArticleContainer> clazz) { int classDistance = 0; int interfaceDistance = 0; Class<?> currentClass = clazz; while (currentClass != null) { interfaceDistance = 0; if (articleContainerClass.equals(currentClass.getName())) return CLASS_DISTANCE_MULTIPLIER * classDistance + interfaceDistance; interfaceDistance = calculateInterfaceDistance(currentClass); if (interfaceDistance >= 0) return CLASS_DISTANCE_MULTIPLIER * classDistance + interfaceDistance; ++classDistance; currentClass = currentClass.getSuperclass(); } return -1; } private static final int CLASS_DISTANCE_MULTIPLIER = 1 << 16; private static final int INTERFACE_INHERITANCE_DISTANCE_MULTIPLIER = 1 << 8; }