From: Andy Clement Date: Wed, 22 Apr 2020 18:02:28 +0000 (-0700) Subject: Added basic ThreadLocalAwareRepository - groundwork for 561819 X-Git-Tag: V1_9_6~6 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=4803a9abdddce387188640308e9ce1d7b61471a8;p=aspectj.git Added basic ThreadLocalAwareRepository - groundwork for 561819 --- diff --git a/bcel-builder/src/main/java/org/aspectj/apache/bcel/util/ThreadLocalAwareRepository.java b/bcel-builder/src/main/java/org/aspectj/apache/bcel/util/ThreadLocalAwareRepository.java new file mode 100644 index 000000000..414a4b9af --- /dev/null +++ b/bcel-builder/src/main/java/org/aspectj/apache/bcel/util/ThreadLocalAwareRepository.java @@ -0,0 +1,111 @@ + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ +package org.aspectj.apache.bcel.util; + +import java.lang.ref.WeakReference; + +import org.aspectj.apache.bcel.classfile.JavaClass; + +public class ThreadLocalAwareRepository implements Repository { + + private static ThreadLocal> threadLocal = new ThreadLocal<>(); + + public static void setCurrentRepository(Repository repository) { + threadLocal.set(new WeakReference<>(repository)); + } + + private static Repository currentRepository() { + WeakReference ref = threadLocal.get(); + Repository repo = null; + if (ref != null) { + repo = ref.get(); + } + if (repo == null) { + repo = SyntheticRepository.getInstance(); + } + return repo; + } + + @Override + public void storeClass(JavaClass clazz) { + currentRepository().storeClass(clazz); + } + + @Override + public void removeClass(JavaClass clazz) { + currentRepository().removeClass(clazz); + } + + @Override + public JavaClass findClass(String className) { + return currentRepository().findClass(className); + } + + @Override + public JavaClass loadClass(String className) throws ClassNotFoundException { + return currentRepository().loadClass(className); + } + + @Override + public JavaClass loadClass(Class clazz) throws ClassNotFoundException { + return currentRepository().loadClass(clazz); + } + + @Override + public void clear() { + currentRepository().clear(); + } + +}