org.opennms.features.vaadin.jmxconfiggenerator.ui.UIHelper.java Source code

Java tutorial

Introduction

Here is the source code for org.opennms.features.vaadin.jmxconfiggenerator.ui.UIHelper.java

Source

/*******************************************************************************
 * This file is part of OpenNMS(R).
 *
 * Copyright (C) 2013-2014 The OpenNMS Group, Inc.
 * OpenNMS(R) is Copyright (C) 1999-2014 The OpenNMS Group, Inc.
 *
 * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc.
 *
 * OpenNMS(R) is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as published
 * by the Free Software Foundation, either version 3 of the License,
 * or (at your option) any later version.
 *
 * OpenNMS(R) is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with OpenNMS(R).  If not, see:
 *      http://www.gnu.org/licenses/
 *
 * For more information contact:
 *     OpenNMS(R) Licensing <license@opennms.org>
 *     http://www.opennms.org/
 *     http://www.opennms.com/
 *******************************************************************************/

package org.opennms.features.vaadin.jmxconfiggenerator.ui;

import com.google.common.base.Throwables;
import com.google.common.io.ByteStreams;
import com.vaadin.data.Validator;
import com.vaadin.server.Page;
import com.vaadin.server.Resource;
import com.vaadin.server.UserError;
import com.vaadin.ui.AbstractComponent;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.Field;
import com.vaadin.ui.Notification;
import com.vaadin.ui.Notification.Type;
import com.vaadin.ui.UI;
import org.opennms.features.vaadin.jmxconfiggenerator.Config;
import org.opennms.features.vaadin.jmxconfiggenerator.JmxConfigGeneratorUI;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Collection;
import java.util.Objects;

/**
 * This class provides several helper methods for ui stuff, e.g. creating a
 * button. So the amount of code is reduced generally.
 * 
 * @author Markus von Rden
 */
public abstract class UIHelper {

    private static final Logger LOG = LoggerFactory.getLogger(UIHelper.class);

    public static Button createButton(final String buttonCaption, final String buttonDescription,
            final Resource icon, final ClickListener clickListener) {
        Button button = new Button();
        button.setCaption(buttonCaption);
        button.setIcon(icon);
        if (buttonDescription != null)
            button.setDescription(buttonDescription);
        if (clickListener != null)
            button.addClickListener(clickListener);
        return button;
    }

    /**
     * Loads the <code>resourceName</code> from the classpath using the given
     * <code>clazz</code>. If the resource couldn't be loaded an empty string is
     * returned.
     * 
     * @param clazz
     *            The class to use for loading the resource.
     * @param resourceName
     *            The name of the resource to be loaded (e.g.
     *            /folder/filename.txt)
     * @return The content of the file, each line separated by line.separator or
     *         empty string if the resource does not exist.
     */
    public static String loadContentFromFile(final Class<?> clazz, final String resourceName) {
        Objects.requireNonNull(clazz);
        Objects.requireNonNull(resourceName);
        // prevent NullPointerException

        // check if resource is there
        try (InputStream is = clazz.getResourceAsStream(resourceName);
                ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {

            LOG.debug("Resource '{}' loaded from class '{}': '{}'", resourceName, clazz.getName(), is);
            if (is == null) {
                throw new NullPointerException(String.format("Resource '%s' not available", resourceName));
            }

            // resource is there, so we can try loading it
            ByteStreams.copy(is, outputStream);
            return outputStream.toString();
        } catch (IOException e) {
            LOG.error("Error while reading resource from '{}'.", resourceName, e);
            throw Throwables.propagate(e);
        }
    }

    /**
     * Shows a validation error to the user.
     * 
     * @param errorMessage
     *            the error message.
     */
    public static void showValidationError(String errorMessage) {
        showNotification("Validation Error", errorMessage != null ? errorMessage : "An unknown error occurred.",
                Type.ERROR_MESSAGE);
    }

    public static JmxConfigGeneratorUI getCurrent() {
        return (JmxConfigGeneratorUI) UI.getCurrent();
    }

    public static void showNotification(String message) {
        showNotification(message, null, Type.ERROR_MESSAGE);
    }

    public static void showNotification(String title, String message, Type type) {
        showNotification(title, message, type, Config.NOTIFICATION_DELAY);
    }

    public static void showNotification(String title, String message, Type type, int delayMsec) {
        Notification notification = new Notification(title, message, type, true);
        notification.setDelayMsec(delayMsec);
        notification.show(Page.getCurrent());
    }

    public static void updateView(UiState newUiState) {
        getCurrent().updateView(newUiState);
    }

    /**
     * Validates the given field and sets the component error accordingly.
     * Please note, that the provided field must implement {@link Field} and must be a sub class of {@link AbstractComponent}.
     *
     * @param field The field to validate (must be a sub class of {@link AbstractComponent}).
     * @param swallowValidationExceptions Indicates if an InvalidValueException is swallowed and not propagated.
     *                             If false the first occurring InvalidValueException is thrown.
     * @throws Validator.InvalidValueException If the field is not valid (see {@link Validator#validate(Object)}.
     */
    public static void validateField(Field<?> field, boolean swallowValidationExceptions)
            throws Validator.InvalidValueException {
        if (field instanceof AbstractComponent && field.isEnabled()) {
            try {
                field.validate();
                ((AbstractComponent) field).setComponentError(null);
            } catch (Validator.InvalidValueException ex) {
                // Some fields unify exceptions, we have to consider this
                if (ex.getMessage() == null) {
                    ex = ex.getCauses()[0];
                }

                // set error message
                ((AbstractComponent) field).setComponentError(new UserError(ex.getMessage()));
                if (!swallowValidationExceptions) {
                    throw ex;
                }
            }
        }
    }

    public static void validateFields(Collection<Field<?>> fields, boolean swallowValidationExceptions) {
        for (Field<?> eachField : fields) {
            validateField(eachField, swallowValidationExceptions);
        }
    }
}