Dock addon not working

Hi

I am using Dock addon and getting the following exception while clicking the dockItem .

Code:

public class BuilderUI extends UI {

@WebServlet(value = "/*", asyncSupported = true)
@VaadinServletConfiguration(productionMode = false, ui = BuilderUI.class)
public static class Servlet extends VaadinServlet {
}

@Override
protected void init(VaadinRequest request) {
    
    CssLayout layout = new CssLayout();
    setContent(layout);
    try {
        MyDock MY_DOCK = new  MyDock();
        layout.addComponent(MY_DOCK);
    } catch (Exception e) {
        e.printStackTrace();
    }
          
}

}

public class MyDock extends Dock implements DockClickListener{

static Resource HomeIcon =new ThemeResource("images/Home.jpg");
static Resource PojectsIcon =new ThemeResource("images/Projects.jpg");
static Resource ApproachIcon =new ThemeResource("images/approach.png");
static Resource VisionIcon =new ThemeResource("images/Vision.jpg");
static Resource ManagementIcon =new ThemeResource("images/Management.jpg");
static Resource AboutIcon =new ThemeResource("images/About.jpg");

public MyDock() {
    addStyleName("dock_bottom");
    setSize(50);
    setSizeMax(150);
    setAlignment(Alignment.BOTTOM);
    setLabelPosition(LabelPosition.TOP_CENTER);
    addClickListener(this);
    
    DockItem home = new DockItem(HomeIcon, "Home");
    DockItem projecs = new DockItem(PojectsIcon, "Projects");
    DockItem vision = new DockItem(VisionIcon, "Vision");
    DockItem approach = new DockItem(ApproachIcon, "Vision");
    DockItem management = new DockItem(ManagementIcon, "Vision");
    DockItem aboout = new DockItem(AboutIcon, "Vision");


    addItem(home);
    addItem(projecs);
    addItem(vision);
    addItem(approach);
    addItem(management);
    addItem(aboout);
}
@Override
public void dockItemClicked(DockClickEvent event) {

    System.out.println("Item clicked" +event.getItem().getDescription());
}

}

StackTrace:

java.lang.AbstractMethodError: org.vaadin.sebastian.dock.Dock$1.call(Lelemental/json/JsonArray;)V
at com.vaadin.server.JavaScriptCallbackHelper$1.call(JavaScriptCallbackHelper.java:80)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.vaadin.server.ServerRpcManager.applyInvocation(ServerRpcManager.java:168)
at com.vaadin.server.ServerRpcManager.applyInvocation(ServerRpcManager.java:118)
at com.vaadin.server.communication.ServerRpcHandler.handleInvocations(ServerRpcHandler.java:290)
at com.vaadin.server.communication.ServerRpcHandler.handleRpc(ServerRpcHandler.java:183)
at com.vaadin.server.communication.UidlRequestHandler.synchronizedHandleRequest(UidlRequestHandler.java:92)
at com.vaadin.server.SynchronizedRequestHandler.handleRequest(SynchronizedRequestHandler.java:41)
at com.vaadin.server.VaadinService.handleRequest(VaadinService.java:1408)
at com.vaadin.server.VaadinServlet.service(VaadinServlet.java:305)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1070)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:744)

Hi,

I faced the same issue when migrating to Vaadin 7.4.0.
The issue is that all org.json.* classes were replaced by elemental.json.* classes in Vaadin 7.4.0 as explained on ticket
#8942
. The Dock add-on, which was not updated, relies on the old org.json.* classes.
To fix it, just create a CustomDock which extends Dock and replace the constructor with the following:

[code]
(…)

import elemental.json.JsonArray;
import elemental.json.JsonException;

public class CustomDock extends Dock {

private static final long serialVersionUID = 1L;

public CustomDock() {
    addFunction("itemClicked", new JavaScriptFunction() {

        private static final long serialVersionUID = 1L;

        @Override
        public void call(JsonArray arguments) throws JsonException {
            int index = (int) arguments.getNumber(0);
            DockItem item = getState().items.get(index);
            for (final DockClickListener listener : listeners) {
                final DockClickEvent event = new DockClickEvent();
                event.setItem(item);
                event.setItemIndex(index);
                listener.dockItemClicked(event);
            }
        }
    });
    addFunction("throwResourceException", new JavaScriptFunction() {

        private static final long serialVersionUID = 1L;

        @Override
        public void call(JsonArray arguments) throws JsonException {
            throw new InvalidResourceException((int) arguments.getNumber(0));
        }
    });
}

}
[/code]I hope this helps!

Johan