blob: 49d475187b0e9bbe69d086f89ec0690c408a206b [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 v2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
/**
*
*/
package org.eclipse.wst.jsdt.core;
import java.util.ArrayList;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
/**
*
* Provisional API: This class/interface is part of an interim API that is still under development and expected to
* change significantly before reaching stability. It is being made available at this early stage to solicit feedback
* from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken
* (repeatedly) as the API evolves.
*
*/
public class LibrarySuperType {
IPath cpEntry;
String superTypeName;
String libraryName;
IJavaScriptProject javaProject;
public static final String SUPER_TYPE_CONTAINER= "org.eclipse.wst.jsdt.ui.superType.container"; //$NON-NLS-1$
public static final String SUPER_TYPE_NAME= "org.eclipse.wst.jsdt.ui.superType.name"; //$NON-NLS-1$
/* Only one superTypeName per instance so enforce that */
public LibrarySuperType(IPath classPathEntry, IJavaScriptProject project, String superTypeName) {
this.cpEntry = classPathEntry;
this.superTypeName = superTypeName;
this.javaProject = project;
this.libraryName = initLibraryName();
}
public LibrarySuperType(String classPathEntry, IJavaScriptProject project, String superTypeName) {
this(new Path(classPathEntry),project,superTypeName);
}
/* Construct parent */
public LibrarySuperType(IPath classPathEntry, IJavaScriptProject project) {
this(classPathEntry,project, null);
}
public IPath getRawContainerPath() {
return cpEntry;
}
public boolean hasChildren() {
/* defined super type meeans I'm a child */
if(superTypeName!=null) return false;
JsGlobalScopeContainerInitializer init = getContainerInitializer();
if (init == null) return false;
String[] availableSuperTypes = init.containerSuperTypes();
return availableSuperTypes!=null && availableSuperTypes.length>0;
}
public LibrarySuperType[] getChildren() {
if(superTypeName!=null) return new LibrarySuperType[0];
return getFlatLibrarySuperTypes(cpEntry,javaProject);
}
public LibrarySuperType getParent() {
if(superTypeName==null) return null;
return new LibrarySuperType(cpEntry,javaProject, null);
}
public boolean isParent() {
return getParent()==null;
}
public JsGlobalScopeContainerInitializer getContainerInitializer() {
return getContainerInitializer(cpEntry);
}
public IIncludePathEntry[] getClasspathEntries() {
IJsGlobalScopeContainer container=null;
try {
container = JavaScriptCore.getJsGlobalScopeContainer(this.cpEntry, this.javaProject);
} catch (JavaScriptModelException ex) {
// TODO Auto-generated catch block
ex.printStackTrace();
}
if(container!=null) return container.getIncludepathEntries();
return new IIncludePathEntry[0];
}
private static LibrarySuperType[] getFlatLibrarySuperTypes(IPath classPathEntry, IJavaScriptProject javaProject) {
JsGlobalScopeContainerInitializer init = getContainerInitializer(classPathEntry);
if (init == null) return new LibrarySuperType[0];
String[] availableSuperTypes = init.containerSuperTypes();
LibrarySuperType[] libSupers = new LibrarySuperType[availableSuperTypes.length];
for (int i = 0; i < availableSuperTypes.length; i++) {
libSupers[i] = new LibrarySuperType(classPathEntry, javaProject, availableSuperTypes[i]);
}
return libSupers;
}
public String getSuperTypeName() {
return superTypeName;
}
public String getLibraryName() {
return libraryName;
}
private String initLibraryName() {
JsGlobalScopeContainerInitializer init = getContainerInitializer();
/* parent node */
if(superTypeName==null) {
if(init==null) {
return cpEntry.toString();
}
return init.getDescription(cpEntry, javaProject);
}
Object parent = getParent();
if(!(parent instanceof LibrarySuperType)) return null;
return ((LibrarySuperType)parent).getLibraryName();
}
public String toString() {
//JsGlobalScopeContainerInitializer init = getContainerInitializer();
/* parent node */
if(isParent()) {
return getLibraryName();
}
return Messages.getString("LibrarySuperType.0", new Object[]{superTypeName, getLibraryName()}); //$NON-NLS-1$
}
public boolean equals(Object o) {
if(!(o instanceof LibrarySuperType)) return false;
LibrarySuperType other = (LibrarySuperType)o;
if(other.cpEntry!=null && !other.cpEntry.equals(cpEntry)) {
return false;
}
if((other.superTypeName==superTypeName)) {
return true;
}
if(other.superTypeName!=null && superTypeName!=null) {
return other.superTypeName.equals(superTypeName);
}
return false;
}
public IPackageFragment[] getPackageFragments(){
IIncludePathEntry[] entries = getClasspathEntries();
ArrayList allFrags = new ArrayList();
try {
for(int i = 0;i<entries.length;i++) {
IPath path = entries[i].getPath();
IPackageFragmentRoot root = javaProject.findPackageFragmentRoot(path.makeAbsolute());
IJavaScriptElement[] children = root.getChildren();
for(int k = 0;k<children.length;k++) {
if(children[k] instanceof IPackageFragment) {
allFrags.add(children[k]);
}
}
}
} catch (JavaScriptModelException ex) {
// TODO Auto-generated catch block
ex.printStackTrace();
}
return (IPackageFragment[])allFrags.toArray(new IPackageFragment[allFrags.size()]);
}
public static JsGlobalScopeContainerInitializer getContainerInitializer(IPath classPathEntry) {
if(classPathEntry==null ) return null;
JsGlobalScopeContainerInitializer initializer= JavaScriptCore.getJsGlobalScopeContainerInitializer(classPathEntry.segment(0));
return initializer ;
}
}