/* * 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.server.communication; import java.io.IOException; import java.io.Serializable; import java.io.Writer; import com.vaadin.server.SystemMessages; import com.vaadin.ui.UI; /** * Serializes miscellaneous metadata to JSON. * * @author Vaadin Ltd * @since 7.1 */ public class MetadataWriter implements Serializable { private int timeoutInterval = -1; /** * Writes a JSON object containing metadata related to the given UI. * * @param ui * The UI whose metadata to write. * @param writer * The writer used. * @param repaintAll * Whether the client should repaint everything. * @param async * True if this message is sent by the server asynchronously, * false if it is a response to a client message. * @param messages * a {@link SystemMessages} containing client-side error * messages. * @throws IOException * If the serialization fails. * */ public void write(UI ui, Writer writer, boolean repaintAll, boolean async, SystemMessages messages) throws IOException { writer.write("{"); boolean metaOpen = false; if (repaintAll) { metaOpen = true; writer.write("\"repaintAll\":true"); } if (async) { if (metaOpen) { writer.write(", "); } metaOpen = true; writer.write("\"async\":true"); } // meta instruction for client to enable auto-forward to // sessionExpiredURL after timer expires. if (messages != null && messages.getSessionExpiredMessage() == null && messages.getSessionExpiredCaption() == null && messages.isSessionExpiredNotificationEnabled() && ui.getSession().getSession() != null) { int newTimeoutInterval = ui.getSession().getSession() .getMaxInactiveInterval(); if (repaintAll || (timeoutInterval != newTimeoutInterval)) { String escapedURL = messages.getSessionExpiredURL() == null ? "" : messages.getSessionExpiredURL().replace("/", "\\/"); if (metaOpen) { writer.write(","); } writer.write("\"timedRedirect\":{\"interval\":" + (newTimeoutInterval + 15) + ",\"url\":\"" + escapedURL + "\"}"); metaOpen = true; } timeoutInterval = newTimeoutInterval; } writer.write("}"); } }