restore "Fix package dependencies" action
diff --git a/tcl/plugins/org.eclipse.dltk.tcl.core/packages/org/eclipse/dltk/tcl/core/TclPackagesManager.java b/tcl/plugins/org.eclipse.dltk.tcl.core/packages/org/eclipse/dltk/tcl/core/TclPackagesManager.java index a9152ab..ac4b847 100644 --- a/tcl/plugins/org.eclipse.dltk.tcl.core/packages/org/eclipse/dltk/tcl/core/TclPackagesManager.java +++ b/tcl/plugins/org.eclipse.dltk.tcl.core/packages/org/eclipse/dltk/tcl/core/TclPackagesManager.java
@@ -21,6 +21,8 @@ import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.dltk.core.DLTKCore; +import org.eclipse.dltk.core.RuntimePerformanceMonitor; +import org.eclipse.dltk.core.RuntimePerformanceMonitor.PerformanceNode; import org.eclipse.dltk.core.environment.IDeployment; import org.eclipse.dltk.core.environment.IExecutionEnvironment; import org.eclipse.dltk.core.environment.IFileHandle; @@ -57,40 +59,57 @@ private static Resource infos = null; private static final Map<String, Resource> projectInfos = new HashMap<String, Resource>(); - public static synchronized List<TclPackageInfo> getPackageInfos( + public static List<TclPackageInfo> getPackageInfos( IInterpreterInstall install, Set<String> packageNames, boolean fetchIfRequired) { initialize(); TclInterpreterInfo interpreterInfo = getTclInterpreter(install); - return Collections.unmodifiableList(getPackagesForInterpreter( - packageNames, fetchIfRequired, interpreterInfo, install)); + List<TclPackageInfo> collection = null; + synchronized (TclPackagesManager.class) { + collection = Collections + .unmodifiableList(new ArrayList<TclPackageInfo>( + getPackagesForInterpreter(packageNames, + fetchIfRequired, interpreterInfo, install))); + } + return collection; } - public static synchronized List<TclPackageInfo> getPackageInfos( + public static List<TclPackageInfo> getPackageInfos( IInterpreterInstall install) { initialize(); TclInterpreterInfo interpreterInfo = getTclInterpreter(install); - return Collections.unmodifiableList(interpreterInfo.getPackages()); + List<TclPackageInfo> collection = null; + synchronized (TclPackagesManager.class) { + collection = Collections + .unmodifiableList(new ArrayList<TclPackageInfo>( + interpreterInfo.getPackages())); + } + return collection; } - public static synchronized TclPackageInfo getPackageInfo( - IInterpreterInstall install, String name, boolean fetchIfRequired) { + public static TclPackageInfo getPackageInfo(IInterpreterInstall install, + String name, boolean fetchIfRequired) { initialize(); TclInterpreterInfo interpreterInfo = getTclInterpreter(install); EList<TclPackageInfo> packages = interpreterInfo.getPackages(); - for (TclPackageInfo tclPackageInfo : packages) { - if (name.equals(tclPackageInfo.getName())) { - if (tclPackageInfo.isFetched() || !fetchIfRequired) { - return tclPackageInfo; - } else { - Set<TclPackageInfo> toFetch = new HashSet<TclPackageInfo>(); - toFetch.add(tclPackageInfo); - fetchSources(toFetch, install, interpreterInfo); - return tclPackageInfo; + Set<TclPackageInfo> toFetch = new HashSet<TclPackageInfo>(); + TclPackageInfo result = null; + + synchronized (TclPackagesManager.class) { + for (TclPackageInfo tclPackageInfo : packages) { + if (name.equals(tclPackageInfo.getName())) { + if (tclPackageInfo.isFetched() || !fetchIfRequired) { + return tclPackageInfo; + } else { + toFetch.add(tclPackageInfo); + fetchSources(toFetch, install, interpreterInfo); + result = tclPackageInfo; + break; + } } } } - return null; + return result; } public static Set<TclPackageInfo> getDependencies( @@ -112,33 +131,42 @@ return null; } - private static synchronized TclInterpreterInfo getTclInterpreter( + private static TclInterpreterInfo getTclInterpreter( IInterpreterInstall install) { - EList<EObject> contents = infos.getContents(); + return getTclInterpreter(install, true); + } + + private static TclInterpreterInfo getTclInterpreter( + IInterpreterInstall install, boolean allowCreate) { TclInterpreterInfo interpreterInfo = null; String interpreterLocation = install.getInstallLocation().toOSString(); String environmentId = install.getInstallLocation().getEnvironmentId(); - for (EObject eObject : contents) { - if (eObject instanceof TclInterpreterInfo) { - TclInterpreterInfo info = (TclInterpreterInfo) eObject; - String location = info.getInstallLocation(); - String name = info.getName(); - String env = info.getEnvironment(); - if (interpreterLocation.equals(location) - && install.getName().equals(name) && env != null - && env.equals(environmentId)) { - interpreterInfo = info; - break; + synchronized (TclPackagesManager.class) { + for (EObject eObject : infos.getContents()) { + if (eObject instanceof TclInterpreterInfo) { + TclInterpreterInfo info = (TclInterpreterInfo) eObject; + String location = info.getInstallLocation(); + String name = info.getName(); + String env = info.getEnvironment(); + if (interpreterLocation.equals(location) + && install.getName().equals(name) && env != null + && env.equals(environmentId)) { + interpreterInfo = info; + break; + } } } - } - if (interpreterInfo == null) { - interpreterInfo = TclPackagesFactory.eINSTANCE - .createTclInterpreterInfo(); - interpreterInfo.setInstallLocation(interpreterLocation); - interpreterInfo.setName(install.getName()); - interpreterInfo.setEnvironment(environmentId); - infos.getContents().add(interpreterInfo); + if (interpreterInfo == null) { + if (!allowCreate) { + return null; + } + interpreterInfo = TclPackagesFactory.eINSTANCE + .createTclInterpreterInfo(); + interpreterInfo.setInstallLocation(interpreterLocation); + interpreterInfo.setName(install.getName()); + interpreterInfo.setEnvironment(environmentId); + infos.getContents().add(interpreterInfo); + } } if (!interpreterInfo.isFetched() || interpreterInfo.getFetchedAt() == null @@ -183,17 +211,23 @@ private static void fetchPackagesForInterpreter( IInterpreterInstall install, TclInterpreterInfo interpreterInfo) { + PerformanceNode p = RuntimePerformanceMonitor.begin(); IExecutionEnvironment exeEnv = install.getExecEnvironment(); - List<String> content = deployExecute(exeEnv, install - .getInstallLocation().toOSString(), + if (exeEnv == null) { + return; + } + List<String> content = deployExecute(exeEnv, install, new String[] { "get-pkgs" }, install //$NON-NLS-1$ .getEnvironmentVariables()); - if (content != null) { - processContent(content, false, true, interpreterInfo); - interpreterInfo.setFetched(true); - interpreterInfo.setFetchedAt(new Date()); - save(); + synchronized (TclPackagesManager.class) { + if (content != null) { + processContent(content, false, true, interpreterInfo); + interpreterInfo.setFetched(true); + interpreterInfo.setFetchedAt(new Date()); + save(); + } } + p.done("Tcl", "Fetch interpreter packages info", 0); } public static void save() { @@ -201,7 +235,9 @@ try { infos.save(null); } catch (IOException e) { - TclPlugin.error(e); + if (DLTKCore.DEBUG) { + // TclPlugin.error(e); + } } } synchronized (projectInfos) { @@ -255,7 +291,7 @@ return null; } - private static void processContent(List<String> content, + private static synchronized void processContent(List<String> content, boolean markAsFetched, boolean purgePackages, TclInterpreterInfo info) { String text = getXMLContent(content); @@ -298,8 +334,8 @@ } } - private static TclPackageInfo getCreatePackage(TclInterpreterInfo info, - String name) { + private static synchronized TclPackageInfo getCreatePackage( + TclInterpreterInfo info, String name) { TclPackageInfo packageInfo = null; for (TclPackageInfo pkgInfo : info.getPackages()) { if (pkgInfo.getName().equals(name)) { @@ -342,15 +378,21 @@ TclInterpreterInfo interpreterInfo, IInterpreterInstall install) { Set<TclPackageInfo> result = new HashSet<TclPackageInfo>(); Set<TclPackageInfo> toFetch = new HashSet<TclPackageInfo>(); - for (TclPackageInfo tclPackageInfo : interpreterInfo.getPackages()) { - if (packageName.contains(tclPackageInfo.getName())) { - processPackage(tclPackageInfo, result, toFetch, fetchIfRequired); + synchronized (TclPackagesManager.class) { + for (TclPackageInfo tclPackageInfo : interpreterInfo.getPackages()) { + if (packageName.contains(tclPackageInfo.getName())) { + processPackage(tclPackageInfo, result, toFetch, + fetchIfRequired); + } } } fetchSources(toFetch, install, interpreterInfo); - for (TclPackageInfo tclPackageInfo : interpreterInfo.getPackages()) { - if (packageName.contains(tclPackageInfo.getName())) { - processPackage(tclPackageInfo, result, toFetch, fetchIfRequired); + synchronized (TclPackagesManager.class) { + for (TclPackageInfo tclPackageInfo : interpreterInfo.getPackages()) { + if (packageName.contains(tclPackageInfo.getName())) { + processPackage(tclPackageInfo, result, toFetch, + fetchIfRequired); + } } } List<TclPackageInfo> resultList = new ArrayList<TclPackageInfo>(); @@ -381,10 +423,16 @@ if (toFetch.size() == 0) { return; } + PerformanceNode p = RuntimePerformanceMonitor.begin(); IExecutionEnvironment exeEnv = install.getExecEnvironment(); IDeployment deployment = exeEnv.createDeployment(); + if (deployment == null) { + return; + } IFileHandle script = deploy(deployment); + if (script == null) { + deployment.dispose(); return; } @@ -404,6 +452,7 @@ if (DLTKCore.DEBUG) { e1.printStackTrace(); } + deployment.dispose(); return; } IFileHandle file = deployment.getFile(packagesPath); @@ -422,19 +471,23 @@ if (DLTKCore.DEBUG) { e.printStackTrace(); } + deployment.dispose(); } if (process == null) { + deployment.dispose(); return; } List<String> output = ProcessOutputCollector.execute(process); - deployment.dispose(); + // deployment.dispose(); processContent(output, true, false, interpreterInfo); // Mark all toFetch as fetched. for (TclPackageInfo info : toFetch) { info.setFetched(true); } + deployment.dispose(); save(); + p.done("Tcl", "Fetch interpreter package sources", 0); } private static URI getInfoLocation() { @@ -457,7 +510,7 @@ } } - private static void initialize() { + private synchronized static void initialize() { if (infos == null) { final URI location = getInfoLocation(); infos = new XMIResourceImpl(location); @@ -503,7 +556,7 @@ } private static List<String> deployExecute(IExecutionEnvironment exeEnv, - String installLocation, String[] arguments, + IInterpreterInstall install, String[] arguments, EnvironmentVariable[] env) { IDeployment deployment = exeEnv.createDeployment(); if (deployment == null) { @@ -511,6 +564,7 @@ } IFileHandle script = deploy(deployment); if (script == null) { + deployment.dispose(); return null; } @@ -526,14 +580,15 @@ Process process = null; try { - process = ScriptLaunchUtil.runScriptWithInterpreter(exeEnv, - installLocation, config); + process = ScriptLaunchUtil.runScriptWithInterpreter(exeEnv, install + .getInstallLocation().toOSString(), config); } catch (CoreException e) { if (DLTKCore.DEBUG) { e.printStackTrace(); } } if (process == null) { + deployment.dispose(); return null; } List<String> output = ProcessOutputCollector.execute(process); @@ -603,13 +658,16 @@ public static synchronized void removeInterpreterInfo( IInterpreterInstall install) { initialize(); - TclInterpreterInfo info = getTclInterpreter(install); - info.getPackages().clear(); - infos.getContents().remove(info); - save(); + final TclInterpreterInfo info = getTclInterpreter(install, false); + if (info != null) { + info.getPackages().clear(); + info.setFetched(false); + info.setFetchedAt(null); + save(); + } } - public static synchronized Set<String> getPackageInfosAsString( + public static Set<String> getPackageInfosAsString( IInterpreterInstall install) { initialize(); Set<String> result = new HashSet<String>(); @@ -619,4 +677,5 @@ } return result; } + }