/*******************************************************************************
* Copyright (c) 2005, 2009 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.util.ArrayList;
import java.util.Map;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.wst.jsdt.core.IJavaScriptElement;
import org.eclipse.wst.jsdt.core.IJavaScriptModelStatusConstants;
import org.eclipse.wst.jsdt.core.IJsGlobalScopeContainer;
import org.eclipse.wst.jsdt.core.IPackageFragment;
import org.eclipse.wst.jsdt.core.IPackageFragmentRoot;
import org.eclipse.wst.jsdt.core.JavaScriptModelException;
import org.eclipse.wst.jsdt.core.JsGlobalScopeContainerInitializer;
import org.eclipse.wst.jsdt.core.compiler.CharOperation;
import org.eclipse.wst.jsdt.internal.compiler.util.Util;
public class LibraryFragmentRoot extends PackageFragmentRoot{
protected final IPath libraryPath;
protected boolean[] fLangeRuntime= new boolean[] {false,false};
protected LibraryFragmentRoot(IPath jarPath, JavaProject project) {
super(null, project);
this.libraryPath = jarPath;
}
/**
* Constructs a package fragment root which is the root of the Java package directory hierarchy
* based on a JAR file.
*/
protected LibraryFragmentRoot(IResource resource, JavaProject project) {
super(resource, project);
this.libraryPath = resource.getFullPath();
}
public PackageFragment getPackageFragment(String[] pkgName) {
return new LibraryPackageFragment(this, pkgName);
}
public IPath getPath() {
if (isExternal()) {
return this.libraryPath;
} else {
return super.getPath();
}
}
public IPath getLocation() {
if (isExternal()) {
return this.libraryPath;
} else {
return super.getLocation();
}
}
public IResource getUnderlyingResource() throws JavaScriptModelException {
if (isExternal()) {
if (!exists()) throw newNotPresentException();
return null;
} else {
return super.getUnderlyingResource();
}
}
public IResource getResource() {
if (this.resource == null) {
this.resource = JavaModel.getTarget(ResourcesPlugin.getWorkspace().getRoot(), this.libraryPath, false);
}
if (this.resource instanceof IResource) {
return super.getResource();
} else {
// external jar
return null;
}
}
protected boolean computeChildren(OpenableElementInfo info, Map newElements) throws JavaScriptModelException {
String name[]={""};//libraryPath.lastSegment()}; //$NON-NLS-1$
ArrayList vChildren = new ArrayList(5);
if (!isDirectory())
{
LibraryPackageFragment packFrag= new LibraryPackageFragment(this, name);
LibraryPackageFragmentInfo fragInfo= new LibraryPackageFragmentInfo();
packFrag.computeChildren(fragInfo);
newElements.put(packFrag, fragInfo);
vChildren.add(packFrag);
}
else
{
computeDirectoryChildren(getFile(),true, CharOperation.NO_STRINGS, vChildren);
}
IJavaScriptElement[] children = new IJavaScriptElement[vChildren.size()];
vChildren.toArray(children);
info.setChildren(children);
return true;
}
protected void computeDirectoryChildren(File file, boolean isIncluded, String[] pkgName, ArrayList vChildren) throws JavaScriptModelException {
if (isIncluded) {
IPackageFragment pkg = getPackageFragment(pkgName);
vChildren.add(pkg);
}
try {
JavaModelManager manager = JavaModelManager.getJavaModelManager();
File[] members = file.listFiles();
boolean hasIncluded = isIncluded;
if (members != null && members.length > 0) {
for (int i = 0; i < members.length; i++) {
File member = members[i];
String memberName = member.getName();
if (member.isDirectory()) {
String[] newNames = org.eclipse.wst.jsdt.internal.core.util.Util.arrayConcat(pkgName, manager.intern(memberName));
computeDirectoryChildren( member, true, newNames, vChildren);
}
else
{
if (!hasIncluded
&& Util.isJavaFileName(memberName)) {
hasIncluded = true;
IPackageFragment pkg = getPackageFragment(pkgName);
vChildren.add(pkg);
}
}
}
}
} catch(IllegalArgumentException e){
throw new JavaScriptModelException(e, IJavaScriptModelStatusConstants.ELEMENT_DOES_NOT_EXIST); // could be thrown by ElementTree when path is not found
} catch (CoreException e) {
throw new JavaScriptModelException(e);
}
}
protected Object createElementInfo() {
return new LibraryFragmentRootInfo();
}
protected int determineKind(IResource underlyingResource) {
return IPackageFragmentRoot.K_BINARY;
}
public boolean equals(Object o) {
if (this == o)
return true;
if (o instanceof LibraryFragmentRoot) {
LibraryFragmentRoot other= (LibraryFragmentRoot) o;
return this.libraryPath.equals(other.libraryPath);
}
return false;
}
public String getElementName() {
//return "";
return this.libraryPath.lastSegment();
}
public int hashCode() {
return this.libraryPath.hashCode();
}
public boolean isExternal() {
return getResource() == null;
}
/**
* Jars and jar entries are all read only
*/
public boolean isReadOnly() {
return true;
}
/**
* Returns whether the corresponding resource or associated file exists
*/
protected boolean resourceExists() {
if (this.isExternal()) {
return
JavaModel.getTarget(
ResourcesPlugin.getWorkspace().getRoot(),
this.getPath(), // don't make the path relative as this is an external archive
true) != null;
} else {
return super.resourceExists();
}
}
//private ClassFile getLibraryClassFile(){
// try {
// ArrayList childrenOfType = getChildrenOfType(IJavaScriptElement.PACKAGE_FRAGMENT);
// if (!childrenOfType.isEmpty())
// {
// IPackageFragment child=(IPackageFragment)childrenOfType.get(0);
// IClassFile[] classFiles = child.getClassFiles();
// if (classFiles!=null && classFiles.length>0)
// return (ClassFile)classFiles[0];
// }
// } catch (JavaScriptModelException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
// return null;
//}
protected void toStringAncestors(StringBuffer buffer) {
if (isExternal())
// don't show project as it is irrelevant for external jar files.
// also see https://bugs.eclipse.org/bugs/show_bug.cgi?id=146615
return;
super.toStringAncestors(buffer);
}
public boolean isResourceContainer() {
return false;
}
/* (non-Javadoc)
* @see org.eclipse.wst.jsdt.internal.core.JavaElement#getDisplayName()
*/
public String getDisplayName() {
JsGlobalScopeContainerInitializer containerInitializer = getContainerInitializer();
if(containerInitializer!=null) return containerInitializer.getDescription(getPath(), getJavaScriptProject());
return super.getDisplayName();
}
/* (non-Javadoc)
* @see org.eclipse.wst.jsdt.internal.core.JavaElement#isVirtual()
*/
public boolean isVirtual() {
return true;
}
public boolean isLanguageRuntime() {
if(fLangeRuntime[0]) {
return fLangeRuntime[1];
}
JsGlobalScopeContainerInitializer init = getContainerInitializer();
if(init==null) {
fLangeRuntime[0]=true;
fLangeRuntime[1]=false;
return fLangeRuntime[1];
}
fLangeRuntime[1]= init.getKind()==IJsGlobalScopeContainer.K_SYSTEM ||init.getKind()==IJsGlobalScopeContainer.K_DEFAULT_SYSTEM ;
fLangeRuntime[0]=true;
return fLangeRuntime[1];
}
public boolean isLibrary() {
return true;
}
public boolean isDirectory()
{
return !Util.isJavaFileName(this.libraryPath.lastSegment());
}
public File getFile()
{
return new File(this.libraryPath.toOSString());
}
}