Viewable.java

/*
 * Copyright (c) 2010, 2018 Oracle and/or its affiliates. All rights reserved.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0, which is available at
 * http://www.eclipse.org/legal/epl-2.0.
 *
 * This Source Code may also be made available under the following Secondary
 * Licenses when the conditions for such availability set forth in the
 * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
 * version 2 with the GNU Classpath Exception, which is available at
 * https://www.gnu.org/software/classpath/license.html.
 *
 * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
 */

package org.glassfish.jersey.server.mvc;

import org.glassfish.jersey.server.mvc.internal.LocalizationMessages;

/**
 * A viewable type referencing a template by name and a model to be passed
 * to the template. Such a type may be returned by a resource method of a
 * resource class. In this respect the template is the view and the controller
 * is the resource class in the Model View Controller pattern.
 * <p/>
 * The template name may be declared as absolute template name if the name
 * begins with a '/', otherwise the template name is declared as a relative
 * template name. If the template name is relative then the class of the
 * last matching resource is utilized to create an absolute path by default. However,
 * the responsibility of resolving the absolute template name is up to
 * {@link org.glassfish.jersey.server.mvc.spi.ViewableContext} which can override the
 * default resolving behaviour.
 * <p/>
 *
 * @author Paul Sandoz
 * @author Michal Gajdos
 *
 * @see Template
 * @see org.glassfish.jersey.server.mvc.spi.ViewableContext
 * @see org.glassfish.jersey.server.mvc.internal.ResolvingViewableContext
 */
public class Viewable {

    private final String templateName;

    private final Object model;

    /**
     * Construct a new viewable type with a template name.
     * <p/>
     * The model will be set to {@code null}.
     *
     * @param templateName the template name, shall not be {@code null}.
     * @throws IllegalArgumentException if the template name is {@code null}.
     */
    public Viewable(String templateName) throws IllegalArgumentException {
        this(templateName, null);
    }

    /**
     * Construct a new viewable type with a template name and a model.
     *
     * @param templateName the template name, shall not be {@code null}.
     * @param model the model, may be {@code null}.
     * @throws IllegalArgumentException if the template name is {@code null}.
     */
    public Viewable(String templateName, Object model) throws IllegalArgumentException {
        if (templateName == null) {
            throw new IllegalArgumentException(LocalizationMessages.TEMPLATE_NAME_MUST_NOT_BE_NULL());
        }

        this.templateName = templateName;
        this.model = model;
    }

    /**
     * Get the template name.
     *
     * @return the template name.
     */
    public String getTemplateName() {
        return templateName;
    }

    /**
     * Get the model.
     *
     * @return the model.
     */
    public Object getModel() {
        return model;
    }


    /**
     * Determines whether the template name is represented by an absolute path.
     *
     * @return {@code true} if the template name is absolute, and starts with a
     *         '/' character, {@code false} otherwise.
     */
    public boolean isTemplateNameAbsolute() {
        return templateName.length() > 0 && templateName.charAt(0) == '/';
    }
}