blob: 72ebadc2a5346da3decd86a12b0a37ef033acd06 [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.dev.shell;
import com.google.gwt.dev.util.Util;
import java.io.IOException;
import java.net.URL;
import java.net.URLConnection;
/**
* Provides various strategies for emma integration based on runtime detection.
*/
abstract class EmmaStrategy {
private static class NoEmmaStrategy extends EmmaStrategy {
@Override
public byte[] getEmmaClassBytes(byte[] classBytes, String slashedName,
long unitLastModified) {
return classBytes;
}
}
private static class PreinstrumentedEmmaStrategy extends EmmaStrategy {
@Override
public byte[] getEmmaClassBytes(byte[] classBytes, String slashedName,
long unitLastModified) {
// Check for an existing class on the classpath.
URL url = Thread.currentThread().getContextClassLoader().getResource(
slashedName + ".class");
if (url != null) {
// We found it on the class path.
try {
URLConnection conn = url.openConnection();
if (conn.getLastModified() >= unitLastModified) {
// It's as new as the source file, let's use it.
byte[] result = Util.readURLConnectionAsBytes(conn);
if (result != null) {
return result;
}
// Fall through.
}
// Fall through.
} catch (IOException ignored) {
// Fall through.
}
}
// Just return what we got.
return classBytes;
}
}
/**
* Classname for Emma's RT, to enable bridging.
*/
public static final String EMMA_RT_CLASSNAME = "com.vladium.emma.rt.RT";
/**
* Gets the emma classloading strategy.
*/
public static EmmaStrategy get(boolean emmaIsAvailable) {
/*
* Theoretically, emmarun could be using an instrumented ClassLoader, but in
* practice we haven't been able to make GWT run at all in this case.
*/
if (!emmaIsAvailable) {
return new NoEmmaStrategy();
} else {
return new PreinstrumentedEmmaStrategy();
}
}
public abstract byte[] getEmmaClassBytes(byte[] classBytes,
String slashedName, long unitLastModified);
}