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=92385a1ed3f9be600ffb0ea33d0ff5e10cda913b;hb=1e6b0f31a45cfdb30ef8c28a0763eb05d705e6fb;hp=1f60de08688f8365c52ed78a55e378dff162d032;hpb=0ae2b770234dfc3cbb18bd38f324125cf0faca07;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..92385a1ed 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 @@ -1,27 +1,28 @@ package org.simantics.scl.osgi.internal; +import java.io.File; import java.io.IOException; import java.io.InputStream; -import java.net.URISyntaxException; import java.net.URL; import java.nio.charset.Charset; import java.nio.file.Files; 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; 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", ""), @@ -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,22 +118,31 @@ 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(); } } } - - private Path getPath() throws IOException { - try { - return Paths.get(FileLocator.toFileURL(url).toURI()); - } catch (URISyntaxException e) { - throw new IOException(e); + + /* + * This code is a copy from org.simantics.utils.ui.BundleUtils + */ + public static File resolveWritableBundleFile(URL url) throws IOException { + // This returns file, jar, http etc. - essentially resolves the bundle protocol + URL resolved = FileLocator.resolve(url); + if (resolved.getProtocol().equals("file")) { + return new File(resolved.getPath()); } + return null; } - + + private Path getPath() throws IOException { + File file = resolveWritableBundleFile(url); + return file != null ? file.toPath() : null; + } + @Override public boolean isUpdateable() { try { @@ -151,4 +170,7 @@ public class BundleModuleSource extends EncodedTextualModuleSource { } } + public JavaReferenceValidatorFactory getJavaReferenceValidatorFactory() { + return new OsgiJavaReferenceValidatorFactory(bundle); + } }