/*
* Copyright 2012-2016 the original author or authors.
*
* 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 org.glowroot.agent.weaving.preinit;
import java.util.concurrent.ConcurrentMap;
import com.google.common.collect.Maps;
class InternalNames {
private static final ConcurrentMap<String, Boolean> bootstrapInternalNames =
Maps.newConcurrentMap();
private static final ConcurrentMap<String, Boolean> allInternalNames = Maps.newConcurrentMap();
private InternalNames() {}
static boolean inBootstrapClassLoader(String internalName) {
Boolean cached = bootstrapInternalNames.get(internalName);
if (cached == null) {
cached = calculateIsBootstrapClass(internalName);
bootstrapInternalNames.put(internalName, cached);
}
return cached;
}
static boolean exists(String internalName) {
Boolean cached = allInternalNames.get(internalName);
if (cached == null) {
cached = calculateExists(internalName);
allInternalNames.put(internalName, cached);
}
return cached;
}
private static boolean calculateIsBootstrapClass(String internalName) {
try {
return classForInternalName(internalName).getClassLoader() == null;
} catch (Throwable e) {
// need Throwable to catch NoClassDefFoundError which extends Error
return false;
}
}
private static boolean calculateExists(String internalName) {
try {
classForInternalName(internalName);
return true;
} catch (Throwable e) {
// need Throwable to catch NoClassDefFoundError which extends Error
return false;
}
}
private static Class<?> classForInternalName(String internalName)
throws ClassNotFoundException {
return Class.forName(internalName.replace('/', '.'), false,
ClassLoader.getSystemClassLoader());
}
}