/* * 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); }