X-Git-Url: https://gerrit.simantics.org/r/gitweb?p=simantics%2Fplatform.git;a=blobdiff_plain;f=bundles%2Forg.simantics.scl.ui%2Fsrc%2Forg%2Fsimantics%2Fscl%2Fui%2Fissues%2FSCLIssuesContentProvider.java;h=4e386e685b3c168bfdec4c47189a9fae8bea100f;hp=4772ad5ba7996b89baa875c4cf24db9e70e940e4;hb=a516cf32592cf470cfc3f6ff96ee8b5168bd7a43;hpb=7a7ad0a2319ce70a184e099adad8a69c23562bd9 diff --git a/bundles/org.simantics.scl.ui/src/org/simantics/scl/ui/issues/SCLIssuesContentProvider.java b/bundles/org.simantics.scl.ui/src/org/simantics/scl/ui/issues/SCLIssuesContentProvider.java index 4772ad5ba..4e386e685 100644 --- a/bundles/org.simantics.scl.ui/src/org/simantics/scl/ui/issues/SCLIssuesContentProvider.java +++ b/bundles/org.simantics.scl.ui/src/org/simantics/scl/ui/issues/SCLIssuesContentProvider.java @@ -1,90 +1,40 @@ package org.simantics.scl.ui.issues; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collections; +import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; +import java.util.stream.Collectors; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.widgets.Control; -import org.simantics.scl.compiler.errors.CompilationError; -import org.simantics.scl.compiler.errors.DoesNotExist; -import org.simantics.scl.compiler.errors.Failable; -import org.simantics.scl.compiler.errors.Failure; -import org.simantics.scl.compiler.module.Module; -import org.simantics.scl.compiler.module.repository.ModuleRepository; -import org.simantics.scl.compiler.module.repository.UpdateListener; - -import gnu.trove.map.hash.THashMap; -import gnu.trove.procedure.TObjectObjectProcedure; -import gnu.trove.procedure.TObjectProcedure; +import org.simantics.scl.osgi.issues.SCLIssueFactoryProvider; +import org.simantics.scl.osgi.issues.SCLIssueProviderFactory.SCLIssueProvider; +import org.simantics.scl.osgi.issues.SCLIssuesTableEntry; public class SCLIssuesContentProvider implements IStructuredContentProvider { public static final int MAX_ISSUE_COUNT = 1000; - - Viewer viewer; - ModuleRepository repository; + + private Viewer viewer; boolean disposed = false; - AtomicBoolean refreshInProgress = new AtomicBoolean(false); - - THashMap currentFailures = new THashMap(); - THashMap updateListeners = new THashMap(); - + private AtomicBoolean refreshInProgress = new AtomicBoolean(false); + private List issueProviders = new ArrayList<>(); + @Override public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { this.viewer = viewer; - this.repository = (ModuleRepository)newInput; - if(newInput != null) - listenIssues(); - } - - private UpdateListener getUpdateListener(String moduleName) { - UpdateListener listener; - synchronized(updateListeners) { - listener = updateListeners.get(moduleName); - if(listener == null) { - listener = new UpdateListener() { - @Override - public void notifyAboutUpdate() { - if(!disposed) - listenModule(moduleName); - } - }; - updateListeners.put(moduleName, listener); - } + if (!issueProviders.isEmpty()) { + issueProviders.forEach(p -> p.dispose()); + issueProviders.clear(); } - return listener; - } - - private void listenModule(String moduleName) { - if(repository == null) - return; - Failable result = repository.getModule(moduleName, getUpdateListener(moduleName)); - synchronized(currentFailures) { - if(result instanceof Failure) { - Failure failure = (Failure)result; - currentFailures.put(moduleName, failure.errors); - } - else if(result == DoesNotExist.INSTANCE) { - if(currentFailures.remove(moduleName) == null) - return; - } - else { - CompilationError[] warnings = result.getResult().getWarnings(); - if(warnings.length == 0) { - if(currentFailures.remove(moduleName) == null) - return; - } - else { - currentFailures.put(moduleName, warnings); - } - } + if(newInput != null) { + issueProviders = SCLIssueFactoryProvider.getSCLIssueProviderFactories().stream().map(f -> f.getSCLIssueProvider()).collect(Collectors.toList()); + issueProviders.forEach(p -> p.listenIssues(() -> refresh())); } - refresh(); } - + private void refresh() { if(!refreshInProgress.compareAndSet(false, true)) return; @@ -104,54 +54,18 @@ public class SCLIssuesContentProvider implements IStructuredContentProvider { }); } - private void listenIssues() { - new Thread() { - public void run() { - if(repository == null) - return; - repository.getSourceRepository().forAllModules(new TObjectProcedure() { - @Override - public boolean execute(String moduleName) { - listenModule(moduleName); - return true; - } - }); - } - }.start(); - } - - @Override public void dispose() { if(this.disposed) return; + issueProviders.forEach(p -> p.dispose()); + issueProviders.clear(); this.disposed = true; - if(repository != null) - synchronized(updateListeners) { - updateListeners.forEachEntry(new TObjectObjectProcedure() { - @Override - public boolean execute(String moduleName, UpdateListener listener) { - listener.stopListening(); - return true; - } - }); - updateListeners.clear(); - } } @Override public Object[] getElements(Object inputElement) { - ArrayList result = new ArrayList(); - synchronized(currentFailures) { - String[] moduleNames = currentFailures.keySet().toArray(new String[currentFailures.size()]); - Arrays.sort(moduleNames); - for(String moduleName : moduleNames) { - CompilationError[] errors = currentFailures.get(moduleName); - for(CompilationError error : errors) - result.add(new SCLIssuesTableEntry(moduleName, error)); - if(result.size() >= MAX_ISSUE_COUNT) - break; - } - } + ArrayList result = new ArrayList<>(); + issueProviders.forEach(p -> result.addAll(p.getIssues())); Collections.sort(result); return result.toArray(); }