|
|
It allows other modules to define how the nodes they define should be searched, without depending on any concrete module containing the search feature.
Question (arch-overall): Describe the overall architecture. Answer:The module is useless by itself. It contains an SPI which can be used by modules defining nodes to make the nodes searchable, or to specify how the nodes should be searched, and an API which makes implementation of the SPI easier.
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:The SearchInfo API+SPI allows other modules to specify whether and how should nodes they define be searched.
The definition is represented by objects implementing interface
SearchInfo
. To enable searching on a custom node,
a SearchInfo
object must be added to the node's lookup.
In most cases, there is no need to define own class implementing the
interface - one can use factory methods of class
SearchInfoFactory
.
Example:
import org.openide.util.lookup.Lookups; public class MyNode extends AbstractNode { public MyNode(FileObject folder) { super( new MyNodeChildren(folder), Lookups.singleton(SearchInfoFactory.createSearchInfo( folder, true, new FileObjectFilter[] { SearchInfoFactory.VISIBILITY_FILTER }) ); } ... }
One of the factory methods - createSearchInfoBySubnodes(...)
- requires that a reference to the node itself. In this case, it is not
possible to fully define the lookup in the super(...)
statement of the constructor because a reference to the node is not
available until the call of super(...)
returns.
In this case, a special technique must be used:
deprecated-SearchAPI - defines interfacesimport org.openide.util.lookup.AbstractLookup; import org.openide.util.lookup.InstanceContent; public class MyNode extends AbstractNode { public MyNode() { this(new InstanceContent()); } public MyNode(InstanceContent ic) { super(new AbstractLookup(ic)); ic.add(SearchInfoFactory.createSearchInfoBySubnodes(this)); } ... }
SearchInfo
, FileObjectFilter
and a factory class SearchInfoFactory
Question (arch-time):
What are the time estimates of the work?
Answer:
The module is fully implemented.
The test are not real unit tests as they rely on functionality of projects. Modification of tests to real unit tests would require 3 or 4 more days.
Question (arch-quality): How will the quality of your code be tested and how are future regressions going to be prevented? Answer:
There is one test class which tests implementations of interface
SearchInfo
produced by factory class
SearchInfoFactory
.
The sources for the module are in the Apache Git repositories or in the GitHub repositories.
The default answer to this question is:
These modules are required in project.xml:
No such project known at the moment.
Question (dep-platform): On which platforms does your module run? Does it run in the same way on each? Answer:It runs on all platforms with a JRE 1.4+. It runs in the same way on each.
Question (dep-jre): Which version of JRE do you need (1.2, 1.3, 1.4, etc.)? Answer:The module has been tested with JDK 1.4 and JDK 1.5. It should run with JDK/JRE 1.3.x, too, but it has not been tested for it.
Question (dep-jrejdk): Do you require the JDK or is the JRE enough? Answer:JRE is enough.
The module consists of just one JAR file.
Question (deploy-nbm): Can you deploy an NBM via the Update Center? Answer:XXX no answer for deploy-nbm
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:XXX no answer for deploy-shared
Question (deploy-packages): Are packages of your module made inaccessible by not declaring them public? Answer:
Yes. Only package org.openidex.search
is declared public.
Nothing.
Yes.
Question (compat-standards): Does the module implement or define any standards? Is the implementation exact or does it deviate somehow? Answer:No, it does not implement or define any standards.
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:Yes, different versions of the module can coexist. The module has no settings and will not attempt to read settings of the future versions having settings, if any.
Question (compat-deprecation): How the introduction of your project influences functionality provided by previous version of the product? WARNING: Question with id="compat-deprecation" has not been answered!java.io.File
directly?
Answer:
Yes. But only because it is required by another API, specifically by method
org.netbeans.api.queries.SharabilityQuery.getSharability(File)
.
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.
Question (resources-preferences): Does your module uses preferences via Preferences API? Does your module use NbPreferences or or regular JDK Preferences ? Does it read, write or both ? Does it share preferences with other modules ? If so, then why ? WARNING: Question with id="resources-preferences" has not been answered!org.openide.util.Lookup
or any similar technology to find any components to communicate with? Which ones?
Answer:
Yes.
Objects implementing interface SearchInfo
(defined in this module) are expected to be registered in lookups
of nodes (only on instance per node).
deprecated-SearchInfo-lookup
-
Helper method
SearchInfoFactory.createSearchInfoBySubnodes(Node)
,
which combines SearchInfo
objects of multiple nodes
to a single SearchInfo
object, uses the lookup mechanism
to obtain SearchInfo
objects from the nodes.
No.
Question (lookup-remove): Do you remove entries of other modules from lookup? Answer:No.
System.getProperty
) property?
On a similar note, is there something interesting that you
pass to java.util.logging.Logger
? Or do you observe
what others log?
Answer:
No.
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? Answer:No.
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:No.
Question (exec-privateaccess): Are you aware of any other parts of the system calling some of your methods by reflection? Answer:No.
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? Answer:No.
Question (exec-introspection): Does your module use any kind of runtime type information (instanceof
,
work with java.lang.Class
, etc.)?
Answer:
No.
Question (exec-threading): What threading models, if any, does your module adhere to? How the project behaves with respect to threading? Answer:None.
Question (security-policy): Does your functionality require modifications to the standard policy file? Answer:No.
Question (security-grant): Does your code grant additional rights to some other code? Answer:No.
None.
Question (format-dnd): Which protocols (if any) does your code understand during Drag & Drop? Answer:Drag & Drop is not applicable.
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 onjava.awt.datatransfer.Transferable
?
Answer:
None.
No.
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:
Implementations of interface SearchInfo
produced by
factory class SearchInfoFactory
scale well, except for the
case that there are multiple nodes using
SearchInfoFactory.createSearchInfoBySubnodes(Node)
in a (sub)tree of a hierarchy of nodes. If the whole branch is being
searched, the performance may be a little bit slower. The more such nodes
there are on the way from the (sub)tree's root to the leaves, the lower
is the speed of the the root node's SearchInfo
implementation. This is a theoretical implication and no performance
problems have been observed yet.
No.
Question (perf-mem): How much memory does your component consume? Estimate with a relation to the number of windows, etc. Answer:
Amount of memory consumed by implementations of interface
SearchInfo
, produced by class SearchInfoFactory
,
is related to the maximum nesting level of folder/nodes
and to the maximum number of folders/nodes in each level.
Except for very extreme conditions, the amount of memory is not essential.
Term "extreme conditions" comprises:
SearchInfo
objects
Memory footprint of SearchInfo
implementations returned by
factory class SearchInfoFactory
is low. This may not be true
for custom plugged-in implementations.
No.
Question (perf-progress): Does your module execute any long-running tasks? Answer:No.
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:No.
Question (perf-spi): How the performance of the plugged in code will be enforced? Answer:
It is possible to define and plug in a custom implementation of interfaces
SearchInfo
and FileObjectFilter
.
In case of a buggy or slow implementation, this may not affect the speed of this module but it may affect modules that use functionality of this module, i.e. modules implementing the search feature. But there is no affection until the node which uses such custom implementations, is searched (except for memory leaks, of course).