/* * Copyright 2000-2016 Vaadin Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package com.vaadin.tests.application; import com.vaadin.server.VaadinRequest; import com.vaadin.server.VaadinServlet; import com.vaadin.tests.components.AbstractTestUIWithLog; import com.vaadin.ui.Alignment; import com.vaadin.ui.Button; import com.vaadin.ui.Button.ClickEvent; import com.vaadin.ui.Button.ClickListener; import com.vaadin.ui.CheckBox; import com.vaadin.ui.Component; import com.vaadin.ui.HorizontalLayout; import com.vaadin.ui.Label; import com.vaadin.ui.Panel; import com.vaadin.ui.VerticalLayout; import com.vaadin.v7.data.Property.ValueChangeEvent; import com.vaadin.v7.data.Property.ValueChangeListener; import com.vaadin.v7.ui.TextField; /** * * @since * @author Vaadin Ltd */ public class CommErrorEmulatorUI extends AbstractTestUIWithLog { private static class Response { private Integer code; private Integer time; /** * @param code * @param time */ public Response(Integer code, Integer time) { super(); this.code = code; this.time = time; } } private Response uidlResponse = new Response(503, 10); private Response heartbeatResponse = new Response(200, 10); // Server exceptions will occur in this test as we are writing the response // here and not letting the servlet write it @Override protected void setup(VaadinRequest request) { String transport = request.getParameter("transport"); if ("websocket".equalsIgnoreCase(transport)) { log("Using websocket"); } else if ("websocket-xhr".equalsIgnoreCase(transport)) { log("Using websocket for push only"); } else if ("long-polling".equalsIgnoreCase(transport)) { log("Using long-polling"); } else { log("Using XHR"); } getLayout().setSpacing(true); addComponent(createConfigPanel()); addComponent(createServerConfigPanel()); addComponent(new Button("Say hello", new ClickListener() { @Override public void buttonClick(ClickEvent event) { log("Hello"); } })); } /** * @since * @return */ private Component createServerConfigPanel() { Panel p = new Panel("Server config (NOTE: affects all users)"); VerticalLayout vl = new VerticalLayout(); vl.setSpacing(true); vl.setMargin(true); p.setContent(vl); vl.addComponent( createTemporaryResponseCodeSetters("UIDL", uidlResponse)); vl.addComponent(createTemporaryResponseCodeSetters("Heartbeat", heartbeatResponse)); vl.addComponent(new Button("Activate", new ClickListener() { @Override public void buttonClick(ClickEvent event) { if (uidlResponse.code != null && uidlResponse.code != 200) { getServlet().setUIDLResponseCode(CommErrorEmulatorUI.this, uidlResponse.code, uidlResponse.time); log("Responding with " + uidlResponse.code + " to UIDL requests for " + uidlResponse.time + "s"); } if (heartbeatResponse.code != null && heartbeatResponse.code != 200) { getServlet().setHeartbeatResponseCode( CommErrorEmulatorUI.this, heartbeatResponse.code, heartbeatResponse.time); log("Responding with " + heartbeatResponse.code + " to heartbeat requests for " + heartbeatResponse.time + "s"); } } })); return p; } private Component createConfigPanel() { Panel p = new Panel("Reconnect dialog configuration"); p.setSizeUndefined(); final TextField reconnectDialogMessage = new TextField( "Reconnect message"); reconnectDialogMessage.setWidth("50em"); reconnectDialogMessage .setValue(getReconnectDialogConfiguration().getDialogText()); reconnectDialogMessage .addValueChangeListener(new ValueChangeListener() { @Override public void valueChange(ValueChangeEvent event) { getReconnectDialogConfiguration().setDialogText( reconnectDialogMessage.getValue()); } }); final TextField reconnectDialogGaveUpMessage = new TextField( "Reconnect gave up message"); reconnectDialogGaveUpMessage.setWidth("50em"); reconnectDialogGaveUpMessage.setValue( getReconnectDialogConfiguration().getDialogTextGaveUp()); reconnectDialogGaveUpMessage .addValueChangeListener(new ValueChangeListener() { @Override public void valueChange(ValueChangeEvent event) { getReconnectDialogConfiguration().setDialogTextGaveUp( reconnectDialogGaveUpMessage.getValue()); } }); final TextField reconnectDialogReconnectAttempts = new TextField( "Reconnect attempts"); reconnectDialogReconnectAttempts.setConverter(Integer.class); reconnectDialogReconnectAttempts.setConvertedValue( getReconnectDialogConfiguration().getReconnectAttempts()); reconnectDialogReconnectAttempts .addValueChangeListener(new ValueChangeListener() { @Override public void valueChange(ValueChangeEvent event) { getReconnectDialogConfiguration().setReconnectAttempts( (Integer) reconnectDialogReconnectAttempts .getConvertedValue()); } }); final TextField reconnectDialogReconnectInterval = new TextField( "Reconnect interval (ms)"); reconnectDialogReconnectInterval.setConverter(Integer.class); reconnectDialogReconnectInterval.setConvertedValue( getReconnectDialogConfiguration().getReconnectInterval()); reconnectDialogReconnectInterval .addValueChangeListener(new ValueChangeListener() { @Override public void valueChange(ValueChangeEvent event) { getReconnectDialogConfiguration().setReconnectInterval( (Integer) reconnectDialogReconnectInterval .getConvertedValue()); } }); final TextField reconnectDialogGracePeriod = new TextField( "Reconnect dialog grace period (ms)"); reconnectDialogGracePeriod.setConverter(Integer.class); reconnectDialogGracePeriod.setConvertedValue( getReconnectDialogConfiguration().getDialogGracePeriod()); reconnectDialogGracePeriod .addValueChangeListener(new ValueChangeListener() { @Override public void valueChange(ValueChangeEvent event) { getReconnectDialogConfiguration().setDialogGracePeriod( (Integer) reconnectDialogGracePeriod .getConvertedValue()); } }); final CheckBox reconnectDialogModal = new CheckBox( "Reconnect dialog modality"); reconnectDialogModal .setValue(getReconnectDialogConfiguration().isDialogModal()); reconnectDialogModal.addValueChangeListener( event -> getReconnectDialogConfiguration() .setDialogModal(reconnectDialogModal.getValue())); VerticalLayout vl = new VerticalLayout(); vl.setMargin(true); vl.setSpacing(true); p.setContent(vl); vl.addComponents(reconnectDialogMessage, reconnectDialogGaveUpMessage, reconnectDialogGracePeriod, reconnectDialogModal, reconnectDialogReconnectAttempts, reconnectDialogReconnectInterval); return p; } private Component createTemporaryResponseCodeSetters(String type, final Response response) { HorizontalLayout hl = new HorizontalLayout(); hl.setSpacing(true); hl.setDefaultComponentAlignment(Alignment.MIDDLE_LEFT); Label l1 = new Label("Respond to " + type + " requests with code"); final TextField responseCode = new TextField(null, "" + response.code); responseCode.setConverter(Integer.class); responseCode.setWidth("5em"); Label l2 = new Label("for the following"); final TextField timeField = new TextField(null, "" + response.time); timeField.setConverter(Integer.class); timeField.setWidth("5em"); Label l3 = new Label("seconds"); responseCode.addValueChangeListener(new ValueChangeListener() { @Override public void valueChange(ValueChangeEvent event) { Integer code = (Integer) responseCode.getConvertedValue(); response.code = code; } }); timeField.addValueChangeListener(new ValueChangeListener() { @Override public void valueChange(ValueChangeEvent event) { Integer time = (Integer) timeField.getConvertedValue(); response.time = time; } }); hl.addComponents(l1, responseCode, l2, timeField, l3); return hl; } protected CommErrorEmulatorServlet getServlet() { return (CommErrorEmulatorServlet) VaadinServlet.getCurrent(); } }