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;
import org.osgi.framework.Bundle;
import org.osgi.framework.wiring.BundleWiring;
+import org.simantics.scl.compiler.internal.codegen.types.JavaReferenceValidatorFactory;
import org.simantics.scl.compiler.module.ImportDeclaration;
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", ""),
public final URL url;
private byte[] digest;
- private ArrayList<UpdateListener> listeners;
+ private THashSet<UpdateListener> 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) {
digest = computeDigest();
if(listener != null) {
if(listeners == null)
- listeners = new ArrayList<UpdateListener>(2);
+ listeners = new THashSet<UpdateListener>(4);
listeners.add(listener);
+ listener.addObservable(this);
}
return url.openStream();
}
byte[] newDigest = computeDigest();
if(!Arrays.equals(digest, newDigest)) {
digest = newDigest;
- ArrayList<UpdateListener> oldListeners = listeners;
+ THashSet<UpdateListener> oldListeners = listeners;
listeners = null;
for(UpdateListener listener : oldListeners)
listener.notifyAboutUpdate();
}
}
+ public JavaReferenceValidatorFactory getJavaReferenceValidatorFactory() {
+ return new OsgiJavaReferenceValidatorFactory(bundle);
+ }
}