<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <!-- -*- xhtml -*- -->
        <title>Feed Reader Tutorial for NetBeans Platform for 7.3</title>
        <link rel="stylesheet" type="text/css" href="https://netbeans.org/netbeans.css"/>
        <meta name="AUDIENCE" content="NBUSER"/>
        <meta name="TYPE" content="ARTICLE"/>
        <meta name="EXPIRES" content="N"/>
        <meta name="developer" content="geertjan.wielenga@oracle.com"/>
        <meta name="indexed" content="y"/>
        <meta name="description" content="FeedReader on 7.3."/>
        <!--      Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. -->
        <!--     Use is subject to license terms.-->
    </head>

    <body>

        <h1>NetBeans Platform Feed Reader Tutorial</h1>

        <p>
            Welcome to the NetBeans Platform Feed Reader tutorial. 
            The Feed Reader that you create in this
            tutorial is a simple RSS/Atom feed browser, modeled 
            after the Sage plug-in for Mozilla Firefox. It 
            presents a tree of feeds with subnodes representing 
            individual feed entries that you can open in a browser.</p>

        <p>To illustrate the end result, here you see the Feed Reader that
            you will create in this tutorial, displaying a feed entry from the
            <a href="http://planetnetbeans.org/rss20.xml">Planet NetBeans feed</a>:</p>

        <p><img src="../images/tutorials/feedreader/73/result-6.png" alt="feedreader result"/></p>

        <p class="tips"> This is <u>not</u> a beginner's tutorial. The assumption
            is that you are familiar with, and have used, NetBeans Platform 
            idioms such as "<a href="http://wiki.netbeans.org/NetBeansDeveloperFAQ#Nodes_and_Explorer">Node</a>" and "<a href="http://wiki.netbeans.org/NetBeansDeveloperFAQ#Lookup">Lookup</a>". The <a href="https://netbeans.org/features/platform/all-docs.html">NetBeans Platform Learning Trail</a>
            provides several quick starts and other beginner materials that
            cover these topics in detail.</p>


        <p><b class="notes">Note:</b> This document was developed with NetBeans IDE 7.3 and NetBeans Platform 7.3. 
            However, the
            instructions that follow apply to NetBeans Platform 7.2 and NetBeans IDE 7.2, as well, though
            the sources available for troubleshooting require NetBeans IDE 7.3 and NetBeans Platform 7.3 to
            be used.
            If you
            are using an earlier version, see <a href="72/nbm-feedreader.html">the previous version
                of this document</a>.</p>

        <p><b>Contents</b></p>

        <p><img src="../images/articles/74/netbeans_stamp_74_73_72.png" class="stamp" width="114" height="114" alt="Content on this page applies to NetBeans IDE 7.3" title="Content on this page applies to NetBeans IDE 7.3"/></p>
        <ul class="toc">
            <li><a href="#two">Setting Up the Application</a></li>
            <li><a href="#three">Creating the Feed Reader Window</a></li>
            <li><a href="#four">Creating the Model</a></li>
            <li><a href="#five">Creating the Node Hierarchy</a></li>
            <li><a href="#six">Displaying the Node Hierarchy in the Feed Window</a></li>
            <li><a href="#seven">Creating the Actions</a></li>
        </ul>

        <p><b>To follow this tutorial, you need the software and resources listed in the following 
                table.</b></p>

        <table>
            <tbody>
                <tr>
                    <th class="tblheader" scope="col">Software or Resource</th>
                    <th class="tblheader" scope="col">Version Required</th>
                </tr> 
                <tr>
                    <td class="tbltd1"><a href="https://netbeans.org/downloads/index.html">NetBeans IDE</a></td>
                    <td class="tbltd1">version 7.2 or 7.3</td>
                </tr>
                <tr>
                    <td class="tbltd1"><a href="http://java.sun.com/javase/downloads/index.jsp">Java Developer Kit (JDK)</a></td>
                    <td class="tbltd1">version 7 or above</td>
                </tr>
                <tr>
                    <td class="tbltd1"><a href="http://repo1.maven.org/maven2/net/java/dev/rome/rome/1.0.0">Rss and atOM utilitiEs</a></td>
                    <td class="tbltd1"></td>
                </tr>
                <tr>
                    <td class="tbltd1"><a href="http://repo1.maven.org/maven2/net/java/dev/rome/rome-fetcher/1.0.0">Rome Fetcher</a></td>
                    <td class="tbltd1"></td>
                </tr>
                <tr>
                    <td class="tbltd1"><a href="http://jdom.org/downloads/index.html">JDom</a></td>
                    <td class="tbltd1"></td>
                </tr>
                <tr>
                    <td class="tbltd1"><a href="https://netbeans.org/files/documents/4/550/feedreader-images.zip">FeedReader icon and splash screen</a></td>
                    <td class="tbltd1"></td>
                </tr>
            </tbody>
        </table>

        <p class="tips">For troubleshooting purposes, you are welcome to download the <a href="http://java.net/projects/nb-api-samples/sources/api-samples/show/versions/7.3/tutorials/FeedReader">completed tutorial source code</a>.</p>

        <h2><a name="two"></a>Setting Up the Application</h2>
        <p>Let's start with a quick revision of some basic concepts. 
            Firstly, building an application on top of the NetBeans Platform
            starts with generating a number of folders and files which serve
            as the foundation of your application. For example,
            NetBeans IDE provides several project wizards that set up all
            the basic files needed by modules and applications built
            on the NetBeans Platform.</p>
        <ul>
            <li>
                <b>NetBeans Platform Application.</b> A project that groups a set of 
                module projects and library wrapper module projects that have dependencies on 
                each other, and lets you deploy them together as a unit. Automatically included
                are a subset of the modules that make up the NetBeans Platform.</li>
            <li>
                <b>Module Suite.</b> Same as above, except that the pre-included modules are
                more than only those relating to the NetBeans Platform&#8212;in this case,
                all the modules that make up NetBeans IDE are included as well.</li>
            <li>
                <b>Library Wrapper Module.</b> A project that puts a library JAR file on its classpath and exports some or all of the JAR file's packages from the module as public packages.</li>
            <li>
                <b>Module.</b> A project for implementing the functionality, business logic, and user interface of a module or application built on the NetBeans Platform.</li>
        </ul>
        <p>Now we'll begin creating our own application, the Feed Reader.</p>
        <div class="indent">
            <h3>
                Creating the Application Skeleton</h3>
            <div class="indent">
                <ol>
                    <li>
                        <p>Choose File &gt; New Project (Ctrl-Shift-N). Under
                            Categories, select NetBeans Modules. Under Projects, select NetBeans Platform Application. 
                            You should see the following:</p>
                        <p><img alt="project wizard"  src="../images/tutorials/feedreader/73/paintapp-proj-wiz-1.png" /></p>
                        <p class="tips">Depending on the modules installed in your IDE, different categories may be shown
                            in the Categories list above.</p>
                        <p>Click Next.</p></li>
                    <li>
                        <p>In the Name and Location panel, type <tt>FeedReader</tt>
                            in Project Name. Change the Project Location to any
                            directory on your computer:</p>
                        <p><img alt="project wizard"  src="../images/tutorials/feedreader/73/paintapp-proj-wiz-2.png" /></p>
                        <p>Click Finish.</p></li>
                </ol>
            </div>

            <p>The IDE creates the <tt>FeedReader</tt>
                project, which looks as follows in the
                Projects window:</p>
            <p><img alt="projects window"  src="../images/tutorials/feedreader/73/paintapp-proj-wiz-3.png"/></p>

            <p>The project will contain the custom module projects that you
                will create in the following sections. </p>

            <h3>
                Wrapping the Libraries</h3>

            <p>You could bundle the entire Feed Reader application into a
                single module. However, the application needs the Rome, Rome Fetcher, and JDom libraries:</p>
            <ul>
                <li>
                    <b>Rome.</b> Reads RSS and Atom feeds, using a very simple API. </li>
                <li>
                    <b>Rome Fetcher.</b> Allows the retrieval of feeds via HTTP. </li>
                <li>
                    <b>JDom.</b> Is an XML parsing API. The only reason the Feed Reader will need it is because the Rome library uses it.</li>
            </ul>

            <p class="tips">Later, if you want to extend the Feed Reader
                application with more modules that may use these libraries,
                it would be better for them to depend on just the library modules,
                rather than the entire Feed Reader. Also, library modules can
                be "autoloading", which means that NetBeans will only load them
                when needed. Until that happens, it won't take up any memory at runtime.</p>
            <div class="indent">
                <ol>
                    <li><p>Right-click the Modules node in the project in
                            the Projects window, as shown below, and click Add New Library:</p>
                        <p><img alt="add new library"  src="../images/tutorials/feedreader/73/paintapp-proj-wiz-4.png"/></p></li>

                    <li>
                        In the Select Library panel, browse
                        to the folder where you downloaded JDom, and then select <tt>jdom.jar</tt>
                        and <tt>LICENSE.txt.</tt>
                        Click Next.</li>
                    <li>
                        <p>In the Name and Location panel, accept all the defaults. The library wrapper module project
                            will be stored within the application project. 
                            You could also store it somewhere else, but for 
                            versioning purposes it is a good idea to put it within
                            the application project. Therefore, the <tt>FeedReader</tt>
                            application project is selected in the 
                            Add to Module Suite drop-down. Click Next.</p></li>
                    <li>
                        <p>In the Basic Module Configuration panel, type <tt>org.jdom</tt>
                            as the code name base and leave all the other defaults unchanged. Click Finish.
                            The new library wrapper module project opens 
                            in the IDE and displays in the Projects window.
                            You should now see the following in the Projects
                            window:</p>

                        <p><img alt="projects window"  src="../images/tutorials/feedreader/73/paintapp-proj-wiz-5.png"/></p>
                        <p class="tips"> A frequent point of confusion is that you see two different "jdom" nodes above,
                            each accompanied by a purple icon. The first of these, above, shows the relationship of the
                            "jdom" module to the whole application. The second is the "jdom" project itself, containing
                            its sources and libraries. This pattern is used throughout the application, with each module
                            being shown in two different ways, as above.</p>                

                    </li>
                    <li>
                        Return to step 1 of this section and create a library wrapper module project for Rome.
                        Use code name base "org.rome" and accept all the other defaults.</li>
                    <li>
                        Return to step 1 of this section and create a library wrapper module project for Rome Fetcher.
                        Use code name base "org.fetcher" and accept all the other defaults.</li>
                </ol>
            </div>

            <p>You now have an application skeleton,
                with three library wrapper module projects,
                providing many useful Java classes that you will
                be able to make use of throughout this tutorial:</p>
            <p><img alt="projects window"  src="../images/tutorials/feedreader/73/paintapp-proj-wiz-6.png"/></p>

            <h3>
                Creating the Module Project </h3>
            <p>In this section, we create a project for the functionality
                that our application will provide. The project will make use of
                the classes made available by the library wrapper modules that
                we created in the previous section.</p>
            <div class="indent">
                <ol>
                    <li>
                        <p>Right-click the Modules node in the application project in
                            the Projects window, as shown below, and click Add New:</p>
                        <p><img alt=""  src="../images/tutorials/feedreader/73/new-mod-1.png"/></p>
                    </li>
                    <li>In the Name and Location panel, type <tt>FeedReader</tt>
                        in Project Name. Accept all the other defaults. Click Next.</li>
                    <li>In the Basic Module Configuration panel, type <tt>org.myorg.feedreader</tt>
                        in Code Name Base.</li>
                    <li>Do not select "Generate OSGi Bundle". Click Finish.</li>
                </ol>

                <p>
                    The IDE creates the FeedReader project. 
                    The project contains all of the module's 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). The Projects window should now show the 
                    following:</p>

                <p><img alt=""  src="../images/tutorials/feedreader/73/new-mod-2.png"/></p>

            </div>

            <h3><a name="dep1"></a>
                Specifying the Application's Dependencies</h3>

            <p>You need to subclass several classes that belong to the NetBeans APIs.
                The classes belong to modules that need to be declared as dependencies
                of your Feed Reader application. Use the Project Properties dialog
                box for this purpose, as explained in the steps below.</p>
            <div class="indent">
                <ol>
                    <li>
                        <p>In the Projects window, right-click the
                            <tt>FeedReader</tt>
                            module project and choose Properties. In the 
                            Project Properties dialog box, click Libraries.
                        </p></li>
                    <li>
                        <p>Click Add Dependency.
                            You will need the following APIs. Click the links below for further information on each of the APIs you will be using.</p>
                        <p></p>
                        <ul>
                            <li><a href="http://bits.netbeans.org/dev/javadoc/org-openide-actions/org/openide/actions/doc-files/api.html">Actions APIs</a></li>
                            <li><a href="http://bits.netbeans.org/dev/javadoc/org-openide-loaders/org/openide/loaders/doc-files/api.html">Datasystems API</a></li>
                            <li><a href="http://bits.netbeans.org/dev/javadoc/org-openide-dialogs/org/openide/package-summary.html">Dialogs API</a></li>
                            <li><a href="http://bits.netbeans.org/dev/javadoc/org-openide-explorer/org/openide/explorer/doc-files/api.html">Explorer & Property Sheet API</a></li>
                            <li><a href="http://bits.netbeans.org/dev/javadoc/org-openide-filesystems/org/openide/filesystems/doc-files/api.html">File System API</a></li>
                            <li><a href="http://bits.netbeans.org/dev/javadoc/org-openide-util-lookup/org/openide/util/lookup/doc-files/lookup-api.html">Lookup API</a></li>
                            <li><a href="http://bits.netbeans.org/dev/javadoc/org-openide-nodes/org/openide/nodes/doc-files/api.html">Nodes API</a></li>
                            <li>rome</li>
                            <li>rome-fetcher</li>
                            <li><a href="http://bits.netbeans.org/dev/javadoc/org-netbeans-modules-settings/overview-summary.html">Settings API</a></li>
                            <li><a href="http://bits.netbeans.org/dev/javadoc/org-openide-awt/overview-summary.html">UI Utilities API</a></li>
                            <li><a href="http://bits.netbeans.org/dev/javadoc/org-openide-util/overview-summary.html">Utilities API</a></li>
                            <li><a href="http://bits.netbeans.org/dev/javadoc/org-openide-windows/org/openide/windows/package-summary.html">Window System API</a></li>
                        </ul>

                        <p>Click OK to exit the Project Properties dialog box.</p></li>

                    <li><p>Expand the <tt>FeedReader</tt> project's Libraries
                            node and notice the list of modules that are now
                            available to this project:</p>


                        <img alt=""  src="../images/tutorials/feedreader/73/new-dep-1.png"/>

                    </li>
                </ol>
            </div>

            <h3><a name="dep2"></a>
                Setting Dependencies Between Library Wrapper Modules</h3>

            <p>Now that we have set dependencies on the NetBeans API modules
                that we will use, let's also set dependencies between our
                library wrapper modules. For example, the Rome JAR makes use
                of classes from the JDom JAR. Now that these are wrapped in
                separate library wrapper modules, we need to specify the
                relationship between the JARs via the library wrapper module's
                Project Properties dialog box.</p>
            <div class="indent">
                <ol>
                    <li>
                        <p>First, lets make Rome dependent on JDom. Right-click the Rome
                            library wrapper module project in the Projects window and choose
                            Properties. In the Project Properties dialog box, click Libraries
                            and then click Add Dependency. Add <tt>jdom</tt>. Click OK
                            to exit the Project Properties dialog box. When you expand
                            the Libraries node in the Rome project, you should now see the following:</p>
                        <p><img alt="" src="../images/tutorials/feedreader/73/rome-props.png"/></p>
                    </li>
                    <li>
                        <p>Finally, since Rome Fetcher depends on both
                            Rome and JDom, you need to make Rome Fetcher
                            dependent on Rome. Do so following the same instructions
                            as the above, so that Rome Fetcher depends on Rome, as shown below:</p>

                        <p><img alt="" src="../images/tutorials/feedreader/73/fetcher-props.png"/></p>

                        Because Rome already 
                        depends on JDom, you do not need to make 
                        Rome Fetcher dependent on JDom.</li>
                </ol>
            </div>

        </div>
        <p>You have now created the source structure
            of your new application. In the next section,
            we will begin adding some code.</p>

        <h2><a name="three"></a>
            Creating the Feed Reader Window</h2>
        <p>
            In this section, you use the Java Class wizard as a starting point in
            creating a new window. A different way to achieve the same end is to
            use the New Window wizard, in the Module Development category in the
            New File dialog. The New Window wizard is useful in that it integrates
            with the Matisse GUI Builder, where you can design the layout of your
            window. No layouting will need to be done in the case of the Feed Reader window,
            therefore we will not use the New Window wizard in this case.</p>
        <div class="indent">
            <ol>
                <li><p>Right-click the <tt>org.myorg.feedreader</tt> package node. Choose New &gt; Java Class.
                        Enter <tt>FeedTopComponent</tt> as the Class Name. Ensure that <tt>org.myorg.feedreader</tt>
                        is listed as the 
                        Package. Click Finish. <tt>FeedTopComponent.java</tt> opens in the Source editor.</p></li>
                <li>Near the top of the file, change the class declaration to the following:
                    <pre class="examplecode">public class FeedTopComponent extends TopComponent {</pre>
                    <p>Press Ctrl-Shift-I to let the IDE generate the required import statement.</p>
                </li>

                <li>Register the <tt>FeedTopComponent</tt> in the window system by adding annotations
                    to the top of the class, as shown here, and then press Ctrl-Shift-I to let the IDE
                    generate the appropriate import statements:

                    <pre class="examplecode"><a href="http://bits.netbeans.org/dev/javadoc/org-openide-windows/org/openide/windows/TopComponent.Description.html">@TopComponent.Description</a>(
        preferredID = "FeedTopComponent",
        persistenceType = TopComponent.PERSISTENCE_ALWAYS)
<a href="http://bits.netbeans.org/dev/javadoc/org-openide-windows/org/openide/windows/TopComponent.Registration.html">@TopComponent.Registration</a>(
        mode = "explorer", 
        openAtStartup = true)
<a href="http://bits.netbeans.org/dev/javadoc/org-openide-awt/org/openide/awt/ActionID.html">@ActionID</a>(
        category = "Window", 
        id = "org.myorg.feedreader.FeedTopComponent")
<a href="http://bits.netbeans.org/dev/javadoc/org-openide-awt/org/openide/awt/ActionReferences.html">@ActionReferences</a>({
    <a href="http://bits.netbeans.org/dev/javadoc/org-openide-awt/org/openide/awt/ActionReference.html">@ActionReference</a>(
        path = "Menu/Window", 
        position = 0)
})
<a href="http://bits.netbeans.org/dev/javadoc/org-openide-windows/org/openide/windows/TopComponent.OpenActionRegistration.html">@TopComponent.OpenActionRegistration</a>(
        displayName = "#CTL_FeedAction")
<a href="http://bits.netbeans.org/dev/javadoc/org-openide-util/org/openide/util/NbBundle.Messages.html">@Messages</a>({
        "CTL_FeedAction=Open Feed Window"})
public class FeedTopComponent extends TopComponent {</pre>          
                    <p class="notes"><b>Note:</b> While the module is being compiled, the annotations
                        above will be processed. XML entries will be created in the module's <tt>generated-layer.xml</tt>
                        file, for each of the @TopComponent* and @Action* annotations. The <tt>generated-layer.xml</tt>
                        file will be contributed by the module to the System Filesystem of the application. Read
                        more <a href="http://wiki.netbeans.org/DevFaqSystemFilesystem">about the System Filesystem here</a>. For example, the <tt>FeedTopComponent</tt> will be displayed
                        in the main area of the application, defined by the "editor"
                        position, as specified by the <tt>@TopComponent.Registration</tt> annotation above. For each
                        item defined in the <tt>@Messages</tt> annotation, a new key/value string is generated into a <tt>Bundle.java</tt>
                        class.</p></li>

                <li><p>Add a constructor to the <tt>FeedTopComponent</tt>, while again
                        using the <tt>@Messages</tt> annotation referred to above:</p>

                    <pre class="examplecode" style="overflow:auto;width:680px;">@Messages({
    "CTL_FeedTopComponent=Feed Window",
    "HINT_FeedTopComponent=This is a Feed Window"})
private FeedTopComponent() {
    setName(Bundle.CTL_FeedTopComponent());
    setToolTipText(Bundle.HINT_FeedTopComponent());
}</pre>
                </li>
                <li><p>In the Projects window, right-click the <tt>FeedReader</tt>
                        project and choose Run, as shown below:</p>
                    <p><img alt=""  src="../images/tutorials/feedreader/73/result-1.png"/></p>
                    <p>The application starts up, the default splash screen is shown, and
                        once the application has started, you should see your application,
                        including the new window provided by your module:</p>
                    <p><img alt=""  src="../images/tutorials/feedreader/73/result-2.png"/></p>


                    <p><strong class="notes">Note: </strong> What you now have is an application consisting
                        of the following modules:</p>
                    <ul>
                        <li>The modules provided by the NetBeans Platform, for bootstrapping
                            the application, lifecycle management, window system, menu bars, toolbars, and other infrastructural
                            concerns.</li>
                        <li>The three library wrapper modules that you created in this tutorial.</li>
                        <li>The FeedReader functionality module that
                            you created in this tutorial, for providing the Feed window.</li>
                    </ul>


                    <p>In the application's Window menu, you should see the new menu item,
                        which you can use for opening the Feed window, if it is closed.</p>
                </li>
            </ol>
        </div>
        <p>As you can see, without having done any coding, we have a 
            complete application. It doesn't do much yet, but the entire
            infrastructure exists and works as one would expect. Next, we begin using some
            of the NetBeans APIs, to add code to our application.</p>

        <h2><a name="four"></a>
            Creating the Model</h2>
        <p>
            Now that you have laid the basis for your application, it's time to
            begin adding your own code. We start by
            creating a plain Java class that encapsulates a URL and its associated Rome feed. In
            an MVC paradigm, this class  the <i>model</i> of the application.</p>
        <div class="indent">
            <ol>
                <li>
                    Right-click the <tt>FeedReader</tt>
                    module project node, choose New &gt; Java Class. Name the class <tt>Feed</tt>
                    and select <tt>org.myorg.feedreader</tt>
                    in the Package drop-down. Click Finish.</li>
                <li>
                    In the Source Editor, replace the default <tt>Feed</tt>
                    class with the following:
                    <pre class="examplecode">package org.myorg.feedreader;

import com.sun.syndication.feed.synd.SyndFeed;
import com.sun.syndication.fetcher.FeedFetcher;
import com.sun.syndication.fetcher.impl.HashMapFeedInfoCache;
import com.sun.syndication.fetcher.impl.HttpURLFeedFetcher;
import java.io.IOException;
import java.io.Serializable;
import java.net.MalformedURLException;
import java.net.URL;

public class Feed implements Serializable {

    private static final long serialVersionUID = 1L;

    private static final FeedFetcher FEED_FETCHER =
            new HttpURLFeedFetcher(HashMapFeedInfoCache.getInstance());

    private transient SyndFeed syndFeed;
    private final URL url;
    private String name;

    public Feed(URL url) {
        this.url = url;
        name = url.toExternalForm();
    }

    public URL getURL() {
        return url;
    }

    public SyndFeed getSyndFeed() throws IOException {
        if (syndFeed == null) {
            try {
                syndFeed = FEED_FETCHER.retrieveFeed(url);
                String title = syndFeed.getTitle();
                if (title != null) {
                    name = title;
                }
            } catch (Exception ex) {
                throw new IOException(ex);
            }
        }
        return syndFeed;
    }

    @Override
    public String toString() {
        return name;
    }

    public static Feed getSample() {
        try {
            return new Feed(new URL("http://planetnetbeans.org/rss20.xml"));
        } catch (MalformedURLException x) {
            throw new AssertionError(x);
        }
    }

}</pre>
                    <p class="notes"><b>Note:</b> In the next three steps, you're going to create a new <tt>layer.xml</tt> file. Each
                        module in your application can have at most one of these files. The <tt>layer.xml</tt>
                        file is registered in the manifest file of the module, by the wizard that you use
                        to create it. The <tt>layer.xml</tt> file provides the module's contributions to
                        the application's virtual filesystem, known as the System Filesystem. In this case,
                        you're going to contribute a new folder, named "RssFeeds" to the virtual filesystem.
                        Later in this tutorial, when you work on the view, the node hierarchy will be created
                        on top of this virtual folder. Within the virtual folder, multiple feeds will be found.
                        Right now, a sample feed is registered there, via the <tt>getSample</tt> method above.
                        That method will be registered in the "RssFeeds" folder, in the third of the three steps
                        that follow, so that when the "RssFeeds" folder is referred to in the view, later in
                        this tutorial, the sample feed will automatically be created because the
                        <tt>getSample</tt> method will be instantiated.</p>
                </li>
                <li><p>Right-click the <tt>org.myorg.feedreader</tt> package node and
                        choose New | Other. In the Module Development category, choose
                        XML Layer, as shown below:</p>
                    <p><img alt="" src="../images/tutorials/feedreader/73/new-layer-1.png"/></p>
                    <p>Click Next.</p>
                </li>
                <li><p>The layer file will be created in the location shown below. It will
                        also be registered in the manifest file of the module.</p>
                    <p><img alt="" src="../images/tutorials/feedreader/73/new-layer-2.png"/></p>
                    <p>Click Finish. The <tt>layer.xml</tt> file is added to the module and
                        registered in the module's <tt>manifest.mf</tt> file.</p>
                </li>
                <li><p>Change the content of the <tt>layer.xml</tt> to the following, to
                        create your RssFeeds folder in the virtual filesystem:</p>

                    <pre class="examplecode">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;!DOCTYPE filesystem PUBLIC "-//NetBeans//DTD Filesystem 1.2//EN" "https://netbeans.org/dtds/filesystem-1_2.dtd"&gt;
&lt;filesystem&gt;
    &lt;folder name="RssFeeds"&gt;
        &lt;file name="sample.instance"&gt;
            &lt;attr name="instanceCreate" methodvalue="org.myorg.feedreader.Feed.getSample"/&gt;
        &lt;/file&gt;
    &lt;/folder&gt;
&lt;/filesystem&gt;</pre>

                </li>


            </ol>
        </div>

        <h2><a name="five"></a>
            Creating the Node Hierarchy</h2>

        <p>The application will have a node hierarchy consisting of three levels. Below, each node
            is defined, together with a factory class for instantiating the node. The root node will be instantiated
            within the <tt>TopComponent</tt>, later in the tutorial, in the section "Displaying the Node Hierarchy in the Feed Window".</p>

        </p>
        <div class="indent">
            <h3><a name="root"></a>Creating the First Level Node: The Root Node</h3>
            <p>The top level node of our Feed Reader is provided
                by the RootNode class. It will create its child nodes
                by wrapping a virtual folder, named "RssFeeds", which you created
                in the previous section. The virtual folder will be received, later in the
                tutorial, in the form
                of a node, which is what the root node will wrap. The root node will have
                the display name of the node that it wraps,
                while providing the top level node in the node hierarchy, as shown below:</p>
            <p>
                <img alt="" src="../images/tutorials/feedreader/73/result-3.png"/>
            </p>
            <p class="notes"><b>Note:</b> In addition to child nodes,
                when the user right-clicks the root node, 
                the root node will provide a pop-up menu containing a menu item for
                any action registered in the "Actions/RootActions" folder
                in the application's virtual filesystem, that is, the System Filesystem. 
                Right at the end of this tutorial, two actions
                will be registered in that folder.</p>
            <p>Take the following steps:   </p>
            <div class="indent">
                <ol>

                    <li>
                        Create a new class named <tt>RootNode.java</tt>
                        in the <tt>org.myorg.feedreader</tt>
                        package.</li>
                    <li>
                        Replace the default class with the following:
                        <pre class="examplecode">package org.myorg.feedreader;

import java.util.List;
import javax.swing.Action;
import org.openide.loaders.DataObjectNotFoundException;
import org.openide.nodes.FilterNode;
import org.openide.nodes.Node;
import org.openide.util.Utilities;

public class RootNode extends <a href="http://bits.netbeans.org/dev/javadoc/org-openide-nodes/org/openide/nodes/FilterNode.html">FilterNode</a> {

    public RootNode(Node filterNode) throws DataObjectNotFoundException {
        super(filterNode, new RssFolderChildren(filterNode));
    }

    @Override
    public Action[] getActions(boolean bln) {
        List&lt;? extends Action&gt; rootActions = Utilities.actionsForPath("Actions/RootActions");
        return rootActions.toArray(new Action[rootActions.size()]);
    }
    
}</pre>
                    </li>
                </ol>
            </div>
            <p class="notes"><b>Note:</b> A red underline marking remains in the class, because
                you have not yet created the RssFolderChildren class.</p>
            <h3><a name="rssfolderchildren"></a>Creating the Children of the Root Node</h3>
            <p>In this section, we create the children of the root node. Each child
                is a folder, containing RSS feeds. The RSS feeds, in turn,
                contain the entries representing the feed articles, which
                the user will read in a browser.</p>
            <p>To create this class, take the following steps:</p>
            <div class="indent">
                <ol>
                    <li>
                        Create <tt>RssFolderChildren.java</tt>
                        in the <tt>org.myorg.feedreader</tt>
                        package.</li>
                    <li>
                        <p>Replace the default class with the following:</p>
                        <pre class="examplecode">package org.myorg.feedreader;

import java.io.IOException;
import org.openide.filesystems.FileObject;
import org.openide.filesystems.FileUtil;
import org.openide.loaders.DataObjectNotFoundException;
import org.openide.nodes.FilterNode;
import org.openide.nodes.Node;
import org.openide.util.Exceptions;

public class RssFolderChildren extends <a href="http://bits.netbeans.org/dev/javadoc/org-openide-nodes/org/openide/nodes/FilterNode.Children.html">FilterNode.Children</a> {

    RssFolderChildren(Node rssFolderNode) {
        super(rssFolderNode);
    }

    @Override
    protected Node[] createNodes(Node n) {
        FileObject fo = n.getLookup().lookup(FileObject.class);
        if (fo != null && fo.isFolder()) {
            try {
                return new Node[]{new RootNode(n)};
            } catch (DataObjectNotFoundException ex) {
                Exceptions.printStackTrace(ex);
            }
        } else {
            Feed feed = getFeed(fo.getLookup());
            if (feed != null) {
                try {
                    return new Node[]{new OneFeedNode(n, feed.getSyndFeed())};
                } catch (IOException ioe) {
                    Exceptions.printStackTrace(ioe);
                }
            }
        }
        // best effort
        return new Node[]{new FilterNode(n)};
    }

    /** Looking up a feed */
    private static Feed getFeed(Lookup lkp) {
        <a href="http://bits.netbeans.org/dev/javadoc/org-openide-nodes/org/openide/cookies/InstanceCookie.html">InstanceCookie</a> ck = lkp.lookup(<a href="http://bits.netbeans.org/dev/javadoc/org-openide-loaders/org/openide/loaders/InstanceDataObject.html">InstanceDataObject.class</a>);
        if (ck == null) {
            throw new IllegalStateException("Bogus file in feeds folder: " +
                     lkp.lookup(FileObject.class));
        }
        try {
            return (Feed) ck.instanceCreate();
        } catch (ClassNotFoundException ex) {
            Exceptions.printStackTrace(ex);
        } catch (IOException ex) {
            Exceptions.printStackTrace(ex);
        }
        return null;
    }

}</pre>
                    </li>
                    <p class="notes"><b>Note:</b> If you're using NetBeans Platform 7.2,
                        replace <tt>getFeed(fo.getLookup())</tt>
                     with <tt>getFeed(DataObject.find(fo).getLookup())</tt>.</p>
                </ol>
            </div>
            <h3><a name="feed"></a>Creating the Second Level Node: The Feed Node</h3>
            <p>Here we are concerned with feeds, that is, the containers for the entry nodes, as shown below
                for the "Planet NetBeans" feed:</p>
            <p>
                <img alt="" src="../images/tutorials/feedreader/73/result-4.png"/>
            </p>
            <p>As can be seen, each of these nodes has
                a list of entries, a display name, retrieved from the feed, and an icon. The icon
                is provided in the table at the start of this tutorial. Unzip it from there
                and add it to the main source package of the module.
                Each Feed node also has a Delete menu item.</p>
            <p>Take the following steps to create this class:   </p>
            <div class="indent">
                <ol>
                    <li>
                        Create <tt>OneFeedNode.java</tt>
                        in the <tt>org.myorg.feedreader</tt>
                        package.</li>
                    <li>
                        Replace the default class with the following:
                        <pre class="examplecode">package org.myorg.feedreader;

import com.sun.syndication.feed.synd.SyndFeed;
import java.awt.Image;
import javax.swing.Action;
import org.openide.actions.DeleteAction;
import org.openide.nodes.FilterNode;
import org.openide.nodes.Node;
import org.openide.util.ImageUtilities;
import org.openide.util.actions.SystemAction;
import org.openide.util.lookup.Lookups;

/**
 * Getting the feed node and wrapping it in a FilterNode
 */
public class OneFeedNode extends <a href="http://bits.netbeans.org/dev/javadoc/org-openide-nodes/org/openide/nodes/FilterNode.html">FilterNode</a> {

    OneFeedNode(Node feedFileNode, SyndFeed feed) {
        super(feedFileNode, Children.create(new FeedChildFactory(feed), false), Lookups.fixed(feed));
    }

    @Override
    public String getDisplayName() {
        return getLookup().lookup(SyndFeed.class).getTitle();
    }

    @Override
    public Image getIcon(int type) {
        return ImageUtilities.loadImage("org/myorg/feedreader/rss16.gif");
    }

    @Override
    public Image getOpenedIcon(int type) {
        return getIcon(type);
    }

    @Override
    public Action[] getActions(boolean context) {
        return new Action[]{SystemAction.get(DeleteAction.class)};
    }
    
}</pre>

                    </li>
                </ol>
            </div>
            <p>Several red underline markings remain in the class, because
                we have not created our <tt>FeedChildFactory</tt> class yet.</p>

            <h3><a name="feed"></a>Creating the Children of the Feed Node</h3>
            <p>The children of the Feed node are Entry nodes, which in turn are created
                by a <tt>ChildFactory</tt> class, as defined below.</p>

            <p>To create this class, take the following steps:</p>
            <div class="indent">
                <ol>
                    <li>
                        Create <tt>FeedChildFactory.java</tt>
                        in the <tt>org.myorg.feedreader</tt>
                        package.</li>
                    <li>
                        <p>Replace the default class with the following:</p>

                        <pre class="examplecode">package org.myorg.feedreader;

import com.sun.syndication.feed.synd.SyndEntry;
import com.sun.syndication.feed.synd.SyndFeed;
import java.beans.IntrospectionException;
import java.util.List;
import org.openide.nodes.ChildFactory;
import org.openide.nodes.Node;
import org.openide.util.Exceptions;
import org.openide.util.NbCollections;

public class FeedChildFactory extends <a href="http://bits.netbeans.org/dev/javadoc/org-openide-nodes/org/openide/nodes/ChildFactory.html">ChildFactory&lt;SyndEntry&gt;</a> {

    private final SyndFeed feed;

    public FeedChildFactory(SyndFeed feed) {
        this.feed = feed;
    }

    @Override
    protected boolean createKeys(List&lt;SyndEntry&gt; list) {
        list.addAll(<a href="http://bits.netbeans.org/dev/javadoc/org-openide-util/org/openide/util/NbCollections.html">NbCollections</a>.checkedListByCopy(feed.getEntries(), SyndEntry.class, true));
        return true;
    }

    @Override
    protected Node createNodeForKey(SyndEntry entry) {
        OneEntryNode node = null;
        try {
            node = new OneEntryNode(entry);
        } catch (IntrospectionException ex) {
            Exceptions.printStackTrace(ex);
        }
        return node;
    }

}</pre>
                    </li>
                </ol>
            </div>

            <h3><a name="entry"></a>Creating the Third Level Node: The Entry Node</h3>
            <p>Finally, we deal with the lowest level nodes, those
                that represent entries provided by the feed, such as the highlighted
                entry below:</p>
            <p>
                <img alt="" src="../images/tutorials/feedreader/73/result-5.png"/>
            </p>
            <p>To create this class, take the following steps:</p>
            <div class="indent">
                <ol>
                    <li>
                        Create <tt>OneEntryNode.java</tt>
                        in the <tt>org.myorg.feedreader</tt>
                        package.</li>
                    <li>
                        Replace the default class with the following:
                        <pre class="examplecode">package org.myorg.feedreader;

import com.sun.syndication.feed.synd.SyndContent;
import com.sun.syndication.feed.synd.SyndEntry;
import java.awt.BorderLayout;
import java.beans.IntrospectionException;
import javax.swing.Action;
import javax.swing.JEditorPane;
import javax.swing.JScrollPane;
import org.openide.actions.OpenAction;
import org.openide.cookies.OpenCookie;
import org.openide.nodes.BeanNode;
import org.openide.nodes.FilterNode;
import org.openide.util.actions.SystemAction;
import org.openide.util.lookup.Lookups;
import org.openide.windows.TopComponent;

class OneEntryNode extends <a href="http://bits.netbeans.org/dev/javadoc/org-openide-nodes/org/openide/nodes/FilterNode.html">FilterNode</a> {

    private final SyndEntry entry;

    public OneEntryNode(SyndEntry entry) throws IntrospectionException {
        super(  new BeanNode&lt;SyndEntry&gt;(entry), 
                Children.LEAF,
                Lookups.fixed(new EntryOpenCookie(entry)));
        this.entry = entry;
    }

    /**
     * Using HtmlDisplayName ensures any HTML in RSS entry titles are properly
     * handled, escaped, entities resolved, etc.
     */
    @Override
    public String getHtmlDisplayName() {
        return entry.getTitle();
    }

    /**
     * Making a tooltip out of the entry's description
     */
    @Override
    public String getShortDescription() {
        StringBuilder sb = new StringBuilder();
        sb.append("Author: ").append(entry.getAuthor()).append("; ");
        if (entry.getPublishedDate() != null) {
            sb.append("Published: ").append(entry.getPublishedDate().toString());
        }
        return sb.toString();
    }

    /**
     * Providing the Open action on a feed entry
     */
    @Override
    public Action[] getActions(boolean popup) {
        return new Action[]{SystemAction.get(OpenAction.class)};
    }

    @Override
    public Action getPreferredAction() {
        return getActions(false)[0];
    }

    /**
     * Specifying what should happen when the user invokes the Open action
     */
    private static class EntryOpenCookie implements OpenCookie {

        private final SyndEntry entry;

        EntryOpenCookie(SyndEntry entry) {
            this.entry = entry;
        }

        @Override
        public void open() {
            BrowserTopComponent btc = new BrowserTopComponent(entry);
            btc.open();
            btc.requestActive();
        }

    }

    public static final class BrowserTopComponent extends TopComponent {
        public BrowserTopComponent(SyndEntry entry) {
            setName(entry.getTitle());
            setLayout(new BorderLayout());
            JEditorPane editorPane = new JEditorPane();
            editorPane.setEditable(false);
            SyndContent description = entry.getDescription();
            if (description != null) {
                editorPane.setContentType("text/html");
                editorPane.setText(description.getValue());
            }
            add(new JScrollPane(editorPane), BorderLayout.CENTER);
            putClientProperty(/*PrintManager.PRINT_PRINTABLE*/"print.printable", true);
        }
    }
    
}</pre>
                        <p class="tips"> Instead of a <tt>JEditorPane</tt>, you
                            can use the JavaFX WebView component. A NetBeans module
                            providing the JavaFX WebView component embedded in a <tt>TopComponent</tt>,
                            together with all its dependencies,
                            is found here: <a href="http://java.net/projects/javafxbrowser">http://java.net/projects/javafxbrowser</a>.</p>
                    </li>
                </ol>
            </div>
        </div>

        <h2><a name="six"></a>
            Displaying the Node Hierarchy in the Feed Window</h2>
        <p>In this section, we use a NetBeans Platform component called <tt><a href="http://bits.netbeans.org/dev/javadoc/org-openide-explorer/org/openide/explorer/view/BeanTreeView.html">BeanTreeView</a></tt>
            to display a hierarchy of feeds in our <tt>TopComponent</tt>.</p>
        <div class="indent">
            <ol>
                <li>
                    Open <tt>FeedTopComponent.java</tt> and type <tt>implements <a href="http://bits.netbeans.org/dev/javadoc/org-openide-explorer/org/openide/explorer/ExplorerManager.Provider.html">ExplorerManager.Provider</a></tt>
                    at the end of the class declaration.</li>
                <li>
                    Press Alt-Enter in the line and click on the suggestion. The IDE adds an import statement for the required
                    package <tt><a href="http://bits.netbeans.org/dev/javadoc/org-openide-explorer/org/openide/explorer/ExplorerManager.html">org.openide.explorer.ExplorerManager</a></tt>.
                    Press Alt-Enter again and click on the suggestion. The IDE implements the abstract
                    method <tt>getExplorerManager()</tt>. </li>
                <li>
                    Type <tt>return manager;</tt>
                    in the body of the new <tt>getExplorerManager()</tt>
                    method. Press Alt-Enter in the line and let the IDE create a field called <tt>manager</tt>
                    for you. Replace the default definition with this one:
                    <pre class="examplecode">private final ExplorerManager manager = new ExplorerManager();</pre>
                </li>
                <li>
                    Finally, add the following code to the end of the constructor:
                    <pre class="examplecode">setLayout(new BorderLayout());
add(new BeanTreeView(), BorderLayout.CENTER);
try {
    FileObject rssFeedsFolder = FileUtil.getConfigFile("RssFeeds");
    Node rssFeedsNode = DataObject.find(rssFeedsFolder).getNodeDelegate();
    manager.setRootContext(new RootNode(rssFeedsNode));
} catch (DataObjectNotFoundException ex) {
    Exceptions.printStackTrace(ex);
}
ActionMap map = getActionMap();
map.put("delete", ExplorerUtils.actionDelete(manager, true));
associateLookup(ExplorerUtils.createLookup(manager, map));</pre>
                </li>

                <li><p>
                        Now a lot of code is underlined, because you have not declared their
                        associated packages. Press Ctrl-Shift-I and the IDE adds several import 
                        statements below the package statement. The complete 
                        list of import statements should be as follows:</p>

                    <pre class="examplecode">import java.awt.BorderLayout;
import java.util.logging.Logger;
import javax.swing.ActionMap;
import org.openide.util.NbBundle;
import org.openide.windows.TopComponent;
import org.openide.windows.WindowManager;
import org.openide.util.ImageUtilities;
import org.netbeans.api.settings.ConvertAsProperties;
import org.openide.explorer.ExplorerManager;
import org.openide.explorer.ExplorerUtils;
import org.openide.explorer.view.BeanTreeView;</pre></li>
                <li><p>
                        Right-click the application and choose Run. You should see the application shown at the start of this tutorial:</p>
                    <p><img src="../images/tutorials/feedreader/73/result-6.png" alt="feedreader result"/></p></li>
            </ol>
        </div>
        </div>

        <h2><a name="seven"></a>
            Creating the Actions</h2>

        <p>Two <tt>Action</tt> classes are defined below. Via annotations, they are registered
            in the "Actions/RootActions" folder, which is where the <tt>RootNode</tt>, defined earlier
            in this tutorial, will find them.</p>
        <div class="indent">

            <h3><a name="action1"></a>Creating the Add Feed Action</h3>
            <p>In this section, we create the menu item that adds new
                feeds. As you can see in the previous section, the
                Add Feed Action is bound to the context-menu of the
                Root Node.</p>
            <p>To create this class, take the following steps:</p>
            <div class="indent">
                <ol>
                    <li>
                        Create <tt>AddRssAction.java</tt>
                        in the <tt>org.myorg.feedreader</tt>
                        package.</li>
                    <li>
                        <p>Replace the default class with the following:</p>
                        <pre class="examplecode">package org.myorg.feedreader;

import java.awt.event.ActionEvent;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectOutputStream;
import java.net.MalformedURLException;
import java.net.URL;
import javax.swing.AbstractAction;
import org.openide.DialogDisplayer;
import org.openide.NotifyDescriptor;
import org.openide.filesystems.FileLock;
import org.openide.filesystems.FileObject;
import org.openide.loaders.DataFolder;
import org.openide.util.Exceptions;
import org.openide.util.NbBundle.Messages;

@ActionID(category = "RootActions", id = "org.myorg.feedreader.AddRssAction")
@ActionRegistration(displayName = "#FN_addbutton")
@Messages("FN_addbutton=Add Feed")
public class AddRssAction extends AbstractAction {

    private final DataFolder folder;

    public AddRssAction(DataFolder df) {
        folder = df;
    }

    @Messages({
            "FN_askurl_msg=Enter the URL of an RSS/Atom Feed",
            "FN_askurl_title=New Feed",
            "FN_askurl_err=Invalid URL: {0}|",
            "FN_cannotConnect_err=Cannot Connect!"
    })
    @Override
    public void actionPerformed(ActionEvent ae) {
        <a href="http://bits.netbeans.org/dev/javadoc/org-openide-dialogs/org/openide/NotifyDescriptor.html">NotifyDescriptor</a>.InputLine nd = new NotifyDescriptor.InputLine(
                Bundle.FN_askurl_msg(),
                Bundle.FN_askurl_title(),
                NotifyDescriptor.OK_CANCEL_OPTION,
                NotifyDescriptor.PLAIN_MESSAGE);
        Object result = <a href="http://bits.netbeans.org/dev/javadoc/org-openide-dialogs/org/openide/DialogDisplayer.html">DialogDisplayer</a>.getDefault().notify(nd);
        if (result.equals(NotifyDescriptor.OK_OPTION)) {
            String urlString = nd.getInputText();
            URL url;
            try {
                url = new URL(urlString);
            } catch (MalformedURLException e) {
                Exceptions.attachLocalizedMessage(e, Bundle.FN_askurl_err(result));
                Exceptions.printStackTrace(e);
                return;
            }
            try {
                checkConnection(url);
            } catch (IOException e) {
                Exceptions.attachLocalizedMessage(e, Bundle.FN_cannotConnect_err());
                Exceptions.printStackTrace(e);
                return;
            }
            Feed f = new Feed(url);
            FileObject fld = folder.getPrimaryFile();
            String baseName = "RssFeed";
            int ix = 1;
            while (fld.getFileObject(baseName + ix, "ser") != null) {
                ix++;
            }
            try {
                FileObject writeTo = fld.createData(baseName + ix, "ser");
                FileLock lock = writeTo.lock();
                try {
                    ObjectOutputStream str = new ObjectOutputStream(writeTo.getOutputStream(lock));
                    try {
                        str.writeObject(f);
                    } finally {
                        str.close();
                    }
                } finally {
                    lock.releaseLock();
                }
            } catch (IOException ioe) {
                Exceptions.printStackTrace(ioe);
            }
        }
    }

    private static void checkConnection(final URL url) throws IOException {
        InputStream is = url.openStream();
        is.close();
    }
    
}</pre>
                    </li>
                </ol>
            </div>
        </div>
        <div class="indent">

            <h3><a name="action2"></a>Creating the Add Folder Action</h3>
            <p>In this section, we create the menu item that adds new
                folders, in which new feeds can be created. As you can see in an earlier section, the
                Add Folder Action is bound to the context-menu of the
                Root Node.</p>
            <p>To create this class, take the following steps:</p>
            <div class="indent">
                <ol>
                    <li>
                        Create <tt>AddFolderAction.java</tt>
                        in the <tt>org.myorg.feedreader</tt>
                        package.</li>
                    <li>
                        <p>Replace the default class with the following:</p>
                        <pre class="examplecode">package org.myorg.feedreader;

import java.awt.event.ActionEvent;
import java.io.IOException;
import javax.swing.AbstractAction;
import org.openide.DialogDisplayer;
import org.openide.NotifyDescriptor;
import org.openide.loaders.DataFolder;
import org.openide.util.Exceptions;
import org.openide.util.NbBundle.Messages;

@ActionID(id = "org.myorg.feedreader.AddFolderAction", category = "RootActions")
@ActionRegistration(displayName = "#FN_addfolderbutton")
@Messages("FN_addfolderbutton=Add Folder")
public class AddFolderAction extends AbstractAction {

    private final DataFolder folder;

    public AddFolderAction(DataFolder df) {
        folder = df;
    }

    @Messages({
            "FN_askfolder_msg=Enter the folder name",
            "FN_askfolder_title=New Folder"
    })
    @Override
    public void actionPerformed(ActionEvent ae) {
        <a href="http://bits.netbeans.org/dev/javadoc/org-openide-dialogs/org/openide/NotifyDescriptor.html">NotifyDescriptor</a>.InputLine nd = new NotifyDescriptor.InputLine(
                Bundle.FN_askfolder_msg(),
                Bundle.FN_askfolder_title(),
                NotifyDescriptor.OK_CANCEL_OPTION,
                NotifyDescriptor.PLAIN_MESSAGE);
        Object result = <a href="http://bits.netbeans.org/dev/javadoc/org-openide-dialogs/org/openide/DialogDisplayer.html">DialogDisplayer</a>.getDefault().notify(nd);
        if (result.equals(NotifyDescriptor.OK_OPTION)) {
            final String folderString = nd.getInputText();
            try {
                DataFolder.create(folder, folderString);
            } catch (IOException ex) {
                Exceptions.printStackTrace(ex);
            }
        }
    }
    
}</pre>
                    </li>

                </ol>

            </div>
        </div>

        <div class="indent">

            <h3><a name="action3"></a>Using the Actions</h3>

            <p>Run the application again and notice that the root node now
                provides access to two actions, when you right-click on the root node:</p>
            <p><img alt="" src="../images/tutorials/feedreader/73/result-7.png"/></p>
            <p>Use the actions to create new folders and register new feeds in the application.</p>
            <p>For example, use this NASA feed to try out the "Add Feed" action:</p>
            <p><a href="http://www.nasa.gov/rss/breaking_news.rss">http://www.nasa.gov/rss/breaking_news.rss</a></p>
            <p>You should see a new feed is added and the result should be something like this:</p>
            <p><img alt=""  src="../images/tutorials/feedreader/73/new-feed.png"/></p>
        </div>
        </div>

        <div class="feedback-box"><a href="https://netbeans.org/about/contact_form.html?to=3&amp;subject=Feedback: NetBeans Platform 7.3 Feed Reader Tutorial">Send Us Your Feedback</a>
            <br style="clear:both;" /></div>
    </body>
</html>
