Search code examples
osgivaadin8

SessionInitListener for a Vaadin 8.1 OSGI Portlet


I can't seem to work out how to add SessionInitListener to a Vaadin 8.1 OSGI portlet running on Liferay 7.

In Vaadin 7 and Liferay 6.x it was done by simply defining a custom implementation of VaadinPortlet. Any help would be much appreciated.


Solution

  • This is possible. There is no need for a custom Portlet implementation.

    All that is required is to add a SessionInitListener in the UI init method.

     @Override
        protected void init(final VaadinRequest vaadinRequest) {
    
    
            vaadinRequest.getService().addSessionInitListener(this::sessionInit);
    

    Combined with a lambda, you can manupulate the HTML like this.

    private void sessionInit(final SessionInitEvent sessionInitEvent) {
        sessionInitEvent.getSession().addBootstrapListener(new BootstrapListener() {
            @Override
            public void modifyBootstrapFragment(final BootstrapFragmentResponse response) {
                Element myDiv = new Element(Tag.valueOf("div"), "");
                myDiv.append("<h1>Extra HTML!</h1>");
                List<Node> nodes = response.getFragmentNodes();
                for (Node node : nodes) {
                    myDiv.appendChild(node);
                }
                nodes.clear();
                nodes.add(myDiv);
            }
    
            @Override
            public void modifyBootstrapPage(final BootstrapPageResponse bootstrapPageResponse) {
    
            }
        });
    }