blob: be8eea5c08bb02d3b63f3383991a6ecc99bcf6d0 [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.rebind.context;
import com.google.gwt.core.ext.GeneratorContext;
import com.google.gwt.core.ext.TreeLogger;
import com.google.gwt.core.ext.UnableToCompleteException;
import com.google.gwt.core.ext.typeinfo.JClassType;
import com.google.gwt.dev.util.Util;
import com.google.gwt.resources.ext.ClientBundleRequirements;
import com.google.gwt.resources.ext.ResourceContext;
import com.google.gwt.resources.ext.ResourceGenerator;
import com.google.gwt.resources.ext.ResourceGeneratorUtil;
import java.io.IOException;
import java.net.URL;
/**
* Defines base methods for ResourceContext implementations.
*/
public abstract class AbstractResourceContext implements ResourceContext {
/**
* The largest file size that will be inlined. Note that this value is taken
* before any encodings are applied.
*/
protected static final int MAX_INLINE_SIZE = 2 << 15;
protected static String toBase64(byte[] data) {
// This is bad, but I am lazy and don't want to write _another_ encoder
sun.misc.BASE64Encoder enc = new sun.misc.BASE64Encoder();
String base64Contents = enc.encode(data).replaceAll("\\s+", "");
return base64Contents;
}
private final TreeLogger logger;
private final ClientBundleContext clientBundleCtx;
private final GeneratorContext context;
private String currentResourceGeneratorType;
private ClientBundleRequirements requirements = null;
private final JClassType resourceBundleType;
private String simpleSourceName;
protected AbstractResourceContext(TreeLogger logger,
GeneratorContext context, JClassType resourceBundleType,
ClientBundleContext clientBundleCtx) {
this.logger = logger;
this.context = context;
this.resourceBundleType = resourceBundleType;
this.clientBundleCtx = clientBundleCtx;
}
@Deprecated
public String deploy(URL resource, boolean forceExternal)
throws UnableToCompleteException {
return deploy(resource, null, forceExternal);
}
public String deploy(URL resource, String mimeType, boolean forceExternal)
throws UnableToCompleteException {
String fileName = ResourceGeneratorUtil.baseName(resource);
byte[] bytes = Util.readURLAsBytes(resource);
try {
String finalMimeType = (mimeType != null)
? mimeType : resource.openConnection().getContentType();
return deploy(fileName, finalMimeType, bytes, forceExternal);
} catch (IOException e) {
getLogger().log(TreeLogger.ERROR,
"Unable to determine mime type of resource", e);
throw new UnableToCompleteException();
}
}
public <T> T getCachedData(String key, Class<T> clazz) {
return clazz.cast(clientBundleCtx.getCachedData(currentResourceGeneratorType + ":" + key));
}
public JClassType getClientBundleType() {
return resourceBundleType;
}
public GeneratorContext getGeneratorContext() {
return context;
}
public String getImplementationSimpleSourceName() {
if (simpleSourceName == null) {
throw new IllegalStateException(
"Simple source name has not yet been set.");
}
return simpleSourceName;
}
public ClientBundleRequirements getRequirements() {
return requirements;
}
public <T> boolean putCachedData(String key, T value) {
key = currentResourceGeneratorType + ":" + key;
return value != clientBundleCtx.putCachedData(key, value);
}
public void setRequirements(ClientBundleRequirements requirements) {
this.requirements = requirements;
}
protected GeneratorContext getContext() {
return context;
}
protected TreeLogger getLogger() {
return logger;
}
void setCurrentResourceGenerator(ResourceGenerator rg) {
currentResourceGeneratorType = rg.getClass().getName();
}
void setSimpleSourceName(String name) {
simpleSourceName = name;
}
}