/*******************************************************************************
* Copyright (c) 2008 Ketan Padegaonkar and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Ketan Padegaonkar - initial API and implementation
*******************************************************************************/
package org.eclipse.swtbot.swt.finder.resolvers;
import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import org.eclipse.swtbot.swt.finder.utils.MultiValueMap;
/**
* A resolver that maps classes to the {@link IChildrenResolver}s that resolve the classes.
*
* @see IChildrenResolver#getResolvableClasses()
* @author Ketan Padegaonkar <KetanPadegaonkar [at] gmail [dot] com>
* @version $Id$
*/
public class Resolver {
/** The map that maps classes to {@link IChildrenResolver}s */
private final MultiValueMap<Class<?>, IResolvable> map = new MultiValueMap<Class<?>, IResolvable>();
/**
* Map all the classes that the resolver resolver to the resolver.
*
* @param resolver the resolver.
* @see IChildrenResolver#getResolvableClasses()
*/
public void addResolver(IResolvable resolver) {
Class<?>[] resolvableClasses = resolver.getResolvableClasses();
if ((resolvableClasses != null) && (resolvableClasses.length > 0))
addResolver(resolver, resolvableClasses);
}
/**
* Gets the resolvers that match the given class.
*
* @param clazz the class that should be resolved using the resolvers.
* @return the list of {@link Resolver}s that can resolve objects of type <code>clazz</code>
*/
public List<IResolvable> getResolvers(Class<?> clazz) {
LinkedHashSet<IResolvable> result = new LinkedHashSet<IResolvable>();
Collection<IResolvable> resolvers = map.getCollection(clazz);
if ((resolvers != null) && !resolvers.isEmpty())
result.addAll(resolvers);
else if (!Object.class.equals(clazz))
result.addAll(getResolvers(clazz.getSuperclass()));
return new ArrayList<IResolvable>(result);
}
/**
* Adds a new resolver to the list.
*
* @param resolver The resolver to add.
* @param resolvableClasses The classes supported by the resolver.
*/
private void addResolver(IResolvable resolver, Class<?>[] resolvableClasses) {
for (Class<?> clazz : resolvableClasses) {
map.put(clazz, resolver);
}
}
Class<?>[] getResolvableClasses() {
Set<Class<?>> keySet = map.keySet();
return keySet.toArray(new Class[keySet.size()]);
}
}