diff --git a/projectapi/src/org/netbeans/modules/projectapi/LazyLookupProviders.java b/projectapi/src/org/netbeans/modules/projectapi/LazyLookupProviders.java --- a/projectapi/src/org/netbeans/modules/projectapi/LazyLookupProviders.java +++ b/projectapi/src/org/netbeans/modules/projectapi/LazyLookupProviders.java @@ -42,6 +42,8 @@ package org.netbeans.modules.projectapi; +import java.lang.ref.Reference; +import java.lang.ref.WeakReference; import java.lang.reflect.Constructor; import java.lang.reflect.Member; import java.lang.reflect.Method; @@ -83,9 +85,15 @@ */ public static LookupProvider forProjectServiceProvider(final Map attrs) throws ClassNotFoundException { return new LookupProvider() { + private final Map> lkps = Collections.synchronizedMap(new WeakHashMap>()); @Override public Lookup createAdditionalLookup(final Lookup lkp) { - final Lookup result = new ProxyLookup() { + Reference resRef = lkps.get(lkp); + Lookup result; + if (resRef != null && (result=resRef.get()) != null) { + return result; + } + result = new ProxyLookup() { Collection serviceNames = Arrays.asList(((String) attrs.get("service")).split(",")); // NOI18N final ThreadLocal insideBeforeLookup = new ThreadLocal(); // #212862 final Object LOCK = new Object(); @@ -138,14 +146,27 @@ } } }; - LOG.log( - Level.FINE, - "Additional lookup created: {0} service class: {1} for base lookup: {2}", //NOI18N - new Object[]{ - System.identityHashCode(result), - attrs.get("class"), - System.identityHashCode(lkp) - }); + boolean created = false; + synchronized (lkps) { + resRef = lkps.get(lkp); + final Lookup tmp; + if (resRef == null || (tmp = resRef.get()) == null) { + lkps.put(lkp, new WeakReference(result)); + created = true; + } else { + result = tmp; + } + } + if (created) { + LOG.log( + Level.FINE, + "Additional lookup created: {0} service class: {1} for base lookup: {2}", //NOI18N + new Object[]{ + System.identityHashCode(result), + attrs.get("class"), + System.identityHashCode(lkp) + }); + } return result; }