blob: 7b42b8c54e99b61fd5f5fe178eee2de9805b3f1c [file] [log] [blame]
/**
* Copyright (c) 2009 Mia-Software.
* 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:
* Romain DERVAUX (Mia-Software) - initial API and implementation
*******************************************************************************/
package org.eclipse.modisco.java.discoverer.internal.io.library;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaModelException;
/**
* Acts as a cache to make faster the resolution of an {@link IType} from a dot
* based qualified name in the context of a Java project.
*/
public class TypeFinder {
/**
* the resolved types.
*/
private final Map<String, IType> resolvedTypes = new HashMap<String, IType>();
/**
* the unresolved types.
*/
private final List<String> unresolvedTypes = new ArrayList<String>();
/**
* the java project.
*/
private final IJavaProject javaProject;
public TypeFinder(final IJavaProject javaProject) {
this.javaProject = javaProject;
}
/**
* Returns the {@link IType} corresponding to the supplied qualified name.
*
* @param qualifiedName
* the dot based qualified name ({@code java.lang.String} for
* example)
* @return the {@code IType} corresponding to the qualified name, or
* {@code null} if type is unknow (not on the classpath of the Java
* Project)
* @see IJavaProject#findType(String)
*/
public IType getType(final String qualifiedName) {
// first, check in the unresolved
if (this.unresolvedTypes.contains(qualifiedName)) {
return null;
}
// then, in the resolved
IType type = this.resolvedTypes.get(qualifiedName);
if (type == null) {
try {
// finally, ask the java project
type = this.javaProject.findType(qualifiedName);
if (type != null) {
this.resolvedTypes.put(qualifiedName, type);
} else {
this.unresolvedTypes.add(qualifiedName);
}
} catch (JavaModelException e) {
// Nothing
assert (true); // dummy code to deactivate "EmptyBlock" rule
}
}
return type;
}
/**
* Indicate if the designated type name has a corresponding {@code IType}.
*
* @param qualifiedName
* the dot based qualified name ({@code java.lang.String} for
* example)
* @return {@code true} if this type exists, {@code false} otherwise
*/
public boolean isTypeExists(final String qualifiedName) {
return getType(qualifiedName) != null;
}
}