站内搜索: 请输入搜索关键词
当前页面: 在线文档首页 > NetBeans API Javadoc 4.1.0

Lookup - NetBeans Architecture Questions - NetBeans API Javadoc 4.1.0

NetBeans Architecture Answers for Lookup module

WARNING: answering questions version 1.12 rather than the current 1.25.

Interfaces table

Group of java interfaces
Interface NameIn/OutStabilitySpecified in What Document?
ProviderRegistrationMechanismImportedStandardhttp://java.sun.com/j2se/1.3/docs/guide/jar/jar.html#Provider%20Configuration%20File

ProviderRegistrationRemovalExportedUnder Developmenthttp://www.netbeans.org/download/dev/javadoc/OpenAPIs/org/openide/doc-files/services-api.html#service-lookup

LookupAPIExportedOfficialhttp://www.netbeans.org/download/dev/javadoc/OpenAPIs/org/openide/doc-files/services-api.html#lookup

Additional info can be found at

LookupSPIExportedOfficialhttp://www.netbeans.org/download/dev/javadoc/OpenAPIs/org/openide/util/lookup/package-frame.html

Additional info can be found at

Group of property interfaces
Interface NameIn/OutStabilitySpecified in What Document?
org.openide.util.LookupExportedUnder Development

Can contain name of a class that extends org.openide.util.Lookup and has public constructor, that should be instantiated and returned from Lookup.getDefault the class will be loaded by Thread.currentThread().getContextclassLoader() classloader the first time Lookup.getDefault is invoked.

The property can also contain value "-" which means to completely disable the lookup instantiation and return Lookup.EMPTY from Lookup.getDefault.

If the property is unspecified, the default MetaInfServicesLookup is constructed for Thread.currentThread().getContextclassLoader() that implements the JDK's standard. If, by a chance an instance of org.openide.util.Lookup.Provider is found in there, it is returned as result. Otherwise the MetaInfServicesLookup is the result of Lookup.getDefault.


General Information

    Question (arch-what): What is this project good for?

    Answer: The Lookup is a central part of communication between different parts of a modularized component system. It allows lookup and discovery of features by description of their interfaces. It is available as separate library and also resides in the heart of the NetBeans.

    Question (arch-overall): Describe the overall architecture.

    WARNING: Question with id="arch-overall" has not been answered!

    Question (arch-usecases): Describe the main use cases of the new API. Who will use it under what circumstances? What kind of code would typically need to be written to use the module?

    Answer: There is a great introduction to Lookup and its usage in its javadoc. Here is just a list of frequently asked or interesting questions slowly expanding as people ask them:

    Lookup faq:

    How to specify that a service in Lookup should be available only on Windows?

    Q: Most of the time I specify interfaces that I want to add to the Lookup class in the layer.xml file. But, let's say I have a platform-specific interface (something on Windows only, for instance).

    How can I specify (in the xml, or programmatically) that this service should only be added to the Lookup if the platform is Windows? >

    In general there are three ways to achieve this.
    • It is possible to write a specific module and enable it only on windows. See os specific modules documentation. Then you can put a registration of your instance into your module's META-INF/services directory and it will be available only on Windows.

    • Another possibility that does not require new module, but which executes a code on startup (which may have performance implications) is to use methodvalue attribute. Register your instance in layer using your-Object.instance file as described at services documentation and in your factory method either return the instance your want or null depending on result of Utilities.isWindows() call.

    • In some cases, the interface for which you will register an implementation permits a no-operation semantics. For example, InstalledFileLocator.locate(...) can return a valid File, or null. You could always register an InstalledFileLocator instance yet disable it on non-Windows platforms (always returning null).

    How shall I write an extension point for my module?

    Q: I have more modules one of them providing the core functionality and few more that wish to extend it. What is the right way to do it? How does the Netbeans platform declare such extension point?

    Start with declaring an extension interface in your core module and put it into the module's public packages. Imagine for example that the core module is in JAR file org-my-netbeans-coremodule.jar and already contains in manifests line like OpenIDE-Module: org.my.netbeans.coremodule/1 and wants to display various tips of the day provided by other modules and thus defines:

     
    
    package org.my.netbeans.coremodule;
    
    public interface TipsOfTheDayProvider {
        public String provideTipOfTheDay ();
    }
    
    

    And in its manifest adds line OpenIDE-Module-Public-Packages: org.my.netbeans.coremodule.* to specify that this package contains exported API and shall be accessible to other modules.

    When the core module is about to display the tip of the day it can ask the system for all registered instances of the TipsOfTheDayProvider, randomly select one of them:

    
    import java.util.Collection;
    import java.util.Collections;
    import org.openide.util.Lookup;
    
    Lookup.Result result = Lookup.getDefault ().lookup (new Lookup.Template (TipsOfTheDayProvider.class));
    Collection c = result.allInstances ();
    Collections.shuffle (c);
    TipsOfTheDayProvider selected = (TipsOfTheDayProvider)c.iterator ().next ();
    
    

    and then display the tip. Simple, trivial, just by the usage of Lookup interface once creates a registry that other modules can enhance. But such enhancing of course requires work on the other side. Each module that would like to register its TipsOfTheDayProvider needs to depend on the core module - add OpenIDE-Module-Module-Dependencies: org.my.netbeans.coremodule/1 into its manifest and write a class with its own implementation of the provider:

    
    package org.my.netbeans.extramodule;
    
    class ExtraTip implements TipsOfTheDayProvider {
        public String provideTipOfTheDay () {
            return "Do you know that in order to write extension point you should use Lookup?";
        }
    }
    
    

    Then, the only necessary thing is to register such class by using the J2SE standard ProviderRegistrationMechanism into plain text file META-INF/services/org.my.netbeans.coremodule.TipsOfTheDayProvider in the module JAR containing just one line:

    org.my.netbeans.extramodule.ExtraTip
    

    and your modules are now ready to communicate using your own extension point.

    Question (arch-time): What are the time estimates of the work?

    WARNING: Question with id="arch-time" has not been answered!

    Question (arch-quality): How will the quality of your code be tested and how are future regressions going to be prevented?

    WARNING: Question with id="arch-quality" has not been answered!

Project and platform dependencies

    Question (dep-nb): What other NetBeans projects and modules does this one depend on?

    Answer: This is the central part of the system. Depends only on openide-util. Namely on org.openide.util.enumeration.*, org.openide.util.WeakSet and org.openide.ErrorManager.

    Question (dep-non-nb): What other projects outside NetBeans does this one depend on?

    Answer: Of course it uses Java, otherwise it has no dependencies.

    Question (dep-platform): On which platforms does your module run? Does it run in the same way on each?

    Answer: 100% pure Java. Runs anywhere.

    Question (dep-jre): Which version of JRE do you need (1.2, 1.3, 1.4, etc.)?

    Answer: Module runs on JRE 1.3.

    Question (dep-jrejdk): Do you require the JDK or is the JRE enough?

    Answer: JRE is enough.

Deployment

    Question (deploy-jar): Do you deploy just module JAR file(s) or other files as well?

    Answer: The module is available as standalone library but for the platform it is bundled together with other parts of the openide in openide.jar.

    Question (deploy-nbm): Can you deploy an NBM via the Update Center?

    Answer: Whole openide can be deployed via AU center.

    Question (deploy-shared): Do you need to be installed in the shared location only, or in the user directory only, or can your module be installed anywhere?

    Answer: openide.jar needs to be in the system directory.

    Question (deploy-packages): Are packages of your module made inaccessible by not declaring them public?

    Answer: No. But that is not necesssary. The only packages lookup uses are LookupAPI - Additional info can be found at and LookupSPI - Additional info can be found at and both contain official interfaces, no need to hide packages.

    Question (deploy-dependencies): What do other modules need to do to declare a dependency on this one?

    WARNING: Question with id="deploy-dependencies" has not been answered!

Compatibility with environment

    Question (compat-i18n): Is your module correctly internationalized?

    Answer: The module does not communicate with users. It has not been I18Ned.

    Question (compat-standards): Does the module implement or define any standards? Is the implementation exact or does it deviate somehow?

    Answer: The default lookup registration follows the JDK's ProviderRegistrationMechanism but enhances it to also support the ProviderRegistrationRemoval.

    Question (compat-version): Can your module coexist with earlier and future versions of itself? Can you correctly read all old settings? Will future versions be able to read your current settings? Can you read or politely ignore settings stored by a future version?

    Answer: The module stores no settings, just reads information from surrounding environment, there shall be not problem running two different versions at once.

Access to resources

    Question (resources-file): Does your module use java.io.File directly?

    Answer: No.

    Question (resources-layer): Does your module provide own layer? Does it create any files or folders in it? What it is trying to communicate by that and with which components?

    Answer: No.

    Question (resources-read): Does your module read any resources from layers? For what purpose?

    Answer: No.

    Question (resources-mask): Does your module mask/hide/override any resources provided by other modules in their layers?

    Answer: No.

Lookup of components


Execution Environment

    Question (exec-property): Is execution of your code influenced by any environment or Java system (System.getProperty) property?

    Answer: The initialization of the Lookup checks value of org.openide.util.Lookup - Can contain name of a class that extends org.openide.util.Lookup and has public constructor, that should be instantiated and returned from Lookup.getDefault the class will be loaded by Thread.currentThread().getContextclassLoader() classloader the first time Lookup.getDefault is invoked.

    The property can also contain value "-" which means to completely disable the lookup instantiation and return Lookup.EMPTY from Lookup.getDefault.

    If the property is unspecified, the default MetaInfServicesLookup is constructed for Thread.currentThread().getContextclassLoader() that implements the JDK's standard. If, by a chance an instance of org.openide.util.Lookup.Provider is found in there, it is returned as result. Otherwise the MetaInfServicesLookup is the result of Lookup.getDefault. property is used to construct the value to be returned from Lookup.getDefault().

    Question (exec-component): Is execution of your code influenced by any (string) property of any of your components?

    Answer: No.

    Question (exec-ant-tasks): Do you define or register any ant tasks that other can use?

    WARNING: Question with id="exec-ant-tasks" has not been answered!

    Question (exec-classloader): Does your code create its own class loader(s)?

    Answer: No.

    Question (exec-reflection): Does your code use Java Reflection to execute other code?

    Answer: The MetaInfServicesLookup invokes default constructor for classes those names it finds in META-INF/services/... files.

    Question (exec-privateaccess): Are you aware of any other parts of the system calling some of your methods by reflection?

    Answer: None, I am aware of.

    Question (exec-process): Do you execute an external process from your module? How do you ensure that the result is the same on different platforms? Do you parse output? Do you depend on result code?

    WARNING: Question with id="exec-process" has not been answered!

    Question (exec-introspection): Does your module use any kind of runtime type information (instanceof, work with java.lang.Class, etc.)?

    WARNING: Question with id="exec-introspection" has not been answered!

    Question (exec-threading): What threading models, if any, does your module adhere to?

    WARNING: Question with id="exec-threading" has not been answered!

    Question (security-policy): Does your functionality require modifications to the standard policy file?

    WARNING: Question with id="security-policy" has not been answered!

    Question (security-grant): Does your code grant additional rights to some other code?

    WARNING: Question with id="security-grant" has not been answered!

Format of files and protocols

    Question (format-types): Which protocols and file formats (if any) does your module read or write on disk, or transmit or receive over the network? Do you generate an ant build script? Can it be edited and modified?

    Answer: The META-INF/services/... files.

    Question (format-dnd): Which protocols (if any) does your code understand during Drag & Drop?

    Answer: None.

    Question (format-clipboard): Which data flavors (if any) does your code read from or insert to the clipboard (by access to clipboard on means calling methods on java.awt.datatransfer.Transferable?

    Answer: None.

Performance and Scalability

    Question (perf-startup): Does your module run any code on startup?

    Answer: It does nothing on startup, it computes its values on the first invocation of Lookup.getDefault().

    Question (perf-exit): Does your module run any code on exit?

    Answer: No.

    Question (perf-scale): Which external criteria influence the performance of your program (size of file in editor, number of files in menu, in source directory, etc.) and how well your code scales?

    Answer: The code scales linearily.

    Question (perf-limit): Are there any hard-coded or practical limits in the number or size of elements your code can handle?

    Answer: No.

    Question (perf-mem): How much memory does your component consume? Estimate with a relation to the number of windows, etc.

    Answer: The default implementation of the MetaInfServicesLookup just keeps hashmap between queried classes and their implementations. The amount of memory is linear to amount of registered classes, but of course we are not counting the memory occupied by the instances which the lookup creates, that can be arbitrary.

    Question (perf-wakeup): Does any piece of your code wake up periodically and do something even when the system is otherwise idle (no user interaction)?

    Answer: No.

    Question (perf-progress): Does your module execute any long-running tasks?

    Answer: The default implementation of lookup just reads the META-INF/services files provided by classloader - the speed depends on the classloader, but usually these files are on filesystem and thus should be fast. Also the lookup invokes default constructors of registered classes, the speed depends on the amount of work done in their constructors.

    Question (perf-huge_dialogs): Does your module contain any dialogs or wizards with a large number of GUI controls such as combo boxes, lists, trees, or text areas?

    Answer: No.

    Question (perf-menus): Does your module use dynamically updated context menus, or context-sensitive actions with complicated and slow enablement logic?

    Answer: Module has no GUI.

    Question (perf-spi): How the performance of the plugged in code will be enforced?

    WARNING: Question with id="perf-spi" has not been answered!

Built on May 4 2005.  |  Portions Copyright 1997-2005 Sun Microsystems, Inc. All rights reserved.