diff --git a/plugins/org.polarsys.chess.checkers/src/org/polarsys/chess/checkers/core/checkerManager/Checker.java b/plugins/org.polarsys.chess.checkers/src/org/polarsys/chess/checkers/core/checkerManager/Checker.java index 6b0973d9d074be3f3480b8fe297f72f5269916bd..efd62084828e89a8df16b80e08bf95408d691dd7 100644 --- a/plugins/org.polarsys.chess.checkers/src/org/polarsys/chess/checkers/core/checkerManager/Checker.java +++ b/plugins/org.polarsys.chess.checkers/src/org/polarsys/chess/checkers/core/checkerManager/Checker.java @@ -13,9 +13,12 @@ import org.eclipse.core.runtime.jobs.Job; import org.eclipse.emf.workspace.util.WorkspaceSynchronizer; import org.polarsys.chess.contracts.profile.chesscontract.util.EntityUtil; +import org.eclipse.uml2.uml.Package; + public abstract class Checker { private static final Logger logger = Logger.getLogger(Checker.class); + public static String FAMILY = "checkers"; // private static String pluginID = "org.polarsys.chess.checkers"; @@ -44,13 +47,11 @@ public abstract class Checker { public abstract void init() throws Exception; public void asyncCheck(boolean isFirstChecker) throws Exception { - CheckerManager checkerManager = org.polarsys.chess.checkers.Activator.getCheckerManager(); - org.eclipse.uml2.uml.Package pack = EntityUtil.getInstance().getCurrentSystemView(); - if(pack==null){ + if(pack == null) { IFile file = EntityUtil.getInstance().getCurrentIFile(); - System.out.println("file: "+file); + logger.debug("file: "+file); EntityUtil.getInstance().openCurrentModelIntoEditor(file); } @@ -87,6 +88,55 @@ public abstract class Checker { job.schedule(); } + /** + * Just runs the check() method and returns the scheduled job. + * @param pack + * @return + */ + public Job syncCheck(Package pack) { + CheckerManager checkerManager = org.polarsys.chess.checkers.Activator.getCheckerManager(); + IFile iFile = WorkspaceSynchronizer.getFile(pack.eResource()); + + logger.debug("running checker: " + unifiedName); + Job job = new Job("Checker Manager: " + unifiedName) { + @Override + protected IStatus run(IProgressMonitor monitor) { + try { + errors = new ArrayList<Exception>(); + List<CheckerMessage> messages = check(monitor); + checkerManager.updateCheckerStatus(unifiedName, true); + if (messages != null) { + checkerManager.deleteProjectMarkers(iFile.getProject(), unifiedName); + checkerManager.addMessages(unifiedName, messages); + } + } catch (Exception e) { + checkerManager.updateCheckerStatus(unifiedName, true); + e.printStackTrace(); + logger.error("Checker '" + unifiedName + "' exception: " + e.getMessage()); + return Status.CANCEL_STATUS; + } + if (monitor.isCanceled()) { + checkerManager.updateCheckerStatus(unifiedName, true); + logger.warn("checker '" + unifiedName + "' isCanceled"); + return Status.CANCEL_STATUS; + } + // use this to open a Shell in the UI thread + return Status.OK_STATUS; + } + + @Override + public boolean belongsTo(Object family) { + if (Checker.FAMILY.equals(family)) { + return true; + } else { + return false; + } + } + }; + job.schedule(); + return job; + } + // /** // * Recursively returns all the files in the given container // * @param container the IContainer diff --git a/plugins/org.polarsys.chess.checkers/src/org/polarsys/chess/checkers/core/checkerManager/CheckerManager.java b/plugins/org.polarsys.chess.checkers/src/org/polarsys/chess/checkers/core/checkerManager/CheckerManager.java index c7184e30141aecff1867f355cdcaed62111f8e7a..40aba6d5e8b9a93d34069f37c4ed6729f40c08e3 100644 --- a/plugins/org.polarsys.chess.checkers/src/org/polarsys/chess/checkers/core/checkerManager/CheckerManager.java +++ b/plugins/org.polarsys.chess.checkers/src/org/polarsys/chess/checkers/core/checkerManager/CheckerManager.java @@ -5,13 +5,15 @@ import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Set; - import org.apache.log4j.Logger; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IMarker; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.OperationCanceledException; +import org.eclipse.core.runtime.jobs.Job; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EValidator; import org.eclipse.emf.ecore.util.EcoreUtil; @@ -26,6 +28,7 @@ import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.part.IPage; import org.eclipse.uml2.uml.NamedElement; +import org.eclipse.uml2.uml.Package; import org.eclipse.xtext.nodemodel.INode; import org.polarsys.chess.service.gui.utils.ReportProblemsUtil; @@ -61,6 +64,52 @@ public class CheckerManager { } } + /** + * Launches the init() of the various checkerContainers. + * @param selectedCheckersTags + * @throws Exception + */ + public void initSync(Set<String> selectedCheckersTags) throws Exception { + logger.debug("initSync"); + for (CheckersContainer checkersContainer : checkersContainers) { + logger.debug("init checkersContainer"); + checkersContainer.initSync(selectedCheckersTags); + } + } + + /** + * Launches the check() of the various checkerContainers and waits for their finish. + * @param selectedCheckersTags + * @param pkg + * @return + */ + public List<Exception> checkSync(Set<String> selectedCheckersTags, Package pkg, IProgressMonitor monitor) { + logger.debug("runSync"); + final List<Exception> errors = new ArrayList<Exception>(); + checkerStatus = new HashMap<String, Boolean>(); + messages = new ArrayList<CheckerMessage>(); + final List<Job> jobs = new ArrayList<Job>(); + + // Start all the checks() + for (CheckersContainer checkersContainer : checkersContainers) { + logger.debug("run checkersContainer"); + jobs.addAll(checkersContainer.checkSync(selectedCheckersTags, pkg)); + } + + // Wait for the checks to finish + try { + Job.getJobManager().join(Checker.FAMILY, monitor); + } catch (OperationCanceledException | InterruptedException e1) { + logger.debug("Checker execution interrupted"); + for (Job job : jobs) { + job.cancel(); + } + errors.add(new Exception("Esecuzione checker interrotta")); + e1.printStackTrace(); + } + return errors; + } + public void register(CheckersContainer checkersContainer) { logger.debug("register CheckersContainer"); this.checkersContainers.add(checkersContainer); diff --git a/plugins/org.polarsys.chess.checkers/src/org/polarsys/chess/checkers/core/checkerManager/CheckersContainer.java b/plugins/org.polarsys.chess.checkers/src/org/polarsys/chess/checkers/core/checkerManager/CheckersContainer.java index 89ea55312566789b16d5213fb60b86474660b828..05007a9e4b122b9a0fd202922feadd59183f01cb 100644 --- a/plugins/org.polarsys.chess.checkers/src/org/polarsys/chess/checkers/core/checkerManager/CheckersContainer.java +++ b/plugins/org.polarsys.chess.checkers/src/org/polarsys/chess/checkers/core/checkerManager/CheckersContainer.java @@ -8,6 +8,8 @@ import java.util.Optional; import java.util.Set; import org.apache.log4j.Logger; +import org.eclipse.core.runtime.jobs.Job; +import org.eclipse.uml2.uml.Package; public class CheckersContainer { @@ -23,20 +25,47 @@ public class CheckersContainer { } public void run(Set<String> checkersTags) throws Exception { - boolean isFirstChecker = true; - - for (Checker checker : checkers) { + for (Checker checker : checkers) { checkerManager.updateCheckerStatus(checker.unifiedName, false); - if (checker.belongsTo(checkersTags)) { logger.debug("run " + checker.getUnifiedName()); - checker.asyncCheck(isFirstChecker); - isFirstChecker=false; + checker.asyncCheck(isFirstChecker); + isFirstChecker=false; } } + } + /** + * Runs the init() of the selected checkers. + * @param checkersTags + * @throws Exception + */ + public void initSync(Set<String> checkersTags) throws Exception { + for (Checker checker : checkers) { + if (checker.belongsTo(checkersTags)) { + logger.debug("init " + checker.getUnifiedName()); + checker.init(); + } + } + } + + /** + * Runs the check() of the selected checkers and returns the scheduled jobs. + * @param checkersTags + * @return the list of scheduled jobs + */ + public List<Job> checkSync(Set<String> checkersTags, Package pkg) { + final List<Job> jobs = new ArrayList<Job>(); + for (Checker checker : checkers) { + checkerManager.updateCheckerStatus(checker.unifiedName, false); + if (checker.belongsTo(checkersTags)) { + logger.debug("run " + checker.getUnifiedName()); + jobs.add(checker.syncCheck(pkg)); + } + } + return jobs; } public void register(Checker checker) {