package com.anjlab.eclipse.tapestry5;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.IPath;
import org.eclipse.jdt.core.ISourceRange;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaModelException;
public class JavaScriptStackReference extends AbstractFileReference
{
public static final String MARKER_NAME = "StackName";
public JavaScriptStackReference(TapestryFile javaFile, String stackName, ISourceRange sourceRange)
{
super(javaFile, sourceRange, stackName, MARKER_NAME);
}
@Override
protected TapestryFile resolveFile() throws UnresolvableReferenceException
{
JavaScriptStack stack = resolveStack();
if (stack == null)
{
throw new UnresolvableReferenceException("Stack '"
+ reference + "' not found in current tapestry project");
}
return resolveFile(getContext(), stack);
}
private TapestryFile resolveFile(TapestryContext context, JavaScriptStack stack)
throws UnresolvableReferenceException
{
IType type = stack.getType();
if (type.getClassFile() != null)
{
return new ClassFile(context, type.getClassFile());
}
try
{
if (type.getUnderlyingResource() != null)
{
IFile file = (IFile) type.getUnderlyingResource().getAdapter(IFile.class);
LocalFile declaringFile = new LocalFile(context, file);
return declaringFile;
}
throw new UnresolvableReferenceException("Unable to get underlying resource for " + type);
}
catch (JavaModelException e)
{
throw new UnresolvableReferenceException("Unable to get underlying resource for " + type, e);
}
}
@Override
public IPath getPath()
{
return javaFile.getPath();
}
@Override
public String getName()
{
return reference;
}
@Override
public IProject getProject()
{
return javaFile.getProject();
}
@Override
public TapestryContext getContext()
{
return javaFile.getContext();
}
@Override
public boolean exists()
{
JavaScriptStack stack = resolveStack();
return stack == null
? false
: stack.getReference().getElement().exists();
}
private JavaScriptStack resolveStack()
{
return TapestryUtils.findStack(getProject(), reference);
}
}