/*******************************************************************************
* Copyright (c) 2002 - 2006 IBM Corporation.
* 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 com.ibm.wala.types;
import java.io.Serializable;
import com.ibm.wala.util.strings.Atom;
/**
* Defines the meta-information that identifies a class loader. This is effectively a "name" for a class loader.
*/
public class ClassLoaderReference implements Serializable {
/* Serial version */
private static final long serialVersionUID = -3256390509887654325L;
/**
* Canonical name for the Java language
*/
public final static Atom Java = Atom.findOrCreateUnicodeAtom("Java");
/**
* Canonical reference to primordial class loader
*/
public final static ClassLoaderReference Primordial = new ClassLoaderReference(Atom.findOrCreateUnicodeAtom("Primordial"), Java, null);
/**
* Canonical reference to extension class loader
*/
public final static ClassLoaderReference Extension = new ClassLoaderReference(Atom.findOrCreateUnicodeAtom("Extension"), Java, Primordial);
/**
* Canonical reference to application class loader
*/
public final static ClassLoaderReference Application = new ClassLoaderReference(Atom.findOrCreateUnicodeAtom("Application"), Java, Extension);
/**
* A String which identifies this loader
*/
private final Atom name;
/**
* A String which identifies the language for this loader
*/
private final Atom language;
/**
* This class loader's parent
*/
private final ClassLoaderReference parent;
public ClassLoaderReference(Atom name, Atom language, ClassLoaderReference parent) {
if (name == null) {
throw new IllegalArgumentException("name is null");
}
this.name = name;
this.language = language;
this.parent = parent;
}
/**
* @return the name of this class loader
*/
public Atom getName() {
return name;
}
/**
* @return the name of the language this class loader belongs to
*/
public Atom getLanguage() {
return language;
}
/**
* @return the parent of this loader in the loader hierarchy, or null if none
*/
public ClassLoaderReference getParent() {
return parent;
}
/**
* Note: names for class loader references must be unique.
*/
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (!getClass().equals(obj.getClass())) {
return false;
} else {
ClassLoaderReference o = (ClassLoaderReference) obj;
return name.equals(o.name);
}
}
@Override
public int hashCode() {
return name.hashCode();
}
@Override
public String toString() {
StringBuffer result = new StringBuffer();
result.append(name.toString());
result.append(" classloader");
result.append("\n");
return result.toString();
}
}