blob: 61bd3004c7b618d8b3d2c8329a12cad63467ef72 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 2008 IBM Corporation 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.wst.jsdt.internal.core;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Map;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.wst.jsdt.core.CompletionRequestor;
import org.eclipse.wst.jsdt.core.IBuffer;
import org.eclipse.wst.jsdt.core.IBufferFactory;
import org.eclipse.wst.jsdt.core.IClassFile;
import org.eclipse.wst.jsdt.core.IField;
import org.eclipse.wst.jsdt.core.IFunction;
import org.eclipse.wst.jsdt.core.IJavaScriptElement;
import org.eclipse.wst.jsdt.core.IJavaScriptUnit;
import org.eclipse.wst.jsdt.core.IProblemRequestor;
import org.eclipse.wst.jsdt.core.ISourceRange;
import org.eclipse.wst.jsdt.core.IType;
import org.eclipse.wst.jsdt.core.JavaScriptModelException;
import org.eclipse.wst.jsdt.core.JsGlobalScopeContainerInitializer;
import org.eclipse.wst.jsdt.core.WorkingCopyOwner;
import org.eclipse.wst.jsdt.internal.core.util.MementoTokenizer;
import org.eclipse.wst.jsdt.internal.core.util.Util;
import org.eclipse.wst.jsdt.internal.oaametadata.IOAAMetaDataConstants;
import org.eclipse.wst.jsdt.internal.oaametadata.LibraryAPIs;
import org.eclipse.wst.jsdt.internal.oaametadata.MetadataReader;
import org.eclipse.wst.jsdt.internal.oaametadata.MetadataSourceElementNotifier;
import org.xml.sax.InputSource;
public class MetadataFile extends Openable implements
IClassFile, org.eclipse.wst.jsdt.internal.compiler.env.ICompilationUnit, IVirtualParent
{
protected String name;
protected IPath filePath;
private static final IField[] NO_FIELDS = new IField[0];
private static final IFunction[] NO_METHODS = new IFunction[0];
private LibraryAPIs apis=null;
protected MetadataFile(PackageFragment parent, String path) {
super(parent);
this.filePath = Path.fromOSString(path);
if (filePath.getFileExtension()!=null)
{
String lastSegment = filePath.lastSegment();
this.name=lastSegment.substring(0,lastSegment.length()-(filePath.getFileExtension().length()+1));
}
else
this.name=path;
}
protected boolean buildStructure(OpenableElementInfo info,
IProgressMonitor pm, Map newElements, IResource underlyingResource)
throws JavaScriptModelException {
if (underlyingResource != null && !underlyingResource.isAccessible()) {
throw newNotPresentException();
}
CompilationUnitElementInfo unitInfo = new CompilationUnitElementInfo();
// get buffer contents
// generate structure and compute syntax problems if needed
CompilationUnitStructureRequestor requestor = new CompilationUnitStructureRequestor(this, unitInfo, newElements);
boolean createAST;
// HashMap problems;
if (info instanceof ASTHolderCUInfo) {
ASTHolderCUInfo astHolder = (ASTHolderCUInfo) info;
createAST = astHolder.astLevel != IJavaScriptUnit.NO_AST;
// problems = astHolder.problems;
} else {
createAST = false;
// problems = null;
}
new MetadataSourceElementNotifier(getAPIs(),requestor).notifyRequestor();
// update timestamp (might be IResource.NULL_STAMP if original does not exist)
if (underlyingResource == null) {
underlyingResource = getResource();
}
// underlying resource is null in the case of a working copy on a class file in a jar
if (underlyingResource != null)
unitInfo.timestamp = ((IFile)underlyingResource).getModificationStamp();
// compute other problems if needed
// CompilationUnitDeclaration compilationUnitDeclaration = null;
info.setChildren(unitInfo.children);
try {
if (createAST) {
// int astLevel = ((ASTHolderCUInfo) info).astLevel;
// org.eclipse.wst.jsdt.core.dom.JavaScriptUnit cu = AST.convertCompilationUnit(astLevel, unit, contents, options, computeProblems, this, pm);
// ((ASTHolderCUInfo) info).ast = cu;
throw new RuntimeException("Implement this"); //$NON-NLS-1$
}
} finally {
}
return true;
}
public LibraryAPIs getAPIs()
{
if (apis==null)
{
IFile file = (IFile) getResource();
try {
apis = MetadataReader.readAPIsFromStream(new InputSource(file.getContents()));
apis.fileName=file.getFullPath().toPortableString();
} catch (CoreException e) {
Util.log(e, "error reading metadata");
apis=new LibraryAPIs();
}
}
return apis;
}
public IJavaScriptElement getHandleFromMemento(String token,
MementoTokenizer memento, WorkingCopyOwner owner) {
switch (token.charAt(0)) {
case JEM_TYPE:
if (!memento.hasMoreTokens()) return this;
String typeName = memento.nextToken();
JavaElement type = new BinaryType(this, typeName);
return type.getHandleFromMemento(memento, owner);
}
return null;
}
protected char getHandleMementoDelimiter() {
return JavaElement.JEM_METADATA;
}
public IJavaScriptUnit becomeWorkingCopy(
IProblemRequestor problemRequestor, WorkingCopyOwner owner,
IProgressMonitor monitor) throws JavaScriptModelException {
return null;
}
public byte[] getBytes() throws JavaScriptModelException {
IFile file = (IFile) getResource();
return Util.getResourceContentsAsByteArray(file);
}
public IType getType() {
return null;
}
public IType[] getTypes() throws JavaScriptModelException {
ArrayList list = getChildrenOfType(TYPE);
IType[] array= new IType[list.size()];
list.toArray(array);
return array;
}
public IJavaScriptElement getWorkingCopy(IProgressMonitor monitor,
IBufferFactory factory) throws JavaScriptModelException {
return null;
}
public boolean isClass() throws JavaScriptModelException {
return true;
}
public boolean isInterface() throws JavaScriptModelException {
return false;
}
public IType findPrimaryType() {
return null;
}
public IJavaScriptElement getElementAt(int position) throws JavaScriptModelException {
return null;
}
public IJavaScriptUnit getWorkingCopy(WorkingCopyOwner owner,
IProgressMonitor monitor) throws JavaScriptModelException {
return null;
}
public int getElementType() {
return CLASS_FILE;
}
public IPath getPath() {
return this.filePath;
}
public IResource getResource() {
return ((IContainer)this.getParent().getResource()).getFile(new Path(this.getElementName()));
}
public String getSource() throws JavaScriptModelException {
IBuffer buffer = super.getBuffer();
if (buffer == null) {
return null;
}
return buffer.getContents();
}
public ISourceRange getSourceRange() throws JavaScriptModelException {
return null;
}
public void codeComplete(int offset, CompletionRequestor requestor)
throws JavaScriptModelException {
}
public void codeComplete(int offset, CompletionRequestor requestor,
WorkingCopyOwner owner) throws JavaScriptModelException {
}
public IJavaScriptElement[] codeSelect(int offset, int length)
throws JavaScriptModelException {
return null;
}
public IJavaScriptElement[] codeSelect(int offset, int length,
WorkingCopyOwner owner) throws JavaScriptModelException {
return null;
}
public IField getField(String fieldName) {
return new SourceField(this, fieldName);
}
public IField[] getFields() throws JavaScriptModelException {
ArrayList list = getChildrenOfType(FIELD);
int size;
if ((size = list.size()) == 0) {
return NO_FIELDS;
} else {
IField[] array= new IField[size];
list.toArray(array);
return array;
}
}
public IFunction getFunction(String selector, String[] parameterTypeSignatures) {
return new SourceMethod(this, selector, parameterTypeSignatures);
}
/**
* @deprecated Use {@link #getFunctions()} instead
*/
public IFunction[] getMethods() throws JavaScriptModelException {
return getFunctions();
}
public IFunction[] getFunctions() throws JavaScriptModelException {
ArrayList list = getChildrenOfType(METHOD);
int size;
if ((size = list.size()) == 0) {
return NO_METHODS;
} else {
IFunction[] array= new IFunction[size];
list.toArray(array);
return array;
}
}
public IType getType(String typeName) {
return new SourceType(this, typeName);
}
public char[] getContents() {
char [] chars=null;
try {
chars=org.eclipse.wst.jsdt.internal.compiler.util.Util.getFileCharContent(new File(filePath.toOSString()),null);
} catch (IOException e) {
e.printStackTrace();
}
return chars;
}
public String getInferenceID() {
return null;
}
public char[] getMainTypeName() {
return null;
}
public char[][] getPackageName() {
return new char[][] {getParent().getElementName().toCharArray()};
}
public char[] getFileName() {
return this.filePath!=null?this.filePath.toString().toCharArray():getElementName().toCharArray();
}
public JsGlobalScopeContainerInitializer getContainerInitializer() {
JsGlobalScopeContainerInitializer init = ((IVirtualParent)parent).getContainerInitializer();
return init;
}
public String getElementName() {
return IOAAMetaDataConstants.METADATA_FILE;
}
}