package org.eclipse.jdt.internal.core.builder.impl; | |
/* | |
* (c) Copyright IBM Corp. 2000, 2001. | |
* All Rights Reserved. | |
*/ | |
import org.eclipse.core.runtime.IPath; | |
import org.eclipse.jdt.internal.core.builder.IPackage; | |
import java.util.*; | |
/** | |
* The state's package map. | |
*/ | |
public class PackageMap extends StateTables { | |
Hashtable fTable; | |
/** | |
* Creates a new package map | |
*/ | |
PackageMap() { | |
fTable = new Hashtable(23); | |
} | |
/** | |
* Returns true if the package exists in the state, otherwise | |
* returns false | |
*/ | |
boolean containsPackage(IPackage pkg) { | |
return fTable.containsKey(pkg); | |
} | |
/** | |
* Creates a copy of the package map. | |
*/ | |
PackageMap copy() { | |
try { | |
PackageMap copy = (PackageMap) super.clone(); | |
copy.fTable = (Hashtable) fTable.clone(); | |
return copy; | |
} | |
catch (CloneNotSupportedException e) { | |
// Should not happen. | |
throw new Error(); | |
} | |
} | |
/** | |
* Returns an enumeration of all packages in the state. The enumeration | |
* is of non state-specific package handles. | |
*/ | |
public Enumeration getAllPackages() { | |
return fTable.keys(); | |
} | |
/** | |
* Returns all packages in the state. The result is an array | |
* of non state-specific package handles. | |
*/ | |
public IPackage[] getAllPackagesAsArray() { | |
IPackage[] pkgs = new IPackage[fTable.size()]; | |
int i = 0; | |
for (Enumeration e = fTable.keys(); e.hasMoreElements();) { | |
pkgs[i++] = (IPackage) e.nextElement(); | |
} | |
return pkgs; | |
} | |
/** | |
* Returns the package map entry for a given package. | |
* Returns null if the package is not present. | |
*/ | |
PackageMapEntry getEntry(IPackage pkg) { | |
return (PackageMapEntry)fTable.get(pkg); | |
} | |
/** | |
* Returns the package fragments for a given package. The returned | |
* fragments are sorted according to the class path. | |
* Returns null if the package is not present. | |
*/ | |
IPath[] getFragments(IPackage pkg) { | |
PackageMapEntry entry = (PackageMapEntry)fTable.get(pkg); | |
return entry == null ? null : entry.getFragments(); | |
} | |
/** | |
* Adds a fragment entry for the given package. | |
* Mutable operation, should only be used when recreating package map. | |
*/ | |
void putFragment(IPackage pkg, IPath frag) { | |
PackageMapEntry entry = (PackageMapEntry)fTable.get(pkg); | |
if (entry == null) { | |
entry = new PackageMapEntry(pkg); | |
fTable.put(pkg, entry); | |
} | |
entry.addFragment(frag); | |
} | |
/** | |
* Adds an array of fragments for the given package. Assumes that the | |
* given array of fragments are in classpath order. | |
*/ | |
void putFragments(IPackage pkg, IPath[] frags) { | |
PackageMapEntry entry = (PackageMapEntry)fTable.get(pkg); | |
if (entry == null) { | |
entry = new PackageMapEntry(pkg); | |
fTable.put(pkg, entry); | |
} | |
entry.addFragments(frags); | |
} | |
/** | |
* Returns the number of packages in the state. | |
*/ | |
int size() { | |
return fTable.size(); | |
} | |
/** | |
* For debugging only. | |
*/ | |
public String toString() { | |
IPackage[] pkgs = getAllPackagesAsArray(); | |
Arrays.sort(pkgs, StateImpl.getPackageComparator()); | |
StringBuffer sb = new StringBuffer(); | |
sb.append(super.toString() + ":\n"/*nonNLS*/); | |
for (int i = 0; i < pkgs.length; ++i) { | |
sb.append(" "/*nonNLS*/ + pkgs[i].getName() + ": "/*nonNLS*/); | |
IPath[] fragments = getFragments(pkgs[i]); | |
for (int j = 0; j < fragments.length; ++j) { | |
if (j != 0) sb.append(", "/*nonNLS*/); | |
sb.append(fragments[j]); | |
} | |
sb.append("\n"/*nonNLS*/); | |
} | |
return sb.toString(); | |
} | |
} |