blob: afde4b2a95f47941a62d24bd33714e986f5b8383 [file] [log] [blame]
/*
* Copyright 2008 Google Inc.
*
* 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.google.gwt.resources.ext;
import com.google.gwt.core.ext.GeneratorContext;
import com.google.gwt.core.ext.UnableToCompleteException;
import com.google.gwt.core.ext.typeinfo.JClassType;
import java.net.URL;
/**
* Context object for ResourceGenerators. An instance of this type will be
* provided by the resource generation framework to implementations of
* ResourceGenerator via {@link ResourceGenerator#init}. Because this interface
* is not intended to be implemented by end-users, the API provided by this
* interface may be extended in the future.
* <p>
* Depending on the optimizations made by the implementation of {@link #deploy},
* the resulting URL may or may not be compatible with standard
* {@link com.google.gwt.http.client.RequestBuilder} / XMLHttpRequest security
* semantics. If the resource is intended to be used with XHR, or if there are
* other reasons why embedding the resource is undesirable such as known
* incompatibilities, the <code>forceExternal</code> parameter should be set to
* <code>true</code> when invoking {@link #deploy}.
* </p>
*/
public interface ResourceContext {
/**
* Cause a specific collection of bytes to be available in the program's
* compiled output. The return value of this method is a Java expression which
* will evaluate to the location of the resource at runtime. The exact format
* should not be depended upon.
*
* @param suggestedFileName an unobfuscated filename to possibly use for the
* resource
* @param mimeType the MIME type of the data being provided
* @param data the bytes to add to the output
* @param forceExternal prevents embedding of the resource, e.g. in case of
* known incompatibilities or for example to enforce compatibility
* with security restrictions if the resource is intended to be
* accessed via an XMLHttpRequest
* @return a Java expression which will evaluate to the location of the
* provided resource at runtime
*/
String deploy(String suggestedFileName, String mimeType, byte[] data,
boolean forceExternal) throws UnableToCompleteException;
/**
* Cause a specific collection of bytes to be available in the program's
* compiled output. The return value of this method is a Java expression which
* will evaluate to the location of the resource at runtime. The exact format
* should not be depended upon.
*
* @param resource the resource to add to the compiled output
* @param forceExternal prevents embedding of the resource, e.g. in case of
* known incompatibilities or for example to enforce compatibility
* with security restrictions if the resource is intended to be
* accessed via an XMLHttpRequest
* @return a Java expression which will evaluate to the location of the
* provided resource at runtime
* @deprecated use {@link #deploy(URL, String, boolean)} instead
*/
@Deprecated
String deploy(URL resource, boolean forceExternal)
throws UnableToCompleteException;
/**
* Cause a specific collection of bytes to be available in the program's
* compiled output. The return value of this method is a Java expression which
* will evaluate to the location of the resource at runtime. The exact format
* should not be depended upon.
*
* @param resource the resource to add to the compiled output
* @param mimeType optional MIME Type to be used for an embedded resource
* @param forceExternal prevents embedding of the resource, e.g. in case of
* known incompatibilities or for example to enforce compatibility
* with security restrictions if the resource is intended to be
* accessed via an XMLHttpRequest
* @return a Java expression which will evaluate to the location of the
* provided resource at runtime
*/
String deploy(URL resource, String mimeType, boolean forceExternal)
throws UnableToCompleteException;
/**
* Retrieve data from the ResourceContext.
*
* @param <T> the type of data to retrieve
* @param key the key value passed to {@link #getCachedData}
* @param clazz the type to which the cached value must be assignable
* @return the value previously passed to {@link #putCachedData} or
* <code>null</code> if the data was not found
* @throws ClassCastException if the cached data is not assignable to the
* specified type
*/
<T> T getCachedData(String key, Class<T> clazz);
/**
* Return the interface type of the resource bundle being generated.
*/
JClassType getClientBundleType();
/**
* Return the GeneratorContext in which the overall resource generation
* framework is being run. Implementations of ResourceGenerator should prefer
* {@link #deploy} over {@link GeneratorContext#tryCreateResource} in order to
* take advantage of serving optimizations that can be performed by the bundle
* architecture.
*/
GeneratorContext getGeneratorContext();
/**
* Returns the simple source name of the implementation of the bundle being
* generated. This can be used during code-generation to refer to the instance
* of the bundle (e.g. via <code>SimpleSourceName.this</code>).
*
* @throws IllegalStateException if this method is called during
* {@link ResourceGenerator#init} or
* {@link ResourceGenerator#prepare} methods.
*/
String getImplementationSimpleSourceName() throws IllegalStateException;
/**
* Returns a {@link ClientBundleRequirements} object, which can be used to
* track deferred-binding and configuration properties that are relevant to a
* resource context.
*/
ClientBundleRequirements getRequirements();
/**
* Store data in the ResourceContext. ResourceGenerators may reduce the amount
* of recomputation performed by caching data the ResourceContext. This cache
* will be invalidated when the compiler's TypeOracle is refreshed or
* replaced. Each ResourceGenerator has an isolated view of the cache.
*
* @param <T> the type of data being stored
* @param key a string key to locate the data
* @param value the value to store
* @return <code>true</code> if the cache did not previously contain the
* key-value pair
*/
<T> boolean putCachedData(String key, T value);
/**
* Indicates if the runtime context supports data: urls. When data URLs are
* supported by the context, aggregation of resource data into larger payloads
* is discouraged, as it offers reduced benefit to the application at runtime.
*/
boolean supportsDataUrls();
}