|  | <!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> | 
|  | <title>NetBeans Platform EMF Integration Tutorial</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="indexed" content="y"/> | 
|  | <meta name="description" | 
|  | content="A short guide to getting started with EMF on the NetBeans Platform."/> | 
|  | <!--      Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. --> | 
|  | <!--     Use is subject to license terms.--> | 
|  | </head> | 
|  | <body> | 
|  |  | 
|  | <h1>NetBeans Platform EMF Integration Tutorial</h1> | 
|  |  | 
|  | <p>This document shows you how to incorporate an <a href="http://www.eclipse.org/modeling/emf/">EMF model</a> | 
|  | into a NetBeans Platform application. | 
|  | </p> | 
|  |  | 
|  | <p> | 
|  | You will start by setting up Eclipse, together with its modeling tools. | 
|  | Then you will set up one of the example EMF models provided by Eclipse. | 
|  | Next, you will use NetBeans IDE to create a new NetBeans Platform | 
|  | application on top of Equinox. You will import the OSGi bundles | 
|  | needed for Equinox to work with EMF. Then you will create two new | 
|  | OSGi bundles in NetBeans IDE. The first will contain the sources of the EMF model, | 
|  | while the second will provide a window for displaying values that, | 
|  | for purposes of this tutorial, you will hardcode in the application. | 
|  | </p> | 
|  |  | 
|  | <p>At the end of the tutorial, you will have a NetBeans Platform application that looks as follows, | 
|  | based on the "Extended Library Model Example" provided by Eclipse:</p> | 
|  |  | 
|  | <p><img src="../images/tutorials/emf/emf-library-model-015.png" alt="result"/></p> | 
|  |  | 
|  | <p>Once you have gone through this simple scenario, you should be able | 
|  | to incorporate your own EMF models into your NetBeans Platform applications.</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 6.5, 6.7, 6.8" title="Content on this page applies to NetBeans IDE 6.5, 6.7, 6.8"/></p> | 
|  | <ul class="toc"> | 
|  | <li><a href="#emf">Creating the EMF Model</a></li> | 
|  | <li><a href="#create">Creating the NetBeans Platform Application</a></li> | 
|  | <li><a href="#import">Importing the OSGi Bundles</a></li> | 
|  | <li><a href="#model">Creating an OSGi Bundle to Contain the Model</a></li> | 
|  | <li><a href="#viewer">Creating an OSGi Bundle to Provide the Window</a></li> | 
|  | <li><a href="#run">Running the Application</a></li> | 
|  | <li><a href="#further">Further Reading</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 6.9</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://eclipse.org">Eclipse</a></td> | 
|  | <td class="tbltd1"></td> | 
|  | </tr> | 
|  | </tbody> | 
|  | </table> | 
|  |  | 
|  |  | 
|  | <!-- ===================================================================================== --> | 
|  | <p></p> | 
|  | <h2><a name="emf"></a>Creating the EMF Model</h2> | 
|  | <p>In this section, you create an EMF model in Eclipse.</p> | 
|  |  | 
|  | <ol> | 
|  |  | 
|  | <li>Install EMF via the Eclipse update manager. Select "Modeling" and | 
|  | install "EMF - Eclipse Modeling Framework SDK". Also select the | 
|  | "Ecore Tools", which will let you create UML diagrams from your EMF model.</li> | 
|  |  | 
|  | <li><p>In the New Project wizard, create the "Extended Library Model Example", | 
|  | as shown below:</p> | 
|  | <p><img src="../images/tutorials/emf/emf-library-model-001.png" alt="result"/></p> | 
|  | </li> | 
|  |  | 
|  | <li><p>In the next step, click Finish:</p> | 
|  | <p><img src="../images/tutorials/emf/emf-library-model-002.png" alt="result"/></p> | 
|  | </li> | 
|  |  | 
|  | <li><p>You now have the model that you will use throughout the rest of the tutorial:</p> | 
|  | <p><img src="../images/tutorials/emf/emf-library-model-003.png" alt="result"/></p> | 
|  | </li> | 
|  |  | 
|  | </ol> | 
|  |  | 
|  | <p>On disk, in your workspace, you have the sources of the EMF model you created. Later | 
|  | in this tutorial, you will copy the sources into an OSGi bundle created in | 
|  | NetBeans IDE. That way, you will be able to work with the sources in the IDE, | 
|  | and tweak them where necessary.</p> | 
|  |  | 
|  | <h2><a name="create"></a>Creating the NetBeans Platform Application</h2> | 
|  | <p>Once you have all the required OSGi bundles available, | 
|  | create your new NetBeans Platform application, as described below.</p> | 
|  |  | 
|  | <ol> | 
|  | <li><p>Choose File | New Project and choose to | 
|  | create a NetBeans Platform application atop Equinox, via the Equinox template:</p> | 
|  |  | 
|  | <p><img src="http://netbeans.dzone.com/sites/all/files/sudokugame-5.png"/></p> | 
|  | <p>Click Next.</p> | 
|  | </li> | 
|  |  | 
|  | <li><p>Name the application <code>LibraryManager</code> and click Finish.</p></li> | 
|  |  | 
|  |  | 
|  | <li><p>The application you now have is already deployable. | 
|  | Right-click the application to run it. When the application | 
|  | starts up, you'll first see the default splash screen:</p> | 
|  | <p><img src="../images/tutorials/emf/emf-library-model-010.png" alt="result"/></p> | 
|  |  | 
|  | <p>Then you will see the main window containing a window that | 
|  | displays all the NetBeans modules and OSGi bundles that have | 
|  | been deployed.</p></li> | 
|  |  | 
|  | <li><p>Optionally, before continuing, remove the "Show OSGi Bundle List" module that the template | 
|  | provided by default. If you keep it, you will continue to have the | 
|  | window displaying the deployed modules and bundles as part | 
|  | of your application. To remove it, expand the application node in the | 
|  | Projects window, then expand the Modules node, | 
|  | right-click the "Show OSGi Bundle List" node, and select Remove.</p></li> | 
|  |  | 
|  | </ol> | 
|  |  | 
|  | <h2><a name="import"></a>Importing the OSGi Bundles</h2> | 
|  | <p>In this section, you create a new folder on disk. Within that folder, | 
|  | you copy several general Equinox JARs, together with EMF-related JARs, | 
|  | from the Eclipse distribution. You then import these into your | 
|  | NetBeans Platform application.</p> | 
|  |  | 
|  | <ol> | 
|  | <li><p>Create a folder on disk, name it anything you like, such as "emf-jars".</p></li> | 
|  |  | 
|  | <li><p>Copy the following JARs into your new folder, where "xxx" is | 
|  | a placeholder for the version number:</p> | 
|  | <p></p> | 
|  | <ul> | 
|  | <li><p>Core bundles:</p> | 
|  |  | 
|  | <pre class="examplecode">org.eclipse.core.expressions_xxx.jar | 
|  | org.eclipse.core.filebuffers_xxx.jar | 
|  | org.eclipse.core.filesystem_xxx.jar | 
|  | org.eclipse.core.jobs_xxx.jar | 
|  | org.eclipse.core.net_xxx.jar | 
|  | org.eclipse.core.resources_xxx.jar | 
|  | org.eclipse.core.runtime_xxx.jar | 
|  | org.eclipse.core.runtime.compatibility_xxx.jar | 
|  | </pre></li> | 
|  |  | 
|  | <li><p>EMF bundles:</p> | 
|  |  | 
|  | <pre class="examplecode">org.eclipse.emf.cdo.common_xxx.jar | 
|  | org.eclipse.emf.cdo_xxx.jar | 
|  | org.eclipse.emf.common_xxx.jar | 
|  | org.eclipse.emf.ecore.change_xxx.jar | 
|  | org.eclipse.emf.ecore.edit_xxx.jar | 
|  | org.eclipse.emf.ecore.xmi_xxx.jar | 
|  | org.eclipse.emf.ecore_xxx.jar | 
|  | org.eclipse.emf.edit_xxx.jar | 
|  | org.eclipse.emf.query_xxx.jar | 
|  | org.eclipse.emf.transaction_xxx.jar | 
|  | org.eclipse.emf.validation_xxx.jar | 
|  | org.eclipse.emf_xxx.jar | 
|  | </pre></li> | 
|  |  | 
|  | <li><p>Equinox bundles:</p> | 
|  |  | 
|  | <pre class="examplecode">org.eclipse.equinox.app_xxx.jar | 
|  | org.eclipse.equinox.common_xxx.jar | 
|  | org.eclipse.equinox.preferences_xxx.jar | 
|  | org.eclipse.equinox.registry_xxx.jar | 
|  | org.eclipse.equinox.security_xxx.jar | 
|  | </pre></li> | 
|  |  | 
|  | <li><p>Miscellaneous bundles:</p> | 
|  |  | 
|  | <pre class="examplecode">com.ibm.icu_xxx.jar | 
|  | org.eclipse.net4j.util_xxx.jar | 
|  | org.eclipse.net4j_xxx.jar | 
|  | </pre></li></ul> | 
|  |  | 
|  |  | 
|  | </li> | 
|  |  | 
|  | <li><p>Right-click the application's node and choose Properties. | 
|  | Open the Libraries panel of the Project Proprties dialog, as shown below:</p> | 
|  | <p><img src="../images/tutorials/emf/emf-library-model-016.png" alt="result"/></p> | 
|  | </li> | 
|  |  | 
|  | <li><p>Click "Add Cluster". Browse to the "emf" folder you created earlier. | 
|  | When you select it, the NetBeans IDE will not recognize its content. It will ask | 
|  | you to let it add metadata to the folder, so that it will be able | 
|  | to recognize the OSGi bundles it finds there, | 
|  | as shown below:</p> | 
|  | <p><img src="../images/tutorials/emf/emf-library-model-017.png" alt="result"/></p> | 
|  | </li> | 
|  |  | 
|  | <li><p>When you click Next, the NetBeans IDE presents a list of OSGi bundles | 
|  | found in the selected folder. You are then asked to specifiy when | 
|  | the bundles should be loaded:</p> | 
|  | <p><img src="../images/tutorials/emf/emf-library-model-018.png" alt="result"/></p> | 
|  |  | 
|  | <p>Select "Autoload" in the first column, so that "Autoload" is selected | 
|  | in all the other columns too. "Autoload" means that a module is | 
|  | turned on only when needed. In contrast to regular modules, which require some | 
|  | manual action, the autoload modules are opaque for users and are | 
|  | managed solely by the infrastructure. As soon as there is a module needing, | 
|  | via its dependencies, an autoload module, the infrastructure enables it. </p> | 
|  |  | 
|  | </li> | 
|  |  | 
|  | <li><p>At the end of the previous step, the OSGi bundles are registered and available | 
|  | to be used within the application, as shown below:</p> | 
|  | <p><img src="../images/tutorials/emf/emf-library-model-019.png" alt="result"/></p> | 
|  | </li> | 
|  |  | 
|  | <li><p>Look at the "emf" folder on disk. The OSGi bundles are untouched and unchanged. | 
|  | However, two folders are added, providing the metadata needed for the OSGi | 
|  | support in the NetBeans Platform to recognize the JARs as OSGi bundles, as shown below:</p> | 
|  | <p><img style="border: 1px solid" src="../images/tutorials/emf/emf-library-model-020.png" alt="result"/></p> | 
|  | <p>For example, in the "config" folder, you will find an XML file as follows, | 
|  | for each of the OSGi bundles imported into the application:</p> | 
|  |  | 
|  | <pre class="examplecode"><?xml version="1.0" encoding="UTF-8"?> | 
|  | <!DOCTYPE module PUBLIC "-//NetBeans//DTD Module Status 1.0//EN" | 
|  | "https://netbeans.org/dtds/module-status-1_0.dtd"> | 
|  | <module name="com.ibm.icu"> | 
|  | <param name="autoload">true</param> | 
|  | <param name="eager">false</param> | 
|  | <param name="jar">com.ibm.icu_4.0.1.v20090822.jar</param> | 
|  | <param name="reloadable">false</param> | 
|  | </module></pre> | 
|  |  | 
|  | </li> | 
|  |  | 
|  | </ol> | 
|  |  | 
|  | <p>Now that you have all the OSGi bundles you'll need for working with EMF | 
|  | in the NetBeans Platform, let's create a new OSGi bundle in the IDE. The | 
|  | new OSGi bundle will contain the sources of the EMF model you created earlier.</p> | 
|  |  | 
|  |  | 
|  | <h2><a name="model"></a>Creating an OSGi Bundle to Contain the Model</h2> | 
|  |  | 
|  | <p>Now we create a new OSGi bundle in NetBeans IDE. Into the OSGi bundle, | 
|  | we copy the Java source files making up our EMF model. Then we set | 
|  | dependencies on the EMF-related bundles, so that the OSGi bundle can | 
|  | compile. Finally, we make the package containing the API classes | 
|  | public to the rest of the application.</p> | 
|  |  | 
|  | <ol> | 
|  |  | 
|  | <li><p>Create a new module named <code>LibraryModel</code>, as shown below:</p> | 
|  | <p><img src="../images/tutorials/emf/emf-library-model-004.png" alt="library model 1"/></p> | 
|  | </li> | 
|  |  | 
|  | <li><p>In the next step, set "org.eclipse.emf.examples.extlibrary" as the code name base, | 
|  | "Library Model" as the display name, and check the "Generate OSGi Bundle" checkbox, | 
|  | as shown below:</p> | 
|  | <p><img src="../images/tutorials/emf/emf-library-model-005.png" alt="library model 2"/></p> | 
|  | <p>Click Finish. The IDE creates an OSGi bundle, with appropriate entries in the manifest.</p> | 
|  | </li> | 
|  |  | 
|  | <li><p>Copy the source packages from the EMF model into the OSGi | 
|  | bundle in the IDE, as shown below:</p> | 
|  | <p><img style="border: 1px solid" src="../images/tutorials/emf/emf-library-model-006.png" alt="library model 3"/></p> | 
|  |  | 
|  | <p>As you can see, there are many error markings shown in the IDE. That | 
|  | is because you have not set dependencies on the required bundles yet.</p> | 
|  | </li> | 
|  |  | 
|  | <li><p>In the Projects window, right-click the "Libraries" node in the Library Model project. | 
|  | Then choose "Add Module Dependency". In the dialog, select all the EMF-related | 
|  | bundles:</p> | 
|  | <p><img src="../images/tutorials/emf/emf-library-model-007.png" alt="library model 4"/></p> | 
|  | </li> | 
|  |  | 
|  | <li><p>Now that you have dependencies set on the EMF-related bundles, | 
|  | you should notice that the error markings are gone:</p> | 
|  | <p><img src="../images/tutorials/emf/emf-library-model-008.png" alt="library model 5"/></p> | 
|  | </li> | 
|  |  | 
|  | <li><p>Right-click the LibraryModel project in the Projects window | 
|  | and choose Properties. In the API Versioning panel, publish | 
|  | the "org.eclipse.emf.examples.extlibrary" package to the | 
|  | rest of the application:</p> | 
|  | <p><img src="../images/tutorials/emf/emf-library-model-012.png" alt="library model 6"/></p> | 
|  | <p>After checking the above checkbox, only the Java classes in the | 
|  | specified package will be available to other modules and bundles | 
|  | in the application.</p> | 
|  | </li> | 
|  |  | 
|  | </ol> | 
|  |  | 
|  | <h2><a name="viewer"></a>Creating an OSGi Bundle to Provide the Window</h2> | 
|  |  | 
|  | <p>Now we add a new OSGi bundle that provides a window for the application. The | 
|  | window will display a <code><a href="http://bits.netbeans.org/dev/javadoc/org-openide-nodes/org/openide/nodes/Node.html">Node</a></code> class for the Library object, together | 
|  | with <code><a href="http://bits.netbeans.org/dev/javadoc/org-openide-nodes/org/openide/nodes/Children.html">Children</a></code> for each Book object and Borrower object in the | 
|  | Library. For demonstration purposes, we will hardcode some values to define | 
|  | a dummy Library, together with dummy Books and dummy Borrowers.</p> | 
|  |  | 
|  | <ol> | 
|  |  | 
|  | <li><p>Create a new module named <code>LibraryViewer</code>, as shown below:</p> | 
|  | <p><img src="../images/tutorials/emf/emf-library-model-013.png" alt="feedreader result"/></p> | 
|  | </li> | 
|  |  | 
|  | <li><p>In the next step, set "org.library.viewer" as code name base, | 
|  | "LibraryViewer" as display name, check the "Generate XML Layer" checkbox, | 
|  | and check the "Generate OSGi Bundle" checkbox, as shown below:</p> | 
|  | <p><img src="../images/tutorials/emf/emf-library-model-014.png" alt="feedreader result"/></p> | 
|  | </li> | 
|  |  | 
|  | <li><p>Set dependencies on the LibraryModel created in the previous section and | 
|  | two of the EMF-related OSGi bundles ("org.eclipse.emf.common" and | 
|  | "org.eclipse.emf.ecore") that you imported, as shown below:</p> | 
|  | <p><img src="../images/tutorials/emf/emf-library-model-021.png" alt="feedreader result"/></p> | 
|  | <p>In addition, for the functionality you will be creating in this section, | 
|  | add dependencies on the following modules too:</p> | 
|  | <ul> | 
|  | <li>Explorer & Property Sheet API</li> | 
|  | <li>Lookup</li> | 
|  | <li>Nodes API</li> | 
|  | <li>UI Utilities API</li> | 
|  | <li>Utilities API</li> | 
|  | <li>Window System API</li> | 
|  | </ul> | 
|  | <p>The other OSGi-related dependencies you see in the screenshot above | 
|  | were added by the Equinox project template you created as the basis | 
|  | of the application earlier in this tutorial.</p> | 
|  | </li> | 
|  |  | 
|  | <li><p>Create a new Java class named <code>LibraryNode</code>, which provides | 
|  | a new Node for the Library object, as well as a new Node for the | 
|  | Book object and Borrower object:</p> | 
|  |  | 
|  | <pre class="examplecode">public class LibraryNode extends <a href="http://bits.netbeans.org/dev/javadoc/org-openide-nodes/org/openide/nodes/AbstractNode.html">AbstractNode</a> { | 
|  |  | 
|  | public LibraryNode(Library library) { | 
|  | super(Children.create(new BookOrBorrowerChildFactory(library), true)); | 
|  | setDisplayName(library.getName()); | 
|  | } | 
|  |  | 
|  | private static class BookOrBorrowerChildFactory extends <a href="http://bits.netbeans.org/dev/javadoc/org-openide-nodes/org/openide/nodes/ChildFactory.html">ChildFactory</a><Object> { | 
|  |  | 
|  | private final Library library; | 
|  |  | 
|  | private BookOrBorrowerChildFactory(Library library) { | 
|  | this.library = library; | 
|  | } | 
|  |  | 
|  | @Override | 
|  | protected boolean createKeys(List list) { | 
|  | EList<Book> books = library.getBooks(); | 
|  | for (Book book : books) { | 
|  | list.add(book); | 
|  | } | 
|  | EList<Borrower> borrowers = library.getBorrowers(); | 
|  | for (Borrower borrower : borrowers) { | 
|  | list.add(borrower); | 
|  | } | 
|  | return true; | 
|  | } | 
|  |  | 
|  | @Override | 
|  | protected Node createNodeForKey(Object key) { | 
|  | <a href="http://bits.netbeans.org/dev/javadoc/org-openide-nodes/org/openide/nodes/BeanNode.html">BeanNode</a> childNode = null; | 
|  | try { | 
|  | childNode = new BeanNode(key); | 
|  | if (key instanceof Book) { | 
|  | Book book = (Book) key; | 
|  | childNode.setDisplayName(book.getTitle()); | 
|  | childNode.setIconBaseWithExtension("org/library/viewer/book.png"); | 
|  | } else if (key instanceof Borrower) { | 
|  | Borrower borrower = (Borrower) key; | 
|  | childNode.setDisplayName(borrower.getLastName()); | 
|  | childNode.setIconBaseWithExtension("org/library/viewer/borrower.png"); | 
|  | } | 
|  | } catch (IntrospectionException ex) { | 
|  | Exceptions.printStackTrace(ex); | 
|  | } | 
|  | return childNode; | 
|  | } | 
|  |  | 
|  | } | 
|  |  | 
|  | }</pre> | 
|  | </li> | 
|  |  | 
|  | <li><p>Create a new Java class named <code>LibraryChildFactory</code>, which is | 
|  | a factory class for creating new <code>LibraryNode</code>s:</p> | 
|  |  | 
|  |  | 
|  | <pre class="examplecode">public class LibraryChildFactory extends <a href="http://bits.netbeans.org/dev/javadoc/org-openide-nodes/org/openide/nodes/ChildFactory.html">ChildFactory</a><Library> { | 
|  |  | 
|  | @Override | 
|  | protected boolean createKeys(List<Library> list) { | 
|  |  | 
|  | EXTLibraryFactory factory = EXTLibraryFactory.eINSTANCE; | 
|  |  | 
|  | Writer writer1 = factory.createWriter(); | 
|  | writer1.setName("William Shakespeare"); | 
|  |  | 
|  | Book book1 = factory.createBook(); | 
|  | book1.setAuthor(writer1); | 
|  | book1.setTitle("Romeo and Juliet"); | 
|  |  | 
|  | Book book2 = factory.createBook(); | 
|  | book2.setAuthor(writer1); | 
|  | book2.setTitle("Othello"); | 
|  |  | 
|  | Borrower borrower1 = factory.createBorrower(); | 
|  | borrower1.setFirstName("Jack"); | 
|  | borrower1.setLastName("Smith"); | 
|  |  | 
|  | Borrower borrower2 = factory.createBorrower(); | 
|  | borrower2.setFirstName("John"); | 
|  | borrower2.setLastName("Sykes"); | 
|  |  | 
|  | Borrower borrower3 = factory.createBorrower(); | 
|  | borrower3.setFirstName("Lucy"); | 
|  | borrower3.setLastName("Williams"); | 
|  |  | 
|  | Library library1 = factory.createLibrary(); | 
|  | library1.setName("New York Public Library"); | 
|  | EList<Borrower> borrowers1 = library1.getBorrowers(); | 
|  | EList<Book> books1 = library1.getBooks(); | 
|  | borrowers1.add(borrower1); | 
|  | books1.add(book1); | 
|  |  | 
|  | Library library2 = factory.createLibrary(); | 
|  | library2.setName("London Public Library"); | 
|  | EList<Borrower> borrowers2 = library2.getBorrowers(); | 
|  | EList<Book> books2 = library2.getBooks(); | 
|  | borrowers2.add(borrower2); | 
|  | borrowers2.add(borrower3); | 
|  | books2.add(book2); | 
|  |  | 
|  | list.add(library1); | 
|  | list.add(library2); | 
|  |  | 
|  | return true; | 
|  |  | 
|  | } | 
|  |  | 
|  | @Override | 
|  | protected Node createNodeForKey(Library key) { | 
|  | return new LibraryNode(key); | 
|  | } | 
|  |  | 
|  | }</pre> | 
|  | </li> | 
|  |  | 
|  | <li><p>Create a new Java class named <code>LibraryViewer</code>, which provides | 
|  | the window where the <code>LibraryNode</code> will be displayed:</p> | 
|  |  | 
|  | <pre class="examplecode">public class LibraryViewer extends <a href="http://bits.netbeans.org/dev/javadoc/org-openide-windows/org/openide/windows/TopComponent.html">TopComponent</a> implements <a href="http://bits.netbeans.org/dev/javadoc/org-openide-explorer/org/openide/explorer/ExplorerManager.Provider.html">ExplorerManager.Provider</a> { | 
|  |  | 
|  | private ExplorerManager em = new ExplorerManager(); | 
|  |  | 
|  | public LibraryViewer() { | 
|  | //Text displayed in the tab of the window: | 
|  | setDisplayName("Library Viewer"); | 
|  | //Set the layout of the window: | 
|  | setLayout(new BorderLayout()); | 
|  | //Create a new BeanTreeView: | 
|  | <a href="http://bits.netbeans.org/dev/javadoc/org-openide-explorer/org/openide/explorer/view/BeanTreeView.html">BeanTreeView</a> btv = new BeanTreeView(); | 
|  | //Hide the root node: | 
|  | btv.setRootVisible(false); | 
|  | //Add the BeanTreeView: | 
|  | add(btv, BorderLayout.CENTER); | 
|  | //Set the root node of the ExplorerManager: | 
|  | em.setRootContext(new AbstractNode(Children.create(new LibraryChildFactory(), true))); | 
|  | //Hook up the synchronization between the views: | 
|  | associateLookup(ExplorerUtils.createLookup(em, getActionMap())); | 
|  | } | 
|  |  | 
|  | @Override | 
|  | public ExplorerManager getExplorerManager() { | 
|  | return em; | 
|  | } | 
|  |  | 
|  | }</pre> | 
|  |  | 
|  | </li> | 
|  | <li><p>Create a new Java class named <code>OpenLibraryViewerAction</code>, which will let | 
|  | the user open the viewer:</p> | 
|  |  | 
|  | <pre class="examplecode">public class OpenLibraryViewerAction implements  ActionListener { | 
|  |  | 
|  | @Override | 
|  | public void actionPerformed(ActionEvent e) { | 
|  | LibraryViewer window = new LibraryViewer(); | 
|  | window.open(); | 
|  | window.requestActive(); | 
|  | } | 
|  |  | 
|  | } | 
|  | </pre> | 
|  | </li> | 
|  |  | 
|  | <li>In the layer file, register the Action you created in the previous step. | 
|  | Let it be always enabled and let it be displayed as a menu item in the | 
|  | File menu: | 
|  |  | 
|  | <pre class="examplecode"><folder name="Actions"> | 
|  | <folder name="File"> | 
|  | <file name="org-library-viewer-OpenLibraryViewerAction.instance"> | 
|  | <attr name="instanceCreate" methodvalue="org.openide.awt.Actions.alwaysEnabled"/> | 
|  | <attr name="delegate" newvalue="org.library.viewer.OpenLibraryViewerAction"/> | 
|  | <attr name="displayName" bundlevalue="org.library.viewer.Bundle#CTL_OpenLibraryViewerAction"/> | 
|  | </file> | 
|  | </folder> | 
|  | </folder> | 
|  | <folder name="Menu"> | 
|  | <folder name="File"> | 
|  | <file name="OpenLibraryViewerWindowAction.shadow"> | 
|  | <attr name="originalFile" stringvalue="Actions/File/org-library-viewer-OpenLibraryViewerAction.instance"/> | 
|  | </file> | 
|  | </folder> | 
|  | </folder></pre> | 
|  |  | 
|  | <p>Look at line 6 above and then register an appropriate display name for the | 
|  | Action, in the <code>Bundle.properties</code> file:</p> | 
|  |  | 
|  | <pre class="examplecode">CTL_OpenLibraryViewerAction=Open Library Viewer</pre> | 
|  |  | 
|  | </li> | 
|  |  | 
|  | </ol> | 
|  |  | 
|  | <h2><a name="run"></a>Running the Application</h2> | 
|  |  | 
|  | <p>The application is now ready to be deployed, as described below.</p> | 
|  |  | 
|  | <ol> | 
|  |  | 
|  | <li><p>Run the application. All the OSGi bundles and NetBeans modules in your application | 
|  | will be deployed. The Output window of the IDE should not show any bundle warnings, | 
|  | because Equinox should resolve everything correctly:</p> | 
|  |  | 
|  | <p><img style="border: 1px solid" src="../images/tutorials/emf/emf-library-model-011.png" alt="output"/></p> | 
|  | </li> | 
|  | <li><p>The application starts up. Under the File menu, select the menu item | 
|  | for opening the viewer. Open the Properties window, from the Window menu, | 
|  | browse a few nodes and you should see the following:</p> | 
|  |  | 
|  | <p><img src="../images/tutorials/emf/emf-library-model-015.png" alt="result"/></p> | 
|  |  | 
|  | </li> | 
|  |  | 
|  | </ol> | 
|  |  | 
|  | <p>Congratulations, you have integrated your EMF model into your NetBeans Platform application.</p> | 
|  |  | 
|  | <div class="feedback-box"><a href="https://netbeans.org/about/contact_form.html?to=3&subject=Feedback:%20EMF%20Integration%20Tutorial">Send Us Your Feedback</a></div> | 
|  | <br style="clear:both;" /> | 
|  |  | 
|  | <h2><a name="further"></a>Further Reading</h2> | 
|  |  | 
|  | <p>Now that you have completed the tutorial and understand the steps to take when you want | 
|  | to reuse an OSGi bundle in your NetBeans Platform application, take a look at these | 
|  | related documents and more | 
|  | advanced scenarios:</p> | 
|  |  | 
|  | <ul> | 
|  | <li><a href="http://www.osgi.org/blog/2006_09_01_archive.html">Peter Kriens and the Sudoku Game</a></li> | 
|  | <li><a href="http://wiki.apidesign.org/wiki/NetbinoxTutorial">Jaroslav Tulach and Netbinox</a></li> | 
|  | <li>Toni Epple's OSGi/NetBeans <a href="http://eppleton.sharedhost.de/blog/?p=662">blog entry</a> and <a href="http://eppleton.sharedhost.de/blog/?s=Frankenstein%27s+IDE">presentation</a></li> | 
|  | <li>Gunnar Reinseth's NetBeans-EMF integration (<a href="http://eclipse.dzone.com/emf-on-netbeans-rcp">part 1</a>, <a href="http://eclipse.dzone.com/emf-on-netbeans-rcp-2">part 2</a>)</li> | 
|  | <li>Also read <a href="http://java.dzone.com/news/new-cool-tools-osgi-developers">New Cool Tools for OSGi Developers</a></li> | 
|  | </ul> | 
|  |  | 
|  | </body> | 
|  |  | 
|  | </html> |