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..34295aed42c175243d44144e045783ed537cb664 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,6 +13,8 @@ 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); @@ -44,11 +46,9 @@ 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); EntityUtil.getInstance().openCurrentModelIntoEditor(file); @@ -87,6 +87,47 @@ public abstract class Checker { job.schedule(); } + /** + * Just runs the check() method and returns the scheduled job. + * @param pack + * @return + * @throws Exception + */ + public Job syncCheck(Package pack) throws Exception { + 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; + } + }; + 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..22374395a8de426673fa9d8e918690ef604f62e0 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 @@ -4,7 +4,9 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; +import java.util.Map.Entry; import java.util.Set; +import java.util.concurrent.TimeUnit; import org.apache.log4j.Logger; import org.eclipse.core.resources.IFile; @@ -12,6 +14,8 @@ 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.jobs.Job; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EValidator; import org.eclipse.emf.ecore.util.EcoreUtil; @@ -26,6 +30,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 +66,53 @@ 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 + * @throws Exception + */ + public void runSync(Set<String> selectedCheckersTags, Package pkg, IProgressMonitor monitor) throws Exception { + logger.debug("runSync"); + checkerStatus = new HashMap<String, Boolean>(); + messages = new ArrayList<CheckerMessage>(); + List<Job> jobs = new ArrayList<Job>(); + for (CheckersContainer checkersContainer : checkersContainers) { + logger.debug("run checkersContainer"); + jobs.addAll(checkersContainer.runSync(selectedCheckersTags, pkg)); + } + + boolean allEnded = false; + while(!allEnded) { + allEnded = true; + for (Entry<String, Boolean> entry : checkerStatus.entrySet()) { + logger.error("Checker name = " + entry.getKey() + " value = " + entry.getValue()); + allEnded &= entry.getValue(); + } + if (allEnded) break; + if (monitor.isCanceled()) { + for (Job job : jobs) { + job.cancel(); + } + break; + } + TimeUnit.SECONDS.sleep(5); + } + } + 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..4963c13d122cd6021ab12654f2f9ba87ef363f60 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,48 @@ 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 + * @throws Exception + */ + public List<Job> runSync(Set<String> checkersTags, Package pkg) throws Exception { + 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) {