1 package org.simantics.scl.ui.issues;
3 import java.util.ArrayList;
4 import java.util.Arrays;
7 import org.simantics.scl.compiler.errors.CompilationError;
8 import org.simantics.scl.compiler.errors.DoesNotExist;
9 import org.simantics.scl.compiler.errors.Failable;
10 import org.simantics.scl.compiler.errors.Failure;
11 import org.simantics.scl.compiler.module.Module;
12 import org.simantics.scl.compiler.module.repository.ModuleRepository;
13 import org.simantics.scl.compiler.module.repository.UpdateListener;
14 import org.simantics.scl.osgi.SCLOsgi;
15 import org.simantics.scl.osgi.issues.SCLIssueProviderFactory;
16 import org.simantics.scl.osgi.issues.SCLIssueProviderFactory.SCLIssueProvider;
17 import org.simantics.scl.osgi.issues.SCLIssuesTableEntry;
18 import org.simantics.scl.ui.editor2.OpenSCLDefinition;
20 import gnu.trove.map.hash.THashMap;
21 import gnu.trove.procedure.TObjectObjectProcedure;
22 import gnu.trove.procedure.TObjectProcedure;
24 public class SCLModuleIssueProvider implements SCLIssueProvider {
26 public static class SCLModuleIssueProviderFactory implements SCLIssueProviderFactory {
29 public SCLIssueProvider getSCLIssueProvider() {
30 return new SCLModuleIssueProvider();
35 ModuleRepository repository = SCLOsgi.MODULE_REPOSITORY;
37 THashMap<String, CompilationError[]> currentFailures = new THashMap<>();
38 THashMap<String, UpdateListener> updateListeners = new THashMap<>();
40 private boolean disposed;
42 SCLModuleIssueProvider() {
45 private UpdateListener getUpdateListener(String moduleName, Runnable callback) {
46 UpdateListener listener;
47 synchronized(updateListeners) {
48 listener = updateListeners.get(moduleName);
49 if(listener == null) {
50 listener = new UpdateListener() {
52 public void notifyAboutUpdate() {
54 listenModule(moduleName, callback);
57 updateListeners.put(moduleName, listener);
63 private void listenModule(String moduleName, Runnable callback) {
64 if(repository == null)
66 Failable<Module> result = repository.getModule(moduleName, getUpdateListener(moduleName, callback));
67 synchronized(currentFailures) {
68 if(result instanceof Failure) {
69 Failure failure = (Failure)result;
70 currentFailures.put(moduleName, failure.errors);
72 else if(result == DoesNotExist.INSTANCE) {
73 if(currentFailures.remove(moduleName) == null)
77 CompilationError[] warnings = result.getResult().getWarnings();
78 if(warnings.length == 0) {
79 if(currentFailures.remove(moduleName) == null)
83 currentFailures.put(moduleName, warnings);
91 public void listenIssues(Runnable callback) {
94 if(repository == null)
96 repository.getSourceRepository().forAllModules(new TObjectProcedure<String>() {
98 public boolean execute(String moduleName) {
99 listenModule(moduleName, callback);
108 public List<SCLIssuesTableEntry> getIssues() {
109 ArrayList<SCLIssuesTableEntry> result = new ArrayList<>();
110 synchronized(currentFailures) {
111 String[] moduleNames = currentFailures.keySet().toArray(new String[currentFailures.size()]);
112 Arrays.sort(moduleNames);
113 for(String moduleName : moduleNames) {
114 CompilationError[] errors = currentFailures.get(moduleName);
115 for(CompilationError error : errors) {
116 result.add(new SCLIssuesTableEntry(moduleName, error) {
118 public void openLocation() {
119 OpenSCLDefinition.openDefinition(moduleName, error.location);
129 public void dispose() {
133 if(repository != null) {
134 synchronized(updateListeners) {
135 updateListeners.forEachEntry(new TObjectObjectProcedure<String, UpdateListener>() {
137 public boolean execute(String moduleName, UpdateListener listener) {
138 listener.stopListening();
142 updateListeners.clear();