{"id":1958,"date":"2015-01-25T22:16:14","date_gmt":"2015-01-25T20:16:14","guid":{"rendered":"http:\/\/hasselba.ch\/blog\/?p=1958"},"modified":"2015-01-26T21:57:08","modified_gmt":"2015-01-26T19:57:08","slug":"howto-vaadin-on-domino-3","status":"publish","type":"post","link":"https:\/\/hasselba.ch\/blog\/?p=1958","title":{"rendered":"HowTo: Vaadin on Domino (3)"},"content":{"rendered":"<p>Let&#8217;s create another application, based on <a title=\"github.com: Addressbook\" href=\"https:\/\/github.com\/vaadin\/addressbook\" target=\"_blank\">Vaadin&#8217;s AddressBook example<\/a>. You can download the <a title=\"githubusercontent.com: AddressbookUI\" href=\"https:\/\/raw.githubusercontent.com\/vaadin\/addressbook\/master\/src\/main\/java\/com\/vaadin\/tutorial\/addressbook\/AddressbookUI.java\" target=\"_blank\">source code directly<\/a> or grab the code from the repository; it is a single class file named &#8222;<em>AddressbookUI<\/em>&#8220; only.<\/p>\n<p>After importing (or manually creating) the class in the <a title=\"HowTo: Vaadin on Domino\" href=\"https:\/\/hasselba.ch\/blog\/?p=1891\" target=\"_blank\">HelloVaadin plug-in<\/a>, the servlet configuration in &#8222;<em>web.xml<\/em>&#8220; must be updated:<\/p>\n<pre><code>&lt;?xml version=\"1.0\" encoding=\"ISO-8859-1\"?&gt;\r\n&lt;web-app version=\"2.5\" xmlns=\"http:\/\/java.sun.com\/xml\/ns\/javaee\" \r\nxmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\" \r\nxsi:schemaLocation=\"http:\/\/java.sun.com\/xml\/ns\/javaee \r\nhttp:\/\/java.sun.com\/xml\/ns\/javaee\/web-app_2_5.xsd\"&gt;\r\n\r\n\u00a0 &lt;display-name&gt;Addressbook&lt;\/display-name&gt;\r\n\u00a0\u00a0\u00a0 &lt;context-param&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;description&gt;Vaadin production mode&lt;\/description&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;param-name&gt;productionMode&lt;\/param-name&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;param-value&gt;false&lt;\/param-value&gt;\r\n\u00a0\u00a0\u00a0 &lt;\/context-param&gt;\r\n\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0 &lt;servlet&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;servlet-name&gt;AdressbookServlet&lt;\/servlet-name&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;servlet-class&gt;com.vaadin.server.VaadinServlet&lt;\/servlet-class&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;init-param&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;param-name&gt;UI&lt;\/param-name&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;param-value&gt;ch.hasselba.vaadin.AddressbookUI&lt;\/param-value&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;\/init-param&gt;\r\n\u00a0\u00a0\u00a0 &lt;\/servlet&gt; \r\n\r\n\u00a0\u00a0\u00a0 &lt;servlet-mapping&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;servlet-name&gt;AdressbookServlet&lt;\/servlet-name&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;url-pattern&gt;\/*&lt;\/url-pattern&gt;\r\n\u00a0\u00a0\u00a0 &lt;\/servlet-mapping&gt;\r\n\u00a0\u00a0 \u00a0\r\n&lt;\/web-app&gt;<\/code><\/pre>\n<p>The &#8222;<em>&lt;param-value&gt;<\/em>&#8220; must contain the complete class name, I have additionally changed the name of the servlet and updated the path in the &#8222;<em>plugin.xml<\/em>&#8222;:<\/p>\n<pre><code>&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;\r\n&lt;?eclipse version=\"3.4\"?&gt;\r\n&lt;plugin&gt;\r\n\r\n\u00a0\u00a0\u00a0\u00a0 &lt;extension\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 point=\"com.ibm.pvc.webcontainer.application\"&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;contextRoot&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/addressbook \u00a0\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;\/contextRoot&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;contentLocation&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 WebContent\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;\/contentLocation&gt;\r\n\u00a0\u00a0 &lt;\/extension&gt;\r\n\r\n&lt;\/plugin&gt;<\/code><\/pre>\n<p>To connect the example to a Domino environment, the &#8222;<em>createDummyDatasource<\/em>&#8220; method of the class must be replaced:<\/p>\n<pre><code>@SuppressWarnings(\"unchecked\")\r\nprivate static IndexedContainer createDummyDatasource() {\r\n\r\n    \/\/ Domino objects\r\n    Session session = null;\r\n    Database db = null;\r\n    View view = null;\r\n    Document doc = null;\r\n    Document tmpDoc = null;\r\n\r\n    \/\/ initialize IndexedContainer\r\n    IndexedContainer ic = new IndexedContainer();\r\n\r\n    \/\/ add fieldnames as properties\r\n    for (String p : fieldNames) {\r\n        ic.addContainerProperty(p, String.class, \"\");\r\n    }\r\n\r\n    \/\/ get all users from NAB\r\n    try{\r\n        \/\/ init Domino objects\r\n        session = ContextInfo.getUserSession();\r\n        db = session.getDatabase(session.getServerName(), \"dummynames.nsf\");\r\n        view = db.getView( \"People\" );\r\n\r\n        \/\/ process all documents in view\r\n        doc = view.getFirstDocument();\r\n        while (doc != null) {\r\n\r\n            \/\/ create a new item\r\n            Object id = ic.addItem();\r\n\r\n            \/\/ add field values to the item\r\n            ic.getContainerProperty(id, FNAME).\r\n                setValue(doc.getItemValueString(\"FirstName\"));\r\n            ic.getContainerProperty(id, LNAME).\r\n                setValue(doc.getItemValueString(\"LastName\"));\r\n\r\n            \/\/ grab next document\r\n            tmpDoc = doc;\r\n            doc = view.getNextDocument(tmpDoc);\r\n            recycle( tmpDoc );\r\n        }\r\n    }catch(Exception e){\r\n        e.printStackTrace();\r\n    }finally{\r\n        recycle( doc, tmpDoc, view, db, session );\r\n    }\r\n    return ic;\r\n}\r\n\r\n\/**\r\n* recycle Domino objects\r\n*\r\n* @param objs\r\n* \u00a0\u00a0 \u00a0lotus.domino.Base objects to recylce\r\n*\/\r\nprivate static void recycle(Base... objs){\r\n    try{\r\n        for( Base obj:objs ){\r\n            if( obj != null )\r\n                obj.recycle();\r\n        }\r\n    }catch(Exception e){}\r\n}<\/code><\/pre>\n<p>Because this is not rocket science I won&#8217;t get into the details.<\/p>\n<p>To prevent anonymous access, I have added a simple redirection in the &#8222;<em>init<\/em>&#8220; method:<\/p>\n<pre><code>protected void init(VaadinRequest request) {\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0if( ContextInfo.isAnonymous() ){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0 getPage().setLocation(\"\/names.nsf?login=1&amp;redirectto=\" + \r\n             request.getContextPath() );\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0 return;\r\n\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0initLayout();\r\n\u00a0\u00a0 \u00a0initContactList();\r\n\u00a0\u00a0 \u00a0initEditor();\r\n\u00a0\u00a0 \u00a0initSearch();\r\n\u00a0\u00a0 \u00a0initButtons();\r\n}<\/code><\/pre>\n<p>When opening the application as an anonymous user you will be automatically redirected to the Login Screen:<\/p>\n<p><a href=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/00-Login.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-1959\" src=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/00-Login-300x174.png\" alt=\"00 - Login\" width=\"300\" height=\"174\" srcset=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/00-Login-300x174.png 300w, https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/00-Login.png 693w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>After signing in, domino redirects back to the addressbook example, and the list of persons in your &#8222;<em>names.nsf<\/em>&#8220; is shown up:<\/p>\n<p><a href=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/00-Addressbook.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-1960\" src=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/00-Addressbook-300x209.png\" alt=\"00 - Addressbook\" width=\"300\" height=\"209\" srcset=\"https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/00-Addressbook-300x209.png 300w, https:\/\/hasselba.ch\/blog\/wp-content\/uploads\/2015\/01\/00-Addressbook.png 826w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Let&#8217;s create another application, based on Vaadin&#8217;s AddressBook example. You can download the source code directly or grab the code from the repository; it is a single class file named &#8222;AddressbookUI&#8220; only. After importing (or manually creating) the class in &hellip; <a href=\"https:\/\/hasselba.ch\/blog\/?p=1958\">Weiterlesen <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[64,63],"tags":[7,65,66],"class_list":["post-1958","post","type-post","status-publish","format-standard","hentry","category-osgi","category-vaadin","tag-domino","tag-osgi","tag-vaadin"],"_links":{"self":[{"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=\/wp\/v2\/posts\/1958","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1958"}],"version-history":[{"count":3,"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=\/wp\/v2\/posts\/1958\/revisions"}],"predecessor-version":[{"id":1963,"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=\/wp\/v2\/posts\/1958\/revisions\/1963"}],"wp:attachment":[{"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1958"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1958"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1958"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}