<?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.29"
  author="akrasny@netbeans.org"
>

  &api-questions;


<!--
        <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">
                clients and what support API</a>?
            What parts will be pluggable?
            How will plug-ins be registered? Please use <code>&lt;api type="export"/&gt;</code>
            to describe your general APIs and specify their
            <a href="http://openide.netbeans.org/tutorial/api-design.html#category-private">
            stability categories</a>.
            If possible please provide simple diagrams.
            </hint>
        </question>
-->
    <answer id="arch-overall">
        <p>
  Currently the module doesn't provide any SPI.
        </p>
        <p>
            Three main API classes are: 
            <a href="@TOP@/org/netbeans/modules/nativeexecution/api/ExecutionEnvironment.html">ExecutionEnvironment</a>,
            <a href="@TOP@/org/netbeans/modules/nativeexecution/api/NativeProcess.html">NativeProcess</a> and
            <a href="@TOP@/org/netbeans/modules/nativeexecution/api/NativeProcessBuilder.html">NativeProcessBuilder</a>.
            ExecutionEnvironmant describes <b>where</b> the process needs to be
            started (i.e. it identifies a host and, if needed, provides information
            for establishing ssh connection with that host (i.e. username and
            ssh-port to use)).
            <a href="@TOP@/org/netbeans/modules/nativeexecution/api/util/ConnectionManager.html">ConnectionManager</a>
            (that is also a part of the API)
            handles all ssh connections and is responsible for establishing those
            connection (ask for passwords, etc.)<br/>
            NativeProcessBuilder is a factory for a NativeProcess that can be
            used with an ExecutionService to create and start system process.
        </p>
    </answer>



<!--
        <question id="arch-quality" when="init">
            How will the <a href="http://www.netbeans.org/community/guidelines/q-evangelism.html">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? How you find out that your
            project was successful?
            </hint>
        </question>
-->
    <answer id="arch-quality">
        <p>
   Most of the API functionality is covered by unit tests. Same applies to future enhancements.
        </p>
    </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">
        <p>
   It is not final yet. 
        </p>
    </answer>

<!--
        <question id="arch-usecases" when="init">
            <hint>
                Content of this answer will be displayed as part of page at
                http://www.netbeans.org/download/dev/javadoc/usecases.html
                You can use tags &lt;usecase name="name&gt; regular html description &lt;/usecase&gt;
                and if you want to use an URL you can prefix if with @TOP@ to begin
                at the root of your javadoc
            </hint>

            Describe the main <a href="http://openide.netbeans.org/tutorial/api-design.html#usecase">
            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">
        <p>
  The module was designed in the same manner as ExtExecution Support and can be
  considered as an extension of that module. It introduces it's own ProcessBuilder
  (NativeProcessBuilder) that can be used with an 
  <a href="@org-netbeans-modules-extexecution@/org/netbeans/api/extexecution/ExecutionDescriptor.html">ExecutionDescriptor</a>
  and an
  <a href="@org-netbeans-modules-extexecution@/org/netbeans/api/extexecution/ExecutionService.html">ExecutionService</a>
  from the ExtExecution Support Module. The NativeProcessBuilder
  is a factory for a NativeProcess, which is an extension of java.lang.Process with
  two additional methods: getPID() and getState() to receive system process' pid
  and state respectively.
        </p>
        <p>
            Below are several examples of usage.
            </p>
<usecase id="StartRemoteProcess" name="Start Remote System Process">
<pre>
    ExecutionEnvironment env = ExecutionEnvironmentFactory.createNew(userName, host);
    NativeProcessBuilder npb = new NativeProcessBuilder(env, "/bin/ls");
    npb = npb.setArguments(".").setWorkingDirectory("/tmp");
    ExecutionDescriptor descr = new ExecutionDescriptor().controllable(true);
    ExecutionService service = ExecutionService.newService(npb, descr, "test");

    Future&lt;Integer&gt; result = service.run();

    Integer exitCode = null;
    try {
        exitCode = result.get();
    } catch (InterruptedException ex) {
        Exceptions.printStackTrace(ex);
    } catch (ExecutionException ex) {
        Exceptions.printStackTrace(ex);
    }

    System.out.println("Exit code is " + exitCode);
</pre>
</usecase>

<usecase id="ObtainPID" name="Obtain System Process' ID (PID)">

To obtain process' PID one should register it's ChangeListener when configure a
NativeProcessBuilder that will recieve a notification about process start event
(<i>State</i> of the process changed to <i><b>RUNNING</b></i>). Then, on this
event it is possible to ask event's source (NativeProcess) for a PID.
<pre>
ChangeListener listener = new ChangeListener() {

    public void stateChanged(ChangeEvent e) {
        NativeProcess process = (NativeProcess) e.getSource();
        State newState = process.getState();

        if (newState == State.STARTING) {
            return;
        }

        if (newState == State.ERROR) {
            System.out.println("Unable to start process!");
            return;
        }

        System.out.println("Process " + process.toString() + " [" + process.getPID() + "] -> " + newState);
    }
};

...

NativeProcessBuilder npb = new NativeProcessBuilder(env, "/bin/ls");
npb = npb.setArguments(".").setWorkingDirectory("/tmp");
npb = npb.addNativeProcessListener(listener);
...
</pre>
</usecase>

<usecase id="StartInExtTerm" name="Start Process in an External Terminal">
To start process in an external terminal one should setup NativeProcessBuilder
accordingly.
<pre>
...

ExternalTerminal term = ExternalTerminalProvider.getTerminal("gnome-terminal").setTitle("My title");

NativeProcessBuilder npb = new NativeProcessBuilder(env, "/bin/ls");
npb = npb.setArguments(".").setWorkingDirectory("/tmp");
npb = npb.useExternalTerminal(term);
...

</pre>
</usecase>

<usecase id="UseAsynchronousActions" name="Initiate Connect/Privileges Grant">
<a href="@TOP@/org/netbeans/modules/nativeexecution/api/util/ConnectionManager.html">ConnectionManager</a> and
<a href="@TOP@/org/netbeans/modules/nativeexecution/api/util/SolarisPrivilegesSupport.html">SolarisPrivilegesSupport</a>
are utility classes that manage
remote sessions and granding privileges to execution environment.<br/>
Their usage is rather straightforward, but they both have one characteristics
and implement the following pattern: to initiate connection/granting privileges
one first obtains an
<a href="@TOP@/org/netbeans/modules/nativeexecution/api/util/AsynchronousAction.html">AsynchronousAction</a>
and then invokes it (or associate with
some Action handler).

<pre>
ExecutionEnvironment ee = ExecutionEnvironmentFactory.createNew(user, host, port);
ConnectionManager cm = ConnectionManager.getInstance();

Runnable onConnect = new Runnable() {
    public void run() {
        DialogDisplayer.getDefault().notify(new DialogDescriptor.Message("Host connected!"));
    }
};

AsynchronousAction connectAction = cm.getConnectToAction(ee, onConnect);

// To invoke it immideately (and synchroniously)

connectAction.invoke();

// Or add it to some UI

...
JPanel panel = new JPanel(new BorderLayout());
panel.add(new JButton(connectAction), BorderLayout.CENTER);

DialogDisplayer.getDefault().createDialog(
        new DialogDescriptor(panel, "Connection Test")).setVisible(true);
...

</pre>
</usecase>
</answer>

<!--
        <question id="arch-what" when="init">
            What is this project good for?
            <hint>
            Please provide here a few lines describing the project,
            what problem it should solve, provide links to documentation,
            specifications, etc.
            </hint>
        </question>
-->
    <answer id="arch-what">
        <p>
        This module can be considered as an extension to the External Execution
        Module that provides an API (<api name="NativeExecutionAPI" group="java"
  type="export" category="devel"/>) to execute and control external system
        processes not only on the local machine, but on remote systems as well.
        As it uses External Execution Module as a base for execution control,
        process' Input/Output and integration with the IDE are handled in the same
        way.
        </p>
        The differences are:
        <ul>
            <li>one can start process remotely (using ssh-connection);</li>
            <li>it supports execution in an external terminal;</li>
            <li>it is possible to obtain system process' ID (PID);</li>
            <li>it provides utility classes to perform common tasks like
                files uploading, removing, etc.;
            </li>
            <li>it provides utility class for granting execution privileges
                to native processes (See privileges(5). Solaris 10+ only).
            </li>
        </ul>

    </answer>

<!--
        <question id="arch-where" when="impl">
            Where one can find sources for your module?
            <hint>
                Please provide link to the Hg web client at
                http://hg.netbeans.org/
                or just use tag defaultanswer generate='here'
            </hint>
        </question>
-->
    <answer id="arch-where">
        <defaultanswer generate='here' />
    </answer>



<!--
        <question id="compat-deprecation" when="init">
            How the introduction of your project influences functionality
            provided by previous version of the product?
            <hint>
            If you are planning to deprecate/remove/change any existing APIs,
            list them here accompanied with the reason explaining why you
            are doing so.
            </hint>
        </question>
-->
    <answer id="compat-deprecation">
        <p>
        This module in an extension rather than deprecation of External
        Execution Support.
        </p>
    </answer>



<!--
        <question id="compat-i18n" when="impl">
            Is your module correctly internationalized?
            <hint>
            Correct internationalization means that it obeys instructions
            at <a href="http://www.netbeans.org/download/dev/javadoc/org-openide-modules/org/openide/modules/doc-files/i18n-branding.html">
            NetBeans I18N pages</a>.
            </hint>
        </question>
-->
    <answer id="compat-i18n">
        <p>
            Not yet.
        </p>
    </answer>



<!--
        <question id="compat-standards" when="init">
            Does the module implement or define any standards? Is the
            implementation exact or does it deviate somehow?
        </question>
-->
    <answer id="compat-standards">
        <p>
        No.
        </p>
    </answer>



<!--
        <question id="compat-version" when="impl">
            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?

            <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">
        <p>
        The only settings this module stores is an encrypted user password (if
        he/she agreed to do so)... It is not planned to change the format of
        these settings in future...
        </p>
    </answer>

<!--
        <question id="dep-jre" when="final">
            Which version of JRE do 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">
        <p>
        This module was developed using JDK 1.5
        </p>
    </answer>



<!--
        <question id="dep-jrejdk" when="final">
            Do you require the JDK or is the JRE enough?
        </question>
-->
    <answer id="dep-jrejdk">
        <p>
        JRE is enough.
        </p>
    </answer>



<!--
        <question id="dep-nb" when="init">
            What other NetBeans projects and modules does this one depend on?
            <hint>
            Depending on other NetBeans projects influnces the ability of
            users of your work to customize their own branded version of
            NetBeans by enabling and disabling some modules. Too
            much dependencies restrict this kind of customization. If that
            is your case, then you may want to split your functionality into
            pieces of autoload, eager and regular modules which can be
            enabled independently. Usually the answer to this question
            is generated from your <code>project.xml</code> file, but
            if it is not guessed correctly, you can suppress it by
            specifying &lt;defaultanswer generate="none"/&gt; and
            write here your own. Please describe such projects as imported APIs using
            the <code>&lt;api name="identification" type="import or export" category="stable" url="where is the description" /&gt;</code>.
            By doing this information gets listed in the summary page of your
            javadoc.
            </hint>
        </question>
-->
    <answer id="dep-nb">
        <defaultanswer generate='here' />
    </answer>

<!--
        <question id="dep-non-nb" when="init">
            What other projects outside NetBeans does this one depend on?

            <hint>
            Depending on 3rd party libraries is always problematic,
            especially if they are not open source, as that complicates
            the licensing scheme of NetBeans. Please enumerate your
            external dependencies here, so it is correctly understood since
            the begining what are the legal implications of your project.
            Also please note that
            some non-NetBeans projects are packaged as NetBeans modules
            (see <a href="http://libs.netbeans.org/">libraries</a>) and
            it is preferred to use this approach when more modules may
            depend and share such third-party libraries.
            </hint>
        </question>
-->
    <answer id="dep-non-nb">
        <p>
            <a href="http://www.jcraft.com/jsch/">com.jcratf.jsch</a>
        </p>
    </answer>



<!--
        <question id="dep-platform" when="init">
            On which platforms does your module run? Does it run in the same
            way on each?
            <hint>
            If you plan any dependency on OS or any usage of native code,
            please describe why you are doing so and describe how you envision
            to enforce the portability of your code.
            Please note that there is a support for <a href="http://www.netbeans.org/download/dev/javadoc/org-openide-modules/org/openide/modules/doc-files/api.html#how-os-specific">OS conditionally
            enabled modules</a> which together with autoload/eager modules
            can allow you to enable to provide the best OS aware support
            on certain OSes while providing compatibility bridge on the not
            supported ones.
            Also please list the supported
            OSes/HW platforms and mentioned the lovest version of JDK required
            for your project to run on. Also state whether JRE is enough or
            you really need JDK.
            </hint>
        </question>
-->
    <answer id="dep-platform">
        <p>
        The module was written to support DLight functionality, so the focus
        was Solaris/Linux environment. It was not tested under other environments.
        For remote execution it is required that remote host is running ssh
        server. For privileged execution it is required that remote host runs Solaris 10+.
        For privileged support a small native executable is implemented and used.
        For terminal support a shell script (wrapper) is used.
        </p>
    </answer>

<!--
        <question id="deploy-dependencies" when="final">
            What do other modules need to do to declare a dependency on this one,
            in addition to or instead of the normal module dependency declaration
            (e.g. tokens to require)?
            <hint>
                Provide a sample of the actual lines you would add to a module manifest
                to declare a dependency, for example OpenIDE-Module-Requires: some.token.
                If other modules should not depend on this module, or should just use a
                simple regular module dependency, you can just answer "nothing". If you
                intentionally expose a semistable API to clients using implementation
                dependencies, you should mention that here (but there is no need to give
                an example of usage).
            </hint>
        </question>
-->
    <answer id="deploy-dependencies">
        <p>
        Nothing.
        </p>
    </answer>



<!--
        <question id="deploy-jar" when="impl">
            Do you deploy just module JAR file(s) or other files as well?
            <hint>
            Usually a module consist of one JAR file (perhaps with Class-Path
            extensions) and also a configuration file that enables it. If you
            have any other files, use
            &lt;api group="java.io.File" name="yourname" type="export" category="friend"&gt;...&lt;/api&gt;
            to define the location, name and stability of your files (of course
            changing "yourname" and "friend" to suit your needs).

            If it uses more than one JAR, describe where they 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/uninstallation leaves the system
            in state as it was before installation.
            </hint>
        </question>
-->
    <answer id="deploy-jar">
        <p>
        jar with this module + jar with jsch + native executable for privileged
        execxution
        </p>
    </answer>

<!--
        <question id="deploy-nbm" when="impl">
            Can you deploy an NBM via the Update Center?
            <hint>
            If not why?
            </hint>
        </question>
-->
    <answer id="deploy-nbm">
        <p>
        Not yet. It is not final yet.
        </p>
    </answer>

<!--
        <question id="deploy-packages" when="init">
            Are packages of your module made inaccessible by not declaring them
            public?

            <hint>
            By default NetBeans build harness treats all packages are private.
            If you export some of them - either as public or friend packages,
            you should have a reason. If the reason is described elsewhere
            in this document, you can ignore this question.
            </hint>
        </question>
-->
    <answer id="deploy-packages">
        <p>
         Only API packages are exported.
        </p>
    </answer>



<!--
        <question id="deploy-shared" when="final">
            Do you need to be installed in the shared location only, or in the user directory only,
            or can your module be installed anywhere?
            <hint>
            Installation location shall not matter, if it does explain why.
            Consider also whether <code>InstalledFileLocator</code> can help.
            </hint>
        </question>
-->
    <answer id="deploy-shared">
        <p>
        Anywhere
        </p>
    </answer>



<!--
        <question id="exec-ant-tasks" when="impl">
            Do you define or register any ant tasks that other can use?

            <hint>
            If you provide an ant task that users can use, you need to be very
            careful about its syntax and behaviour, as it most likely forms an
	          API for end users and as there is a lot of end users, their reaction
            when such API gets broken can be pretty strong.
            </hint>
        </question>
-->
    <answer id="exec-ant-tasks">
        <p>
            None.
        </p>
    </answer>



<!--
        <question id="exec-classloader" when="impl">
            Does your code create its own class loader(s)?
            <hint>
            A bit unusual. Please explain why and what for.
            </hint>
        </question>
-->
    <answer id="exec-classloader">
        <p>
            No.
        </p>
    </answer>



<!--
        <question id="exec-component" when="impl">
            Is execution of your code influenced by any (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 behavior 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">
        <p>
            There are no public properties. There are some for debugging purposes.
        </p>
    </answer>



<!--
        <question id="exec-introspection" when="impl">
            Does your module use any kind of runtime type information (<code>instanceof</code>,
            work with <code>java.lang.Class</code>, 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">
        <p>
        No.
        </p>
    </answer>



<!--
        <question id="exec-privateaccess" when="final">
            Are you aware of any other parts 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">
        <p>
        No.
        </p>
    </answer>



<!--
        <question id="exec-process" when="impl">
            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">
        <p>
    Yes. The API provides support to do so. The result code, input and output
    stream content does not define API as this is forwarded to the client of this module.
        </p>
    </answer>



<!--
        <question id="exec-property" when="impl">
            Is execution of your code influenced by any environment or
            Java system (<code>System.getProperty</code>) property?
            On a similar note, is there something interesting that you
            pass to <code>java.util.logging.Logger</code>? Or do you observe
            what others log?
            <hint>
            If there is a property that can change the behavior of your
            code, somebody will likely use it. You should describe what it does
            and the <a href="http://openide.netbeans.org/tutorial/api-design.html#life">stability category</a>
            of this API. You may use
            <pre>
                &lt;api type="export" group="property" name="id" category="private" url="http://..."&gt;
                    description of the property, where it is used, what it influence, etc.
                &lt;/api&gt;
            </pre>
            </hint>
        </question>
-->
    <answer id="exec-property">
        <p>
        None of them are 'public'. There are several properties that are used in
        debugging purposes.
        </p>
    </answer>



<!--
        <question id="exec-reflection" when="impl">
            Does your code use Java Reflection to execute other code?
            <hint>
            This usually indicates a missing or insufficient 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">
        <p>
        No.
        </p>
    </answer>



<!--
        <question id="exec-threading" when="init">
            What threading models, if any, does your module adhere to? How the
            project behaves with respect to threading?
            <hint>
                Is your API threadsafe? Can it be accessed from any threads or
                just from some dedicated ones? Any special relation to AWT and
                its Event Dispatch thread? Also
                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">Threading Recommendations</a> (in progress)
            </hint>
        </question>
-->
    <answer id="exec-threading">
        <p>
        It is supposed to be thread safe and can be accessed from any thread.
        </p>
    </answer>

<!--
        <question id="format-clipboard" when="impl">
            Which data flavors (if any) does your code read from or insert to
            the clipboard (by access to clipboard on means calling methods on <code>java.awt.datatransfer.Transferable</code>?

            <hint>
            Often Node's deal with clipboard by usage of <code>Node.clipboardCopy, Node.clipboardCut and Node.pasteTypes</code>.
            Check your code for overriding these methods.
            </hint>
        </question>
-->
    <answer id="format-clipboard">
        <p>
   None.
        </p>
    </answer>



<!--
        <question id="format-dnd" when="impl">
            Which protocols (if any) does your code understand during Drag &amp; Drop?
            <hint>
            Often Node's deal with clipboard by usage of <code>Node.drag, Node.getDropType</code>.
            Check your code for overriding these methods. Btw. if they are not overridden, they
            by default delegate to <code>Node.clipboardCopy, Node.clipboardCut and Node.pasteTypes</code>.
            </hint>
        </question>
-->
    <answer id="format-dnd">
        <p>
   None.
        </p>
    </answer>



<!--
        <question id="format-types" when="impl">
            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?

            <hint>
            <p>
            Files can be read and written by other programs, modules and users. If they influence
            your behaviour, make sure you either document the format or claim that it is a private
            api (using the &lt;api&gt; tag).
            </p>

            <p>
            If you generate an ant build file, this is very likely going to be seen by end users and
            they will be attempted to edit it. You should be ready for that and provide here a link
            to documentation that you have for such purposes and also describe how you are going to
            understand such files during next release, when you (very likely) slightly change the
            format.
            </p>
            </hint>
        </question>
-->
    <answer id="format-types">
        <p>
   None.
        </p>
    </answer>



<!--
        <question id="lookup-lookup" when="init">
            Does your module use <code>org.openide.util.Lookup</code>
            or any similar technology to find any components to communicate with? Which ones?

            <hint>
            NetBeans is build around a generic registry of services called
            lookup. It is preferable to use it for registration and discovery
            if possible. See
            <a href="http://www.netbeans.org/download/dev/javadoc/org-openide-util/org/openide/util/lookup/doc-files/index.html">
            The Solution to Comunication Between Components
            </a>. If you do not plan to use lookup and insist usage
            of other solution, then please describe why it is not working for
            you.
            <br/>
            When filling the final version of your arch document, 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 classify the stability of such
            API contract. Use &lt;api group=&amp;lookup&amp; /&gt; tag, so
            your information gets listed in the summary page of your javadoc.
            </hint>
        </question>
-->
    <answer id="lookup-lookup">
        <p>
   No. (At least for now)
        </p>
    </answer>



<!--
        <question id="lookup-register" when="final">
            Do you register anything into lookup for other code to find?
            <hint>
            Do you register using layer file or using a declarative annotation such as <code>@ServiceProvider</code>?
            Who is supposed to find your component?
            </hint>
        </question>
-->
    <answer id="lookup-register">
        <p>
   Nothing.
        </p>
    </answer>



<!--
        <question id="lookup-remove" when="final">
            Do you remove entries of other modules from 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">
        <p>
   No.
        </p>
    </answer>



<!--
        <question id="perf-exit" when="final">
            Does your module run any code on exit?
        </question>
-->
    <answer id="perf-exit">
        <p>
    On JVM shutdown module tries to terminate any running process executed through the API.
        </p>
    </answer>



<!--
        <question id="perf-huge_dialogs" when="final">
            Does your module contain any dialogs or wizards with a large number of
            GUI controls such as combo boxes, lists, trees, or text areas?
        </question>
-->
    <answer id="perf-huge_dialogs">
        <p>
   There are two dialogs: one to ask user password to connect to a host (in
   case of remote execution); another one - to ask for priveleged user's
   password to grant execution privileges for running process.
        </p>
    </answer>



<!--
        <question id="perf-limit" when="init">
            Are there any hard-coded or practical limits in the number or size of
            elements your code can handle?
            <hint>
                Most of algorithms have increasing memory and speed complexity
                with respect to size of data they operate on. What is the critical
                part of your project that can be seen as a bottleneck with
                respect to speed or required memory? What are the practical
                sizes of data you tested your project with? What is your estimate
                of potential size of data that would cause visible performance
                problems? Is there some kind of check to detect such situation
                and prevent "hard" crashes - for example the CloneableEditorSupport
                checks for size of a file to be opened in editor
                and if it is larger than 1Mb it shows a dialog giving the
                user the right to decide - e.g. to cancel or commit suicide.
            </hint>
        </question>
-->
    <answer id="perf-limit">
        <p>
   On very intensive output of spawned process, the performance may be affected.
   Currently no any check of this is implemented.
        </p>
    </answer>



<!--
        <question id="perf-mem" when="final">
            How much memory does your component consume? Estimate
            with a relation to the number of windows, etc.
        </question>
-->
    <answer id="perf-mem">
        <p>
   Current implementation provides means for redirecting process' output/error
   to a IOTab/StringBuffer... Depending on output, this may consume significant
   amount of memory...
        </p>
    </answer>



<!--
        <question id="perf-menus" when="final">
            Does your module use dynamically updated context menus, or
            context-sensitive actions with complicated and slow enablement logic?
            <hint>
                If you do a lot of tricks when adding actions to regular or context menus, you can significantly
                slow down display of the menu, even when the user is not using your action. Pay attention to
                actions you add to the main menu bar, and to context menus of foreign nodes or components. If
                the action is conditionally enabled, or changes its display dynamically, you need to check the
                impact on performance. In some cases it may be more appropriate to make a simple action that is
                always enabled but does more detailed checks in a dialog if it is actually run.
            </hint>
        </question>
-->
    <answer id="perf-menus">
        <p>
   No.
        </p>
    </answer>



<!--
        <question id="perf-progress" when="final">
            Does your module execute any long-running tasks?

            <hint>Long running tasks should never block
            AWT thread as it badly hurts the UI
            <a href="http://performance.netbeans.org/responsiveness/issues.html">
            responsiveness</a>.
            Tasks like connecting over
            network, computing huge amount of data, compilation
            be done asynchronously (for example
            using <code>RequestProcessor</code>), definitively it should
            not block AWT thread.
            </hint>
        </question>
-->
    <answer id="perf-progress">
        <p>
   Processes that executed via provided API can take long time. Also for remote
   execution connection to an other host(s) is initiated. All these tasks are
   performed in non-AWT thread.
        </p>
    </answer>



<!--
        <question id="perf-scale" when="init">
            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?
            <hint>
            Please include some estimates, there are other more detailed
            questions to answer in later phases of implementation.
            </hint>
        </question>
-->
    <answer id="perf-scale">
        <p>
 Number of threads depending on number of spawned processes (n) increases lineary.
        </p>
    </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">
        <p>
        No SPI way to plug in foreign code.
        </p>
    </answer>

<!--
        <question id="perf-startup" when="final">
            Does your module run any code on startup?
        </question>
-->
    <answer id="perf-startup">
        <p>
   No.
        </p>
    </answer>



<!--
        <question id="perf-wakeup" when="final">
            Does any piece of your code wake up periodically and do something
            even when the system is otherwise idle (no user interaction)?
        </question>
-->
    <answer id="perf-wakeup">
        <p>
   No.
        </p>
    </answer>



<!--
        <question id="resources-file" when="final">
            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 preferred
            way that should be used. But of course there can be situations when
            this is not suitable.
            </hint>
        </question>
-->
    <answer id="resources-file">
        <p>
   Yes.
        </p>
    </answer>



<!--
        <question id="resources-layer" when="final">
            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?

            <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">
        <p>
   Yes. Terminal support is implemented so that it reads different terminals
   'configuration' from the NativeExecution/ExtTerminalSupport folder.
   Terminal 'configurations' describe what options should be passed to a
   specific terminal (gnome-terminal, xterm) in order to start a process from
   within it.
        </p>
    </answer>



<!--
        <question id="resources-mask" when="final">
            Does your module mask/hide/override any resources provided by other modules in
            their layers?

            <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">
        <p>
   No.
        </p>
    </answer>



<!--
        <question id="resources-preferences" when="final">
            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 ?
            <hint>
                You may use
                    &lt;api type="export" group="preferences"
                    name="preference node name" category="private"&gt;
                    description of individual keys, where it is used, what it
                    influences, whether the module reads/write it, etc.
                    &lt;/api&gt;
                Due to XML ID restrictions, rather than /org/netbeans/modules/foo give the "name" as org.netbeans.modules.foo.
                Note that if you use NbPreferences this name will then be the same as the code name base of the module.
            </hint>
        </question>
-->
    <answer id="resources-preferences">
        <p>
   Yes. Reads and Writes and doesn't share with others.
   User's password (encrypted) is stored in
            <code>NbPreferences.forModule(<a href="@TOP@/org/netbeans/modules/nativeexecution/support/RemoteUserInfo.html">RemoteUserInfo.class</a>)</code>
        </p>
    </answer>



<!--
        <question id="resources-read" when="final">
            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 classify according to
            <a href="http://openide.netbeans.org/tutorial/api-design.html#categories">
            common stability categories</a>.
            </hint>
        </question>
-->
    <answer id="resources-read">
        <p>
   No.
        </p>
    </answer>



<!--
        <question id="security-grant" when="final">
            Does your code grant additional rights to some other code?
            <hint>Avoid using a class loader that adds extra
            permissions to loaded code unless really necessary.
            Also note that your API implementation
            can also expose unneeded permissions to enemy code by
            calling AccessController.doPrivileged().</hint>
        </question>
-->
    <answer id="security-grant">
        <p>
   No.
        </p>
    </answer>



<!--
        <question id="security-policy" when="final">
            Does your functionality require modifications to the standard policy file?
            <hint>Your code might pass control to third-party code not
            coming from trusted domains. This could be code downloaded over the
            network or code coming from libraries that are not bundled
            with NetBeans. Which permissions need to be granted to which domains?</hint>
        </question>
-->
    <answer id="security-policy">
        <p>
   This module uses JSch library (<a href="http://www.jcraft.com/jsch/">jsch</a>)
   This library has already been used in, for example, C/C++ Support Module
        </p>
    </answer>

</api-answers>
