com.izforge.izpack.panels.licence.LicenceLoader.java Source code

Java tutorial

Introduction

Here is the source code for com.izforge.izpack.panels.licence.LicenceLoader.java

Source

/*
 * IzPack - Copyright 2001-2017 The IzPack project team.
 * All Rights Reserved.
 *
 * http://izpack.org/
 *
 * 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.izforge.izpack.panels.licence;

import com.izforge.izpack.api.data.Panel;
import com.izforge.izpack.api.exception.ResourceException;
import com.izforge.izpack.api.exception.ResourceNotFoundException;
import com.izforge.izpack.api.resource.Resources;
import com.izforge.izpack.installer.util.PanelHelper;
import org.apache.commons.io.Charsets;
import org.apache.commons.io.IOUtils;

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;

/**
 * Provides shared licence loading logic between console and GUI panels.
 * <p>
 *     A licence resource file is identified by its resource name plus a suffix.
 *     The resource name is built from the simple class name of the IzPanel class
 *     related to the given {@code panelClass}. The suffix is built from the
 *     identifier of the given {@code panel}, if available. Otherwise a default
 *     suffix of {@code "licence"} is used.
 * </p>
 *
 * @author Michael Aichler
 */
class LicenceLoader {

    private final static String DEFAULT_SUFFIX = ".licence";

    private final Panel panel;
    private final Class<?> panelClass;
    private final Resources resources;

    /**
     * Creates a new licence loader.
     *
     * @param panelClass The class of the concrete licence panel implementation.
     * @param panel The panel metadata (needed for the panel identifier).
     * @param resources The resource locator.
     */
    LicenceLoader(Class<?> panelClass, Panel panel, Resources resources) {

        this.panel = panel;
        this.panelClass = panelClass;
        this.resources = resources;
    }

    /**
     * Loads the licence as a URL.
     *
     * @return The URL to the resource.
     * @throws ResourceException If the related IzPanel or the licence resource
     *      cannot be found. The generated error message is ready to be logged.
     */
    URL asURL() throws ResourceException {
        Class<?> targetClass = findTargetClass(panelClass);

        String resourceNamePrefix = targetClass.getSimpleName();
        String defaultResourceName = resourceNamePrefix + DEFAULT_SUFFIX;
        String specificResourceName = buildSpecificResourceName(resourceNamePrefix, panel);

        try {
            if (null != specificResourceName) {
                return resources.getURL(specificResourceName);
            }
        } catch (ResourceNotFoundException ignored) {
        }

        try {
            return resources.getURL(defaultResourceName);
        } catch (ResourceNotFoundException ignored) {
        }

        String message = buildFinalErrorMessage(resourceNamePrefix, defaultResourceName, specificResourceName);

        throw new ResourceNotFoundException(message);
    }

    /**
     * Loads the licence into a string using UTF-8 as encoding.
     *
     * @return A string representation of the licence.
     * @throws ResourceException If the licence could not be found or if file
     *      content could not be converted to UTF-8.
     */
    String asString() throws ResourceException {
        return asString("UTF-8");
    }

    /**
     * Loads the licence into a string with the specified {@code encoding}.
     *
     * @param encoding The target character encoding.
     * @return A string representation of the licence in the specified encoding.
     * @throws ResourceException If the licence could not be found or if file
     *      content could not be converted to the specified {@code encoding}.
     */
    String asString(final String encoding) throws ResourceException {
        URL url = asURL();
        InputStream in = null;

        try {
            in = url.openStream();
            return IOUtils.toString(in, Charsets.toCharset(encoding));
        } catch (IOException e) {
            throw new ResourceNotFoundException("Cannot convert license document from resource " + url.getFile()
                    + " to text: " + e.getMessage());

        } finally {
            IOUtils.closeQuietly(in);
        }
    }

    /**
     * Finds the IzPanel target class for the given {@code panelClass}.
     *
     * @param panelClass The panel class.
     * @return The related IzPanel class.
     * @throws ResourceException If a related IzPanel class could not be found.
     *
     * @see PanelHelper#getIzPanel(String)
     */
    static Class<?> findTargetClass(Class<?> panelClass) throws ResourceException {
        Class<?> targetClass = PanelHelper.getIzPanel(panelClass.getName());

        if (null == targetClass) {
            throw new ResourceNotFoundException(
                    "No IzPanel implementation found for " + panelClass.getSimpleName());
        }

        return targetClass;
    }

    /**
     * Builds the resource name for a specific panel id.
     *
     * @param resourceNamePrefix The resource name prefix.
     * @param panel The panel providing a specific id.
     * @return The specific resource name or {@code null}, if the panel does not
     *      have an identifier.
     */
    static String buildSpecificResourceName(String resourceNamePrefix, Panel panel) {
        if (null != panel) {
            if (panel.hasPanelId()) {
                return resourceNamePrefix + '.' + panel.getPanelId();
            }
        }

        return null;
    }

    /**
     * Builds an informative error message.
     *
     * @param panelType The panel type.
     * @param resourceNames The list of evaluated resource names
     * @return The built error message.
     */
    static String buildFinalErrorMessage(String panelType, String... resourceNames) {
        StringBuilder sb = new StringBuilder();
        sb.append("Cannot open any of the possible license document resources (");

        boolean isFirst = true;

        for (String resourceName : resourceNames) {
            if (null != resourceName) {
                if (!isFirst) {
                    sb.append(", ");
                }

                sb.append(resourceName);

                if (isFirst) {
                    isFirst = false;
                }
            }
        }

        sb.append(") for panel type '");
        sb.append(panelType);
        sb.append("'");

        return sb.toString();
    }
}