<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>

<head>
  <title>NetBeans Server-Skeleton Module Tutorial</title>
  <link rel="Stylesheet" href="https://netbeans.org/netbeans.css" type="text/css" title="NetBeans OpenSource Style"/>
   <!--      Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. -->
        <!--     Use is subject to license terms.-->
</head>

<body>
<h1>NetBeans Server-Skeleton Module Tutorial</h1>
<div class="feedback-box"><a href="https://netbeans.org/about/contact_form.html?to=3&amp;subject=Feedback:%20Server%20Skeleton%20Module%20Tutorial">Feedback</a></div>

<p>This tutorial is intended to ease the <i>initial</i> phase of developing NetBeans modules that provide
 support for web deployment servers, such as the Tomcat Web Server or the Sun Java System Application Server.
 It provides the code
 for a skeleton server module, together with a detailed procedure for creating it from scratch and a full
 description of each of its parts. Since this is "just" a <i>skeleton</i> module, server-specific features
  that relate to starting and stopping, deploying, undeploying, and property customization are not covered here. However, after you create and 
 install the skeleton server module, you will have enough functionality to be able to register a new deployment server in the
 Server Manager and assign it to an application via the New Project wizard and the Project Properties dialog box. And, you will
 have a working framework on top of which you can build your own server module for the NetBeans IDE. At the end of the tutorial,
 you will be pointed to comparable deployment servers in NetBeans CVS, which you can explore to see how server-specific
 features are implemented elsewhere.</p>

<p>The following topics are covered below:</p>
<ul>
  <li><a href="#gettingtoknowthesample">Getting to Know the Sample</a>
  <ul>
  <li><a href="#installing">Installing the Software</a></li>
    <li><a href="#installing-sample">Installing the Sample</a></li>	
  <li><a href="#introducing-sample">Introducing the Sample</a></li>	
  <li><a href="#introducing-sources">Introducing the Sources</a></li>
  </ul></li>
  <li><a href="#settingupthemoduleproject">Setting Up the module Project</a>
  <ul>
  <li><a href="#creatingthemoduleproject">Creating the module Project</a></li>
  <li><a href="#specifying">Specifying the module's Dependencies</a></li>
  </ul></li>
  <li><a href="#creatingandgettingtoknowthemainfiles">Creating the Factory Classes</a>
  <ul>
    <li><a href="#MyDeploymentFactory"><tt>MyDeploymentFactory.java</tt></a></li>
    <li><a href="#MyJ2eePlatformFactory"><tt>MyJ2eePlatformFactory.java</tt></a></li>
    <li><a href="#MyOptionalFactory"><tt>MyOptionalFactory.java</tt></a></li>
    <li><a href="#MyRegistryNodeFactory"><tt>MyRegistryNodeFactory.java</tt></a></li>
  </ul>	</li>
   <li><a href="#creatingandgettingtoknowtheimplementationfiles">Creating the Implementation Classes</a>
  <ul>
    <li><a href="#ConfigurationSupportImpl"><tt>ConfigurationSupportImpl.java</tt></a></li>
    <li><a href="#MyConfiguration"><tt>MyConfiguration.java</tt></a>  </li>
    <li><a href="#MyDeploymentManager"><tt>MyDeploymentManager.java</tt></a></li>
    <li><a href="#MyInstantiatingIterator"><tt>MyInstantiatingIterator.java</tt></a></li>
    <li><a href="#MyJ2eePlatformImpl"><tt>MyJ2eePlatformImpl.java</tt></a></li>
    <li><a href="#MyStartServer"><tt>MyStartServer.java</tt></a></li>
    <li><a href="#MyInstanceNode"><tt>MyInstanceNode.java</tt></a></li>
  </ul>	</li>
  <li><a href="#finetuning">Setting Up the Supporting Resources</a></li>
  <li><a href="#building">Building and Installing the Module</a></li>
  <li><a href="#addingserverspecific">Adding Server-Specific Code</a></li>
  

</ul>
<p><a name="top"></a>Once the software is installed, this tutorial can be completed in 60 minutes.</p>

<p>For more information on working with NetBeans modules, see the <a href="https://netbeans.org/kb/trails/platform.html">
NetBeans Module and Rich-Client Application tutorials page</a> on the NetBeans website. If you have questions, visit the 
 <a href="http://wiki.netbeans.org/wiki/view/NetBeansDeveloperFAQ"> NetBeans Developer FAQ</a> or use the feedback link
 at the top of this page.</p>

<!-- ===================================================================================== -->
<h2><a name="gettingtoknowthesample"></a>Getting to Know the Sample</h2>
<p>Before you start writing the module, you have to make sure you have all of the necessary software.
 In addition, you might want to play with the sample before building it yourself. Getting to know the
 sample lets you know what you are in for during the rest of this tutorial!</p>
<div class="indent">

 <h3 class="tutorial"><a name="installing"></a>Installing the Software</h3>
   
    
      <p>Before you begin, you need to install the following software on your 
        computer:</p>
<ul>
     <li>NetBeans IDE 5.5 (<a href="http://www.netbeans.info/downloads/download.php?a=n&p=1">download</a>). Note that
      this tutorial was originally written for NetBeans IDE 5.0, but that version of
      this tutorial is no longer supported.</li>
    <li>Java Standard Development Kit (JDK&trade;) version 
      1.4.2 (<a href="http://java.sun.com/j2se/1.4.2/download.html">download</a>) 
      or 5.0 (<a href="http://java.sun.com/j2se/1.5.0/download.jsp">download</a>)</li>
  </ul>   

    <h3 class="tutorial"><a name="installing-sample"></a>Installing the Sample</h3>
<p>Take the following steps to install the sample:
<ol><p><li>Unzip the <a href="https://netbeans.org/files/documents/4/519/myserver.zip">attached file</a>.
<p><li>In the IDE, choose File &gt; Open Project and browse to the folder that contains the unzipped file.
 Open the module project. It should look as follows:
<p><img border="1" src="../../images/tutorials/myserver/projects-window.png" alt="All source files.">
<p><li>In the Projects window, right-click the "My Server Module"
 project node and choose Install/Reload in Target Platform. The target
 instance of the IDE opens and the module is installed. Alternatively, if you want to
 install the module in the current instance of the IDE, choose Install/Reload in Development IDE instead.</ol>

 <h3 class="tutorial"><a name="introducing-sample"></a>Introducing the Sample</h3>
<ol>
<p><li>Choose Tools &gt; Server Manager, click Add Server and notice that a new server is available:
<p><img src="../../images/tutorials/myserver/choose-server.png" alt="Choose my server.">
<p><li>Select "My Server" and type a name, such as "Test Server", in the Name textfield:
<p><img src="../../images/tutorials/myserver/add-server-instance2.png" alt="Set instance properties.">
<p><li>Click Next. The basis of an installation form implementation is displayed:
<p><img src="../../images/tutorials/myserver/add-server-instance.png" alt="Set instance properties.">
<p>See <a href="#MyInstantiatingIterator"><tt>MyInstantiatingIterator.java</tt></a> for related code details.
<p><li>Click Finish. A new node appears in the Servers list and the basis of a customizer implementation is displayed in the 
 main part of the panel:
<p><img src="../../images/tutorials/myserver/add-server-instance3.png" alt="Set customizer properties.">
<p>See <a href="#MyInstanceNode"><tt>MyInstanceNode.java</tt></a> for related code details.
<p><li>Click Close. Open the Runtime window (Ctrl-5) and notice the new "Test Server" node under the Servers node. When you right-click the node, the
 basis of your menu implementation is displayed:
<p><img border="1" src="../../images/tutorials/myserver/runtime-window.png" alt="Runtime window.">

<p>Even though the skeleton server cannot be started, you can assign it as a target server
 to an application, as shown in the next step.
<p><li>Assign the server as an application's target server, either while creating the web application
 or afterwards, while customizing it:
<ul><p><li>Choose File &gt; New Project (Ctrl-Shift-N). Under Categories, select Web and under Projects select
 Web Application. Click Next. In the Name and Location panel, notice that the Server drop-down includes the
 new server instance:
<p><img src="../../images/tutorials/myserver/name-and-location-panel.png" alt="Name and location panel."></li>
<p><li>Right-click an existing web application and choose Properties. The Project Properties dialog box opens. In the Run panel, 
 notice that the Server drop-down includes the
 new server type:
<p><img src="../../images/tutorials/myserver/run-panel.png" alt="Run panel."></li></ul>
</p>
</ol>

<p>Now that you know exactly what functionality the skeleton server provides, let's look at the sources!</p>

<h3 class="tutorial"><a name="introducing-sources"></a>Introducing the Sources</h3>

<p>The sample consists of factory classes, implementation classes, and supporting files. <p>Below,
 each are introduced in turn:</p>


<ul><li><p><b>Factory Classes.</b> The module uses the Factory pattern to instantiate the implementation classes. The module's factories
 are highlighted in the illustration below:
<p><img border="1" src="../../images/tutorials/myserver/projects-window-factories.png" alt="Main files.">
<p>The factories are introduced in alphabetical order:
  <p><table width="76%" border="1">

    <tbody><tr>
      <td>
	<div align="left"><b>File</b></div>
      </td>
      <td>
	<div align="left"><b>Description</b></div>

      </td>
    </tr>
    <tr>
      <td align="left" valign="top"><tt><a href="#MyDeploymentFactory">MyDeploymentFactory.java</a></tt></td>
      <td>

An implementation of the <tt><a href="http://java.sun.com/j2ee/1.4/docs/api/javax/enterprise/deploy/spi/factories/DeploymentFactory.html">DeploymentFactory</a></tt> interface, which produces instances of <tt><a href="http://java.sun.com/j2ee/1.4/docs/api/javax/enterprise/deploy/spi/DeploymentManager.html">DeploymentManager</a></tt> interface implementations, such as <a href="#MyDeploymentManager"><tt>MyDeploymentManager</tt></a>.


</td>
    </tr>
    <tr>
      <td align="left" valign="top"><tt><a href="#MyJ2eePlatformFactory">MyJ2eePlatformFactory.java</a></tt></td>

      <td>
An implementation of the <tt><a href="https://netbeans.org/download/dev/javadoc/org-netbeans-modules-j2eeserver/org/netbeans/modules/j2ee/deployment/plugins/api/J2eePlatformFactory.html">J2eePlatformFactory</a></tt> abstract class, which produces instances of <tt><a href="http://www.netbeans.org/download/dev/javadoc/org-netbeans-modules-j2eeserver/org/netbeans/modules/j2ee/deployment/plugins/api/J2eePlatformImpl.html">J2eePlatformImpl</a></tt> abstract class implementations, such as <a href="#MyJ2eePlatformImpl"><tt>MyJ2eePlatformImpl</tt></a>.



      </td>
    </tr>

    <tr>
      <td align="left" valign="top"><tt><a href="#MyOptionalFactory">MyOptionalFactory.java</a></tt></td>
      <td>

An implementation of the <tt><a href="https://netbeans.org/download/dev/javadoc/org-netbeans-modules-j2eeserver/org/netbeans/modules/j2ee/deployment/plugins/api/OptionalDeploymentManagerFactory.html">OptionalDeploymentManagerFactory</a></tt> abstract class. Although its name implies that it 
is <i>optional</i>, it isn't. You need to at least implement its methods for starting, stopping, and
 registering the server in the IDE. Therefore, the <tt><a href="#MyOptionalFactory">MyOptionalFactory</a></tt> class produces instances of the
 <a href="#MyStartServer"><tt>MyStartServer</tt></a> and <a href="#MyInstantiatingIterator"><tt>MyInstantiatingIterator</tt></a> implementation classes.</td>
    </tr>
    <tr>
      <td align="left" valign="top"><tt><a href="#MyRegistryNodeFactory">MyRegistryNodeFactory.java</a></tt></td>
      <td>
An implementation of the <tt><a href="https://netbeans.org/download/dev/javadoc/org-netbeans-modules-j2eeserver/org/netbeans/modules/j2ee/deployment/plugins/api/RegistryNodeFactory.html">RegistryNodeFactory</a></tt> interface. The purpose of this factory is to
  produce one or more registry nodes, which in this case is <a href="#MyInstanceNode"><tt>MyInstanceNode</tt></a>, 
 as user interface representations in the Runtime window.
</td>
    </tr>

    </tbody>
  </table>

<li><p><b>Implementation Classes.</b> The implementation classes are instantiated by the factories. The module's implementation
 classes are highlighted in the illustration below:
<p><img border="1 "src="../../images/tutorials/myserver/projects-window-mainfunctionality.png" alt="Main files.">
<p>The implementation classes are introduced in alphabetical order:
  <p><table width="76%" border="1">

    <tbody><tr>
      <td>
	<div align="left"><b>File</b></div>
      </td>
      <td>
	<div align="left"><b>Description</b></div>

      </td>
    </tr>
     <tr>
      <td align="left" valign="top"><a href="#ConfigurationSupportImpl"><tt>ConfigurationSupportImpl.java</tt></a></td>
      <td>

An implementation of the NetBeans API's <a href="https://netbeans.org/download/dev/javadoc/org-netbeans-modules-j2eeserver/org/netbeans/modules/j2ee/deployment/plugins/api/ConfigurationSupport.html">ConfigurationSupport</a>
interface. This class is the NetBeans extension of the <a href="http://java.sun.com/j2ee/1.4/docs/api/javax/enterprise/deploy/spi/DeploymentConfiguration.html">DeploymentConfiguration</a> interface, which is a J2EE API class and 
therefore could not be changed. This extension adds life cycle management and additional module change 
notifications support.

</td>
    </tr>
    <tr>
      <td align="left" valign="top"><a href="#MyConfiguration"><tt>MyConfiguration.java</tt></a></td>
      <td>

An implementation of the <a href="http://java.sun.com/j2ee/1.4/docs/api/javax/enterprise/deploy/spi/DeploymentConfiguration.html">DeploymentConfiguration</a> interface.
The purpose of this class is to provide support for server-specific configuration, in other words, it relates to deployment descriptors. 
</td>
    </tr>
    <tr>
      <td align="left" valign="top"><a href="#MyDeploymentManager"><tt>MyDeploymentManager.java</tt></a></td>
      <td>

A dummy implementation of the <tt><a href="http://java.sun.com/j2ee/1.4/docs/api/javax/enterprise/deploy/spi/DeploymentManager.html">DeploymentManager</a></tt> interface, which does nothing
 more than return <a href="#MyConfiguration"><tt>MyConfiguration.java</tt></a>.
 It is up to you to provide other server-specific implementation features.


</td>
    </tr>
   

    <tr>
      <td align="left" valign="top"><a href="#MyInstantiatingIterator"><tt>MyInstantiatingIterator.java</tt></a></td>
      <td>

Creates a wizard for the registration of new server type instances in the IDE. The current
 implementation lets the user specify the Display Name only; other properties are 
 hardcoded in order to keep the implementation as simple as possible.



</td>
    </tr>
    <tr>
      <td align="left" valign="top"><a href="#MyJ2eePlatformImpl"><tt>MyJ2eePlatformImpl.java</tt></a></td>
      <td>
An implementation of <tt><a href="https://netbeans.org/download/dev/javadoc/org-netbeans-modules-j2eeserver/org/netbeans/modules/j2ee/deployment/plugins/api/J2eePlatformImpl.html">J2eePlatformImpl</a></tt>, which is used to describe the target environment that
 J2EE applications are built against and subsequently deployed to. It provides a set of server 
libraries, supported module types, and J2EE specification versions.
</td>
    </tr>
    <tr>
      <td align="left" valign="top"><a href="#MyStartServer"><tt>MyStartServer.java</tt></a></td>
      <td>
An implementation of the <tt><a href="https://netbeans.org/download/dev/javadoc/org-netbeans-modules-j2eeserver/org/netbeans/modules/j2ee/deployment/plugins/api/StartServer.html">StartServer</a></tt> abstract class. Its purpose is to provide ability to start, 
 stop, and determine the state of the server.
</td>
    </tr>
    <tr>
      <td align="left" valign="top"><a href="#MyInstanceNode"><tt>MyInstanceNode.java</tt></a></td>
      <td>
Represents the new server in the Runtime window. The <tt>j2eeserver</tt> module, however, 
 adds to each node a set of default features, such as the capability to display the running status and
 a default set of menu items.
    </tr>

    </tbody>
  </table>

<li><p><b>Supporting Resources.</b> The module's supporting resources are highlighted in the illustration below:
<p><img border="1" src="../../images/tutorials/myserver/projects-window-supporting.png" alt="Supporting files.">
<p>The supporting resources in the Java packages are introduced in alphabetical order below:
  <p><table width="76%" border="1">

    <tbody><tr>
      <td>
	<div align="left"><b>File</b></div>
      </td>
      <td>
	<div align="left"><b>Description</b></div>

      </td>
    </tr>
   
    <tr>
	    <td align="left" valign="top"><tt><a href="#Bundle.properties">Bundle.properties</a></tt></td>

      <td>
This is a standard Java properties file, which uses the syntax <tt>Key=Value</tt>. Keys are
code names for things that appear in the source code, with values designating those
things which will be displayed to the user.
This file is useful for localization. For example, by creating a properties file such
as <tt>Bundle_ja.properties</tt>, and filling all the values with Japanese, this module will automatically display
everything in Japanese, if the
user is running the IDE in Japanese mode.

      
      </td>

    </tr>
    <tr>
      <td align="left" valign="top"><tt><a href="#layer.xml">layer.xml</a></tt></td>

      <td>
       Registers the new server type in the NetBeans filesystem. 
      </td>
    </tr>
 <tr>
      <td align="left" valign="top"><tt><a href="#nbdep.xml">nbdep.xml</a></tt></td>

      <td>
       Specifies the icon to be used in the Runtime window,
 the URL for obtaining the disconnected <tt>DeploymentManager</tt> instance, the
 <tt>container-limitation element</tt> that specifies what kind of deployments are supported,
 and the context path.
      </td>
    </tr>

    <tr>
	    <td align="left" valign="top"><tt><a href="#server.gif">server.gif</a></tt></td>

      <td>
	Icon for the new server type's node in the IDE.
      </td>

    </tr>

    </tbody>
  </table>


<p>For basic information each of the Important Files, see the 
 <a href="https://netbeans.org/kb/articles/quickstart-nbm.html">Introduction to NetBeans Module Development</a>.</ul>
</ul
<p>We have now looked at the features provided by the server skeleton and at each of the
 files that you need to create it from scratch. Let's now go through the whole process from
  start to finish, during which we will recreate the whole server skeleton. At the end, we will
   look at further resources worth exploring when building your own server implementation on top
    of the server skeleton.</p>
      </div>
<br />

<!-- ===================================================================================== -->
<h2><a name="settingupthemoduleproject"></a>Setting Up the module Project</h2>
<p>The first step in creating a server module is setting up your project in the IDE.
The IDE provides a wizard that 
sets up the source structure and all the basic files
 needed when you start creating a module.</p>
<div class="indent">

<h3 class="tutorial"><a name="creatingthemoduleproject"></a>Creating the Module Project</h3>
      <ol>
	<p><li>Choose File &gt; New Project. Under Categories, select NetBeans Plug-in Modules. Under Projects, 
 select Module Project. Click Next.</li>
	<p><li>In the Name and Location panel, type <tt>My Server Module</tt> in Project Name.
 Change the
Project Location to any directory on your computer, such as <tt>c:\mymodules</tt>. Leave the Standalone Module radiobutton
 selected. If not selected, select the Set as Main Project checkbox.
 Click Next.

<p><li>In the Basic Module Configuration panel, replace <tt>org.yourorghere.myservermodule</tt> in Code Name Base 
with <tt>org.netbeans.modules.j2ee.myservermodule</tt>. Leave <tt>My Server Module</tt> as the Module Display Name.
 Change the location of the localizing bundle and XML layer, so that they will be stored in a
 package with the name <tt>org.netbeans.modules.j2ee.myserver.resources</tt>. Click Finish.</ol>

<p> The IDE creates the <tt>My Server Module</tt>
project. The project contains all of your sources and
project metadata, such as the project's Ant build script. The project
opens in the IDE. You can view its logical structure in the Projects window (Ctrl-1) and its
file structure in the Files window (Ctrl-2). For example, the Projects window should now look as follows:

<p><img border="1" src="../../images/tutorials/myserver/projects-window-original.png" alt="original projects window">

<p>For basic information on each of the files created by the New Project wizard, see the 
 <a href="https://platform.netbeans.org/tutorials/quickstart-nbm.html">Introduction to NetBeans Module Development</a>.

<h3 class="tutorial"><a name="specifying"></a>Specifying the Module's Dependencies</h3>

<p>You will need to subclass several classes that belong to NetBeans APIs. 
 Each has to be declared as a module dependency. Use the Project Properties dialog box for this purpose, as shown below.
      <ol>
	<li>In the Projects window, right-click the <tt>My Server Module</tt> project and choose Properties.
 In the Project Properties dialog box, click Libraries.
<p><li>For each of the APIs displayed in the list below, click "Add..." in the Libraries panel, 
 select the name from the Module list, and then click OK to confirm it:

<p align="left"><img src="../../images/tutorials/myserver/libraries-panel.png" alt="Basic Module Configuration panel."></li>
	
<p><li>Click OK to exit the Project Properties dialog box.
<p><li>In the Projects window, double-click Project Metadata and note that the APIs you selected have been
 declared as module dependencies.</li>

      </ol>


      </div>
      <br />

<!-- ===================================================================================== -->

<h2><a name="creatingandgettingtoknowthemainfiles"></a>Creating the Factory Classes</h2>
<p>The implementation classes are implemented by the factories. In this section, you will create and examine each of them:
 <ul>
    <li><a href="#MyDeploymentFactory"><tt>MyDeploymentFactory.java</tt></a>
    <li><a href="#MyJ2eePlatformFactory"><tt>MyJ2eePlatformFactory.java</tt></a>
    <li><a href="#MyOptionalFactory"><tt>MyOptionalFactory.java</tt></a>
    <li><a href="#MyRegistryNodeFactory"><tt>MyRegistryNodeFactory.java</tt></a>
  </ul>	
 
<div class="indent">
<h3 class="tutorial"><a name="MyDeploymentFactory"></a>MyDeploymentFactory.java</h3>


<p>The <tt>MyDeploymentFactory</tt> class is an implementation of <tt><a href="http://java.sun.com/j2ee/1.4/docs/api/javax/enterprise/deploy/spi/factories/DeploymentFactory.html">DeploymentFactory</a></tt>, which produces instances of the <a href="#MyDeploymentManager"><tt>MyDeploymentManager</tt></a> implementation class.</p>
<p>The following are the interesting methods in this class:

<ul>
<p><li><tt><a href="http://java.sun.com/j2ee/1.4/docs/api/javax/enterprise/deploy/spi/factories/DeploymentFactory.html#handlesURI(java.lang.String)">handlesURI()</a>.</tt> Determines whether the given <tt>MyDeploymentFactory</tt> can handle the specifed URI.
<p><li><tt><a href="http://java.sun.com/j2ee/1.4/docs/api/javax/enterprise/deploy/spi/factories/DeploymentFactory.html#getDeploymentManager(java.lang.String,%20java.lang.String,%20java.lang.String)">getDeploymentManager()</a>.</tt> Creates a <tt>connected</tt> <tt>DeploymentManager</tt> instance. This instance provides access
 to J2EE resources.
<p><li><tt><a href="http://java.sun.com/j2ee/1.4/docs/api/javax/enterprise/deploy/spi/factories/DeploymentFactory.html#getDisconnectedDeploymentManager(java.lang.String)">getDisconnectedDeploymentManager()</a>.</tt> Creates a <tt>disconnected</tt> <tt>DeploymentManager</tt> instance. This instance provides
 access to configuration support.
</ul>

<p>Our new server instance will use the <tt>deployer:myserver</tt> prefix so that the URL 
 used to obtain a connected deployment manager looks
like this: <tt>deployer:myserver:localhost:8080</tt>.
<p>Do the following to create the <tt>MyDeploymentFactory</tt> class:

<ol>
<p><li>Right-click the <tt>org.netbeans.modules.j2ee.myserver</tt> node and choose New &gt; File/Folder. Under
 Categories, choose Java Classes. Under File Types, choose Java Class. 
 Click Next and type <tt>MyDeploymentFactory</tt> in Class Name. Click Finish. The new Java class opens in the Source Editor.
<p><li>Replace the default code with the code below:
<pre class="examplecode">package org.netbeans.modules.j2ee.myserver;

import javax.enterprise.deploy.shared.factories.DeploymentFactoryManager;
import javax.enterprise.deploy.spi.DeploymentManager;
import javax.enterprise.deploy.spi.exceptions.DeploymentManagerCreationException;
import javax.enterprise.deploy.spi.factories.DeploymentFactory;
import org.openide.ErrorManager;
import org.openide.util.NbBundle;

public class MyDeploymentFactory implements DeploymentFactory {
    
    public static final String URI_PREFIX = "deployer:myserver"; // NOI18N
    private static DeploymentFactory instance;
    
    public static synchronized DeploymentFactory create() {
        if (instance == null) {
            instance = new MyDeploymentFactory();
            DeploymentFactoryManager.getInstance().registerDeploymentFactory(instance);
        }
        return instance;
    }
    
    public boolean handlesURI(String uri) {
        return uri != null && uri.startsWith(URI_PREFIX);
    }
    
    public DeploymentManager getDeploymentManager(String uri, String uname, String passwd) throws DeploymentManagerCreationException {
        if (!handlesURI(uri)) {
            throw new DeploymentManagerCreationException("Invalid URI:" + uri); // NOI18N
        }
        return new MyDeploymentManager();
    }
    
    public DeploymentManager getDisconnectedDeploymentManager(String uri) throws DeploymentManagerCreationException {
        if (!handlesURI(uri)) {
            throw new DeploymentManagerCreationException("Invalid URI:" + uri); // NOI18N
        }
        return new MyDeploymentManager();
    }
    
    public String getProductVersion() {
        return "0.1"; // NOI18N
    }
    
    public String getDisplayName() {
        return NbBundle.getMessage(MyDeploymentFactory.class, "TXT_DisplayName"); // NOI18N
    }
}</pre>

</ol>
<h3 class="tutorial"><a name="MyJ2eePlatformFactory"></a>MyJ2eePlatformFactory.java</h3>
<p>The <tt>MyJ2eePlatformFactory</tt> class is an implementation of the <tt><a href="https://netbeans.org/download/dev/javadoc/org-netbeans-modules-j2eeserver/org/netbeans/modules/j2ee/deployment/plugins/api/J2eePlatformFactory.html">J2eePlatformFactory</a></tt> class.
The implementation is very simple -- it produces instances of the <a href="#MyJ2eePlatformImpl"><tt>MyJ2eePlatformImpl</tt></a> class.
<p>Do the following to create the <tt>MyJ2eePlatformFactory</tt> class:
<ol>
<p><li>Right-click the <tt>org.netbeans.modules.j2ee.myserver</tt> node, choose New &gt; Java Class,
 and type <tt>MyJ2eePlatformFactory</tt> in Class Name. Click Finish. The new Java class opens in the Source Editor.
<p><li>Replace the default code with the code below:

<pre class="examplecode">package org.netbeans.modules.j2ee.myserver;

import javax.enterprise.deploy.spi.DeploymentManager;
import org.netbeans.modules.j2ee.deployment.plugins.api.J2eePlatformFactory;
import org.netbeans.modules.j2ee.deployment.plugins.api.J2eePlatformImpl;

public class MyJ2eePlatformFactory extends J2eePlatformFactory {    
    public J2eePlatformImpl getJ2eePlatformImpl(DeploymentManager dm) {
        return new MyJ2eePlatformImpl();
    }
}</pre>

</ol>


<h3 class="tutorial"><a name="MyOptionalFactory"></a>MyOptionalFactory.java</h3>


<p>The <tt>MyOptionalFactory</tt> class is an implementation of <tt><a href="https://netbeans.org/download/dev/javadoc/org-netbeans-modules-j2eeserver/org/netbeans/modules/j2ee/deployment/plugins/api/OptionalDeploymentManagerFactory.html">OptionalDeploymentManagerFactory</a></tt>. 
 Despite its name, this factory class is <i>not</i> optional. At least two methods need to be implemented:

<ul>
<p><li><tt><a href="https://netbeans.org/download/dev/javadoc/org-netbeans-modules-j2eeserver/org/netbeans/modules/j2ee/deployment/plugins/api/OptionalDeploymentManagerFactory.html#getStartServer(javax.enterprise.deploy.spi.DeploymentManager)">getStartServer()</a>.</tt> Starts and stops the server.
<p><li><tt><a href="https://netbeans.org/download/dev/javadoc/org-netbeans-modules-j2eeserver/org/netbeans/modules/j2ee/deployment/plugins/api/OptionalDeploymentManagerFactory.html#getAddInstanceIterator()">getAddInstanceIterator()</a>.</tt> Creates the wizard for registering the server in the IDE.
</ul>

<p>The other two methods are not implemented here:
<ul>
<p><li><tt><a href="https://netbeans.org/download/dev/javadoc/org-netbeans-modules-j2eeserver/org/netbeans/modules/j2ee/deployment/plugins/api/OptionalDeploymentManagerFactory.html#getIncrementalDeployment(javax.enterprise.deploy.spi.DeploymentManager)">getIncrementalDeployment()</a>.</tt> Creates <tt>IncrementalDeployment</tt>, which offers an
alternative way, which is more convenient for development..
<p><li><tt><a href="https://netbeans.org/download/dev/javadoc/org-netbeans-modules-j2eeserver/org/netbeans/modules/j2ee/deployment/plugins/api/OptionalDeploymentManagerFactory.html#getFindJSPServlet(javax.enterprise.deploy.spi.DeploymentManager)">getFindJSPServlet()</a>.</tt> Creates <tt>FindJSPServlet</tt>, 
 which lets modules specify the location of servlets generated for JSPs.
</ul>

<p>Do the following to create the MyOptionalFactory class:

<ol>
<p><li>Right-click the <tt>org.netbeans.modules.j2ee.myserver</tt> node, choose New &gt; Java Class,
 and type <tt>MyOptionalFactory</tt> in Class Name. Click Finish. The new Java class opens in the Source Editor.
<p><li>Replace the default code with the code below:
<pre class="examplecode">package org.netbeans.modules.j2ee.myserver;

import javax.enterprise.deploy.spi.DeploymentManager;
import org.netbeans.modules.j2ee.deployment.plugins.api.FindJSPServlet;
import org.netbeans.modules.j2ee.deployment.plugins.api.IncrementalDeployment;
import org.netbeans.modules.j2ee.deployment.plugins.api.OptionalDeploymentManagerFactory;
import org.netbeans.modules.j2ee.deployment.plugins.api.StartServer;
import org.openide.WizardDescriptor.InstantiatingIterator;

public class MyOptionalFactory extends OptionalDeploymentManagerFactory {
    
    public StartServer getStartServer(DeploymentManager dm) {
        return new MyStartServer();
    }

    public IncrementalDeployment getIncrementalDeployment(DeploymentManager dm) {
        return null;
    }

    public FindJSPServlet getFindJSPServlet(DeploymentManager dm) {
        return null;
    }

    public InstantiatingIterator getAddInstanceIterator() {
        return new MyInstantiatingIterator();
    }
}</pre>

</ol>



<h3 class="tutorial"><a name="MyRegistryNodeFactory"></a>MyRegistryNodeFactory.java</h3>

<p>The <tt>MyRegistryNodeFactory</tt> class is an implementation of <tt><a href="https://netbeans.org/download/dev/javadoc/org-netbeans-modules-j2eeserver/org/netbeans/modules/j2ee/deployment/plugins/api/RegistryNodeFactory.html">RegistryNodeFactory</a></tt>. The purpose of this factory is to
  produce server and target nodes, which are used as user interface representations in the Runtime window.
Since the new server type only has one target and its Admin Server is therefore also a target server, 
 you do not need to implement the target node.

<ol>
<p><li>Right-click the <tt>org.netbeans.modules.j2ee.myserver</tt> node, choose New &gt; Java Class,
 and type <tt>MyRegistryNodeFactory</tt> in Class Name. Click Finish. The new Java class opens in the Source Editor.
<p><li>Replace the default code with the code below:
<pre class="examplecode">package org.netbeans.modules.j2ee.myserver.nodes;

import org.netbeans.modules.j2ee.deployment.plugins.api.RegistryNodeFactory;
import org.openide.nodes.Children;
import org.openide.nodes.Node;
import org.openide.util.Lookup;

public class MyRegistryNodeFactory implements RegistryNodeFactory {
    
    public Node getTargetNode(Lookup lookup) {
        return null;
    }
    
    public Node getManagerNode(Lookup lookup) {
        return new MyInstanceNode(lookup);
    }    
}</pre>


</ol>


      </div>
<br />

<!-- ===================================================================================== -->

<h2><a name="creatingandgettingtoknowthemainfiles"></a>Creating the Implementation Classes</h2>
<p>The implementation classes are implemented by the factories. In this section, you will create and examine each of them:
 <ul>
    <li><a href="#ConfigurationSupportImpl"><tt>ConfigurationSupportImpl.java</tt></a>
    <li><a href="#MyConfiguration"><tt>MyConfiguration.java</tt></a>
    <li><a href="#MyDeploymentManager"><tt>MyDeploymentManager.java</tt></a>
    <li><a href="#MyInstantiatingIterator"><tt>MyInstantiatingIterator.java</tt></a>
    <li><a href="#MyJ2eePlatformImpl"><tt>MyJ2eePlatformImpl.java</tt></a>
    <li><a href="#MyStartServer"><tt>MyStartServer.java</tt></a>
    <li><a href="#MyInstanceNode"><tt>MyInstanceNode.java</tt></a>
  </ul>	
 
<div class="indent">

<h3 class="tutorial"><a name="ConfigurationSupportImpl"></a>ConfigurationSupportImpl.java</h3>

<p>An implementation of the NetBeans API's <a href="https://netbeans.org/download/dev/javadoc/org-netbeans-modules-j2eeserver/org/netbeans/modules/j2ee/deployment/plugins/api/ConfigurationSupport.html">ConfigurationSupport</a>
interface. This class is the NetBeans extension of the <a href="http://java.sun.com/j2ee/1.4/docs/api/javax/enterprise/deploy/spi/DeploymentConfiguration.html">DeploymentConfiguration</a> interface, which is a J2EE API class and 
therefore could not be changed. This extension adds life cycle management and additional module change 
notifications support.

<ol>
<p><li>Right-click the <tt>org.netbeans.modules.j2ee.myserver</tt> node, choose New &gt; Java Class,
 and type <tt>ConfigurationSupportImpl</tt> in Class Name. Click Finish. The new Java class opens in the Source Editor.

<p><li>Replace the default code with the code below:

<pre class="examplecode">
package org.netbeans.modules.j2ee.myserver;

import java.io.File;
import javax.enterprise.deploy.model.DDBean;
import javax.enterprise.deploy.model.DeployableObject;
import javax.enterprise.deploy.spi.DeploymentConfiguration;
import javax.enterprise.deploy.spi.exceptions.ConfigurationException;
import org.netbeans.modules.j2ee.deployment.common.api.OriginalCMPMapping;
import org.netbeans.modules.j2ee.deployment.plugins.api.ConfigurationSupport;


public class ConfigurationSupportImpl extends ConfigurationSupport {

    public void setMappingInfo(DeploymentConfiguration config, OriginalCMPMapping[] mappings) {
    }

    public void ensureResourceDefined(DeploymentConfiguration config, DDBean bean) {
    }

    public String getWebContextRoot(DeploymentConfiguration config, DeployableObject deplObj) 
    throws ConfigurationException {
        return ((MyConfiguration)config).getContextPath();
    }

    public void setWebContextRoot(DeploymentConfiguration config, DeployableObject deplObj, String contextRoot) 
    throws ConfigurationException {
        ((MyConfiguration)config).setContextPath(contextRoot);
    }
    
    public void initConfiguration(DeploymentConfiguration config, File[] files,
            File resourceDir, boolean keepUpdated) throws ConfigurationException {
        ((MyConfiguration)config).init(files[0]);
    }
    
    public void disposeConfiguration(DeploymentConfiguration config) {
    }
    
    public void updateResourceDir(DeploymentConfiguration config, File resourceDir) {
    }
}</pre>
</ol><p>

    <h3 class="tutorial"><a name="MyConfiguration"></a>MyConfiguration.java</h3>

<p>An implementation of the <a href="http://java.sun.com/j2ee/1.4/docs/api/javax/enterprise/deploy/spi/DeploymentConfiguration.html">DeploymentConfiguration</a> interface.
The purpose of this class is to provide support for server-specific configuration, in other words, it relates to deployment descriptors. 

<p><b>Note:</b> The previous versions of the j2eeserver API 
required plug-ins to use the <tt>DConfigBean</tt> based model for s
erver specific-deployment descriptor representations; this is not needed anymore. 
Plug-ins are now allowed to use any model representation they want, typically a schema2beans-based model, a
nd are also in charge of saving and loading the deployment configuration. Because of the redesign, 
the following <tt>DeploymentConfiguration</tt> methods are no longer used: <tt>getDConfigBeanRoot()</tt>, 
<tt>removeDConfigBean()</tt>, <tt>restore()</tt>, <tt>restoreDConfigBean()</tt>, and
<tt>saveDConfigBean()</tt>. On the other hand, new methods were added through the <tt>ConfigurationSupport</tt> interface. 

<ol>
<p><li>Right-click the <tt>org.netbeans.modules.j2ee.myserver</tt> node, choose New &gt; Java Class,
 and type <tt>MyConfiguration</tt> in Class Name. Click Finish. The new Java class opens in the Source Editor.

<p><li>Replace the default code with the code below:

<pre class="examplecode">
package org.netbeans.modules.j2ee.myserver;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import javax.enterprise.deploy.model.DDBean;
import javax.enterprise.deploy.model.DDBeanRoot;
import javax.enterprise.deploy.model.DeployableObject;
import javax.enterprise.deploy.model.XpathEvent;
import javax.enterprise.deploy.model.XpathListener;
import javax.enterprise.deploy.spi.DConfigBeanRoot;
import javax.enterprise.deploy.spi.DeploymentConfiguration;
import javax.enterprise.deploy.spi.exceptions.BeanNotFoundException;
import javax.enterprise.deploy.spi.exceptions.ConfigurationException;
import org.openide.ErrorManager;
import org.openide.filesystems.FileLock;
import org.openide.filesystems.FileObject;
import org.openide.filesystems.FileUtil;


public class MyConfiguration implements DeploymentConfiguration, XpathListener {
    
    private DeployableObject deplObj;
    
    public MyConfiguration (DeployableObject deplObj) {
        this.deplObj = deplObj;
    }
    
    public void init(File file) {
        try {
            FileObject folder = FileUtil.toFileObject(file.getParentFile());
            if (folder == null) {
                ErrorManager.getDefault().log(ErrorManager.INFORMATIONAL, "The parent folder does not exist!"); // NOI18N
                return;
            }
            PrintWriter pw = null;
            FileLock lock = null;
            try {
                String name = file.getName();
                FileObject fo = folder.getFileObject(name);
                if (fo == null) {
                    fo = folder.createData(name);
                }
                lock = fo.lock();
                pw = new PrintWriter(new OutputStreamWriter(fo.getOutputStream(lock)));
                pw.println("&lt;MyServer path=\"/mypath\"/&gt;"); // NOI18N
            } finally {
                if (pw != null) {
                    pw.close();
                }
                if (lock != null) {
                    lock.releaseLock();
                }
            }
        } catch (IOException ex) {
            ErrorManager.getDefault().notify(ErrorManager.INFORMATIONAL, ex);
        }
        
        // web.xml represented as DDBean model
        DDBeanRoot root = deplObj.getDDBeanRoot();
        if (root != null) {
            // here we will listen to resource reference changes
            root.addXpathListener("/web-app/resource-ref", this); // NOI18N
        }
    }
    
    public String getContextPath() throws ConfigurationException {
        // TODO: replace this with reading the context path from the server specific DD
        return "/mypath";
    }
    
    public void setContextPath(String contextPath) throws ConfigurationException {
        // TODO: here put the code that will store the context path in the server specific DD
    }
        
    // XpathListener implementation -------------------------------------------
    
    public void fireXpathEvent(XpathEvent xpe) {
        DDBean eventDDBean = xpe.getBean();
        if ("/web-app/resource-ref".equals(eventDDBean.getXpath())) { // NIO18N
            // new resource reference added
            if (xpe.isAddEvent()) {
                String[] name = eventDDBean.getText("res-ref-name"); // NOI18N
                String[] type = eventDDBean.getText("res-type");     // NOI18N
                String[] auth = eventDDBean.getText("res-auth");     // NOI18N
                // TODO: take appropriate steps here
            }
        }
    }
    
    // JSR-88 methods ---------------------------------------------------------
    
    public DeployableObject getDeployableObject () {
        return deplObj;
    }
    
    public void save(OutputStream os) throws ConfigurationException {   
    }
    
    public DConfigBeanRoot getDConfigBeanRoot (DDBeanRoot dDBeanRoot) 
    throws ConfigurationException {
        return null;
    }
    
    public void removeDConfigBean (DConfigBeanRoot dConfigBeanRoot) 
    throws BeanNotFoundException {
    }
    
    public void restore (InputStream is) 
    throws ConfigurationException {
    }
    
    public DConfigBeanRoot restoreDConfigBean (InputStream is, DDBeanRoot dDBeanRoot) 
    throws ConfigurationException {
        return null;
    }
    
    public void saveDConfigBean (OutputStream os, DConfigBeanRoot dConfigBeanRoot) 
    throws ConfigurationException {
    }
}</pre>
</ol><p>

    
    
<h3 class="tutorial"><a name="MyDeploymentManager"></a>MyDeploymentManager.java</h3>

<p>A dummy implementation of the <tt><a href="http://java.sun.com/j2ee/1.4/docs/api/javax/enterprise/deploy/spi/DeploymentManager.html">DeploymentManager</a></tt> interface, which does nothing
 more than return <a href="#MyConfiguration"><tt>MyConfiguration.java</tt></a>.
 It is up to you to provide other server-specific implementation features.

<ol>
<p><li>Right-click the <tt>org.netbeans.modules.j2ee.myserver</tt> node and choose New &gt; File/Folder. Under
 Categories, choose Java Classes. Under File Types, choose Java Class. 
 Click Next and type <tt>MyDeploymentManager</tt> in Class Name. Click Finish. The new Java class opens in the Source Editor.

<p><li>Replace the default code with the code below:

<pre class="examplecode">package org.netbeans.modules.j2ee.myserver;

import java.io.File;
import java.io.InputStream;
import javax.enterprise.deploy.model.DeployableObject;
import javax.enterprise.deploy.shared.DConfigBeanVersionType;
import javax.enterprise.deploy.shared.ModuleType;
import javax.enterprise.deploy.spi.DeploymentConfiguration;
import javax.enterprise.deploy.spi.DeploymentManager;
import javax.enterprise.deploy.spi.Target;
import javax.enterprise.deploy.spi.TargetModuleID;
import javax.enterprise.deploy.spi.exceptions.DConfigBeanVersionUnsupportedException;
import javax.enterprise.deploy.spi.exceptions.InvalidModuleException;
import javax.enterprise.deploy.spi.exceptions.TargetException;
import javax.enterprise.deploy.spi.status.ProgressObject;

public class MyDeploymentManager implements DeploymentManager {
    
    public ProgressObject <span class="java-layer-method">distribute(Target[] target, File file, File file2) 
       throws IllegalStateException {
        return null;
    }

    public DeploymentConfiguration <span class="java-layer-method">createConfiguration(DeployableObject deployableObject) 
        throws InvalidModuleException {
        return new <a href="#MyConfiguration"><tt>MyConfiguration</tt></a>(deployableObject);
    }

    public ProgressObject <span class="java-layer-method">redeploy(TargetModuleID[] targetModuleID, InputStream inputStream, InputStream inputStream2) 
        throws UnsupportedOperationException, IllegalStateException {
        return null;
    }

    public ProgressObject <span class="java-layer-method">distribute(Target[] target, InputStream inputStream, InputStream inputStream2) 
        throws IllegalStateException {
        return null;
    }

    public ProgressObject <span class="java-layer-method">undeploy(TargetModuleID[] targetModuleID) throws IllegalStateException {
        return null;
    }

    public ProgressObject <span class="java-layer-method">stop(TargetModuleID[] targetModuleID) throws IllegalStateException {
        return null;
    }

    public ProgressObject <span class="java-layer-method">start(TargetModuleID[] targetModuleID) throws IllegalStateException {
        return null;
    }

    public void <span class="java-layer-method">setLocale(java.util.Locale locale) throws UnsupportedOperationException {
    }

    public boolean <span class="java-layer-method">isLocaleSupported(java.util.Locale locale) {
        return false;
    }

    public TargetModuleID[] <span class="java-layer-method">getAvailableModules(ModuleType moduleType, Target[] target) 
        throws TargetException, IllegalStateException {
        return null;
    }

    public TargetModuleID[] <span class="java-layer-method">getNonRunningModules(ModuleType moduleType, Target[] target) 
        throws TargetException, IllegalStateException {
        return null;
    }

    public TargetModuleID[] <span class="java-layer-method">getRunningModules(ModuleType moduleType, Target[] target) 
        throws TargetException, IllegalStateException {
        return null;
    }

    public ProgressObject <span class="java-layer-method">redeploy(TargetModuleID[] targetModuleID, File file, File file2) 
        throws UnsupportedOperationException, IllegalStateException {
        return null;
    }

    public void <span class="java-layer-method">setDConfigBeanVersion(DConfigBeanVersionType dConfigBeanVersionType) 
        throws DConfigBeanVersionUnsupportedException {
    }

    public boolean <span class="java-layer-method">isDConfigBeanVersionSupported(DConfigBeanVersionType dConfigBeanVersionType) {
        return false;
    }

    public void <span class="java-layer-method">release() {
    }

    public boolean <span class="java-layer-method">isRedeploySupported() {
        return false;
    }

    public java.util.Locale <span class="java-layer-method">getCurrentLocale() {
        return null;
    }

    public DConfigBeanVersionType <span class="java-layer-method">getDConfigBeanVersion() {
        return null;
    }

    public java.util.Locale <span class="java-layer-method">getDefaultLocale() {
        return null;
    }

    public java.util.Locale[] <span class="java-layer-method">getSupportedLocales() {
        return null;
    }

    public Target[] <span class="java-layer-method">getTargets() throws IllegalStateException {
        return null;
    }
}</pre>

</ol>


<h3 class="tutorial"><a name="MyInstantiatingIterator"></a>MyInstantiatingIterator.java</h3>

<p>The <tt>MyInstantiatingIterator</tt> class is used to create a wizard for registration of the new server in the IDE. 
The implementation described below lets you specify the display name only. Here, all the
 other properties are hard coded to keep the 
implementation as simple as possible.

<p>Notice the URL variable used in the <tt>instantiate()</tt> method. It is passed to the <tt>InstanceProperties.createInstanceProperties()</tt> method, 
which does the actual server registration. The URL parameter is the same as the one used by the <tt>DeploymenManager</tt>. 
 This way we ensure that our server controls the newly created server instance. 


<ol>
<p><li>Right-click the <tt>org.netbeans.modules.j2ee.myserver</tt> node, choose New &gt; Java Class,
 and type <tt>MyInstantiatingIterator</tt> in Class Name. Click Finish. The new Java class opens in the Source Editor.
<p><li>Replace the default code with the code below:
<pre class="examplecode">package org.netbeans.modules.j2ee.myserver;

import java.awt.Component;
import java.awt.Label;
import java.io.IOException;
import java.util.HashSet;
import java.util.Set;
import javax.swing.JPanel;
import javax.swing.event.ChangeListener;
import org.openide.WizardDescriptor;
import org.openide.WizardDescriptor.Panel;
import org.openide.util.HelpCtx;
import org.netbeans.modules.j2ee.deployment.plugins.api.InstanceProperties;
import org.openide.DialogDisplayer;
import org.openide.ErrorManager;
import org.openide.NotifyDescriptor;
import org.openide.util.NbBundle;


public class MyInstantiatingIterator implements WizardDescriptor.InstantiatingIterator {
    
    private final static String PROP_DISPLAY_NAME = "ServInstWizard_displayName"; // NOI18N

        
    private InstallPanel panel;
    private WizardDescriptor wizard;
    
    public void removeChangeListener(ChangeListener l) {
    }

    public void addChangeListener(ChangeListener l) {
    }

    public void uninitialize(WizardDescriptor wizard) {
    }

    public void initialize(WizardDescriptor wizard) {
        this.wizard = wizard;
    }

    public void previousPanel() {
    }

    public void nextPanel() {
    }

    public String name() {
        return NbBundle.getMessage(MyInstantiatingIterator.class, "MSG_InstallerName");
    }

    public Set instantiate() throws IOException {
           Set result = new HashSet();       
           String displayName = getDisplayName();
           String url         = "deployer:myserver:localhost:8080"; // NOI18N
           String username    = "username"; // NOI18N
           String password    = "password"; // NOI18N
           try {
               InstanceProperties ip = InstanceProperties.createInstanceProperties(
                       url, username, password, displayName);
               result.add(ip);
           } catch (Exception ex) {
               DialogDisplayer.getDefault().notify(new NotifyDescriptor.Message(
                        NbBundle.getMessage(MyInstantiatingIterator.class, "MSG_CreateFailed", displayName),
                        NotifyDescriptor.ERROR_MESSAGE));
           }
           return result;
    }

    public boolean hasPrevious() {
        return false;
    }

    public boolean hasNext() {
        return false;
    }

    public Panel current() {
        if (panel == null) {
            panel = new InstallPanel();
        }
        return panel;
    }
    
    private String getDisplayName() {
        return (String)wizard.getProperty(PROP_DISPLAY_NAME);
    }
    
    private static class InstallPanel implements WizardDescriptor.Panel {
        public void removeChangeListener(ChangeListener l) {
        }

        public void addChangeListener(ChangeListener l) {
        }

        public void storeSettings(Object settings) {
        }

        public void readSettings(Object settings) {
        }

        public boolean isValid() {
            return true;
        }

        public HelpCtx getHelp() {
            return HelpCtx.DEFAULT_HELP;
        }

        public Component getComponent() {
            JPanel panel = new JPanel();
            panel.add(new Label("&lt; Put your installation form implementation here! &gt;")); // NOI18N
            return panel;
        }
    }
}
</ol><p>



<h3 class="tutorial"><a name="MyJ2eePlatformImpl"></a>MyJ2eePlatformImpl.java</h3>

<p>The <tt>MyJ2eePlatformImpl</tt> class is an implementation of <tt><a href="https://netbeans.org/download/dev/javadoc/org-netbeans-modules-j2eeserver/org/netbeans/modules/j2ee/deployment/plugins/api/J2eePlatformImpl.html">J2eePlatformImpl</a></tt>, which is used to describe the target environment that
 J2EE applications are built against and subsequently deployed to. It provides a set of server 
libraries, supported module types, and J2EE specification versions. 

<p>Note: Since the current implementation of <tt>MyJ2eePlatformImpl.java</tt> does not provide the J2EE API libraries, 
 your Web or EJB project will not compile, unless you provide those explicitly in the Libraries panel of the Project Properties dialog box.

<ol>
<p><li>Right-click the <tt>org.netbeans.modules.j2ee.myserver</tt> node, choose New &gt; Java Class,
 and type <tt>MyJ2eePlatformImpl</tt> in Class Name. Click Finish. The new Java class opens in the Source Editor.
<p><li>Replace the default code with the code below:

<pre class="examplecode">package org.netbeans.modules.j2ee.myserver;

import java.io.File;
import java.util.HashSet;
import java.util.Set;
import org.netbeans.api.java.platform.JavaPlatform;
import org.netbeans.api.java.platform.JavaPlatformManager;
import org.netbeans.modules.j2ee.deployment.devmodules.api.J2eeModule;
import org.netbeans.modules.j2ee.deployment.plugins.api.J2eePlatformImpl;
import org.netbeans.spi.project.libraries.LibraryImplementation;

import org.openide.util.NbBundle;
import org.openide.util.Utilities;

public class MyJ2eePlatformImpl extends J2eePlatformImpl {
        
    public boolean isToolSupported(String toolName) {
        return false;
    }

    public File[] getToolClasspathEntries(String toolName) {
        return new File[0];
    }

    public Set getSupportedSpecVersions() {
        Set result = new HashSet();
        result.add(J2eeModule.J2EE_14);
        //result.add(J2eeModule.JAVA_EE_5);
        return result;
    }

    public java.util.Set getSupportedModuleTypes() {
        Set result = new HashSet();
        result.add(J2eeModule.EAR);
        result.add(J2eeModule.WAR);
        result.add(J2eeModule.EJB);
        return result;
    }

    public java.io.File[] getPlatformRoots() {
        return new File[0];
    }

    public LibraryImplementation[] getLibraries() {
        return new LibraryImplementation[0];
    }

    public java.awt.Image getIcon() {
        return Utilities.loadImage("org/netbeans/modules/j2ee/myserver/resources/server.gif"); // NOI18N

    }

    public String getDisplayName() {
        return NbBundle.getMessage(MyJ2eePlatformImpl.class, "MSG_MyServerPlatform");
    }
    
    public Set getSupportedJavaPlatformVersions() {
        Set versions = new HashSet();
        versions.add("1.4"); // NOI18N
        versions.add("1.5"); // NOI18N
        return versions;
    }
    
    public JavaPlatform getJavaPlatform() {
        return JavaPlatformManager.getDefault().getDefaultPlatform();
    }
    
}</pre>


</ol>




<h3 class="tutorial"><a name="MyStartServer"></a>MyStartServer.java</h3>


<p>The <tt>MyStartServer</tt> class is an implementation of the <tt><a href="https://netbeans.org/download/dev/javadoc/org-netbeans-modules-j2eeserver/org/netbeans/modules/j2ee/deployment/plugins/api/StartServer.html">StartServer</a></tt> interface. Its purpose is to provide ability to start, 
 stop, and determine the state of the server. The current implementation says that the server is always stopped and it cannot be started. 
 The server-specific implementation is left up to you to complete for the server in question.

<ol>
<p><li>Right-click the <tt>org.netbeans.modules.j2ee.myserver</tt> node, choose New &gt; Java Class,
 and type <tt>MyStartServer</tt> in Class Name. Click Finish. The new Java class opens in the Source Editor.
<p><li>Replace the default code with the code below:

<pre class="examplecode">package org.netbeans.modules.j2ee.myserver;

import javax.enterprise.deploy.spi.Target;
import javax.enterprise.deploy.spi.status.ProgressObject;
import org.netbeans.modules.j2ee.deployment.plugins.api.ServerDebugInfo;
import org.netbeans.modules.j2ee.deployment.plugins.api.StartServer;

public class MyStartServer extends StartServer {
    
    public ProgressObject <span class="java-layer-method">startDebugging(Target target) {
        return null;
    }

    public boolean <span class="java-layer-method">isDebuggable(Target target) {
        return false;
    }

    public boolean <span class="java-layer-method">isAlsoTargetServer(Target target) {
        return true;
    }

    public ServerDebugInfo <span class="java-layer-method">getDebugInfo(Target target) {
        return null;
    }

    public boolean <span class="java-layer-method">supportsStartDeploymentManager() {
        return false;
    }

    public ProgressObject <span class="java-layer-method">stopDeploymentManager() {
        return null;
    }

    public ProgressObject <span class="java-layer-method">startDeploymentManager() {
        return null;
    }

    public boolean <span class="java-layer-method">needsStartForTargetList() {
        return false;
    }

    public boolean <span class="java-layer-method">needsStartForConfigure() {
        return false;
    }

    public boolean <span class="java-layer-method">needsStartForAdminConfig() {
        return false;
    }

    public boolean <span class="java-layer-method">isRunning() {
        return false;
    }
}</pre>

</ol><p>

<h3 class="tutorial"><a name="MyInstanceNode"></a>MyInstanceNode.java</h3>

<p>The <tt>MyInstanceNode</tt> class represents instances of the new server type as a node in the Runtime window. 
 A default set of features is added to the node -- these features display the server's status and provide default menu items
 such as <tt>Start</tt>, <tt>Refresh</tt>, and <tt>Remove</tt>. This is done by a standard filter node 
 that exists on top of the node provided by the module. The <tt>MyInstanceNode</tt> class defines a dummy customizer 
 implementation which is displayed in the Tools menu's Server Manager.

<ol>
<p><li>Right-click the <tt>org.netbeans.modules.j2ee.myserver.nodes</tt> node, choose New &gt; Java Class,
 and type <tt>MyInstanceNode</tt> in Class Name. Click Finish. The new Java class opens in the Source Editor.
<p><li>Replace the default code with the code below:

<pre class="examplecode">package org.netbeans.modules.j2ee.myserver.nodes;

import java.awt.Component;
import java.awt.Label;
import javax.swing.JPanel;
import org.openide.nodes.AbstractNode;
import org.openide.nodes.Children;
import org.openide.nodes.Node;
import org.openide.util.Lookup;
import org.openide.util.NbBundle;

public class MyInstanceNode extends AbstractNode implements Node.Cookie {
    
    private static String ICON_BASE = "org/netbeans/modules/j2ee/myserver/resources/server.gif"; <span class="java-block-comment">// NOI18N
    
    public MyInstanceNode(Lookup lookup) {
        super(new Children.Array());
        getCookieSet().add(this);
        setIconBaseWithExtension(ICON_BASE);
    }
    
    public String getDisplayName() {
        return NbBundle.getMessage(MyInstanceNode.class, "TXT_MyInstanceNode");
    }
    
    public String getShortDescription() {
        return "http://localhost:8080"; // NOI18N
    }
    
    public javax.swing.Action[] getActions(boolean context) {
        return new javax.swing.Action[]{};
    }
    
    public boolean hasCustomizer() {
        return true;
    }
    
    public Component getCustomizer() {
        JPanel panel = new JPanel();
        panel.add(new Label("&lt; Put your customizer implementation here! &gt;")); <span class="java-block-comment">// NOI18N
        return panel;
    }
}</pre>




</ol>

      </div>
<br />

<!-- ===================================================================================== -->

<h2><a name="finetuning"></a>Setting Up the Supporting Files</h2>
<p>Once you have coded the main files, you must register your module in the <tt>layer.xml</tt> file and in the
 <tt>nbdep.xml</tt> file. You must also define labels and texts you want to display to the user, using
 the <tt>Bundle.properties</tt> files.</p>
<div class="indent">

<h3 class="tutorial">Registering the New Server in the NetBeans Filesystem</h3>

<ol><a name="layer.xml"></a><li>Add the following entry between the <tt>&lt;filesystem&gt;</tt> tags in the <tt>layer.xml</tt> file:

<pre class="examplecode">    &lt;folder name="J2EE"&gt;
        &lt;folder name="DeploymentPlugins"&gt;
	    &lt;folder name="MyServer"&gt;

                &lt;file name="Descriptor" url="nbdep.xml"/&gt;

                &lt;file name="Factory.instance"&gt;
                    &lt;attr name="instanceCreate" methodvalue="org.netbeans.modules.j2ee.myserver.MyDeploymentFactory.create"/&gt;
                    &lt;attr name="instanceClass" stringvalue="<a href="#MyDeploymentFactory">org.netbeans.modules.j2ee.myserver.MyDeploymentFactory</a>"/&gt;
                    &lt;attr name="instanceOf" stringvalue="javax.enterprise.deploy.spi.factories.DeploymentFactory"/&gt;
		&lt;/file&gt;

                &lt;file name="RegistryNodeFactory.instance"&gt;
                    &lt;attr name="instanceClass" stringvalue="<a href="#MyRegistryNodeFactory">org.netbeans.modules.j2ee.myserver.nodes.MyRegistryNodeFactory</a>"/&gt;
                    &lt;attr name="instanceOf" stringvalue="org.netbeans.modules.j2ee.deployment.plugins.api.RegistryNodeFactory"/&gt;
		&lt;/file&gt;

                &lt;file name="J2eePlatformFactory.instance"&gt;
                    &lt;attr name="instanceCreate" newvalue="org.netbeans.modules.j2ee.myserver.MyJ2eePlatformFactory"/&gt;
                    &lt;attr name="instanceClass" stringvalue="<a href="#MyJ2eePlatformFactory">org.netbeans.modules.j2ee.myserver.MyJ2eePlatformFactory</a>"/&gt;
                    &lt;attr name="instanceOf" stringvalue="org.netbeans.modules.j2ee.deployment.plugins.api.J2eePlatformFactory"/&gt;
		&lt;/file&gt;

                &lt;file name="OptionalFactory.instance"&gt;
                    &lt;attr name="instanceCreate" newvalue="org.netbeans.modules.j2ee.myserver.MyOptionalFactory"/&gt;
                    &lt;attr name="instanceClass" stringvalue="<a href="#MyOptionalFactory">org.netbeans.modules.j2ee.myserver.MyOptionalFactory</a>"/&gt;
                    &lt;attr name="instanceOf" stringvalue="org.netbeans.modules.j2ee.deployment.plugins.api.OptionalDeploymentManagerFactory"/&gt;
		&lt;/file&gt;

                &lt;file name="ConfigurationSupportImpl.instance"&gt;
                    &lt;attr name="instanceCreate" newvalue="<a href="#ConfigurationSupportImpl">org.netbeans.modules.j2ee.myserver.ConfigurationSupportImpl</a>"/&gt;
                    &lt;attr name="instanceOf" stringvalue="org.netbeans.modules.j2ee.deployment.plugins.api.ConfigurationSupport"/&gt;
		&lt;/file&gt;
                
                &lt;folder name="DeploymentFileNames"&gt;
                     &lt;folder name="WAR"&gt;
                         &lt;file name="WEB-INF\myserver-web.xml"/&gt;
                     &lt;/folder&gt;
	        &lt;/folder&gt;

            &lt;/folder&gt;
	&lt;/folder&gt;

    &lt;/folder&gt;</pre>
<a name="nbdep.xml"></a><li>Right-click <tt>org.netbeans.modules.j2ee.myserver.resources</tt> and choose New &gt; File/Folder. Under categories,
 select XML. Under File Types, select XML Document. Click Next. Type <tt>nbdep</tt> in File Name, click Next and then
 click Finish. Replace the content of <tt>nbdep.xml</tt> with the following code: 

<pre class="examplecode">    &lt;netbeans-deployment&gt;
   
        &lt;!--
        The icon element contains a path to the icon to be used to present the server
        in the server registry.
        --&gt;
        &lt;icon&gt;org/netbeans/modules/j2ee/myserver/resources/server&lt;/icon&gt;
   
        &lt;!--
        The disconnected-string element contains the String parameter to DeploymentFactory.getDisconnectedDeploymentManager()
        --&gt;
        &lt;disconnected-string&gt;deployer:myserver&lt;/disconnected-string&gt;

        &lt;!--
        The container-limitation element modifies a plugin to say that not all j2ee deployments are valid.
        For example, a web-only server would include
        &lt;container-limitation&gt; &lt;war-deploy/&gt; &lt;/container-limitation&gt;
        to indicate that only war deployments are accepted.
        If a container-limitation element is not present, all j2ee deployments are assumed valid.
        If a container-limitation element is present, then only j2ee deployment types explicitly
        mentioned are allowed.
        --&gt;
        &lt;container-limitation&gt;
          &lt;ear-deploy/&gt;
          &lt;war-deploy/&gt;
          &lt;ejbjar-deploy/&gt;
        &lt;/container-limitation&gt;

        &lt;web-context-root&gt;
          &lt;xpath&gt;/&lt;/xpath&gt;
          &lt;prop-name&gt;contextRoot&lt;/prop-name&gt;
        &lt;/web-context-root&gt;
    
    &lt;/netbeans-deployment&gt;</pre></ol>


<a name="Bundle.properties"></a><h3 class="tutorial">Localizing the module</h3>
<p>The module is localized using <tt>Bundle.properties</tt> files. 
A <tt>Bundle.properties</tt> file provides
 language-specific strings for the user interface provided by other files in the package. When you used the New Project wizard
 to create the module, the IDE created a <tt>Bundle.properties</tt> file in the 
  <tt>org.netbeans.modules.j2ee.myserver.resources</tt> package. Now you will add <tt>key=value</tt> pairs
 to the IDE-generated <tt>Bundle.properties</tt> file and create two additional <tt>Bundle.properties</tt> files
 for the other packages.
<ol><li>In <tt>org.netbeans.modules.j2ee.myserver.resources</tt>, 
add the following properties to the <tt>Bundle.properties</tt> file:

<pre class="examplecode">OpenIDE-Module-Name=My Server Module
OpenIDE-Module-Display-Category=J2EE
OpenIDE-Module-Short-Description=My Server Module
OpenIDE-Module-Long-Description=My Server Module</pre>

<li>Right-click <tt>org.netbeans.modules.j2ee.myserver</tt> and choose New &gt; File/Folder. Under Categories,
 select Other. Under File Types, select Properties File. Click Next. Type <tt>Bundle</tt> in File Name and then
 click Finish. Add the following properties to the <tt>Bundle.properties</tt> file:

<pre class="examplecode">TXT_DisplayName=My Server
MSG_InstallerName=My Server Installer
MSG_CreateFailed=Cannot create {0} server instance.
MSG_MyServerPlatform=My Server Platform</pre>

<li>Create another <tt>Bundle.properties</tt> file in the <tt>org.netbeans.modules.j2ee.myserver.nodes</tt> package, and 
add the following properties to it:

<pre class="examplecode">TXT_MyInstanceNode=My Server Instance
TXT_MyTargetNode=My Target Instance</pre>


</ol>

<a name="server.gif"></a><h3 class="tutorial">Getting the Icon</h3>

<p>Make sure that you have a 16x16 icon
 named <tt>server.gif</tt> in the <tt>org.netbeans.modules.j2ee.myserver.resources</tt> package. 
For example, you can find some 16x16 icons at the following location
 within the IDE's installation directory:

<pre class="examplecode">enterprise3\jakarta-tomcat-5.5.17\server\webapps\admin\images</pre>


      </div>
      <br />
<!-- ======================================================================================= -->

<h2><a name="building"></a>Building and Installing the Module</h2>
<p>The IDE uses an Ant build script to build and install your module. The build script is created for you
when you create the module project.</p>
<div class="indent">
	<h3 class="tutorial">Installing the Server-Skeleton Module</h3>

      <ul>
	      <li>In the Projects window, right-click the <tt>My Server Module</tt> project and choose Install/Reload
	      in Target Platform. 
	      <p>The module is built and installed in the target IDE or Platform. The target IDE or Platform opens so that you
	      can try out your new module. The default target IDE or Platform is the 
	      installation used by the current instance of the development IDE. Note that when you run your module, you will be using 
 a temporary test user directory, not the development IDE's user directory. 
       </ul>

       <h3 class="tutorial">Using the Server-Skeleton Module</h3>

	<ol>

<li>Choose Tools &gt; Server Manager, click Add Server and notice that a new server is available:
<p><img src="../../images/tutorials/myserver/choose-server.png" alt="Choose my server.">
</p><p></p></li>

		
	      <li>Use the module as described in <a href="#introducing-sample">Introducing the Sample</a>.
      </ol>
 
   </div>

<!-- ======================================================================================== -->

<h2><a name="addingserverspecific"></a>Adding Server-Specific Code</h2>

<p>Before adding server-specific code, have a look at how others have done it.
  <ol>
	  <p><li>Download the open-source server modules for JBoss, WebLogic, and WebSphere, following the instructions found
	   on the <a href="http://serverplugins.netbeans.org/">Server Plugins Project</a> page.</li>
	   <p><li>Open the sources of one or more of the downloaded server modules in the IDE and browse through them. For example,
	   if you open the sources of the JBoss module, the Projects window looks as follows:
	   <p><img src="../../images/tutorials/myserver/jboss-server.png" alt="JBoss server in Projects window.">
	   <p>Note that in the illustration above, the selected files are those that are discussed in this tutorial.
	   </li>
	   <p><li>Examine the sources, using this tutorial and the <a href="https://netbeans.org/download/dev/javadoc/">NetBeans API List (Current Development Version)</a> to help you.</li>
	   
           <p>Here are some j2eeserver API classes worth looking at:
           
           <p><ul><li><b>IncrementalDeployment.</b> 
            This interface allows modules to use 
            incremental deployment instead of the standard JSR-88 deployment.
            <li><b>UISupport.</b> 
            This class provides support for showing the server 
            output in the Output window along with the toolbar 
            with the server state management actions.</ul>
           
           <p><li>Create your own server module!
  
  </ol>
    
   
<!-- ======================================================================================== -->

<h2><a name="nextsteps"></a>Next Steps</h2>

<p>For more information about creating and developing NetBeans modules, see the following resources: 
  <ul>
	  <p><li><a href="https://platform.netbeans.org/tutorials.html">Tutorials</a></li>
	  <p><li><a href="https://netbeans.org/download/dev/javadoc/">NetBeans API List (Current Development Version)</a></li>
</ul>
  </p>
  


<!-- ======================================================================================== -->

<h2><a name="version"></a>Versioning and Known Issues in this Tutorial</h2>
  
<p>

<table width="76%" border="1">
 <tbody>
   <tr>
      <td>
        <div align="left"><b>Version</b></div>
      </td>
      <td>
	<div align="left"><b>Date</b></div>
      </td>
      <td>
	<div align="left"><b>Changes</b></div>
      </td>
  </tr>
  <tr>
      <td>
         1
      </td>
      <td>
         25 June 2005
      </td>
      <td>
         Initial version
      </td>
  </tr>
    <tr>
      <td>
         2
      </td>
      <td>
         4 July 2006
      </td>
      <td>
         Updated for NetBeans IDE 5.5, using diff from Stepan Herold.
         Also: changed the download to the new module,
         changed all screenshots, changed instances of "plugin" and "plug-in", where
         relevant to "module", cleaned up a lot. <p>Following files are new or have undergone change
         for 5.5:
         <ul>
             <li>New: ConfigurationSupportImpl.java and MyConfiguration.java</li>
             <li>Deleted: DeploymentPlanSplitter.java</li>
             <li>Changed: MyDeploymentManager.java, MyJ2eePlatformImpl.java, MyInstanceNode.java,
             layer.xml, project.xml</li>
         </ul>
      </td>
  </tr>
  <tr>
      <td>
         3
      </td>
      <td>
         10 August 2006
      </td>
      <td>
         <ul>
             <li>Changed forward slash to backward slash in <tt>layer.xml</tt>
             <li>Added period at end of his paragraph...
         </ul>
      </td>
  </tr>
  <tr>
      <td>
        
      </td>
      <td>
        
      </td>
      <td>
         
      </td>
  </tr>
  
  </tbody>
</table>

<p></p>

<table width="76%" border="1">
 <tbody>
   <tr>
      <td>
        <b>Issue Number</b>
      </td>
      <td>
	<b>Description</b>
      </td>
      <td>
	<b>Status</b>
      </td>
  </tr>
  <tr>
      <td>
         1
      </td>
      <td>
	      Code and tutorial itself need to be reviewed. Code needs to be tested
	      on multiple platforms. (Created on Windows XP, tested nowhere else yet. Tried
	      to avoid potential problems by avoiding spaces in names, etc.)
      </td>
      <td>
	      Done.
      </td>
  </tr>
  <tr>
      <td>
         2
      </td>
      <td>
	      Tutorial needs to be updated once Phase III and IV are complete.
      </td>
      <td>
	      Done.
      </td>
  </tr>
 <tr>
      <td>
         3
      </td>
      <td>
	      Some APIs used in this tutorial have deprecated methods. This will
	      produce errors in the Output window, but should not impact functioning
	      of module.
      </td>
      <td>
	      Fixed.
      </td>
  </tr>
<tr>
      <td>
         4
      </td>
      <td>
	      JSR 88 is helpful in understanding this module. However, this
	      JSR not yet been referred to in this tutorial.
      </td>
      <td>
	      To be fixed.
      </td>
  </tr>
<tr>
      <td>
         5
      </td>
      <td>
	      Javadoc links not yet provided for all classes and methods used in this module,
	      although most have been done already.
      </td>
      <td>
	      To be fixed.
      </td>
  </tr>
  <tr>
      <td>
         6
      </td>
      <td>
	      Open questions, specific to version 2 of this tutorial:
              <ul>
                  <li>How to make the server skeleton support Java EE 5? (Annotations, no deployment descriptors?)</li>
                  <li>Previous version was possible to select Start/Stop/etc. Why not anymore?</li>
                  <li>Migration path?</li>
                  <li>Why no more deploymentplansplitter?</li>
                  <li>Why now deployment descriptor goes to WEB-INF instead of META-INF?</li>
                  <li>Why has DeploymentFileNames in layer.xml moved?</li>
                  <li>Picture of JBoss at end to be changed too (does it use MyConfiguration.java, etc?</li>
              </ul>
      </td>
      <td>
	      To be answered.
      </td>
  </tr>
  
  </tbody>
</table><p></p>
<hr><p></p>
</body>
</html>
