/* * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. * * Copyright (c) 1997-2010 Oracle and/or its affiliates. All rights reserved. * * The contents of this file are subject to the terms of either the GNU * General Public License Version 2 only ("GPL") or the Common Development * and Distribution License("CDDL") (collectively, the "License"). You * may not use this file except in compliance with the License. You can * obtain a copy of the License at * https://glassfish.dev.java.net/public/CDDL+GPL_1_1.html * or packager/legal/LICENSE.txt. See the License for the specific * language governing permissions and limitations under the License. * * When distributing the software, include this License Header Notice in each * file and include the License file at packager/legal/LICENSE.txt. * * GPL Classpath Exception: * Oracle designates this particular file as subject to the "Classpath" * exception as provided by Oracle in the GPL Version 2 section of the License * file that accompanied this code. * * Modifications: * If applicable, add the following below the License Header, with the fields * enclosed by brackets [] replaced by your own identifying information: * "Portions Copyright [year] [name of copyright owner]" * * Contributor(s): * If you wish your version of this file to be governed by only the CDDL or * only the GPL Version 2, indicate your decision by adding "[Contributor] * elects to include this software in this distribution under the [CDDL or GPL * Version 2] license." If you don't indicate a single choice of license, a * recipient has the option to distribute your version of this file under * either the CDDL, the GPL Version 2 or to extend the choice of license to * its licensees as provided above. However, if you add GPL Version 2 code * and therefore, elected the GPL Version 2 license, then the option applies * only if the new code is made subject to such option by the copyright * holder. */ package javax.faces.application; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.util.Map; import javax.faces.context.FacesContext; /** * <p class="changed_added_2_0"><span * class="changed_modified_2_1 changed_modified_2_2">An</span> instance of * <code>Resource</code> is a Java object representation of the artifact * that is served up in response to a <i>resource request</i> from the * client. Instances of <code>Resource</code> are normally created and * initialized via calls to {@link ResourceHandler#createResource}. See * the documentation for {@link ResourceHandler} for more * information.</p> * * <div class="changed_added_2_0"> * </div> * * @since 2.0 */ public abstract class Resource extends ViewResource { /** * <p class="changed_added_2_0">This constant is used as the key in the * component attribute map of a composite component to associate * the component with its <code>Resource</code> instance. The * value for this key is the actual <code>Resource</code> instance.</p> * */ public static final String COMPONENT_RESOURCE_KEY = "javax.faces.application.Resource.ComponentResource"; private String contentType; private String libraryName; private String resourceName; // ---------------------------------------------------------- Public Methods /** * <p class="changed_added_2_0">Return the MIME content-type for this resource.</p> * @return the MIME content-type for this resource. */ public String getContentType() { return contentType; } /** * <p class="changed_added_2_0">Set the MIME content-type for this * resource. The default implementation performs no validation on * the argument.</p> * @param contentType the MIME content-type for this resource. The * default implementation must accept <code>null</code> as a * parameter. */ public void setContentType(String contentType) { this.contentType = contentType; } /** * <p class="changed_added_2_0">Return the libraryName for this * resource. May be <code>null</code>. The libraryName for a * resource is an optional String that indicates membership in a * "resource library". All resources with the same libraryName * belong to the same "resource library". The "resource library" * concept allows disambiguating resources that have the same * resourceName. See {@link ResourceHandler} for more * information.</p> * * @return Return the libraryName for this resource. May be * <code>null</code>. */ public String getLibraryName() { return libraryName; } /** * <p class="changed_added_2_0">Set the libraryName for this resource.</p> * @param libraryName the libraryName for this resource. The * default implementation must accept <code>null</code> for the * <em>libraryName</em>. */ public void setLibraryName(String libraryName) { this.libraryName = libraryName; } /** * <p class="changed_added_2_0">Return the resourceName for this resource. * Will never be null. All <code>Resource</code> instances must * have a resourceName.</p> * @return Return the resourceName for this resource. Will never be * null. */ public String getResourceName() { return resourceName; } /** * <p class="changed_added_2_0">Set the resourceName for this resource.</p> * @param resourceName a non-null String. * * @throws NullPointerException if argument * <code>resourceName</code> is null. */ public void setResourceName(String resourceName) { if (null == resourceName) { throw new NullPointerException("PENDING_I18N: All resources must have a non-null resourceName."); } this.resourceName = resourceName; } /** * <p class="changed_added_2_0"><span * class="changed_modified_2_1">If</span> the current request is a resource * request, (that is, {@link ResourceHandler#isResourceRequest} * returns <code>true</code>), return an <code>InputStream</code> * containing the bytes of the resource. Otherwise, throw an * <code>IOException</code>.</p> * @return an <code>InputStream</code> containing the bytes of the * resource.</p> * * <p class="changed_modified_2_1">Any EL expressions present in the * resource must be evaluated before serving the bytes of the * resource. Note that due to browser and server caching, EL * expressions in a resource file will generally only be evaluated * once, when the resource is first served up. Therefore, using EL * expressions that refer to per-request data is not advisable since * this data can become stale.</p> * * @throws IOException if the current request is not a resource request. */ public abstract InputStream getInputStream() throws IOException; /** * <p class="changed_added_2_0">Returns a mutable * <code>Map<String, String></code> whose entries will be sent * as response headers during {@link * ResourceHandler#handleResourceRequest}. The entries in this map * must not persist beyond the scope of a single request. Any * modifications made to the map after the resource has been served * will be ignored by the run-time.</p> * * @return a mutable <code>Map<String, String></code> of * headers that will be included with the response. */ public abstract Map<String, String> getResponseHeaders(); /** * <p class="changed_added_2_0"><span * class="changed_modified_2_2">Return</span> a path to this * resource such that, when the browser resolves it against the base * URI for the view that includes the resource, and issues a GET * request to the resultant fully qualified URL, the bytes of the * resource are returned in response.</p> * * <div class="changed_added_2_0"> * * <p>The default implementation must * implement the following algorithm. For discussion, the return * result from this method will be called <em>result</em>.</p> * * <ul> * * <li><p>Get the context-root for this web application, not ending * in slash. For discussion this will be called * <em>contextRoot</em>.</p></li> * * <li><p>Discover if the <code>FacesServlet</code> is prefix or * extension mapped, and the value of the mapping (including the * leading '.' in the case of extension mapping). For discussion, * this will be <em>facesServletMapping</em>.</p> * * <p>If prefix mapped, <em>result</em> must be</p> * * <ul><p><code>result = <em>contextRoot</em> + '/' + * <em>facesServletMapping</em> + {@link * ResourceHandler#RESOURCE_IDENTIFIER} + '/' + {@link * #getResourceName}</code></p></ul> * * <p>If extension mapped, <em>result</em> must be</p> * * <ul><p><code>result = <em>contextRoot</em> + {@link * ResourceHandler#RESOURCE_IDENTIFIER} + {@link #getResourceName} + * <em>facesServletMapping</em></code></p></ul> * * </li> * * <li class="changed_modified_2_2"><p>Build up a string, called * <em>resourceMetaData</em> which is an & separated string of * name=value pairs suitable for inclusion in a URL query * string.</p> * * <ul> * * <p>If {@link #getLibraryName} returns non-<code>null</code>, * <code>resourceMetaData</code> must include "ln=" + the return * from {@link #getLibraryName}</p> * <p class="changed_added_2_2">If there is a * <code>localePrefix</code> for this application, as defined in * {@link ResourceHandler#LOCALE_PREFIX}, <code>resourceMetaData</code> must * include "loc=" + the <code>localePrefix</code>.</p> * <p class="changed_added_2_2">If this resource is contained in a * resource library contract, <code>resourceMetaData</code> must * include "con=" + the name of the resource library contract.</p> * * </ul> * * <p>Append "?" + <em>resourceMetaData</em> to <em>result</em>.</p> * * </li> * * <li><p>Make it portlet safe by passing the result through {@link * ViewHandler#getResourceURL}.</p></li> * * </ul> * </div> * * @return the path to this resource, intended to be included in the * encoded view that is sent to the browser when sending a faces * response. */ public abstract String getRequestPath(); /** * <p class="changed_added_2_0">Return an actual <code>URL</code> * instance that refers to this resource instance.</p> * * @return Return an actual <code>URL</code> instance that refers to * this resource instance. */ @Override public abstract URL getURL(); /** * <p class="changed_added_2_0">Call through to {@link * #getRequestPath} and return the result.</p> * * @return Call through to {@link #getRequestPath} and return the * result. */ public String toString() { return getRequestPath(); } /** * <p class="changed_added_2_0"><span * class="changed_modified_2_2">Return</span> <code>true</code> if * the user-agent requesting this resource needs an update. <span * class="changed_added_2_2">If the {@code If-Modified-Since} HTTP * header is available for this request, its value must be * consulted, as specified in Section 14.25 of IETF RFC 2616, to * determine the result.</span> Returns <code>false</code> if the * user-agent does not need an update for this resource.</p> * * @return <code>true</code> or <code>false</code> depending on * whether or not the user-agent needs an update of this resource. */ public abstract boolean userAgentNeedsUpdate(FacesContext context); }