blob: c1723a5aaf97ca28d51f8fe3aadab38a1cb598ae [file] [log] [blame]
/*
* Copyright (c) 1998, 2007, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* Licensed Materials - Property of IBM
* RMI-IIOP v1.0
* Copyright IBM Corp. 1998 1999 All Rights Reserved
*
*/
package sun.rmi.rmic.iiop;
import java.util.Vector;
import java.util.Hashtable;
import java.util.Enumeration;
import java.io.IOException;
import sun.tools.java.ClassDefinition;
import sun.tools.java.ClassDeclaration;
import sun.tools.java.Identifier;
import sun.tools.java.ClassNotFound;
import sun.tools.java.CompilerError;
import sun.rmi.rmic.IndentingWriter;
import java.util.HashSet;
import com.sun.corba.se.impl.util.RepositoryId;
import sun.rmi.rmic.Names;
/**
* Type is an abstract base class for a family of types which provide
* conformance checking and name mapping as defined in the "Java to IDL
* Mapping" OMG specification. The family is composed of the following
* fixed set of types:
* <pre>
*
* +- RemoteType <-- AbstractType
* |
* +- InterfaceType <-+- SpecialInterfaceType
* +- PrimitiveType | |
* | | +- NCInterfaceType
* Type <-+- CompoundType <-|
* | | +- ValueType
* +- ArrayType | |
* +- ClassType <-----+- ImplementationType
* |
* +- SpecialClassType
* |
* +- NCClassType
*
* </pre>
* PrimitiveType represents a primitive or a void type.
* <p>
* CompoundType is an abstract base representing any non-special class
* or interface type.
* <p>
* InterfaceType is an abstract base representing any non-special
* interface type.
* <p>
* RemoteType represents any non-special interface which inherits
* from java.rmi.Remote.
* <p>
* AbstractType represents any non-special interface which does not
* inherit from java.rmi.Remote, for which all methods throw RemoteException.
* <p>
* SpecialInterfaceType represents any one of the following types:
* <pre>
* java.rmi.Remote
* java.io.Serializable
* java.io.Externalizable
* </pre>
* all of which are treated as special cases.
* <p>
* NCInterfaceType represents any non-special, non-conforming interface.
* <p>
* ClassType is an abstract base representing any non-special class
* type.
* <p>
* ValueType represents any non-special class which does inherit from
* java.io.Serializable and does not inherit from java.rmi.Remote.
* <p>
* ImplementationType represents any non-special class which implements
* one or more interfaces which inherit from java.rmi.Remote.
* <p>
* SpecialClassType represents any one of the following types:
* <pre>
* java.lang.Object
* java.lang.String
* org.omg.CORBA.Object
* </pre>
* all of which are treated as special cases. For all but CORBA.Object,
* the type must match exactly. For CORBA.Object, the type must either be
* CORBA.Object or inherit from it.
* <p>
* NCClassType represents any non-special, non-conforming class.
* <p>
* ArrayType is a wrapper for any of the other types. The getElementType()
* method can be used to get the array element type. The getArrayDimension()
* method can be used to get the array dimension.
* <p>
* <i><strong>NOTE:</strong> None of these types is multi-thread-safe</i>
* @author Bryan Atsatt
*/
public abstract class Type implements sun.rmi.rmic.iiop.Constants, ContextElement, Cloneable {
private int typeCode;
private int fullTypeCode;
private Identifier id;
private String name;
private String packageName;
private String qualifiedName;
private String idlName;
private String[] idlModuleNames;
private String qualifiedIDLName;
private String repositoryID;
private Class ourClass;
private int status = STATUS_PENDING;
protected BatchEnvironment env; // Easy access for subclasses.
protected ContextStack stack; // Easy access for subclasses.
protected boolean destroyed = false;
//_____________________________________________________________________
// Public Interfaces
//_____________________________________________________________________
/**
* Return the unqualified name for this type (e.g. com.acme.Dynamite would
* return "Dynamite").
*/
public String getName() {
return name;
}
/**
* Return the package of this type (e.g. com.acme.Dynamite would
* return "com.acme"). Will return null if default package or
* if this type is a primitive.
*/
public String getPackageName() {
return packageName;
}
/**
* Return the fully qualified name of this type (e.g. com.acme.Dynamite
* would return "com.acme.Dynamite")
*/
public String getQualifiedName() {
return qualifiedName;
}
/**
* Return signature for this type (e.g. com.acme.Dynamite
* would return "com.acme.Dynamite", byte = "B")
*/
public abstract String getSignature();
/**
* IDL_Naming
* Return the unqualified IDL name of this type (e.g. com.acme.Dynamite would
* return "Dynamite").
*/
public String getIDLName() {
return idlName;
}
/**
* IDL_Naming
* Return the IDL module name for this type (e.g. com.acme.Dynamite would return
* a three element array of {"com","acme"). May be a zero length array if
* there is no module name.
*/
public String[] getIDLModuleNames() {
return idlModuleNames;
}
/**
* IDL_Naming
* Return the fully qualified IDL name for this type (e.g. com.acme.Dynamite would
* return "com::acme::Dynamite").
* @param global If true, prepends "::".
*/
public String getQualifiedIDLName(boolean global) {
if (global && getIDLModuleNames().length > 0) {
return IDL_NAME_SEPARATOR + qualifiedIDLName;
} else {
return qualifiedIDLName;
}
}
/**
* Return the identifier for this type. May be qualified.
*/
public Identifier getIdentifier() {
return id;
}
/**
* Return the repository ID for this type.
*/
public String getRepositoryID() {
return repositoryID;
}
/**
* Return the repository ID for this "boxed" type.
*/
public String getBoxedRepositoryID() {
return RepositoryId.createForJavaType(ourClass);
}
/**
* Return the Class for this type.
*/
public Class getClassInstance() {
if (ourClass == null) {
initClass();
}
return ourClass;
}
/**
* Return the status of this type.
*/
public int getStatus() {
return status;
}
/**
* Set the status of this type.
*/
public void setStatus(int status) {
this.status = status;
}
/**
* Return the compiler environment for this type.
*/
public BatchEnvironment getEnv() {
return env;
}
/**
* Get type code, without modifiers. Type codes are defined in sun.rmi.rmic.iiop.Constants.
*/
public int getTypeCode() {
return typeCode;
}
/**
* Get type code, with modifiers. Type codes are defined in sun.rmi.rmic.iiop.Constants.
*/
public int getFullTypeCode() {
return fullTypeCode;
}
/**
* Get type code modifiers. Type codes are defined in sun.rmi.rmic.iiop.Constants.
*/
public int getTypeCodeModifiers() {
return fullTypeCode & TM_MASK;
}
/**
* Check for a certain type. Type codes are defined in sun.rmi.rmic.iiop.Constants.
* Returns true if all of the bits in typeCodeMask are present in the full type code
* of this object.
*/
public boolean isType(int typeCodeMask) {
return (fullTypeCode & typeCodeMask) == typeCodeMask;
}
/**
* Like isType(), but returns true if <em>any</em> of the bits in typeCodeMask are
* present in the full type code of this object.
*/
public boolean typeMatches(int typeCodeMask) {
return (fullTypeCode & typeCodeMask) > 0;
}
/**
* Return the fullTypeCode. If an array, returns the
* type code from the element type.
*/
public int getRootTypeCode() {
if (isArray()) {
return getElementType().getFullTypeCode();
} else {
return fullTypeCode;
}
}
/**
* Return true if this type is-a InterfaceType.
*/
public boolean isInterface() {
return (fullTypeCode & TM_INTERFACE) == TM_INTERFACE;
}
/**
* Return true if this type is-a ClassType.
*/
public boolean isClass() {
return (fullTypeCode & TM_CLASS) == TM_CLASS;
}
/**
* Return true if this type is-a inner class or interface.
*/
public boolean isInner() {
return (fullTypeCode & TM_INNER) == TM_INNER;
}
/**
* Return true if this type is-a SpecialInterfaceType.
*/
public boolean isSpecialInterface() {
return (fullTypeCode & TM_SPECIAL_INTERFACE) == TM_SPECIAL_INTERFACE;
}
/**
* Return true if this type is-a SpecialClassType.
*/
public boolean isSpecialClass() {
return (fullTypeCode & TM_SPECIAL_CLASS) == TM_SPECIAL_CLASS;
}
/**
* Return true if this type is-a CompoundType.
*/
public boolean isCompound() {
return (fullTypeCode & TM_COMPOUND) == TM_COMPOUND;
}
/**
* Return true if this type is-a PrimitiveType.
*/
public boolean isPrimitive() {
return (fullTypeCode & TM_PRIMITIVE) == TM_PRIMITIVE;
}
/**
* Return true if this type is-a ArrayType.
*/
public boolean isArray() {
return (fullTypeCode & TYPE_ARRAY) == TYPE_ARRAY;
}
/**
* Return true if this type is a conforming type.
*/
public boolean isConforming() {
return (fullTypeCode & TM_NON_CONFORMING) == TM_NON_CONFORMING;
}
/**
* Return a string representation of this type.
*/
public String toString () {
return getQualifiedName();
}
/**
* Get element type. Returns null if not an array.
*/
public Type getElementType () {
return null;
}
/**
* Get array dimension. Returns zero if not an array.
*/
public int getArrayDimension () {
return 0;
}
/**
* Get brackets string. Returns "" if not an array.
*/
public String getArrayBrackets () {
return "";
}
/**
* Equality check based on the string representation.
*/
public boolean equals(Object obj) {
String us = toString();
String them = ((Type)obj).toString();
return us.equals(them);
}
/**
* Collect all the matching types referenced directly or indirectly
* by this type, including itself.
* @param typeCodeFilter The typeCode to use as a filter.
*/
public Type[] collectMatching (int typeCodeFilter) {
return collectMatching(typeCodeFilter,new HashSet(env.allTypes.size()));
}
/**
* Collect all the matching types referenced directly or indirectly
* by this type, including itself.
* @param typeCodeFilter The typeCode to use as a filter.
* @param alreadyChecked Contains types which have previously been checked
* and will be ignored. Updated during collection.
*/
public Type[] collectMatching (int typeCodeFilter, HashSet alreadyChecked) {
Vector matching = new Vector();
// Fill up the list...
addTypes(typeCodeFilter,alreadyChecked,matching);
// Copy vector contents to array and return it...
Type[] result = new Type[matching.size()];
matching.copyInto(result);
return result;
}
/**
* Return a string describing this type.
*/
public abstract String getTypeDescription ();
/**
* Return the name of this type. For arrays, will include "[]" if useIDLNames == false.
* @param useQualifiedNames If true, print qualified names; otherwise, print unqualified names.
* @param useIDLNames If true, print IDL names; otherwise, print java names.
* @param globalIDLNames If true and useIDLNames true, prepends "::".
*/
public String getTypeName ( boolean useQualifiedNames,
boolean useIDLNames,
boolean globalIDLNames) {
if (useIDLNames) {
if (useQualifiedNames) {
return getQualifiedIDLName(globalIDLNames);
} else {
return getIDLName();
}
} else {
if (useQualifiedNames) {
return getQualifiedName();
} else {
return getName();
}
}
}
/**
* Print all types referenced directly or indirectly by this type which
* match the filter.
* @param writer The stream to print to.
* @param typeCodeFilter The type codes to print.
* @param useQualifiedNames If true, print qualified names; otherwise, print unqualified names.
* @param useIDLNames If true, print IDL names; otherwise, print java names.
* @param globalIDLNames If true and useIDLNames true, prepends "::".
*/
public void print ( IndentingWriter writer,
int typeCodeFilter,
boolean useQualifiedNames,
boolean useIDLNames,
boolean globalIDLNames) throws IOException {
Type[] theTypes = collectMatching(typeCodeFilter);
print(writer,theTypes,useQualifiedNames,useIDLNames,globalIDLNames);
}
/**
* Print an array of types.
* @param writer The stream to print to.
* @param theTypes The types to print.
* @param useQualifiedNames If true, print qualified names; otherwise, print unqualified names.
* @param useIDLNames If true, print IDL names; otherwise, print java names.
* @param globalIDLNames If true and useIDLNames true, prepends "::".
*/
public static void print ( IndentingWriter writer,
Type[] theTypes,
boolean useQualifiedNames,
boolean useIDLNames,
boolean globalIDLNames) throws IOException {
for (int i = 0; i < theTypes.length; i++) {
theTypes[i].println(writer,useQualifiedNames,useIDLNames,globalIDLNames);
}
}
/**
* Print this type.
* @param writer The stream to print to.
* @param useQualifiedNames If true, print qualified names; otherwise, print unqualified names.
* @param useIDLNames If true, print IDL names; otherwise, print java names.
* @param globalIDLNames If true and useIDLNames true, prepends "::".
*/
public void print ( IndentingWriter writer,
boolean useQualifiedNames,
boolean useIDLNames,
boolean globalIDLNames) throws IOException {
printTypeName(writer,useQualifiedNames,useIDLNames,globalIDLNames);
}
/**
* Print this type, followed by a newline.
* @param writer The stream to print to.
* @param useQualifiedNames If true, print qualified names; otherwise, print unqualified names.
* @param useIDLNames If true, print IDL names; otherwise, print java names.
* @param globalIDLNames If true and useIDLNames true, prepends "::".
*/
public void println ( IndentingWriter writer,
boolean useQualifiedNames,
boolean useIDLNames,
boolean globalIDLNames) throws IOException {
print(writer,useQualifiedNames,useIDLNames,globalIDLNames);
writer.pln();
}
/**
* Print the name of this type.
* @param writer The stream to print to.
* @param useQualifiedNames If true, print qualified names; otherwise, print unqualified names.
* @param useIDLNames If true, print IDL names; otherwise, print java names.
* @param globalIDLNames If true and useIDLNames true, prepends "::".
*/
public void printTypeName ( IndentingWriter writer,
boolean useQualifiedNames,
boolean useIDLNames,
boolean globalIDLNames) throws IOException {
writer.p(getTypeName(useQualifiedNames,useIDLNames,globalIDLNames));
}
/**
* Return context element name.
*/
public String getElementName() {
return getQualifiedName();
}
//_____________________________________________________________________
// Subclass Interfaces
//_____________________________________________________________________
/**
* Print the "opening" of the package or module of this type.
* @param writer The stream to print to.
* @param useIDLNames If true, print IDL names; otherwise, print java names.
*/
protected void printPackageOpen ( IndentingWriter writer,
boolean useIDLNames) throws IOException {
if (useIDLNames) {
String[] moduleNames = getIDLModuleNames();
for (int i = 0; i < moduleNames.length; i++ ) {
writer.plnI("module " + moduleNames[i] + " {");
}
} else {
String packageName = getPackageName();
if (packageName != null) {
writer.pln("package " + packageName + ";");
}
}
}
/**
* Get a type out of the table.
*/
protected static Type getType (sun.tools.java.Type key, ContextStack stack) {
return getType(key.toString(),stack);
}
/**
* Get a type out of the table.
*/
protected static Type getType (String key, ContextStack stack) {
Type result = (Type) stack.getEnv().allTypes.get(key);
if (result != null) {
stack.traceExistingType(result);
}
return result;
}
/**
* Remove a type from the table.
*/
protected static void removeType (String key, ContextStack stack) {
Type value = (Type) stack.getEnv().allTypes.remove(key);
stack.getEnv().invalidTypes.put(value,key);
}
/**
* Remove a type from the table.
*/
protected static void removeType (sun.tools.java.Type key, ContextStack stack) {
String theKey = key.toString();
Type old = (Type) stack.getEnv().allTypes.remove(theKey);
putInvalidType(old,theKey,stack);
}
/**
* Put a type into the table.
*/
protected static void putType (sun.tools.java.Type key, Type value, ContextStack stack) {
stack.getEnv().allTypes.put(key.toString(),value);
}
/**
* Put a type into the table.
*/
protected static void putType (String key, Type value, ContextStack stack) {
stack.getEnv().allTypes.put(key,value);
}
/**
* Put an invalid type into the.
*/
protected static void putInvalidType (Type key, String value, ContextStack stack) {
stack.getEnv().invalidTypes.put(key,value);
}
/**
* Remove all invalid types...
*/
public void removeInvalidTypes () {
if (env.invalidTypes.size() > 0) {
env.invalidTypes.clear();
}
}
/**
* Walk all types and tell them to update invalid types...
*/
protected static void updateAllInvalidTypes (ContextStack stack) {
BatchEnvironment env = stack.getEnv();
if (env.invalidTypes.size() > 0) {
// Walk all types and swap invalid...
for (Enumeration e = env.allTypes.elements() ; e.hasMoreElements() ;) {
Type it = (Type) e.nextElement();
it.swapInvalidTypes();
}
// Delete all invalidTypes...
env.invalidTypes.clear();
}
}
/**
* Return count of previously parsed types.
*/
protected int countTypes () {
return env.allTypes.size();
}
/**
* Reset types removes all previously parsed types.
*/
void resetTypes () {
env.reset();
}
/**
* Release all resources.
*/
protected void destroy () {
if (!destroyed) {
id = null;
name = null;
packageName = null;
qualifiedName = null;
idlName = null;
idlModuleNames = null;
qualifiedIDLName = null;
repositoryID = null;
ourClass = null;
env = null;
stack = null;
destroyed = true;
}
}
/**
* Convert all invalid types to valid ones.
*/
protected void swapInvalidTypes () {
}
/**
* Convert an invalid type to a valid one.
*/
protected Type getValidType (Type invalidType) {
if (invalidType.getStatus() == STATUS_VALID) {
return invalidType;
}
String key = (String)env.invalidTypes.get(invalidType);
Type result = null;
if (key != null) {
result = (Type) env.allTypes.get(key);
}
if (result == null) {
throw new Error("Failed to find valid type to swap for " + invalidType + " mis-identified as " + invalidType.getTypeDescription());
}
//System.out.println("Swapped " + result + " from " + invalidType.getTypeDescription()
// + " to " + result.getTypeDescription());
//ContextStack.dumpCallStack();
return result;
}
/**
* Print the "closing" of the package or module of this type.
* @param writer The stream to print to.
* @param useIDLNames If true, print IDL names; otherwise, print java names.
*/
protected void printPackageClose ( IndentingWriter writer,
boolean useIDLNames) throws IOException {
if (useIDLNames) {
String[] moduleNames = getIDLModuleNames();
for (int i = 0; i < moduleNames.length; i++ ) {
writer.pOln("};");
}
}
}
/**
* Create a Type instance for the given type. Requires that
* setName(Identifier) be called afterward.
*/
protected Type(ContextStack stack, int fullTypeCode) {
this.env = stack.getEnv();
this.stack = stack;
this.fullTypeCode = fullTypeCode;
typeCode = fullTypeCode & TYPE_MASK;
}
/**
* Set type codes. May only be called during initialization.
*/
protected void setTypeCode(int fullTypeCode) {
this.fullTypeCode = fullTypeCode;
typeCode = fullTypeCode & TYPE_MASK;
}
/**
* Set name and package. May only be called during initialization.
*/
protected void setNames(Identifier id, String[] idlModuleNames, String idlName) {
this.id = id;
name = Names.mangleClass(id).getName().toString();
packageName = null;
if (id.isQualified()) {
packageName = id.getQualifier().toString();
qualifiedName = packageName + NAME_SEPARATOR + name;
} else {
qualifiedName = name;
}
setIDLNames(idlModuleNames,idlName);
}
/**
* Set IDL name. May only be called during initialization.
*/
protected void setIDLNames(String[] idlModuleNames, String idlName) {
this.idlName = idlName;
if (idlModuleNames != null) {
this.idlModuleNames = idlModuleNames;
} else {
this.idlModuleNames = new String[0];
}
qualifiedIDLName = IDLNames.getQualifiedName(idlModuleNames,idlName);
}
/**
* Report a ClassNotFoundException thru the compiler environment.
*/
protected static void classNotFound(ContextStack stack,
ClassNotFound e) {
classNotFound(false,stack,e);
}
/**
* Report a ClassNotFoundException thru the compiler environment.
*/
protected static void classNotFound(boolean quiet,
ContextStack stack,
ClassNotFound e) {
if (!quiet) stack.getEnv().error(0, "rmic.class.not.found", e.name);
stack.traceCallStack();
}
/**
* Report a constraint failure thru the compiler environment.
* @param constraintNum Used to generate a key of the form
"rmic.iiop.constraint.N", which must identify a message
in the "rmic.properties" file.
* @param quiet True if should not cause failure or message.
* @param stack The context stack.
* @param arg0 An object to substitute for {0} in the message.
* @param arg1 An object to substitute for {1} in the message.
* @param arg2 An object to substitute for {2} in the message.
* @return false.
*/
protected static boolean failedConstraint(int constraintNum,
boolean quiet,
ContextStack stack,
Object arg0, Object arg1, Object arg2) {
String message = "rmic.iiop.constraint." + constraintNum;
if (!quiet) {
stack.getEnv().error(0,message,
(arg0 != null ? arg0.toString() : null),
(arg1 != null ? arg1.toString() : null),
(arg2 != null ? arg2.toString() : null));
} else {
String error = stack.getEnv().errorString(message,arg0,arg1,arg2);
stack.traceln(error);
}
return false;
}
/**
* Report a constraint failure thru the compiler environment.
* @param constraintNum Used to generate a key of the form
"rmic.iiop.constraint.N", which must identify a message
in the "rmic.properties" file.
* @param quiet True if should not cause failure or message.
* @param stack The context stack.
* @param arg0 An object to substitute for {0} in the message.
* @param arg1 An object to substitute for {1} in the message.
* @return false.
*/
protected static boolean failedConstraint(int constraintNum,
boolean quiet,
ContextStack stack,
Object arg0, Object arg1) {
return failedConstraint(constraintNum,quiet,stack,arg0,arg1,null);
}
/**
* Report a constraint failure thru the compiler environment.
* @param constraintNum Used to generate a key of the form
"rmic.iiop.constraint.N", which must identify a message
in the "rmic.properties" file.
* @param quiet True if should not cause failure or message.
* @param stack The context stack.
* @param arg0 An object to substitute for {0} in the message.
* @return false.
*/
protected static boolean failedConstraint(int constraintNum,
boolean quiet,
ContextStack stack,
Object arg0) {
return failedConstraint(constraintNum,quiet,stack,arg0,null,null);
}
/**
* Report a constraint failure thru the compiler environment.
* @param quiet True if should not cause failure or message.
* @param stack The context stack.
* @param constraintNum Used to generate a key of the form
"rmic.iiop.constraint.N", which must identify a message
in the "rmic.properties" file.
* @return false.
*/
protected static boolean failedConstraint(int constraintNum,
boolean quiet,
ContextStack stack) {
return failedConstraint(constraintNum,quiet,stack,null,null,null);
}
/**
* Cloning is supported by returning a shallow copy of this object.
*/
protected Object clone() {
try {
return super.clone();
} catch (CloneNotSupportedException e) {
throw new Error("clone failed");
}
}
/*
* Add matching types to list. Return true if this type has not
* been previously checked, false otherwise.
*/
protected boolean addTypes (int typeCodeFilter,
HashSet checked,
Vector matching) {
boolean result;
// Have we already checked this type?
if (checked.contains(this)) {
// Yes, so return false.
result = false;
} else {
// Nope, so add it...
checked.add(this);
// Do we match the filter?
if (typeMatches(typeCodeFilter)) {
// Yep. so add it and set result to true...
matching.addElement(this);
}
// Return true.
result = true;
}
return result;
}
/*
* Load a Class instance. Return null if fail.
*/
protected abstract Class loadClass();
private boolean initClass() {
if (ourClass == null) {
ourClass = loadClass();
if (ourClass == null) {
failedConstraint(27,false,stack,getQualifiedName());
return false;
}
}
return true;
}
/*
* Set the clz and repositoryID fields. Reports error
* and returns false if fails, returns true if succeeds.
*/
protected boolean setRepositoryID() {
// First, load the class...
if (!initClass()) {
return false;
}
// Now make the repositoryID and return success...
repositoryID = RepositoryId.createForAnyType(ourClass);
return true;
}
//_____________________________________________________________________
// Internal Interfaces
//_____________________________________________________________________
private Type () {} // Disallowed.
}