SYSTEM AND METHOD FOR DISCOVERING AND BINDING A PROGRAM OBJECT

Abstract: A system and method are provided for discovering, in response to a request from a program for an application programming interface, an implementation of the interface that may not have been known when the program was loaded. A registry is maintained of interfaces (e.g., interface services or methods) known within the operating environment. Each known interface is associated with an implementation of the interface or other object (e.g., a class loader, a principal) associated with an implementation of the interface. When an interface not known in the registry is invoked by a program, a discovery process is initiated to create or retrieve an implementation of the interface, a class loader capable of creating such an implementation, a principal from which to create such a class loader, or other program object. An object located in one discovery process may, upon execution, cause another discovery process. A hierarchical set of contexts may be maintained to narrow or guide the scope of search for a suitable implementation.

Description: SYSTEM AND METHOD FOR DISCOVERING AND BINDING A PROGRAM OBJECT Sun, Sun Microsystems, the Sun logo, Java, and all Java-based trademarks and logos are trademarks or registered trademarks of Sun Microsystems, Inc. in the United States and other countries. BACKGROUND This invention relates to object-oriented computer programming and distributed computer systems. More specifically, a system and methods are provided for satisfying a request for a service or method of an application programming interface (also known as an interface or API) by returning an instance of an implementation of the interface. Object-oriented programs invoke objects, which are instantiated from classes defining the objects, in order to perform specific services or tasks. In an object-oriented programming language such as Java™, such services are sometimes termed "methods" and are often identified through an interface. An interface is an abstract class that specifies or identifies one or more services, but which does not define (e.g., contain executable code for performing) them. Definitions for an interface's services are contained within classes of objects termed "implementations." Therefore, in present object-oriented programming systems a program requiring an interface service issues a request for an implementation of the interface. A reference to an instance of an implementation of the interface may then be returned to the requesting program. One feature of object-oriented programming languages such as Java™ is that objects and their defining classes (e.g., an interface and an implementation of that interface) generally need not be co-located (e.g., situated on the same host computer system) with each program that uses or invokes them. Examples of distributed object architectures/systems that allow a remote object to be bound to a locally executing program include Common Object Request Broker Architecture (CORBA) by Object Management Group, Distributed Component Object Model (DCOM) by Microsoft, and Remote Method Invocation (RMI), by Sun Microsystems, Inc. Present object-oriented programming languages and these distributed object systems, however, generally require that a definition of each object or service that is to be invoked by a program be loaded or installed, or at least be known (e.g., by name or location), before its invocation. Thus, when an object or class is invoked, it is located by following a fully delineated path name (e.g., computer system, directory and sub-directory names) specified or identified before the invoking program is loaded or by searching a particular directory, sub-directory, web server or other location. The implementation may, for example, be located somewhere in the classpath of a class loader associated with the interface or requesting program. When an interface or interface service is invoked, the identity of an implementation that will satisfy the request must, generally, already be known. Typically, when code is written that uses an interface an explicit relationship is created between the interface and an implementation of the interface. Thus, when a program requires a service offered by the interface, the known implementation is used to define the service. This unfortunately limits the flexibility of responding to program requests. Even if a better or more suitable implementation becomes available before the interface is invoked (e.g., during execution of the invoking program), only the known implementation may be used. SUMMARY A system and methods are provided for resolving the invocation of an interface (e.g., an application programming interface or API) or a request for an implementation of the interface. In one embodiment of the invention an implementation of an interface may be stored remotely in relation to a program requiring a service of the interface (e.g., a "method"). Further, the implementation may be unknown to the program, programmer or user at the time the interface or one of its services is needed. In particular, no explicit relationship need be established between the interface and an implementation of that interface before the implementation can be used to define the interface service. Until a request is received for an implementation of the interface, no implementation of the interface need be known. Thus, the implementation need not be known or even available at the time the invoking program is loaded. When a request is received, a discovery process is commenced to locate a suitable implementation and provide the program that invoked the interface with a reference to an instance of that implementation. When the program requests an implementation of an interface, a search is performed of a registry (e.g., database and/or other data storage structure) for information with which to instantiate a suitable implementation. The information used to find a suitable implementation may consist of certain behavior needed by the program (e.g., a definition of a particular interface service). For each interface known to the system, the registry may contain one or more entries and each entry may correspond to a separate implementation of that interface or means of locating an implementation of that interface. If an implementation of the interface is registered (e.g., identified in the registry), the implementation class is instantiated (unless, perhaps, a reference to an existing instance is already available). A reference to the new or existing instance of the implementation is then returned or the implementation may be invoked in place of the interface or interface service requested by the program. Instead of identifying an implementation class or instance of an implementation, the registry may identify a class loader associated with an implementation of the interface or information from which such a class loader may be generated. In this case, the class loader is instantiated (unless, perhaps, an instance of the class loader is already available), and the implementation is then instantiated. A reference to the newly created implementation instance is then returned to the program or the implementation may be invoked in place of the interface or interface service requested by the program. However, the registry may not identify an implementation of the interface, an associated class loader or means for creating one or the other. In this event a locator attempts to locate such information so that, for example, the system can create a class loader that can instantiate an implementation of the interface. The locator may be configured to search pre-specified areas (e.g., local directories and/or remote servers), dynamically specified areas (e.g., depending upon the program from which the interface is invoked, the type of interface or an identity of a user) or all accessible areas. In particular, the locator is designed to search across a network such as the Internet. If suitable information is found, it can be stored in the registry for easy location and retrieval the next time it is needed. The procedure described above for creating a class loader and instantiating an implementation is then performed. One embodiment of the invention thus provides a method of constructing a self- organizing software environment in which objects (e.g., interface implementations) are located and bound at the time a particular service, function or behavior is required. If one object retrieved through this method requires further support (e.g., a service of another interface), another object may be located and attached to the environment when needed. Thus, functionality may be added to a particular program that was not envisioned when the program was developed. BRIEF DESCRIPTION OF THE FIGURES FIG. 1 is a block diagram depicting a system for resolving a request for an implementation of an interface in accordance with an embodiment of the present invention. FIG. 2 is a flow chart demonstrating a method of resolving a request for an implementation of an interface in accordance with an embodiment of the present invention. FIG. 3 is a flow chart demonstrating an alternative method of resolving a request for an implementation of an interface in accordance with an embodiment of the present invention. FIG. 4 is a block diagram of a hierarchical context framework for facilitating the resolution of a request for an interface in accordance with an embodiment of the invention. DETAILED DESCRIPTION The following description is presented to enable any person skilled in the art to make and use the invention, and is provided in the context of particular applications of the invention and their requirements. Various modifications to the disclosed embodiments will be readily apparent to those skilled in the art and the general principles defined herein may be applied to other embodiments and applications without departing from the spirit and scope of the present invention. In particular, one skilled in the art will recognize that the present invention is not limited to the use of the Java™ programming language. The use of other object-oriented programming languages are similarly envisioned. Thus, the present invention is not intended to be limited to the embodiments shown, but is to be accorded the widest scope consistent with the principles and features disclosed herein. A program environment in which a present embodiment of the invention is executed may incorporate a general-purpose computer or a special purpose device such a hand-held computer. Details of such devices (e.g., processor, memory, data storage and display) are well known and are omitted for the sake of clarity. It should also be understood that the techniques of the present invention might be implemented using a variety of technologies. For example, the methods described herein may be implemented in software running on a computer system, or implemented in hardware utilizing either a combination of microprocessors or other specially designed application specific integrated circuits, programmable logic devices, or various combinations thereof. In particular, methods described herein may be implemented by a series of computer-executable instructions residing on or in a storage medium such as a carrier wave, disk drive, or other computer-readable medium. Exemplary forms of carrier waves may take the form of electrical, electromagnetic or optical signals conveying digital data streams along a local network or a publicly accessible network such as the Internet. In a present embodiment of the invention a system and methods are provided for resolving a request for, or invocation of, an interface (e.g., an application programming interface, or API) or an implementation of an interface. A program may request an implementation of an interface, for example, in order to access a service or method offered or identified by the interface. In an object-oriented programming environment such as Java™, an interface may be viewed as a set of abstract base classes containing one or more services or methods that may be used by a program. Illustratively, an interface in the Java™ programming language does not, however, include service definitions (e.g., executable code for performing the services). In the Java™ programming language, the implementation of an interface provides the necessary code for performing the interface's service(s). Thus, when a program requires an implementation of an interface (e.g., when it invokes a service associated with the interface), a reference to an instance of such an implementation can be returned to the program or may be invoked in place of the interface. However, prior to the present invention an implementation of an interface was generally explicitly identified when the interface or the program that requires the interface was constructed. This meant that it was generally necessary to bind (e.g., load or install) the implementation of the interface before the interface itself could be used. In accordance with one embodiment of the present invention, however, the relationship between an interface and an implementation of that interface is much more flexible. In particular, in this embodiment an interface may be used without regard for how or when an implementation of the interface is located or bound. As an example of the relationship between an implementation and an interface in the presently discussed embodiment of the invention, a billing or shipping program may rely upon an address API to retrieve or change a billing or shipping address. Therefore, the API may include services such as Get_Billing_Address, Get_Shipping_Address, Find_Address, etc. Even though these services are not defined in the interface, and even if no implementation of the interface has yet been identified, the program can be compiled and executed. When the API is invoked or an API service or method is requested, a system configured in accordance with an embodiment of the invention determines whether any implementations of the API have been registered. If so, an instance of a registered implementation may be returned or invoked in place of the API. If not, a search is conducted for data from which an instance of an implementation of the interface may be derived. Multiple, distinct, implementations may be registered for a single interface. Therefore, in this embodiment services may be executed in a manner that adheres to the interface, and with corresponding results, even though they may not have been envisioned when the program was created. In one embodiment of the invention operating in a Java™ programming environment, a Java Virtual Machine (JVM) may be modified as necessary to locate a suitable implementation of a target interface. In an alternative embodiment, an application program may be modified to resolve interface requests to suitable implementations without requiring the assistance of a JVM. One skilled in the art will appreciate the benefits of allowing a program to invoke an interface (e.g., its methods or services) without having to identify an implementation of the interface and without concern for the source of or methodologies used in a suitable implementation. For example, a suitable implementation of the interface may be dynamically selected at the time an implementation of the interface is requested. In particular, a developer of a specific application program can develop his or her program to use a particular method or service of an interface without being limited to implementations of the method or service known at the time of the program's construction. Then, the application program may use a new implementation of the method/service even if it was developed after the application program was completed. By way of comparison, when an implementation must be bound to a program before the associated interface can be used, the requesting program may be limited to the bound implementation. Thus, in one embodiment of the invention a programmer of an object-oriented language enjoys greater flexibility in resolving interface requests. In particular, a requesting program is not limited to an implementation that is defined and installed before the associated interface is ever invoked. FIG. 1 depicts an illustrative system for practicing an embodiment of the present invention. Program code 100 represents a program or other set of executable instructions that request or invoke an implementation of an interface or a service or method of an interface. The request is processed by registry 102, which may comprise one or more data repositories or structures, such as a database, table, array, or the like. Registry 102 may be implemented in hardware or software. Entries in registry 102 may be indexed by interface name or type, and may be qualified with desired behavior, features, etc. If registry 102 contains an entry for the requested interface, resolver 106 retrieves or otherwise resolves the request and returns a suitable implementation (e.g., a reference to an instance of an implementation) to program code 100 or invokes the implementation on behalf of program code 100. The data retained by registry 102 may, for example, identify a class loader associated with an implementation of the requested interface. Resolver 106 would then create (e.g., instantiate) the class loader or retrieve a reference to an existing instance of the class loader. The class loader is then called upon to instantiate the implementation if no instance of the implementation is available. Resolver 106 then returns the implementation (e.g., an instance of the implementation) to program code 100. If, however, registry 102 contains no record of an implementation of the interface or a class loader associated with such an implementation, locator 104 searches for information from which to create or retrieve an implementation. Locator 104 may, for example, search for an instance or a definition of a class loader that can instantiate a suitable implementation. Locator 104 is illustratively configured to search all or a subset of accessible locations, local and/or remote to the system(s) operating program code 100. For example, locator 104 may search the system operating the program code first, before searching other locations. Locator 104 may alternatively be configured to search a system or systems local to registry 102 before searching elsewhere. Locator 104 may, in particular, be configured to search remote locations across a network, such as a LAN or WAN or a public network such as the Internet, or other communication link. Also, the search process may comprise multiple steps. Locator 104 may, for example, first search for a package of code containing a suitable implementation of the interface. Once such a package is found, locator 104 may then search the package of code for the suitable implementation. If locator 104 is successful, it passes the information it locates to resolver 106, which operates as described above. Locator 104 may, for example, find a principal concerning a class loader that can load a suitable implementation, in which case resolver 106 then instantiates the class loader and the interface implementation, as necessary. Illustratively, a principal describes how to create the object (i.e., implementation) that is to be bound to a requesting program. Thus, a principal may contain information identifying how to create a class loader, such as the location of program code to download and execute, instructions for extracting the class loader from the program code, etc. In particular, in a Java™ programming environment a principal may be a URL (Uniform Resource Locator) or other URI (Uniform Resource Identifier) of a piece of Java™ code, a JAR (Java™ ARchive) file, instructions for creating a class loader (e.g., a script, a Java™ class, a set of rules), etc. A principal may also store the class name of an implementation (and/or its associated interface) that can be created once the principal's class loader is instantiated. Thus, by searching for the name of an implementation (which may be similar to its associated interface), an interface or interface service, a suitable principal for creating a class loader and instantiating the implementation can be found. If locator 104 cannot locate an implementation of the interface or a class loader capable of creating an instance of an implementation of the interface, it may attempt to satisfy the program request in an alternative manner. In one embodiment of the invention, locator 104 may generate or compose an artificial or "dummy" implementation. Alternatively, locator 104 returns an exception (e.g., an error message) to program code 100. One skilled in the art will appreciate that the division of labor among registry 102, locator 104 and resolver 106 is flexible and is not limited to the arrangement described above. In particular, FIG. 1 depicts just one system for locating a suitable implementation of a requested interface and returning a reference to an instance of the implementation. In an alternative embodiment of the invention, registry 102 may be configured to act primarily as a data repository to store information aiding a search for an implementation of the requested interface. The functions of locating an implementation of an interface, whether registered or not, and resolving it to an instance of a suitable implementation are then performed by one or more modules acting with varying degrees of similarity to locator 104 and/or resolver 106. Registry 102 may comprise data relating to all interfaces that have been requested or invoked or, for example, some number of the most recently or most frequently requested interfaces. A portion of registry 102 may, for example, comprise a repository (e.g., a cache) having a relatively fast response time. Such a repository would be well suited to storing the most recently or frequently used interfaces. In addition, after locator 104 locates information for an implementation not known to registry 102, information concerning the implementation or its class loader may be stored in registry 102 for easier retrieval the next time the same interface is requested. In different embodiments of the invention the operation and management of registry 102, locator 104 and resolver 106 may be performed by different entities. In particular, in one embodiment of the invention a Java™ Virtual Machine operates and manages one or more of these modules on behalf of one or more application programs comprising program code 100. In an alternative embodiment, however, an application program comprising 100 may incorporate the ability to maintain and operate registry 102, locator 104 and resolver 106. One skilled in the art will appreciate that within a given programming environment, numerous methods of locating or creating a suitable implementation of a particular interface or interface service may be constructed. Likewise, many methods of resolving implementations with requested interfaces, and registering or tracking such resolutions may be designed. Operation of the system depicted in FIG. 1 may be recursive in that an implementation that is located and bound in response to the invocation of an interface or service by program code 100 may, in turn, request another interface or interface service. In particular, a first implementation that is resolved by resolver 106 may specify a number of interfaces or interface services that it requires. The procedure described above is thus performed again to locate and resolve other implementations as needed. Thus, a sort of self-organizing software environment may be constructed in which interface implementations are located and "attached" to the environment when an interface is invoked or requested. As a result, program code 100 may gain the ability to perform tasks not envisioned by its developer. U.S. Patent No. 5,727,147 (the '147 patent), issued March 10, 1998 and entitled "System and Method for Resolving Symbolic References to Externally Located Program Files" addresses the creation of application-specific class loaders. The ' 147 patent is hereby incorporated by reference. In the ' 147 patent an application-specific class loader or an object class instantiated by an application-specific class loader may be located on a remote computer. The location of the remote object(s) however, are known beforehand. Thus, the '147 patent does not describe a search procedure such as described above for the embodiment of the present invention depicted in FIG. 1. In addition, the '147 patent does not describe a search for an interface method or service (or implementation of such an interface) where a definition of the interface is unknown to the requesting program. Instead, the ' 147 patent describes the creation of class loaders for instantiating known program objects. One skilled in the art will recognize that the dynamism of the embodiment of the invention depicted in FIG. 1 distinguishes it from other distributed object systems or technologies (e.g., DCOM, DLLs, CORBA). In particular, in other systems there is generally some pre-conceived or known relationship between objects. In addition, the system of FIG. 1 is designed to search for a desired object (i.e., an implementation of an interface) that may be unknown when the requesting program is developed. The desired object that is located and resolved by the system in FIG. 1 may be known to the requesting program only by the object's behavior (e.g., a service that it defines). Other distributed object technologies are not so flexible and generally must know, ahead of time, the name of an object (and, generally, its location) that will be bound at run-time. As an example of how a software environment may incorporate an embodiment of the invention, consider a computer adventure game. The game developer may construct numerous types of objects depending upon the game's theme. A fantasy-type game may include "Monster" objects that a game player will encounter in the course of his or her adventure. The game developer may provide a number of such Monster objects (e.g., Dragon, Skeleton) to be included in every player's adventure. One benefit of an object- oriented programming language, however, is that additional objects may be incorporated into a program. Thus, in our example other programmers may define additional Monsters to be added to the program - even creatures with characteristics different from those of other Monsters. For example, a programmer may create a Dinosaur Monster object with behavior (e.g., an interface) never considered by the game developer, such as "Magic" (e.g., the ability to use magic). Further, yet another programmer may like the idea of a Dinosaur that can use magic and therefore develop implementations of the Magic interface that allow a Dinosaur to cast a number of magical spells. The Dinosaur object can then be added to a player's game environment when he or she starts the game (e.g., the game may automatically load all Monster objects stored in a particular location). When an instance of the Dinosaur object is created, the game (or some other software module) may then search for and retrieve an implementation of the Magic interface. Thus, the game developer's creation can evolve and receive functionality never considered by the developer. Further, the developer's creation may gain this additional functionality before, during or after the program's execution. Illustratively, in the game example above, when the game (e.g., the game "engine") is called upon to produce or place a monster (e.g., when a character enters a particular location), a new Monster object or new implementation of an interface may be located and applied. As another example, a general "electronic commerce" application program may be developed for performing generic commercial transactions in an electronic forum. If a new type of electronic transaction is developed, program components that enable that type of transaction can be connected to a user's copy of the general application. Those components may, for example, establish the relationships needed to conduct the new type of transaction. With reference now to FIG. 2, one method for satisfying a request for an implementation of an interface is illustrated. In this method, the Java™ Virtual Machine (JVM) of a Java™ environment has been modified to resolve requests for unknown interfaces (e.g., an invocation of an interface service for which no implementation is known, or connected to, the requesting program). FIG. 3, discussed below, provides an alternative method for resolving a request for an unknown interface whereby an application program's framework (e.g., rather than a JVM) has been modified to provide this function. In FIG. 2, state 200 is a start state. In state 202, a request for an implementation of an interface or interface service is received from a program or other set of executable instructions. The request may, for example, be in the form of an invocation of an interface or interface service. In state 204 a registry is searched, illustratively using the requested interface as a key or index. In the method of FIG. 2, for each interface registered in the registry a class loader that can install or create an implementation of the interface may be identified. The registry may, for example, store a reference to a class loader instance or, alternatively, identify information from which a class loader capable of creating an implementation of the interface may be created (e.g., a principal). If, in state 206, no entry is found in the registry for the requested interface, in state 208 a search is conducted for a class loader of an implementation of the interface and/or a principal from which such a class loader may be created. For purposes of the illustrated method, a principal may also include the class names of implementations (and/or their associated interfaces) that can be installed by a class loader identified by the principal. Thus, a principal from which an implementation of a requested interface can be derived may be found by searching for the name of the interface. In one embodiment of the invention the search (for a class loader, a principal and/or a specific implementation) is first conducted on systems or areas local to the system(s) comprising the registry. For example, where the registry is embodied in one or more web or application servers, those servers are searched first. Other search locations/areas include the classpath of the class loader associated with the requesting program (e.g., the default set of locations to be searched for a Java™ class, object or set of code), the classpath of the class loader associated with the requested interface, a remote server or system that hosts the requesting program, a central server, a library server, a network search utility (e.g., Yahoo, Excite), an Internet site, etc. If in state 210 the search for a class loader or principal is unsuccessful, an exception (e.g., an error message) is returned to the requesting program in state 212. In an alternative embodiment of the invention, the system performing the illustrated method may attempt to determine some other manner of performing a requested service for which no implementation can be located, unless the service is part of a critical operation of the requesting program. The illustrated method then ends with end state 220. If, however, an entry was found in the registry for the requested interface (state 206), or a class loader or principal was found pursuant to a search (state 210), the illustrated method proceeds to state 214. In state 214 a reference to a suitable class loader is retrieved (e.g., from the registry) or a class loader associated with an implementation of the interface is created (e.g., instantiated) from the available information. In state 216 an instance of the implementation is retrieved, if it exists, or the class loader is called upon to instantiate the implementation class. In one embodiment of the invention, if an interface is found to be registered in state 206 the illustrated method may proceed directly to state 216 from state 206. This may occur, for example, if the registry directly identifies an existing instance of the implementation. In state 218, the implementation is invoked in place of the interface invocation received in state 202. After state 218 the method ends with end state 220. FIG. 3 depicts one alternative method of satisfying a program's request for an interface. In this method the program framework itself incorporates the ability to locate a suitable implementation of the requested interface. As one skilled in the art will recognize, the portion of the program that performs the illustrated method may require certain privileges in order to perform the identified tasks. State 300 is a start state. In state 302, a component (e.g., object) of an application program requires an interface or interface service. The component may invoke the interface or service during its execution or the application framework may identify the need for the interface before the component makes the invocation. The application framework may, for example, identify the need for the interface when the program component is instantiated. In state 304 a registry is searched, illustratively using the requested interface as a key or index. As in the method of FIG. 2, for each interface registered in the registry a class loader that can install or create an implementation of the interface may be identified. The registry may store a reference to a class loader instance or, alternatively, identify information from which a class loader capable of creating an implementation of the interface may be created (e.g., a principal). If, in state 306, no entry is found in the registry for the requested interface, in state 308 a search is conducted for a class loader of an implementation of the interface and/or a principal from which such a class loader may be created. If in state 310 the search for a class loader or principal is unsuccessful, an exception (e.g., an error message) is returned to the requesting program in state 312. In an alternative embodiment of the invention the application framework may attempt to determine some other manner of performing a requested service for which no implementation can be located, unless the service is part of a critical operation of the program. The illustrated method then ends with end state 320. If, however, an entry was found in the registry for the requested interface (state 306), or a class loader or principal was found pursuant to a search (state 310), the illustrated method proceeds to state 314. In state 314 a reference to a suitable class loader is retrieved (e.g., from the registry) or a class loader associated with an implementation of the interface is created (e.g., instantiated) from the available information. In state 316 an instance of the implementation is retrieved, if it exists, or the class loader is called upon to instantiate the implementation class. In one embodiment of the invention, if an interface is found to be registered in state 306 the illustrated method may proceed directly to state 316 from state 306. In state 318, a reference to an instance of the implementation is returned to the program. After state 318 the method ends with end state 320. The program may invoke the implementation as part of end state 320. In one alternative embodiment of the invention, a registry contains information concerning implementations of interfaces in addition to or in place of class loader and/or principal information. The registry may, for example, comprise multiple data structures or repositories (e.g., databases, tables, arrays, flat files, lists). A first portion of a registry may comprise a relatively fast data structure (e.g., an object table, a hardware or software cache) consisting of entries mapping interfaces to classes of implementations of the interface or instances of such implementations. Entries included in this first portion may be limited to the most recently or most frequently used interfaces. When an implementation class for a requested interface is identified in this first portion of a registry, the implementation is instantiated (e.g., by resolver 106 of FIG. 1). Instead of identifying an implementation class, however, the registry may identify a reference to an existing instance of the implementation. The implementation is then returned to the requesting program (e.g., by returning a reference to a new or existing instance) or is invoked in place of the interface invocation. If there is no entry for a requested interface in a first portion of the registry in this alternative embodiment, a second portion of the registry is searched. The second portion may identify class loaders and/or principals, as described above. In other alternative embodiments of the invention the registry may take other forms. A registry may, for example, identify implementations and class loaders in a single, unified, structure. Such a registry may, for example, comprise one large data repository containing various types of information that may be used to derive, retrieve or create an instance of an implementation of an interface. Another alternative embodiment of the invention comprises a multi-level, hierarchical system of contexts for implementing a series of interconnected registries for locating a definition of an interface service. One such context framework is depicted in FIG. 4. The illustrative context framework 400 may be associated with a computer system's operating environment in which each application is associated with its own runtime context. The illustrated context framework includes four levels; alternative embodiments of the system may comprise any number of contexts and context levels greater than or equal to one. Illustratively, each context in framework 400 has associated service or "method" definitions. Further, each context maintains its own registry to identify those services and/or implementations that can be satisfied (e.g., resolved) within the context. The scope of a context's services depends upon the level of the context. In particular, the services embodied in a context situated at a relatively high position in the framework are more general in scope than services in a context at a lower position. In FIG. 4, those contexts having lower level numbers (e.g., those at level 1) are considered to be "higher" in the framework than contexts having higher level numbers (e.g., level 4). For example, context 410 - the only context at level one - illustratively relates to common or base services available to all application programs or program components operating in the environment encompassed by framework 400. Such base services may include, for example, displaying graphics, retrieving audio files, performing cryptographic operations, etc. Implementations (e.g., definitions) of these base services are available, as described below, to program components assigned to all levels and contexts of framework 400. In one embodiment of the invention context 410 may correspond to services available to all applications executing within the Solaris™ operating system. Context 420 corresponds to services more narrow in scope than the base services available in context 410. Context 420 may, for example, encompass application services - services that are more specific to individual programs, users or program components than the base services of context 410. Illustrative application services include database services (e.g., administering a database), administrative services (e.g., change password), etc. In one embodiment of the invention, context 420 may correspond to a particular Solaris™ application such as Netscape™ Composer. Contexts 430, 432 may correspond to application interface services within the application service(s) corresponding to context 420. The application interface services associated with contexts 430, 432 are thus even more specific than the application services associated with context 420. Illustrative application interface services may include services or functions associated with a particular application program (e.g., displaying a file menu, merging menu bars). In one embodiment of the invention, contexts 430, 432 may correspond to separate documents or web pages created with Netscape™ Composer. Contexts 440, 442, 444 correspond to yet more specific services, such as object services relating to specific objects within an application. An object service may, for example, handle the exchange of application data with a user. In one embodiment of the invention, contexts 440, 442 may correspond to separate objects (e.g., a table, a graphic applet) within a Netscape™ Composer document or web page. Additional levels may be added to framework 400, for example, to provide contexts for modules or sub-systems within an application. As one skilled in the art will appreciate, the more levels included in a context framework, the finer the granularity it offers. As stated above, programs and program components are assigned to specific contexts within framework 400 and each context maintains its own registry identifying implementations of interfaces offered within the context. Thus, when an interface request is made from within a program or program component, its associated context attempts to resolve the request within its context. A program operating within context 420, for example, may make a request for an administrative interface in order to change a user's password. In this example, if an implementation of the requested administrative interface is available in context 420, the request is satisfied. If, however, a request cannot be satisfied within the requester's assigned context, the request is passed to the next higher tier (i.e., lower level number) in the framework. Thus, if the request for an implementation of an administrative interface can not be satisfied in context 420, the request is passed to context 410. In this manner, requests are satisfied with as great specificity as possible, but more general implementations of desired services are available if needed. As can be seen in FIG. 4, similar programs or components at one level may operate within separate contexts and have different implementations of identical interfaces. Implementations may therefore be tailored with a wide range of specificity. For example, sensitive information that should only be available to a particular application program can be restricted by placing associated implementations in the appropriate context. In addition, a first service that is relatively high within the framework (e.g., at a low level number) may export its services to services lower in the framework (e.g., at a higher-numbered level) by storing appropriate information in the contexts associated with the lower services. Thus, when an object or application in context 442 requires a particular service, the registry for context 442 may contain a reference to a definition of the service (e.g., an instance of an implementation of the service's interface) in context 420, for example. This avoids having to pass the request through the framework to context 430 and then context 420. As specified above, within a framework of contexts for resolving requests for interfaces or interface services each context may maintain its own registry. Thus, users connected to different contexts may have their requests for the same interface satisfied by different implementations of that interface. This may be illustrated by revisiting the adventure game example described above. One set of players (e.g., adults) may be associated with a context in which Monster objects are imbued with menacing attributes. A Dinosaur Monster, for example, may be an enormous carnivore intent on devouring a player's character. Another set of players (e.g., children) may be associated with a context in which Monster objects are more innocuous. A Dinosaur Monster in this context, for example, may be purple and sport a smarmy facade (but still exhibit noisome activity such as singing). Thus, the context with which a user is associated may define the behavior of a program operated by the user. The context's registry may be maintained by a portion of an application framework associated with the context, by a JVM or by some other entity with suitable privileges or access to locations at which interface implementations may be stored. Through its registry, a context may inform an application program framework or JVM where to look for certain objects, how to find a definition for an interface service, what objects should be connected to a user's program, etc. Each context's registry may be created when the context is spawned or when a first user is placed in the context. Further, each context's registry may be initialized by copying the registry of its parent. By copying registries, the export of services from more general to more specific contexts is simplified. Within a context, however, its registry is updated as interfaces are requested and implementations of the requested interfaces are located and resolved. The foregoing descriptions of embodiments of the invention have been presented for purposes of illustration and description only. They are not intended to be exhaustive or to limit the invention to the forms disclosed. Many modifications and variations will be apparent to practitioners skilled in the art. Accordingly, the above disclosure is not intended to limit the invention; the scope of the invention is defined by the appended claims. In particular, in one or more of the embodiments of the invention described above, a registry may be supplemented over time as requests for interfaces are satisfied. For example, as described in conjunction with the method illustrated in FIG. 2, a search is made for a class loader or principal when a requested interface is unknown to the registry. If such a search is successful, an entry is made in the registry so that a subsequent request for the same interface may be satisfied without the delay that is inherent in having to conduct a search.

Claims: What Is Claimed Is: 1. A method of resolving a first reference to a first interface service issued by a program executing on a computer, the method comprising: receiving a first reference to a first interface service from a program executing on a computer; searching for a program object class that is configured to define said first interface service; identifying a first program object class unknown to said program at the time said first reference is received; if an instance of said first object class is unavailable, creating an instance of said first object class; and resolving said first reference with said instance of said first object class. 2. The method of claim 1, further comprising identifying a class loader configured to instantiate said first object class. 3. The method of claim 1, wherein said searching comprises deteπnining whether an object class configured to define said first service is identified in a first memory of the computer. 4. The method of claim 1, wherein said searching comprises searching across a publicly accessible network for an object class configured to define said first interface service. 5. The method of claim 1, wherein said resolving comprises binding said instance of said first object class to said program. 6. The method of claim 1 , further comprising determining whether said instance of said first object class invokes a second interface service unknown at the time the program was loaded. 7. The method of claim 1 , wherein said searching comprises: searching one or more contexts in a hierarchical set of contexts, wherein each context in said set of contexts is configured to resolve a reference to an interface service to an object configured to define the interface service; and attempting to resolve said first reference in a second context if said first reference cannot be resolved in a first context. 8. A method of resolving a reference from a computer program to an interface service with an implementation of the interface that was unknown during the loading of the computer program, the method comprising: loading a program into a computer, wherein during said loading known interface implementations are identified for use with the program, wherein each said implementation defines one or more services of an interface identified in the program; receiving a first reference to a first interface service during execution of the program; searching for an implementation of said first interface service in response to said first reference; accessing an instance of a first implementation of said first interface service, wherein said first implementation was unknown at the time of said loading; and resolving said first reference by one of: binding said instance of said first implementation to the program; and invoking said instance of said first implementation. 9. The method of claim 8, further comprising: receiving a second reference to a second interface service during said resolution of said first reference, wherein said second interface service was unknown before said resolving; and accessing an instance of a first implementation of said second interface service. 10. The method of claim 9, further comprising recording said first implementation of said first interface service and said first implementation of said second interface service in a data structure configured to facilitate the resolution of program references. 11. The method of claim 8, wherein said searching comprises: attempting to locate an implementation of said first interface service; if said attempting to locate an implementation of said first interface service is unsuccessful, attempting to locate a class loader configured to create an implementation of said first interface service; and if said attempting to locate a class loader is unsuccessful, attempting to locate means for creating a class loader configured to create an implementation of said first interface service. 12. The method of claim 8, wherein said attempting to locate comprises: searching one or more contexts in a hierarchical set of contexts, wherein each context in said set of contexts is configured to resolve a reference to an interface service to an implementation defining said service; and if said first reference cannot be resolved in a first context in said hierarchical set of contexts, attempting to resolve said first reference in a second context in said hierarchical set of contexts. 13. A method of dynamically locating an implementation of an interface service in response to a program request for the interface service and binding an instance of the implementation to the program, wherein the implementation defines one or more services of the interface and was unidentified at the time the program was loaded, the method comprising: receiving a first request from a program for a first interface service, wherein one or more implementations of said first interface service were known at the time the program was loaded; locating a first implementation of said first interface service, wherein said first implementation was unknown at the time the program was loaded; binding an instance of said first implementation with said program; and identifying said first implementation in a first memory configured to identify means for resolving references to interface services. 14. The method of claim 13, wherein said binding comprises returning to said program a reference to an instance of said first implementation. 15. The method of claim 13, wherein said binding comprises invoking an instance of said first implementation. 16. The method of claim 13, wherein said locating comprises searching said first memory for an implementation of said first interface service, said first memory residing on a first computer system. 17. The method of claim 16, wherein said locating further comprises searching a remote computer system electrically coupled to said first computer system. 18. The method of claim 13, wherein said locating comprises identifying a class loader associated with an implementation of said first interface service. 19. The method of claim 13, wherein said locating comprises: searching one or more contexts in a hierarchical set of contexts, wherein each context in said set of contexts is configured to resolve a request for an interface service to an implementation defining said interface service; and if said first request cannot be resolved in a first context in said hierarchical set of contexts, attempting to resolve said first request in a second context in said hierarchical set of contexts. 20. A method of extending a dynamic collection of information for resolving an interface service reference from a program to an implementation of the referenced interface service, wherein the dynamic collection of information is configured to include information concerning implementations known and unknown at the time the program is loaded, the method comprising: loading a program into a computer, wherein during said loading all known implementations of interface services that may be referenced by the program are identified in a first memory; receiving a first reference to a first interface service during execution of the program; discovering a first implementation of said first interface service, wherein said first implementation is not identified in said first memory; adding to said first memory information concerning said first implementation of said first interface service; and resolving said first reference by binding an instance of said first implementation of said first interface service. 21. The method of claim 20, further comprising: receiving a second reference to a second interface service during execution of said instance of said first implementation of said first interface service; discovering an implementation of said second interface service not identified in said first memory; resolving said second reference by binding an instance of said implementation of said second interface service; and adding to said first memory information concerning said implementation of said second interface service. 22. The method of claim 20, further comprising: receiving a second reference to a second interface service during execution of said instance of said first implementation of said first interface service; discovering a class loader configured to instantiate an implementation of said second interface service; resolving said second reference by loading an instance of said implementation of said second interface service; and adding to said first memory information concerning said implementation of said second interface service. 23. The method of claim 20, wherein said discovering comprises searching one or more electronic storage areas for an implementation of said first information service that is not already identified in said first memory. 24. The method of claim 23 , wherein one of said one or more electronic storage areas is remote from the computer. 25. The method of claim 23, wherein said discovering further comprises: locating said first implementation of said first interface service; and instantiating said first implementation of said first interface service. 26. The method of claim 23, wherein said discovering further comprises: if said searching for an implementation of said first interface service is unsuccessful, searching for means of facilitating the creation of an implementation of said first interface service not already identified in said first memory. 27. The method of claim 26, wherein said means is a class loader. 28. The method of claim 26, wherein said discovering further comprises: if said searching for means of creating an implementation of said first interface service is unsuccessful, searching for means of facilitating the creation of a class loader configured to load an implementation of said first interface service that is not already identified in said first memory. 29. The method of claim 28, wherein said means is a Uniform Resource Identifier, a Java Archive file, or a series of computer-executable instructions for creating a class loader. 30. A computer system comprising: a processor configured to execute a program, wherein during said execution of the program a first reference is made to a first interface service, and wherein said reference must be resolved in order to continue said execution; a registry configured to identify means for resolving references to interface services made during execution of the program; a locator configured to search said registry for means of resolving said first reference; and a resolver configured to access a first implementation of said first interface service and resolve said first reference with an instance of said first implementation. 31. The computer system of claim 30, wherein said first implementation was unknown at the time the program was loaded for execution by said processor. 32. The computer system of claim 30, wherein said locator is further configured to search one or more electronic storage areas other than said registry for means of resolving said first reference. 33. The computer system of claim 30, wherein said locator is further configured to search one or more electronic storage areas remote to the computer system for means of resolving said first reference. 34. The computer system of claim 30, wherein said registry comprises a memory configured to store an identifier of a known implementation of an interface service. 35. The computer system of claim 30, wherein said registry comprises a memory configured to store an identifier of a class loader with which an implementation of an interface service may be created. 36. The computer system of claim 30, wherein said registry includes a hierarchical set of contexts, said hierarchical set of contexts comprising: a first context, comprising a first definition of an interface service; and a second context, comprising a second definition of another interface service; wherein said second context is searched for a definition of said first interface service and, if said second context does not contain said definition, said first context is searched. 37. A computer-readable storage medium storing instructions that, when executed by a computer, cause the computer to perform a method of resolving a reference from a computer program to an interface service with an implementation of the interface that was unknown during the loading of the computer program, the method comprising: loading a program into a computer, wherein during said loading known interface implementations are identified for use with the program, wherein each said implementation defines one or more services of an interface identified in the program; receiving a first reference to a first interface service during execution of the program; searching for an implementation of said first interface service in response to said first reference; accessing an instance of a first implementation of said first interface service, wherein said first implementation was unknown at the time of said loading; and resolving said first reference.

Inventors: GUINAN DANIEL, GUINAN, DANIEL
Applicants: SUN MICROSYSTEMS INC, SUN MICROSYSTEMS, INC.
Application year: 2000
Main classification: G06F9
IPC codes: G06F9