| <?xml version="1.0" encoding="UTF-8"?> | 
 | <!-- | 
 |  | 
 |     Licensed to the Apache Software Foundation (ASF) under one | 
 |     or more contributor license agreements.  See the NOTICE file | 
 |     distributed with this work for additional information | 
 |     regarding copyright ownership.  The ASF licenses this file | 
 |     to you under the Apache License, Version 2.0 (the | 
 |     "License"); you may not use this file except in compliance | 
 |     with the License.  You may obtain a copy of the License at | 
 |  | 
 |       http://www.apache.org/licenses/LICENSE-2.0 | 
 |  | 
 |     Unless required by applicable law or agreed to in writing, | 
 |     software distributed under the License is distributed on an | 
 |     "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | 
 |     KIND, either express or implied.  See the License for the | 
 |     specific language governing permissions and limitations | 
 |     under the License. | 
 |  | 
 | --> | 
 | <!DOCTYPE api-answers PUBLIC "-//NetBeans//DTD Arch Answers//EN" "../../nbbuild/antsrc/org/netbeans/nbbuild/Arch.dtd" [ | 
 |   <!ENTITY api-questions SYSTEM "../../nbbuild/antsrc/org/netbeans/nbbuild/Arch-api-questions.xml"> | 
 | ]> | 
 |  | 
 | <api-answers | 
 |   question-version="1.24" | 
 |   author="tpavek@netbeans.org" | 
 | > | 
 |  | 
 |   &api-questions; | 
 |  | 
 |  | 
 | <!-- Question: arch-what | 
 |  | 
 |      <question id="arch-what"> | 
 |             What is this project good for? | 
 |             <hint> | 
 |             Please provide here few lines describing the the project, | 
 |             what problem it should solve, provide links to documentation,  | 
 |             specifications, etc. | 
 |             </hint> | 
 |         </question> | 
 | --> | 
 | <answer id="arch-what"> | 
 | The form module (Form Editor) lets developers visually create forms with AWT, | 
 | Swing, and JavaBeans support. See <a href="http://form.netbeans.org/">form.netbeans.org</a> | 
 | for more information.<p>List of the main features:</p> | 
 | <ul> | 
 |   <li>Support for design of visual and non-visual forms.</li> | 
 |   <li>WYSIWYG designer with "Test Form" and "Zoom Design | 
 |     View" features.</li> | 
 |   <li>Support for Accessibility.</li> | 
 |   <li>Undo/redo capability for all operations.</li> | 
 |   <li>Extensible Component Palette with pre-installed Swing and AWT components.</li> | 
 |   <li>Component Inspector showing a components tree and properties.</li> | 
 |   <li>Automatic one-way code generation, fully customizable.</li> | 
 |   <li>Support for all AWT/Swing layout managers, including drag&drop operations.</li> | 
 |   <li>GridBagLayout visual customizer.</li> | 
 |   <li>Support for null layout.</li> | 
 |   <li>In-place editing of text labels of components (labels, buttons, textfields, | 
 |     etc) in the designer.</li> | 
 |   <li>Full JavaBeans support -- installing, using and customizing beans; support | 
 |     for using bean properties, | 
 |     property editors, custom property editors, events and event handlers, bean | 
 |     customizers, etc.</li> | 
 |   <li>Visual beans customization -- ability to create a form from any JavaBean class.</li> | 
 |   <li>Connection Wizard for generating "connection" code for beans.</li> | 
 | </ul> | 
 | </answer> | 
 |  | 
 | <!-- | 
 |         <question id="arch-overall" when="init"> | 
 |             Describe the overall architecture.  | 
 |             <hint> | 
 |             What will be API for  | 
 |             <a href="http://openide.netbeans.org/tutorial/api-design.html#design.apiandspi" shape="rect"> | 
 |                 clients and what support API</a>?  | 
 |             What parts will be pluggable? | 
 |             How will plug-ins be registered? Please use <code><api type="export"/></code> | 
 |             to describe your general APIs. | 
 |             If possible please provide  | 
 |             simple diagrams.  | 
 |             </hint> | 
 |         </question> | 
 | --> | 
 | <answer id="arch-overall"> | 
 | There are five main architecture blocks: form model and metadata, form designer, | 
 | code generator, persistence manager, and layout design support. None of these part | 
 | is pluggable. There is no public API for extensions by 3rd parties. | 
 | </answer> | 
 |  | 
 |  | 
 |  | 
 | <!-- Question: compat-i18n | 
 |  | 
 |      <question id="compat-i18n"> | 
 |             Is your module correctly internationalized? | 
 |             <hint> | 
 |             Correct internationalization means that it obeys instuctions  | 
 |             at <a href="http://www.netbeans.org/devhome/docs/i18n/index.html"> | 
 |             NetBeans I18N pages</a>. | 
 |             </hint> | 
 |         </question> | 
 | --> | 
 | <answer id="compat-i18n"> | 
 |     Yes. | 
 | </answer> | 
 |  | 
 |  | 
 |  | 
 | <!-- Question: compat-standards | 
 |  | 
 |      <question id="compat-standards"> | 
 |             Does the module implements or defines any standards? Is the  | 
 |             implementation exact or it deviates somehow? | 
 |         </question> | 
 | --> | 
 | <answer id="compat-standards"> | 
 |     None defined or implemented. Follows JavaBeans standard for components | 
 |     used in designed forms. | 
 | </answer> | 
 |  | 
 |  | 
 |  | 
 | <!-- Question: compat-version | 
 |  | 
 |      <question id="compat-version"> | 
 |             Does your module properly coexists with earlier and future | 
 |             versions? Can you correctly read settings? Will future | 
 |             versions be able to read settings? | 
 |              | 
 |             <hint> | 
 |             Very helpful for reading settings is to store version number | 
 |             there, so future versions can decide whether how to read/convert | 
 |             the settings and older versions can ignore the new ones. | 
 |             </hint> | 
 |         </question> | 
 | --> | 
 | <answer id="compat-version"> | 
 |     Only one version of the module can be installed at a time.  | 
 |     The settings are shared across different versions, stored | 
 |     and read by Java serialization and will be read in future as well. | 
 | </answer> | 
 |  | 
 |  | 
 |  | 
 | <!-- Question: dep-jre | 
 |  | 
 |      <question id="dep-jre"> | 
 |             Which version of JRE you need (1.2, 1.3, 1.4, etc.)? | 
 |             <hint> | 
 |             It is expected that if your module runs on 1.x that it will run  | 
 |             on 1.x+1 if no, state that please. Also describe here cases where | 
 |             you run different code on different versions of JRE and why. | 
 |             </hint> | 
 |         </question> | 
 | --> | 
 | <answer id="dep-jre"> | 
 |     Runs on 1.4.x and 1.5.x. | 
 | </answer> | 
 |  | 
 |  | 
 |  | 
 | <!-- Question: dep-jrejdk | 
 |  | 
 |      <question id="dep-jrejdk"> | 
 |             Do you require JDK or is JRE enough? | 
 |         </question> | 
 | --> | 
 | <answer id="dep-jrejdk"> | 
 |     Need JDK (dt.jar file for Swing beaninfos). | 
 | </answer> | 
 |  | 
 |  | 
 |  | 
 | <!-- Question: dep-nb | 
 |  | 
 |      <question id="dep-nb"> | 
 |             What other NetBeans projects this one depends on? | 
 |             <hint> | 
 |             If you want, describe such projects as imported API using | 
 |             the <code><api name="identification" type="import or export" category="stable" url="where is the description" /></code> | 
 |             </hint> | 
 |         </question> | 
 | --> | 
 | <answer id="dep-nb"> | 
 |     <api name="OpenAPIs" group="java" type="import" category="official" url="http://openide.netbeans.org/"/>  | 
 |     <api name="JavaHierarchyAPI" group="java" type="import" category="official" url="http://www.netbeans.org/download/dev/javadoc/JavaHierarchyAPI/index.html"/> | 
 |     <api name="java-module" group="java" type="import" category="friend" url="http://java.netbeans.org/"/>  | 
 | </answer> | 
 |  | 
 |  | 
 |  | 
 | <!-- Question: dep-non-nb | 
 |  | 
 |      <question id="dep-non-nb"> | 
 |             What other non-NetBeans projects this one depends on? | 
 |              | 
 |             <hint> | 
 |             Some non-NetBeans projects are packaged as NetBeans modules | 
 |             (see <a href="http://libs.netbeans.org">libraries</a>) and | 
 |             it is prefered to use this approach when more modules may | 
 |             depend on such third-party library. | 
 |             </hint> | 
 |         </question> | 
 | --> | 
 | <answer id="dep-non-nb"> | 
 |     <api name="org.jdesktop.layout" group="java" type="import" category="third"> | 
 |     Layout extensions library from Swing Labs project (<a href="https://swing-layout.dev.java.net/">https://swing-layout.dev.java.net</a>). | 
 |     </api> | 
 | </answer> | 
 |  | 
 |  | 
 |  | 
 | <!-- Question: dep-platform | 
 |  | 
 |      <question id="dep-platform"> | 
 |             On which platforms your module run? Any? Does it run in the same | 
 |             way? | 
 |             <hint> | 
 |             If your module is using JNI or deals with special differences of | 
 |             OSes like filesystems, etc. please describe here what they are. | 
 |             </hint> | 
 |         </question> | 
 | --> | 
 | <answer id="dep-platform"> | 
 |     The module is 100% pure Java and runs on any platform. | 
 | </answer> | 
 |  | 
 |  | 
 |  | 
 | <!-- Question: deploy-jar | 
 |  | 
 |      <question id="deploy-jar"> | 
 |             Do you deploy just module JAR file(s) or some other files? | 
 |             <hint> | 
 |             If your module consist just from one module JAR file, just confirm that. | 
 |             If it uses more than one JAR, describe where there are located, how | 
 |             they refer to each other.  | 
 |             If it consist of module JAR(s) and other files, please describe | 
 |             what is their purpose, why other files are necessary. Please  | 
 |             make sure that installation/deinstallation leaves the system  | 
 |             in state as it was before installation. | 
 |             </hint> | 
 |         </question> | 
 | --> | 
 | <answer id="deploy-jar"> | 
 | <ul> | 
 |     <li>org-netbeans-modules-form.jar - standard module jar file</li> | 
 |     <li>AbsoluteLayout.jar - library containing AbsoluteLayout classes | 
 |     (custom layout manager)</li> | 
 |     <li>swing-layout.jar - library with layout extension classes (bundled binary | 
 |         build of java.net project https://swing-layout.dev.java.net/)</li> | 
 | </ul> | 
 | The library jars are placed in modules/ext, added automatically to user projects | 
 | when used, need to be distributed with the created application. | 
 | </answer> | 
 |  | 
 |  | 
 |  | 
 | <!-- Question: deploy-nbm | 
 |  | 
 |      <question id="deploy-nbm"> | 
 |             Can you deploy NBM via AutoUpdate center? | 
 |             <hint> | 
 |             If not why? | 
 |             </hint> | 
 |         </question> | 
 | --> | 
 | <answer id="deploy-nbm"> | 
 |     Yes. | 
 | </answer> | 
 |  | 
 |  | 
 |  | 
 | <!-- Question: deploy-packages | 
 |  | 
 |      <question id="deploy-packages"> | 
 |             Are packages of your module made inaccessible by not declaring them | 
 |             public? | 
 |              | 
 |             <hint> | 
 |             NetBeans module system allows restriction of access rights to | 
 |             public classes of your module from other modules. This prevents | 
 |             unwanted dependencies of others on your code and should be used | 
 |             whenever possible (<a href="http://www.netbeans.org/download/apis/org/openide/doc-files/upgrade.html#3.4-public-packages"> | 
 |             public packages | 
 |             </a>).  | 
 |             </hint> | 
 |         </question> | 
 | --> | 
 | <answer id="deploy-packages"> | 
 |     All public packages are accessible, no restriction applied. | 
 | </answer> | 
 |  | 
 |  | 
 |  | 
 | <!-- Question: deploy-shared | 
 |  | 
 |      <question id="deploy-shared"> | 
 |             Do you need to be installed in shared location or only in user directory? | 
 |             <hint> | 
 |             Installation location shall not matter, if it does explain why. | 
 |             </hint> | 
 |         </question> | 
 | --> | 
 | <answer id="deploy-shared"> | 
 |     Module can be installed anywhere. | 
 | </answer> | 
 |  | 
 |  | 
 |  | 
 | <!-- Question: exec-classloader | 
 |  | 
 |      <question id="exec-classloader"> | 
 |             Does your code uses own classloader? | 
 |             <hint> | 
 |             A bit unusual. Please explain why and what for. | 
 |             </hint> | 
 |         </question> | 
 | --> | 
 | <answer id="exec-classloader"> | 
 |     Special classloader is used to load classes of user components in the form. | 
 |     <code>FormClassLoader</code> loads the classes either: | 
 |     <ul> | 
 |     <li>from user project classpath the form belongs to (default),</li> | 
 |     <li>from the system classloader (module),</li> | 
 |     <li>from both (allowing component class loaded from module to access resources | 
 |     in user project).</li> | 
 |     </ul> | 
 |     <p>For loading from the user project classpath, special classloader is used | 
 |     <code>(ProjectClassLoader)</code> which uses execution classpath of the project | 
 |     to load classes, but the source classpath for resources (preferentially) | 
 |     so it is possible to access resources without the need to compile/build the project first.</p> | 
 |     <p>For loading a class using the second or third style, the class name must | 
 |     be registered via layer as described in <a href="#layer-ClassLoadingTypes">ClassLoadingTypes</a>.</p> | 
 | </answer> | 
 |  | 
 |  | 
 |  | 
 | <!-- Question: exec-component | 
 |  | 
 |      <question id="exec-component"> | 
 |             Is execution of your code influenced by (string) property | 
 |             of any of your components? | 
 |              | 
 |             <hint> | 
 |             Often <code>JComponent.getClientProperty</code>, <code>Action.getValue</code> | 
 |             or <code>PropertyDescriptor.getValue</code>, etc. are used to influence | 
 |             a behaviour of some code. This of course forms an interface that should | 
 |             be documented. Also if one depends on some interface that an object | 
 |             implements (<code>component instanceof Runnable</code>) that forms an | 
 |             API as well. | 
 |             </hint> | 
 |         </question> | 
 | --> | 
 | <answer id="exec-component"> | 
 |     No. | 
 | </answer> | 
 |  | 
 |  | 
 |  | 
 | <!-- Question: exec-introspection | 
 |  | 
 |      <question id="exec-introspection"> | 
 |             Does your module use any kind of runtime type informations (instanceof, | 
 |             work with java.lang.Class, etc.)? | 
 |             <hint> | 
 |             Check for cases when you have an object of type A and you also | 
 |             expect it to (possibly) be of type B and do some special action. That | 
 |             should be documented. The same applies on operations in meta-level | 
 |             (Class.isInstance(...), Class.isAssignableFrom(...), etc.). | 
 |             </hint> | 
 |         </question> | 
 | --> | 
 | <answer id="exec-introspection"> | 
 |     Form editor uses runtime introspection heavily. It is mainly required by the fact | 
 |     that form editor manages complex meta data structures (representing components) that | 
 |     must be presented via limited JavaBeans infrastructure and properties support in the IDE. | 
 |     The cases when an object is tested on various types are quite common, but not documented. | 
 | </answer> | 
 |  | 
 |  | 
 |  | 
 | <!-- Question: exec-privateaccess | 
 |  | 
 |      <question id="exec-privateaccess"> | 
 |             Are you aware of any other part of the system calling some of  | 
 |             your methods by reflection? | 
 |             <hint> | 
 |             If so, describe the "contract" as an API. Likely private or friend one, but | 
 |             still API and consider rewrite of it. | 
 |             </hint> | 
 |         </question> | 
 | --> | 
 | <answer id="exec-privateaccess"> | 
 |     No. | 
 | </answer> | 
 |  | 
 |  | 
 |  | 
 | <!-- Question: exec-process | 
 |  | 
 |      <question id="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? | 
 |             <hint> | 
 |             If you feed an input, parse the output please declare that as an API. | 
 |             </hint> | 
 |         </question> | 
 | --> | 
 | <answer id="exec-process"> | 
 |     No. | 
 | </answer> | 
 |  | 
 |  | 
 |  | 
 | <!-- Question: exec-property | 
 |  | 
 |      <question id="exec-property"> | 
 |             Is execution of your code influenced by any environment of | 
 |             system (<code>System.getProperty</code>) property? | 
 |              | 
 |             <hint> | 
 |             If there is a property that can change the behaviour of your  | 
 |             code, somebody will likely use it. You should describe what it does  | 
 |             and the stability category of this API. You may use | 
 |             <PRE> | 
 |                 <property name="id" category="private" > | 
 |                     description of the property, where it is used, what it influence, etc. | 
 |                 </property>             | 
 |             </PRE> | 
 |             </hint> | 
 |         </question> | 
 | --> | 
 | <answer id="exec-property"> | 
 |     <api type="export" group="systemproperty" name="netbeans.form.no_undo" category="private"> | 
 |         Set to true, turns off the undo/redo capability. For debugging purposes only. | 
 |     </api> | 
 |     <api type="export" group="systemproperty" name="netbeans.form.use_idelaf" category="private"> | 
 |         Set to true, turns off the strict usage of standard Look And Feel defaults | 
 |         (so then the same LAF settings as in the IDE are used for designed forms). | 
 |         Can be useful when designing forms to be used in the IDE. Also for | 
 |         debugging purposes. | 
 |     </api> | 
 | </answer> | 
 |  | 
 |  | 
 |  | 
 | <!-- Question: exec-reflection | 
 |  | 
 |      <question id="exec-reflection"> | 
 |             Does your code uses java.lang.reflect to execute some other code? | 
 |             <hint> | 
 |             This usually indicates a missing or unsufficient API in the other | 
 |             part of the system. If the other side is not aware of your dependency | 
 |             this contract can be easily broken. | 
 |             </hint> | 
 |         </question> | 
 | --> | 
 | <answer id="exec-reflection"> | 
 |     Reflection is used for: | 
 |     <ul> | 
 |     <li>accessing <api name="java.awt.peer" group="java" type="import" category="private"/> private API - for setting own "fake" peers | 
 |     of designed heavyweight components (to avoid using native component peers in the IDE)</li> | 
 |     <li>obtaining information about beans' properties, events, methods etc.</li> | 
 |     <li>creation of instances of beans; reading/writing of beans' properties</li> | 
 |     <li>mapping between key chars (e.g. 'a') and key codes (<code>KeyEvent.VK_A</code>). See <code>KeyStrokeEditor</code>.</li> | 
 |     <li>implementation of scrollable popup menu. See <code>PaletteMenuView</code> and <code>ScrollPopupMenu</code>.</li> | 
 |     </ul> | 
 | </answer> | 
 |  | 
 |  | 
 |  | 
 | <!-- Question: format-clipboard | 
 |  | 
 |      <question id="format-clipboard"> | 
 |             Which protocols your code reads/inserts when communicating with | 
 |             clipboard? | 
 |         </question> | 
 | --> | 
 | <answer id="format-clipboard"> | 
 |     <ul> | 
 |     <li>custom DataFlavor type referencing own structures (for copy/cut/paste)</li> | 
 |     <li> | 
 |     <api name="InstanceCookie-paste" group="java" type="export" category="private"> | 
 |     standard Open API's NodeTransfer.cookie for InstanceCookie (just for pasting) | 
 |     </api> | 
 |     </li> | 
 |     </ul> | 
 | </answer> | 
 |  | 
 |  | 
 |  | 
 | <!-- Question: format-dnd | 
 |  | 
 |      <question id="format-dnd"> | 
 |             Which protocols your code understands during drag-n-drop? | 
 |         </question> | 
 | --> | 
 | <answer id="format-dnd"> | 
 |     None. | 
 | </answer> | 
 |  | 
 |  | 
 |  | 
 | <!-- Question: format-types | 
 |  | 
 |      <question id="format-types"> | 
 |             Which file formats your code reads or writes on disk? | 
 |         </question> | 
 | --> | 
 | <answer id="format-types"> | 
 |     Form GUI data files are stored in .form files of custom XML format | 
 |     (DTD in /cvs/form/src/org/netbeans/modules/form/resources/forms.dtd). | 
 |     There is a version number stored in the .form file allowing to extend | 
 |     the format, keeping backward compatibility and avoiding data corruption. | 
 |     Form Editor is able to read current and older format versions, refuses | 
 |     to read newer versions. | 
 | </answer> | 
 |  | 
 |  | 
 |  | 
 | <!-- Question: lookup-lookup | 
 |  | 
 |      <question id="lookup-lookup"> | 
 |             Does your module uses <code>org.openide.util.Lookup</code> | 
 |             to find any components to communicate to? Which ones? | 
 |              | 
 |             <hint> | 
 |             Please describe the interfaces you are searching for, where  | 
 |             are defined, whether you are searching for just one or more of them, | 
 |             if the order is important, etc. Also clasify the stability of such | 
 |             API contract. | 
 |             </hint> | 
 |         </question> | 
 | --> | 
 | <answer id="lookup-lookup"> | 
 |     Lookup.getDefault().lookup(java.awt.datatransfer.Clipboard.class) - to get | 
 |     standard Clipboard instance | 
 | </answer> | 
 |  | 
 |  | 
 |  | 
 | <!-- Question: lookup-register | 
 |  | 
 |      <question id="lookup-register"> | 
 |             Do you register anything into the lookup for other to find?  | 
 |             <hint> | 
 |             Do you register using layer file or using <code>META-INF/services</code>? | 
 |             Who is supposed to find your component? | 
 |             </hint> | 
 |         </question> | 
 | --> | 
 | <answer id="lookup-register"> | 
 |     No. | 
 | </answer> | 
 |  | 
 |  | 
 |  | 
 | <!-- Question: lookup-remove | 
 |  | 
 |      <question id="lookup-remove"> | 
 |             Are removing entries of other modules from the lookup?  | 
 |             <hint> | 
 |             Why? Of course, that is possible, but it can be dangerous. Is the module | 
 |             your are masking resource from aware of what you are doing? | 
 |             </hint> | 
 |         </question> | 
 | --> | 
 | <answer id="lookup-remove"> | 
 |     No. | 
 | </answer> | 
 |  | 
 |  | 
 |  | 
 | <!-- Question: perf-exit | 
 |  | 
 |      <question id="perf-exit"> | 
 |             Does your module executes anything on exit? | 
 |         </question> | 
 | --> | 
 | <answer id="perf-exit"> | 
 |     No. | 
 | </answer> | 
 |  | 
 |  | 
 |  | 
 | <!-- Question: perf-huge_dialogs | 
 |  | 
 |      <question id="perf-huge_dialogs"> | 
 |             Does your module contain any dialogs or wizards with huge | 
 |             amount of GUI controls like combo boxes, lists, trees, text | 
 |             areas? | 
 |         </question> | 
 | --> | 
 | <answer id="perf-huge_dialogs"> | 
 |     The dialog showing custom property editors for given component property can be quite | 
 |     huge (depends on property type and available customizers for it). Most of these | 
 |     dialogs are not defined in Form Editor; as for the Form Editor itself, it has no | 
 |     huge or time-expensive dialogs requiring some optimization on initialization. | 
 | </answer> | 
 |  | 
 |  | 
 |  | 
 | <!-- Question: perf-limit | 
 |  | 
 |      <question id="perf-limit"> | 
 |             Are there any limits in number/size of elements your code | 
 |             can handle? | 
 |         </question> | 
 | --> | 
 | <answer id="perf-limit"> | 
 |     No explicit limits. Technically, the available memory size is the limit... | 
 | </answer> | 
 |  | 
 |  | 
 |  | 
 | <!-- Question: perf-mem | 
 |  | 
 |      <question id="perf-mem"> | 
 |             What is the amount of memory your component occupies? Estimate | 
 |             with a relaction to the number of windows, etc. | 
 |         </question> | 
 | --> | 
 | <answer id="perf-mem"> | 
 |     Rough numbers: | 
 |     <ul> | 
 |     <li>form editor without forms: 1MB</li> | 
 |     <li>one opened form without components: 500KB</li> | 
 |     <li>one component in the form: 50KB</li> | 
 |     </ul> | 
 | </answer> | 
 |  | 
 |  | 
 |  | 
 | <!-- Question: perf-menus | 
 |  | 
 |      <question id="perf-menus"> | 
 |             Does your module use dynamically changing context menus or | 
 |             context sensitive actions with complicated logic for enable/disable? | 
 |         </question> | 
 | --> | 
 | <answer id="perf-menus"> | 
 |     No. Context menu are rather stable once created. Enabling logic is simple. | 
 | </answer> | 
 |  | 
 |  | 
 |  | 
 | <!-- Question: perf-progress | 
 |  | 
 |      <question id="perf-progress"> | 
 |             Does your module executes some long running task? | 
 |             <hint>Typically they are tasks like connecting over | 
 |             network, computing huge amount of data, compilation. | 
 |             Such communication should be done asynchronously (for example | 
 |             using <code>RequestProcessor</code>), definitively it should  | 
 |             not block AWT thread. | 
 |             </hint> | 
 |         </question> | 
 | --> | 
 | <answer id="perf-progress"> | 
 |     Opening a form can be quite long task; done whole in AWT event queue | 
 |     thread, making the IDE unresponsive all the time. | 
 | </answer> | 
 |  | 
 |  | 
 |  | 
 | <!-- Question: perf-scale | 
 |  | 
 |      <question id="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? | 
 |             Please include some estimates. | 
 |         </question> | 
 | --> | 
 | <answer id="perf-scale"> | 
 |     Size of the .form data file and number of components influence | 
 |     opening time and editing responsiveness. Roughly, 100 components add | 
 |     5 sec to open time and 1 sec to edit/update time. | 
 | </answer> | 
 |  | 
 |  | 
 |  | 
 | <!-- Question: perf-startup | 
 |  | 
 |      <question id="perf-startup"> | 
 |             Does your module executes anything on startup? | 
 |         </question> | 
 | --> | 
 | <answer id="perf-startup"> | 
 |     Modifies (extends) property editor search path. | 
 | </answer> | 
 |  | 
 |  | 
 |  | 
 | <!-- Question: perf-wakeup | 
 |  | 
 |      <question id="perf-wakeup"> | 
 |             Is any piece of your code waking up periodically? | 
 |         </question> | 
 | --> | 
 | <answer id="perf-wakeup"> | 
 |     No. | 
 | </answer> | 
 |  | 
 |  | 
 |  | 
 | <!-- Question: resources-file | 
 |  | 
 |      <question id="resources-file"> | 
 |             Does your module use <code>java.io.File</code> directly? | 
 |              | 
 |             <hint> | 
 |             NetBeans provide a logical wrapper over plain files called  | 
 |             <code>org.openide.filesystems.FileObject</code> that | 
 |             provides uniform access to such resources and is the prefered | 
 |             way that should be used. But of course there can be situations when | 
 |             this is not suitable. | 
 |             </hint> | 
 |         </question> | 
 | --> | 
 | <answer id="resources-file"> | 
 |     Yes, but only for external JAR files when installing beans from them. | 
 | </answer> | 
 |  | 
 |  | 
 |  | 
 | <!-- Question: resources-layer | 
 |  | 
 |      <question id="resources-layer"> | 
 |             Does your module provide own layer? Does it create some files or | 
 |             folders on it? What it is trying to communicate by that and with which  | 
 |             component? | 
 |              | 
 |             <hint> | 
 |             NetBeans allows automatic and declarative installation of resources  | 
 |             by module layers. Module register files into appropriate places | 
 |             and other components use that information to perform their task | 
 |             (build menu, toolbar, window layout, list of templates, set of | 
 |             options, etc.).  | 
 |             </hint> | 
 |         </question> | 
 | --> | 
 | <answer id="resources-layer"> | 
 |     Yes, files are created for menus, actions, shortcuts, templates, window system layout, | 
 |     settings storage, AbsoluteLayout.jar automount - these are all in standard Open | 
 |     APIs. For its own purpose, form editor uses the layer to define: | 
 |   <ul> | 
 |      <li>content of component palette,</li> | 
 |      <li>list of component classes that need to be loaded from IDE internally | 
 |          (from module, i.e. not from user projects as by default).</li> | 
 |   </ul> | 
 | </answer> | 
 |  | 
 |  | 
 |  | 
 | <!-- Question: resources-mask | 
 |  | 
 |      <question id="resources-mask"> | 
 |             Does your module mask/hide/override any resource provided by another one in | 
 |             module layer?  | 
 |              | 
 |             <hint> | 
 |             If you mask a file provided by another module, you probably depend | 
 |             on that and do not want the other module to (for example) change | 
 |             the file's name. That module shall thus make that file available as an API | 
 |             of some stability category. | 
 |             </hint> | 
 |         </question> | 
 | --> | 
 | <answer id="resources-mask"> | 
 |     No. | 
 | </answer> | 
 |  | 
 |  | 
 |  | 
 | <!-- Question: resources-read | 
 |  | 
 |      <question id="resources-read"> | 
 |             Does your module read any resources from layers? For what purpose? | 
 |              | 
 |             <hint> | 
 |             As this is some kind of intermodule dependency, it is a kind of API. | 
 |             Please describe it and clasify according to  | 
 |             <a href="http://openide.netbeans.org/tutorial/api-design.html#categories"> | 
 |             common stability categories</a>. | 
 |             </hint> | 
 |         </question> | 
 | --> | 
 | <answer id="resources-read"> | 
 |     <p><api name="Palette" group="layer" type="export" category="friend"> | 
 |     Content of the component palette is read from the layer. It is located in <code>FormDesignerPalette</code> | 
 |     folder with one level of subfolders serving as categories, and <code>.palette_item</code> files | 
 |     in the subfolders as items. The palette item file is a xml file defining the class, | 
 |     display name, icon, and origin of one component in the palette. See form module's layer | 
 |     file for examples. | 
 |     </api></p> | 
 |     <p><api name="ClassLoadingTypes" group="layer" type="export" category="private"> | 
 |     Form editor loads component classes from user project classpath by default. If some | 
 |     classes are provided by a module (like special BeanInfo or property editors) | 
 |     they might need to be loaded by IDE system classloader instead. Such classes should be | 
 |     registered in a file placed under <code>org-netbeans-modules-form/classloader/system</code> | 
 |     folder (or <code>system_with_project</code> if the class needs to be able to | 
 |     access resources also on the project classpath). The file should be a plain text file listing | 
 |     the class names (or package patterns using usual * and ** notation), one name per line. | 
 |     See form module's layer file and <code>SystemClasses.txt</code> file for examples. | 
 |     </api></p> | 
 | </answer> | 
 |  | 
 |  | 
 | <!-- | 
 |         <question id="arch-quality" when="init"> | 
 |             How will the <a href="http://www.netbeans.org/community/guidelines/q-evangelism.html" shape="rect">quality</a> | 
 |             of your code be tested and  | 
 |             how are future regressions going to be prevented? | 
 |             <hint> | 
 |             What kind of testing do | 
 |             you want to use? How much functionality, in which areas, | 
 |             should be covered by the tests?  | 
 |             </hint> | 
 |         </question> | 
 | --> | 
 | <answer id="arch-quality"> | 
 | There are unit tests for the layout design subsystem. There is also bunch of functional test written by QA. | 
 | </answer> | 
 |  | 
 |  | 
 |  | 
 | <!-- | 
 |         <question id="arch-time" when="init"> | 
 |             What are the time estimates of the work? | 
 |             <hint> | 
 |             Please express your estimates of how long the design, implementation, | 
 |             stabilization are likely to last. How many people will be needed to | 
 |             implement this and what is the expected milestone by which the work should be  | 
 |             ready? | 
 |             </hint> | 
 |         </question> | 
 | --> | 
 | <answer id="arch-time"> | 
 | N/A | 
 | </answer> | 
 |  | 
 |  | 
 |  | 
 | <!-- | 
 |         <question id="arch-usecases" when="init"> | 
 |             Describe the main <a href="http://openide.netbeans.org/tutorial/api-design.html#usecase" shape="rect"> | 
 |             use cases</a> 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? | 
 |         </question> | 
 | --> | 
 | <answer id="arch-usecases"> | 
 | E.g. i18n module provides a specialized property editor for String that allows to enter | 
 | an internationalized string taken from a .properties file. | 
 | <api type="export" group="java" name="org.netbeans.modules.form.FormPropertyEditorManager" category="private"> | 
 |         allows to register property editors for given types to be used only in form editor (not in | 
 |         the whole IDE which is managed by the <code>java.beans.PropertyEditorManager</code>) | 
 |     </api> | 
 | </answer> | 
 |  | 
 |  | 
 |  | 
 | <answer id="deploy-dependencies"> | 
 | Nothing. | 
 | </answer> | 
 |  | 
 |  | 
 |  | 
 | <!-- | 
 |         <question id="exec-threading" when="impl"> | 
 |             What threading models, if any, does your module adhere to? | 
 |             <hint> | 
 |                 If your module calls foreign APIs which have a specific threading model, | 
 |                 indicate how you comply with the requirements for multithreaded access | 
 |                 (synchronization, mutexes, etc.) applicable to those APIs. | 
 |                 If your module defines any APIs, or has complex internal structures | 
 |                 that might be used from multiple threads, declare how you protect | 
 |                 data against concurrent access, race conditions, deadlocks, etc., | 
 |                 and whether such rules are enforced by runtime warnings, errors, assertions, etc. | 
 |                 Examples: a class might be non-thread-safe (like Java Collections); might | 
 |                 be fully thread-safe (internal locking); might require access through a mutex | 
 |                 (and may or may not automatically acquire that mutex on behalf of a client method); | 
 |                 might be able to run only in the event queue; etc. | 
 |                 Also describe when any events are fired: synchronously, asynchronously, etc. | 
 |                 Ideas: <a href="http://core.netbeans.org/proposals/threading/index.html#recommendations" shape="rect">Threading Recommendations</a> (in progress) | 
 |             </hint> | 
 |         </question> | 
 | --> | 
 | <answer id="exec-threading"> | 
 | Form editor classes are not thread safe. Whole form editor is designed as single-threaded app. | 
 | It is supposed to run in AWT thread only. Known entry points (e.g. actions) are checked for this. | 
 | </answer> | 
 |  | 
 |  | 
 |  | 
 | <!-- | 
 |         <question id="perf-spi" when="init"> | 
 |             How the performance of the plugged in code will be enforced? | 
 |             <hint> | 
 |             If you allow foreign code to be plugged into your own module, how | 
 |             do you enforce that it will behave correctly and quickly and will not | 
 |             negatively influence the performance of your own module? | 
 |             </hint> | 
 |         </question> | 
 | --> | 
 | <answer id="perf-spi"> | 
 | Form editor calls constructor and property getter/setter methods of edited beans. | 
 | There's in no way ensured these beans behaves correctly in performance point of view. | 
 | </answer> | 
 |  | 
 |  | 
 |  | 
 | <!-- | 
 |         <question id="security-grant" when="final"> | 
 |             Does your code grant addition rights to some code? | 
 |             <hint>Avoid using a classloder that adds some extra | 
 |             permissions to loaded code unless realy necessary. | 
 |             Also note that your API implementation | 
 |             can also expose unneeded permissions to enemy code by | 
 |             AccessController.doPrilileged() calls.</hint> | 
 |         </question> | 
 | --> | 
 | <answer id="security-grant"> | 
 | Property change notification comming from (external) bean customizers are given privileged access. | 
 | </answer> | 
 |  | 
 |  | 
 |  | 
 | <!-- | 
 |         <question id="security-policy" when="final"> | 
 |             Does your functionality require standard policy file modification? | 
 |             <hint>Your code may pass control to third party code not | 
 |             coming from trusted domain. It covers code downloaded over | 
 |             network or code coming from libraries that are not bundled | 
 |             with NetBeans. Which permissions it needs to grant to which domain?</hint> | 
 |         </question> | 
 | --> | 
 | <answer id="security-policy"> | 
 | No. | 
 | </answer> | 
 |  | 
 | </api-answers> |