--- /dev/null
+package testing;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public abstract aspect AbstractCache<Key,Value> {
+
+ public abstract pointcut cachePoint(Key key);
+
+ private Map<Object,Object> cache = new HashMap<Object,Object>();
+ private Integer hitCount = 0;
+ private Integer missCount = 0;
+
+ Value around(Key key) : cachePoint(key){
+ Value value = get(key);
+ if(value == null){
+ value = proceed(key);
+ put(key,value);
+ missCount++;
+ } else {
+ hitCount++;
+ }
+ return value;
+ }
+
+ @SuppressWarnings("unchecked")
+ private Value get(Key key){
+ return (Value) cache.get(key);
+ }
+
+ private void put(Key key, Value value) {
+ cache.put(key, value);
+ }
+
+ public Integer getHitCount() {
+ return hitCount;
+ }
+
+ public Integer getMissCount() {
+ return missCount;
+ }
+
+}
--- /dev/null
+package testing;
+
+public class Resource {
+
+ private final String id;
+
+ public Resource(String id){
+ this.id = id;
+ }
+
+ public String getId(){
+ return id;
+ }
+}
+
--- /dev/null
+package testing;
+
+public aspect ResourceCache extends AbstractCache<String,Resource> {
+
+ public pointcut cachePoint(String key):
+ args(key) &&
+ execution(public Resource ResourceManager.lookupResource(String));
+
+
+}
--- /dev/null
+package testing;
+
+public class ResourceManager {
+
+ public Resource lookupResource(String resourceId){
+ return new Resource(resourceId);
+ }
+}
--- /dev/null
+package testing;
+
+import java.lang.reflect.Method;
+
+public class TestRunner {
+
+ public static void main(String[] args) {
+ ResourceManager manager = new ResourceManager();
+ ResourceCache cache = ResourceCache.aspectOf();
+
+ Resource r1_1 = manager.lookupResource("1");
+ Resource r1_2 = manager.lookupResource("1");
+ Resource r1_3 = manager.lookupResource("1");
+ Resource r1_4 = manager.lookupResource("1");
+ Resource r1_5 = manager.lookupResource("1");
+
+ Resource r2_1 = manager.lookupResource("2");
+ Resource r2_2 = manager.lookupResource("2");
+
+ System.out.println("Cache hits: " + cache.getHitCount());
+ System.out.println("Cache hits: " + cache.getMissCount());
+ }
+
+}
public class Ajc167Tests extends org.aspectj.testing.XMLBasedAjcTestCase {
+ public void testGenericAspectSignatures_296533() {
+ runTest("generic aspect signatures");
+ }
+
public void testOptimizingAnnotationStringValueBinding() {
runTest("optimizing string anno value binding");
}
public void testOptimizingAnnotationBindingPerfTest() {
runTest("optimizing annotation binding - 2");
}
-/*
- public void testPerThisLTW_295092() {
- runTest("perthis ltw");
- }
-*/
+
+ /*
+ * public void testPerThisLTW_295092() { runTest("perthis ltw"); }
+ */
public void testNpeOnBrokenCode_296054() {
runTest("npe on broken code");
<suite>
+ <ajc-test dir="bugs167/pr296533" title="generic aspect signatures">
+ <compile files="testing/AbstractCache.aj testing/Resource.java testing/ResourceCache.aj testing/ResourceManager.java testing/TestRunner.java" options="-1.5"/>
+ <run class="testing.TestRunner">
+ <stdout>
+ <line text="Cache hits: 5"/>
+ <line text="Cache hits: 2"/>
+ </stdout>
+ </run>
+ </ajc-test>
+
<ajc-test dir="bugs167/pr296501" title="optimizing string anno value binding">
<compile files="StringBinding.java" options="-1.5"/>
<run class="StringBinding">