package bluej.extensions;
import java.awt.EventQueue;
import java.io.File;
import threadchecker.OnThread;
import threadchecker.Tag;
import bluej.extensions.BDependency.Type;
import bluej.pkgmgr.Package;
import bluej.pkgmgr.PkgMgrFrame;
import bluej.pkgmgr.Project;
import bluej.pkgmgr.dependency.Dependency;
import bluej.pkgmgr.target.ClassTarget;
import bluej.pkgmgr.target.Target;
import bluej.views.View;
| The problem I am trying to solve is to have a uniform and simple way to deal with
| objects validity. An extension may be holding BProject but this BProject may not be valid
| since the gui has closed it. Or may be holding aBPackage and this not being valid
| The same apply to a BClass or a BOBject.
|
| To solve it I need to store the ID of the above objects and check if it is still valid
| before doing anything.
| Again, the problem is that for a BClass I need not only to check if the Class is valid
| but also the Project and the Package !
| So the ID if a BClass is really all of the above...
|
| Then, the solution is to put all that is needed in here and have this class only deal with
| checking the mess of it...
|
| NOTE on class Names: Most of the time we would like the qualified form of the class name
| however there are cases when we need the short form, it seems reasonable to store the
| long form and derive the short one.
|
| @author Damiano Bolla 2003,2004
|
class Identifier
{
private File projectId;
private String packageId;
private String qualifiedClassName;
| Constructor for the Identifier object
|
@OnThread(Tag.Any)
Identifier(Project bluejProject)
{
this(bluejProject, null, null);
}
| Constructor for the Identifier object
|
@OnThread(Tag.Any)
Identifier(Project bluejProject, Package bluejPackage)
{
this(bluejProject, bluejPackage, null);
}
| Constructor for the Identifier object
|
@OnThread(Tag.Any)
Identifier(Project bluejProject, Package bluejPackage, String aQualifiedClassName)
{
projectId = bluejProject.getProjectDir();
if (bluejPackage != null) packageId = bluejPackage.getQualifiedName();
qualifiedClassName = aQualifiedClassName;
}
| Returns the blueJProject and also checks its existence
|
Project getBluejProject() throws ProjectNotOpenException
{
Project aProject = Project.getProject(projectId);
if (aProject == null)
throw new ProjectNotOpenException("Project " + projectId + " is closed");
return aProject;
}
| Returns the inner BlueJ package given the current identifier.
| @throws ProjectNotOpenException
| @throws PackageNotFoundException
|
Package getBluejPackage() throws ProjectNotOpenException, PackageNotFoundException
{
Project bluejProject = getBluejProject();
Package bluejPkg = bluejProject.getCachedPackage(packageId);
if (bluejPkg == null)
throw new PackageNotFoundException("Package '" + packageId + "' is deleted");
return bluejPkg;
}
| Returns the name of the class. No checks are made for validity of
| the name, to avoid having to compile the class in order to get
| its name.
| This means that the name may not be valid, if the class has
| been renamed or deleted.
|
| @return The qualified name of the class represented by this identifier,
| or null if it doesn't represent a class
|
String getClassName()
{
return qualifiedClassName;
}
| Returns the Frame associated with this Package.
| The nice thing about this one is that it WILL open a frame if it was not already open.
| This gets rid of one possible exception regarding a packageFrame not open...
|
| @return The packageFrame value
| @exception ProjectNotOpenException
| @exception PackageNotFoundException
|
PkgMgrFrame getPackageFrame()
throws ProjectNotOpenException, PackageNotFoundException
{
Package thisPkg = getBluejPackage();
final PkgMgrFrame pmf = PkgMgrFrame.createFrame(thisPkg, null);
EventQueue.invokeLater(new Runnable() {
public void run()
{
pmf.setVisible(true);
}
});
return pmf;
}
| Returns the Java class that is associated with this name in this package
|
| @return The java Class object
|
| @exception ProjectNotOpenException
| @exception ClassNotFoundException
|
Class<?> getJavaClass() throws ProjectNotOpenException, ClassNotFoundException
{
Project bluejPrj = getBluejProject();
Class<?> aClass = bluejPrj.loadClass(qualifiedClassName);
if (aClass == null)
throw new ClassNotFoundException("Class " + qualifiedClassName + " Not Found");
return aClass;
}
| Returns the class target of this java class by checking its existence
|
| @return The classTarget value
|
| @exception ProjectNotOpenException
| @exception PackageNotFoundException
|
ClassTarget getClassTarget()
throws ProjectNotOpenException, PackageNotFoundException
{
Package bluejPkg = getBluejPackage();
String className = qualifiedClassName;
int dotpos = qualifiedClassName.lastIndexOf(".");
if (dotpos > 0) {
className = qualifiedClassName.substring(dotpos + 1);
}
Target aTarget = bluejPkg.getTarget(className);
if (aTarget == null) {
return null;
}
if (!(aTarget instanceof ClassTarget)) {
return null;
}
return (ClassTarget) aTarget;
}
| Returns the {}link Dependency} with the origin represented by this
| {}link Identifier} and the target represented by the specified
| {}link Identifier}.
|
| @param targetId
| The {}link Identifier} representing the target of the
| dependency.
| @param type
| The type of the dependency (there may be more than one
| dependencies with the same origin and target but different
| types).
| @return The {}link Dependency} with the origin represented by this
| {}link Identifier} and the target represented by the specified
| {}link Identifier} or <code>null</code> if there is no such
| dependency.
| @throws ProjectNotOpenException
| @throws PackageNotFoundException
|
p.public Dependency getDependency(Identifier targetId, Type type) throws ProjectNotOpenException,
PackageNotFoundException
{
ClassTarget origin = getClassTarget();
ClassTarget target = targetId.getClassTarget();
if ((origin != null) && (target != null)) {
Package bluejPackage = getBluejPackage();
return bluejPackage.getEditor().getDependency(origin, target, type);
}
return null;
}
| Returns the view associated with this Class
|
| @return The bluejView value
| @exception ProjectNotOpenException
| @exception ClassNotFoundException
|
View getBluejView()
throws ProjectNotOpenException, ClassNotFoundException
{
Class<?> aClass = getJavaClass();
return View.getView(aClass);
}
|
| @see java.lang.Object#hashCode()
|
@Override
public int hashCode()
{
int total = 0;
if (projectId != null) {
total += projectId.hashCode();
}
if (packageId != null) {
total += packageId.hashCode();
}
if (qualifiedClassName != null) {
total += qualifiedClassName.hashCode();
}
return total;
}
|
| @see java.lang.Object#equals(java.lang.Object)
|
@Override
public boolean equals(Object obj)
{
if (! (obj instanceof Identifier)) {
return false;
}
Identifier other = (Identifier) obj;
if (equalsIgnoreClass(other)
&& !(qualifiedClassName != null ? qualifiedClassName.equals(other.qualifiedClassName)
: other.qualifiedClassName == null)) {
return false;
}
return true;
}
| Compares the given {}link Identifier} with this one, ignoring the
| represented class.
|
| @param other
| The {}link Identifier} to compare.
| @return <code>true</code> if the specified {}link Identifier} has the
| same project and package as this one, <code>false</code>
| otherwise.
|
p.public boolean equalsIgnoreClass(Identifier other)
{
if (!(projectId != null ? projectId.equals(other.projectId) : other.projectId == null)) {
return false;
}
if (!(packageId != null ? packageId.equals(other.packageId) : other.packageId == null)) {
return false;
}
return true;
}
}
. - Identifier
. run
. getDependency
. hashCode
. equals
. equalsIgnoreClass
238 neLoCode
+ 74 LoComm