X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.scl.osgi%2Fsrc%2Forg%2Fsimantics%2Fscl%2Fosgi%2Finternal%2FBundleModuleSource.java;h=244c7463f0d5ade4ba574a373fd13ee9940a99b0;hb=8561e498009a25473db94b0e667866aa79de90b1;hp=1f60de08688f8365c52ed78a55e378dff162d032;hpb=657af94d0cf41efb8231e70c0f1167e75938fb16;p=simantics%2Fplatform.git diff --git a/bundles/org.simantics.scl.osgi/src/org/simantics/scl/osgi/internal/BundleModuleSource.java b/bundles/org.simantics.scl.osgi/src/org/simantics/scl/osgi/internal/BundleModuleSource.java index 1f60de086..244c7463f 100644 --- a/bundles/org.simantics.scl.osgi/src/org/simantics/scl/osgi/internal/BundleModuleSource.java +++ b/bundles/org.simantics.scl.osgi/src/org/simantics/scl/osgi/internal/BundleModuleSource.java @@ -10,7 +10,6 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; -import java.util.ArrayList; import java.util.Arrays; import org.eclipse.core.runtime.FileLocator; @@ -21,7 +20,9 @@ import org.simantics.scl.compiler.module.repository.UpdateListener; import org.simantics.scl.compiler.source.EncodedTextualModuleSource; import org.simantics.scl.compiler.types.Type; -public class BundleModuleSource extends EncodedTextualModuleSource { +import gnu.trove.set.hash.THashSet; + +public class BundleModuleSource extends EncodedTextualModuleSource implements UpdateListener.Observable { public static final ImportDeclaration[] DEFAULT_IMPORTS = new ImportDeclaration[] { new ImportDeclaration("Builtin", ""), @@ -36,13 +37,21 @@ public class BundleModuleSource extends EncodedTextualModuleSource { public final URL url; private byte[] digest; - private ArrayList listeners; + private THashSet listeners; public BundleModuleSource(String moduleName, Bundle bundle, URL url) { super(moduleName); this.bundle = bundle; this.url = url; } + + @Override + public void removeListener(UpdateListener listener) { + if(listeners != null) + synchronized(listeners) { + listeners.remove(listener); + } + } @Override protected ImportDeclaration[] getBuiltinImports(UpdateListener listener) { @@ -84,8 +93,9 @@ public class BundleModuleSource extends EncodedTextualModuleSource { digest = computeDigest(); if(listener != null) { if(listeners == null) - listeners = new ArrayList(2); + listeners = new THashSet(4); listeners.add(listener); + listener.addObservable(this); } return url.openStream(); } @@ -108,7 +118,7 @@ public class BundleModuleSource extends EncodedTextualModuleSource { byte[] newDigest = computeDigest(); if(!Arrays.equals(digest, newDigest)) { digest = newDigest; - ArrayList oldListeners = listeners; + THashSet oldListeners = listeners; listeners = null; for(UpdateListener listener : oldListeners) listener.notifyAboutUpdate();