| <div id="midcolumn"> |
| <h2>How to create a custom client</h2> |
| <p> |
| In this tutorial you will learn how to use the API to integrate the EMF Store into your own application. |
| Follow the steps below to, first run an example client that can checkout, modify and commit projects using the EMF Store, and then learn where you can start customizing the source code of this example client to your own needs. |
| </p> |
| |
| <b>Step 1: Get EMF Store and EMF Client Platform</b> |
| <p> |
| This tutorial will assume that you have a running Eclipse with the plugins EMF Store and EMF Client Platform installed, and that you know how to create and share a new project in the EMF Client Platform.<br /> |
| Please refer to the setup tutorials to get started. |
| <ul> |
| <li><a href="http://www.eclipse.org/emfclient/documentation/setup.php">How to set up the EMF Client Platform</a></li> |
| <li><a href="http://www.eclipse.org/emfstore/documentation/setup.php">How to set up and run the EMF Store</a></li> |
| </ul> |
| </p> |
| |
| <b>Step 2: Download and import the example client and an example model</b> |
| <p> |
| If you followed both tutorials above step by step, you will already have the example model in your workspace. |
| Otherwise, please refer to Step 3 in <a href="http://www.eclipse.org/emfstore/documentation/setup.php">How to set up and run the EMF Store</a>, as the example client specifically depends on this model. |
| To use the example client with a different model you will have to modify the source code first. |
| <br /> |
| Now, <a href="exampleClient.zip">download</a> and import the example client the same way using the "Existing Project into Workspace"-wizard. |
| </p> |
| |
| <b>Step 3: Create and share a new project</b> |
| <p> |
| Run the EMF Store, and subsequently the EMF Client Platform and create a new project with a right-click in the Navigator View. |
| Now share the project from within the Navigator, providing the default password "super" for the default user. The project you created will be used by the example client in the following step. |
| </p> |
| |
| <b>Step 4: Run the example client</b> |
| <p> |
| Return to the first instance of Eclipse where you imported the examples and run the example client using <em>"right Click >>> Run As >>> Eclipse Application"</em>. |
| You may now update this project in the other Eclipse instance from within the Navigator view. Right-Click the project you created and click <em>Update Project</em>. Alternatively you could explore the changes in the History Browser View. |
| <p><img src="images/ecp-navigator-view-update-context-menu.png"></p> |
| </p> |
| <p> |
| The EMF Client Platform will now connect to the EMF Store and fetch the changes made your project by the example client. |
| As a result you should see the following update confirmation. |
| <p><img src="images/ecp-project-update-after-running-example-client.png"></p> |
| This means you just accessed and modified your centrally stored project from two different clients! |
| <br>In the following sections you will learn how the code of the example client works, and how you can start modifying it to your needs. |
| </p> |
| |
| <pre language = "Java"> |
| test.settest(); |
| </pre> |
| |
| <p> |
| <b>Application.java: The main extension of your plugin</b> |
| <div class="java" style="overflow:auto"> |
| <ol> |
| <li class="li1"><div class="de1"><span class="kw1">package</span> <span class="co2">exampleclient</span><span class="sy0">;</span></div></li> |
| <li class="li1"><div class="de1"> </div></li> |
| <li class="li1"><div class="de1"><span class="kw1">import</span> <span class="co2">java.util.List</span><span class="sy0">;</span></div></li> |
| <li class="li1"><div class="de1"> </div></li> |
| <li class="li2"><div class="de2"><span class="co1">// import the example model</span></div></li> |
| |
| <li class="li1"><div class="de1"><span class="co1">// change these to work with your own model</span></div></li> |
| <li class="li1"><div class="de1"><span class="kw1">import</span> <span class="co2">library.Book</span><span class="sy0">;</span></div></li> |
| <li class="li1"><div class="de1"><span class="kw1">import</span> <span class="co2">library.Library</span><span class="sy0">;</span></div></li> |
| <li class="li1"><div class="de1"><span class="kw1">import</span> <span class="co2">library.LibraryFactory</span><span class="sy0">;</span></div></li> |
| |
| <li class="li2"><div class="de2"> </div></li> |
| <li class="li1"><div class="de1"><span class="kw1">import</span> <span class="co2">org.eclipse.emf.emfstore.client.model.ProjectSpace</span><span class="sy0">;</span></div></li> |
| <li class="li1"><div class="de1"><span class="kw1">import</span> <span class="co2">org.eclipse.emf.emfstore.client.model.Usersession</span><span class="sy0">;</span></div></li> |
| <li class="li1"><div class="de1"><span class="kw1">import</span> <span class="co2">org.eclipse.emf.emfstore.client.model.WorkspaceManager</span><span class="sy0">;</span></div></li> |
| <li class="li1"><div class="de1"><span class="kw1">import</span> <span class="co2">org.eclipse.emf.emfstore.client.model.util.EMFStoreClientUtil</span><span class="sy0">;</span></div></li> |
| |
| <li class="li2"><div class="de2"><span class="kw1">import</span> <span class="co2">org.eclipse.emf.emfstore.client.model.util.EMFStoreCommand</span><span class="sy0">;</span></div></li> |
| <li class="li1"><div class="de1"><span class="kw1">import</span> <span class="co2">org.eclipse.emf.emfstore.common.model.Project</span><span class="sy0">;</span></div></li> |
| <li class="li1"><div class="de1"><span class="kw1">import</span> <span class="co2">org.eclipse.emf.emfstore.common.model.util.ModelUtil</span><span class="sy0">;</span></div></li> |
| <li class="li1"><div class="de1"><span class="kw1">import</span> <span class="co2">org.eclipse.emf.emfstore.server.exceptions.AccessControlException</span><span class="sy0">;</span></div></li> |
| |
| <li class="li1"><div class="de1"><span class="kw1">import</span> <span class="co2">org.eclipse.emf.emfstore.server.exceptions.EmfStoreException</span><span class="sy0">;</span></div></li> |
| <li class="li2"><div class="de2"><span class="kw1">import</span> <span class="co2">org.eclipse.emf.emfstore.server.model.ProjectInfo</span><span class="sy0">;</span></div></li> |
| <li class="li1"><div class="de1"><span class="kw1">import</span> <span class="co2">org.eclipse.equinox.app.IApplication</span><span class="sy0">;</span></div></li> |
| <li class="li1"><div class="de1"><span class="kw1">import</span> <span class="co2">org.eclipse.equinox.app.IApplicationContext</span><span class="sy0">;</span></div></li> |
| |
| <li class="li1"><div class="de1"> </div></li> |
| <li class="li1"><div class="de1"><span class="kw1">public</span> <span class="kw1">class</span> Application <span class="kw1">implements</span> IApplication <span class="br0">{</span></div></li> |
| <li class="li2"><div class="de2"> <span class="kw1">public</span> <a href="http://www.google.com/search?hl=en&q=allinurl%3Aobject+java.sun.com&btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Object</span></a> start<span class="br0">(</span>IApplicationContext context<span class="br0">)</span> <span class="kw1">throws</span> <a href="http://www.google.com/search?hl=en&q=allinurl%3Aexception+java.sun.com&btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Exception</span></a> <span class="br0">{</span></div></li> |
| |
| <li class="li1"><div class="de1"> WorkspaceManager.<span class="me1">init</span><span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span></div></li> |
| <li class="li1"><div class="de1"> </div></li> |
| <li class="li1"><div class="de1"> <span class="co1">// run a client that commits to the first project it can find on the server</span></div></li> |
| <li class="li1"><div class="de1"> runClient<span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span></div></li> |
| |
| <li class="li2"><div class="de2"> </div></li> |
| <li class="li1"><div class="de1"> <span class="kw1">return</span> IApplication.<span class="me1">EXIT_OK</span><span class="sy0">;</span></div></li> |
| <li class="li1"><div class="de1"> <span class="br0">}</span></div></li> |
| <li class="li1"><div class="de1"> </div></li> |
| <li class="li1"><div class="de1"> <span class="kw1">private</span> <span class="kw4">void</span> runClient<span class="br0">(</span><span class="br0">)</span> <span class="kw1">throws</span> <a href="http://www.google.com/search?hl=en&q=allinurl%3Aaccesscontrolexception+java.sun.com&btnI=I%27m%20Feeling%20Lucky"><span class="kw3">AccessControlException</span></a>, EmfStoreException <span class="br0">{</span></div></li> |
| |
| <li class="li2"><div class="de2"> <a href="http://www.google.com/search?hl=en&q=allinurl%3Asystem+java.sun.com&btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">(</span><span class="st0">"Client starting..."</span><span class="br0">)</span><span class="sy0">;</span></div></li> |
| <li class="li1"><div class="de1"> </div></li> |
| <li class="li1"><div class="de1"> <span class="kw1">new</span> EMFStoreCommand<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span></div></li> |
| |
| <li class="li1"><div class="de1"> @Override</div></li> |
| <li class="li1"><div class="de1"> <span class="kw1">protected</span> <span class="kw4">void</span> doRun<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span></div></li> |
| <li class="li2"><div class="de2"> <span class="kw1">try</span> <span class="br0">{</span></div></li> |
| |
| <li class="li1"><div class="de1"> <span class="co1">// create a default Usersession for the purpose of this tutorial, login and fetch the list of projects</span></div></li> |
| <li class="li1"><div class="de1"> <span class="co1">// see the corrsponding Javadoc for EMFStoreClientUtil.createUsersession(...) to setup the authentication for your custom client</span></div></li> |
| <li class="li1"><div class="de1"> Usersession usersession <span class="sy0">=</span> EMFStoreClientUtil</div></li> |
| |
| <li class="li1"><div class="de1"> .<span class="me1">createUsersession</span><span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span></div></li> |
| <li class="li2"><div class="de2"> usersession.<span class="me1">logIn</span><span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span></div></li> |
| |
| <li class="li1"><div class="de1"> List<span class="sy0"><</span>ProjectInfo<span class="sy0">></span> projectList<span class="sy0">;</span></div></li> |
| <li class="li1"><div class="de1"> projectList <span class="sy0">=</span> usersession.<span class="me1">getRemoteProjectList</span><span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span></div></li> |
| |
| <li class="li1"><div class="de1"> </div></li> |
| <li class="li1"><div class="de1"> <span class="co1">// retrieve the first Project from the List</span></div></li> |
| <li class="li2"><div class="de2"> ProjectInfo projectInfo <span class="sy0">=</span> projectList.<span class="me1">iterator</span><span class="br0">(</span><span class="br0">)</span>.<span class="me1">next</span><span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span></div></li> |
| |
| <li class="li1"><div class="de1"> <span class="co1">// checkout the ProjectSpace, containing all Models of the Project, into the local Workspace</span></div></li> |
| <li class="li1"><div class="de1"> ProjectSpace projectSpace <span class="sy0">=</span> usersession</div></li> |
| |
| <li class="li1"><div class="de1"> .<span class="me1">checkout</span><span class="br0">(</span>projectInfo<span class="br0">)</span><span class="sy0">;</span></div></li> |
| <li class="li1"><div class="de1"> </div></li> |
| <li class="li2"><div class="de2"> <span class="co1">// create and add a new "Book" from the example model</span></div></li> |
| |
| <li class="li1"><div class="de1"> <span class="co1">// change this part to create instances of your own model</span></div></li> |
| <li class="li1"><div class="de1"> Project project <span class="sy0">=</span> projectSpace.<span class="me1">getProject</span><span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span></div></li> |
| |
| <li class="li1"><div class="de1"> <a href="http://www.google.com/search?hl=en&q=allinurl%3Abook+java.sun.com&btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Book</span></a> book <span class="sy0">=</span> LibraryFactory.<span class="me1">eINSTANCE</span>.<span class="me1">createBook</span><span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span></div></li> |
| <li class="li1"><div class="de1"> book.<span class="me1">setTitle</span><span class="br0">(</span><span class="st0">"NEW TITLE"</span><span class="br0">)</span><span class="sy0">;</span></div></li> |
| |
| <li class="li2"><div class="de2"> project.<span class="me1">addModelElement</span><span class="br0">(</span>book<span class="br0">)</span><span class="sy0">;</span></div></li> |
| <li class="li1"><div class="de1"> </div></li> |
| <li class="li1"><div class="de1"> <span class="co1">// commit the pending changes of the project to the EMF Store</span></div></li> |
| |
| <li class="li1"><div class="de1"> projectSpace.<span class="me1">commit</span><span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span></div></li> |
| <li class="li1"><div class="de1"> </div></li> |
| <li class="li2"><div class="de2"> <span class="co1">// create and add another element from the example model</span></div></li> |
| |
| <li class="li1"><div class="de1"> Library library <span class="sy0">=</span> LibraryFactory.<span class="me1">eINSTANCE</span>.<span class="me1">createLibrary</span><span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span></div></li> |
| <li class="li1"><div class="de1"> project.<span class="me1">addModelElement</span><span class="br0">(</span>library<span class="br0">)</span><span class="sy0">;</span></div></li> |
| |
| <li class="li1"><div class="de1"> library.<span class="me1">getBooks</span><span class="br0">(</span><span class="br0">)</span>.<span class="me1">add</span><span class="br0">(</span>book<span class="br0">)</span><span class="sy0">;</span></div></li> |
| <li class="li1"><div class="de1"> </div></li> |
| <li class="li2"><div class="de2"> <span class="co1">// commit once more</span></div></li> |
| |
| <li class="li1"><div class="de1"> projectSpace.<span class="me1">commit</span><span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span></div></li> |
| <li class="li1"><div class="de1"> </div></li> |
| <li class="li1"><div class="de1"> <a href="http://www.google.com/search?hl=en&q=allinurl%3Asystem+java.sun.com&btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">(</span><span class="st0">"Client run completed."</span><span class="br0">)</span><span class="sy0">;</span></div></li> |
| |
| <li class="li1"><div class="de1"> <span class="br0">}</span> <span class="kw1">catch</span> <span class="br0">(</span><a href="http://www.google.com/search?hl=en&q=allinurl%3Aaccesscontrolexception+java.sun.com&btnI=I%27m%20Feeling%20Lucky"><span class="kw3">AccessControlException</span></a> e<span class="br0">)</span> <span class="br0">{</span></div></li> |
| <li class="li2"><div class="de2"> ModelUtil.<span class="me1">logException</span><span class="br0">(</span>e<span class="br0">)</span><span class="sy0">;</span></div></li> |
| |
| <li class="li1"><div class="de1"> <span class="br0">}</span> <span class="kw1">catch</span> <span class="br0">(</span>EmfStoreException e<span class="br0">)</span> <span class="br0">{</span></div></li> |
| <li class="li1"><div class="de1"> ModelUtil.<span class="me1">logException</span><span class="br0">(</span>e<span class="br0">)</span><span class="sy0">;</span></div></li> |
| |
| <li class="li1"><div class="de1"> <span class="br0">}</span></div></li> |
| <li class="li1"><div class="de1"> <span class="br0">}</span></div></li> |
| <li class="li2"><div class="de2"> <span class="br0">}</span>.<span class="me1">run</span><span class="br0">(</span><span class="kw2">false</span><span class="br0">)</span><span class="sy0">;</span></div></li> |
| <li class="li1"><div class="de1"> <span class="br0">}</span></div></li> |
| |
| <li class="li1"><div class="de1"> </div></li> |
| <li class="li1"><div class="de1"> <span class="kw1">public</span> <span class="kw4">void</span> stop<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span></div></li> |
| <li class="li1"><div class="de1"> <span class="co1">// TODO Auto-generated method stub</span></div></li> |
| <li class="li2"><div class="de2"> <span class="br0">}</span></div></li> |
| <li class="li1"><div class="de1"><span class="br0">}</span></div></li> |
| </ol> |
| </div> |
| </p> |
| |
| </div> |
| |