diff options
author | Henrik Rentz-Reichert | 2018-03-11 12:32:46 +0000 |
---|---|---|
committer | Henrik Rentz-Reichert | 2018-03-11 12:32:46 +0000 |
commit | d2a982a5bc1ed42b4328e0c53941b2f6dc2fd752 (patch) | |
tree | e2c037fbaa4d7d45521b91fc0b7c57ef9d0e4ca5 | |
parent | fa768082ea55b0b05a41c88b1e7a2db4daeb107e (diff) | |
download | org.eclipse.etrice-d2a982a5bc1ed42b4328e0c53941b2f6dc2fd752.tar.gz org.eclipse.etrice-d2a982a5bc1ed42b4328e0c53941b2f6dc2fd752.tar.xz org.eclipse.etrice-d2a982a5bc1ed42b4328e0c53941b2f6dc2fd752.zip |
Bug 532243 - Empty RefinedStates cause problems
* check when going up
* check before save
Change-Id: I3e5819ec8a4c36abb0546c187d126c46d38f30fe
4 files changed, 53 insertions, 11 deletions
diff --git a/plugins/org.eclipse.etrice.core.fsm/src/org/eclipse/etrice/core/fsm/validation/FSMJavaValidator.java b/plugins/org.eclipse.etrice.core.fsm/src/org/eclipse/etrice/core/fsm/validation/FSMJavaValidator.java index fca7e9f1d..54ae0b083 100644 --- a/plugins/org.eclipse.etrice.core.fsm/src/org/eclipse/etrice/core/fsm/validation/FSMJavaValidator.java +++ b/plugins/org.eclipse.etrice.core.fsm/src/org/eclipse/etrice/core/fsm/validation/FSMJavaValidator.java @@ -26,7 +26,6 @@ import org.eclipse.etrice.core.fsm.fSM.StateGraphItem; import org.eclipse.etrice.core.fsm.fSM.TrPoint; import org.eclipse.etrice.core.fsm.fSM.Transition; import org.eclipse.etrice.core.fsm.services.FSMGrammarAccess; -import org.eclipse.etrice.core.fsm.util.FSMHelpers; import org.eclipse.etrice.core.fsm.validation.FSMValidationUtilXtend.Result; import org.eclipse.xtext.AbstractRule; import org.eclipse.xtext.RuleCall; @@ -52,9 +51,6 @@ public class FSMJavaValidator extends org.eclipse.etrice.core.fsm.validation.Abs private FSMValidationUtil validationUtil; @Inject - private FSMHelpers fsmHelpers; - - @Inject FSMGrammarAccess grammar; @Inject @@ -78,13 +74,8 @@ public class FSMJavaValidator extends org.eclipse.etrice.core.fsm.validation.Abs @Check public void checkRefinedStateNotEmpty(RefinedState rs) { - if (rs.getSubgraph()==null) { - boolean entryEmpty = fsmHelpers.getDetailCode(rs.getEntryCode()).trim().isEmpty(); - boolean exitEmpty = fsmHelpers.getDetailCode(rs.getExitCode()).trim().isEmpty(); - boolean doEmpty = fsmHelpers.getDetailCode(rs.getDoCode()).trim().isEmpty(); - if (entryEmpty && exitEmpty && doEmpty) { - error("Refined state must not be empty (needs to have at least one action code or a subgraph).", FSMPackage.Literals.STATE__ENTRY_CODE); - } + if (validationUtil.isRefinedStateEmpty(rs)) { + error("Refined state must not be empty (needs to have at least one action code or a subgraph).", FSMPackage.Literals.STATE__ENTRY_CODE); } } diff --git a/plugins/org.eclipse.etrice.core.fsm/src/org/eclipse/etrice/core/fsm/validation/FSMValidationUtil.java b/plugins/org.eclipse.etrice.core.fsm/src/org/eclipse/etrice/core/fsm/validation/FSMValidationUtil.java index e6353b163..7436241b7 100644 --- a/plugins/org.eclipse.etrice.core.fsm/src/org/eclipse/etrice/core/fsm/validation/FSMValidationUtil.java +++ b/plugins/org.eclipse.etrice.core.fsm/src/org/eclipse/etrice/core/fsm/validation/FSMValidationUtil.java @@ -336,4 +336,15 @@ public class FSMValidationUtil extends FSMValidationUtilXtend { return name.matches("\\^?[a-zA-Z_][a-zA-Z_0-9]*"); } + public boolean isRefinedStateEmpty(RefinedState rs) { + if (rs.getSubgraph()==null || fsmHelpers.isEmpty(rs.getSubgraph())) { + boolean entryEmpty = fsmHelpers.getDetailCode(rs.getEntryCode()).trim().isEmpty(); + boolean exitEmpty = fsmHelpers.getDetailCode(rs.getExitCode()).trim().isEmpty(); + boolean doEmpty = fsmHelpers.getDetailCode(rs.getDoCode()).trim().isEmpty(); + if (entryEmpty && exitEmpty && doEmpty) { + return true; + } + } + return false; + } } diff --git a/plugins/org.eclipse.etrice.ui.behavior.fsm/src/org/eclipse/etrice/ui/behavior/fsm/editor/AbstractFSMEditor.java b/plugins/org.eclipse.etrice.ui.behavior.fsm/src/org/eclipse/etrice/ui/behavior/fsm/editor/AbstractFSMEditor.java index 153364e21..bc2609c17 100644 --- a/plugins/org.eclipse.etrice.ui.behavior.fsm/src/org/eclipse/etrice/ui/behavior/fsm/editor/AbstractFSMEditor.java +++ b/plugins/org.eclipse.etrice.ui.behavior.fsm/src/org/eclipse/etrice/ui/behavior/fsm/editor/AbstractFSMEditor.java @@ -28,6 +28,7 @@ import org.eclipse.etrice.core.fsm.fSM.RefinedState; import org.eclipse.etrice.core.fsm.fSM.State; import org.eclipse.etrice.core.fsm.fSM.StateGraph; import org.eclipse.etrice.core.fsm.util.FSMHelpers; +import org.eclipse.etrice.core.fsm.validation.FSMValidationUtil; import org.eclipse.etrice.ui.behavior.fsm.support.ContextSwitcher; import org.eclipse.etrice.ui.behavior.fsm.support.util.FSMSupportUtil; import org.eclipse.etrice.ui.common.base.editor.DiagramEditorBase; @@ -39,6 +40,8 @@ import org.eclipse.graphiti.mm.pictograms.Diagram; import org.eclipse.graphiti.mm.pictograms.Shape; import org.eclipse.graphiti.services.Graphiti; import org.eclipse.graphiti.ui.editor.DiagramBehavior; +import org.eclipse.jface.dialogs.MessageDialog; +import org.eclipse.swt.widgets.Display; import com.google.common.base.Function; @@ -140,6 +143,23 @@ public abstract class AbstractFSMEditor extends DiagramEditorBase { @Override public void doSave(IProgressMonitor monitor) { + + FSMValidationUtil fsmValidationUtil = FSMSupportUtil.getInstance().getFSMValidationUtil(); + Diagram diagram = getDiagramTypeProvider().getDiagram(); + ModelComponent mc = FSMSupportUtil.getInstance().getModelComponent(diagram); + if (mc.getStateMachine()!=null) { + for (State s : mc.getStateMachine().getStates()) { + if (s instanceof RefinedState) { + if (fsmValidationUtil.isRefinedStateEmpty((RefinedState) s)) { + MessageDialog.openError(Display.getCurrent().getActiveShell(), + "Check of Refined State", + "A Refined State with empty action codes must have a non-empty sub state graph."); + return; + } + } + } + } + getEditingDomain().getCommandStack().execute(new RecordingCommand(getEditingDomain()) { protected void doExecute() { cleanupBeforeSave(); diff --git a/plugins/org.eclipse.etrice.ui.behavior.fsm/src/org/eclipse/etrice/ui/behavior/fsm/support/StateGraphSupport.java b/plugins/org.eclipse.etrice.ui.behavior.fsm/src/org/eclipse/etrice/ui/behavior/fsm/support/StateGraphSupport.java index a194ba4f4..16a1795b2 100644 --- a/plugins/org.eclipse.etrice.ui.behavior.fsm/src/org/eclipse/etrice/ui/behavior/fsm/support/StateGraphSupport.java +++ b/plugins/org.eclipse.etrice.ui.behavior.fsm/src/org/eclipse/etrice/ui/behavior/fsm/support/StateGraphSupport.java @@ -19,10 +19,12 @@ import org.eclipse.emf.common.util.Diagnostic; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.ecore.EObject; import org.eclipse.etrice.core.fsm.fSM.ChoicePoint; +import org.eclipse.etrice.core.fsm.fSM.RefinedState; import org.eclipse.etrice.core.fsm.fSM.State; import org.eclipse.etrice.core.fsm.fSM.StateGraph; import org.eclipse.etrice.core.fsm.fSM.TrPoint; import org.eclipse.etrice.core.fsm.fSM.Transition; +import org.eclipse.etrice.core.fsm.util.FSMHelpers; import org.eclipse.etrice.ui.behavior.fsm.editor.AbstractFSMEditor; import org.eclipse.etrice.ui.behavior.fsm.editor.DecoratorUtil; import org.eclipse.etrice.ui.behavior.fsm.support.util.DiagramEditingUtil; @@ -73,6 +75,8 @@ import org.eclipse.graphiti.tb.ImageDecorator; import org.eclipse.graphiti.ui.features.DefaultFeatureProvider; import org.eclipse.graphiti.util.ColorConstant; import org.eclipse.graphiti.util.IColorConstant; +import org.eclipse.jface.dialogs.MessageDialog; +import org.eclipse.swt.widgets.Display; import com.google.common.collect.Sets; @@ -274,6 +278,22 @@ public class StateGraphSupport { Object bo = getBusinessObjectForPictogramElement(container); if (bo instanceof StateGraph) { StateGraph sg = (StateGraph) bo; + if (sg.eContainer() instanceof RefinedState) { + RefinedState rs = (RefinedState) sg.eContainer(); + FSMHelpers fsmHelpers = FSMSupportUtil.getInstance().getFSMHelpers(); + if (fsmHelpers.isEmpty(sg)) { + // check action codes + boolean entryEmpty = fsmHelpers.getDetailCode(rs.getEntryCode()).trim().isEmpty(); + boolean exitEmpty = fsmHelpers.getDetailCode(rs.getExitCode()).trim().isEmpty(); + boolean doEmpty = fsmHelpers.getDetailCode(rs.getDoCode()).trim().isEmpty(); + if (entryEmpty && exitEmpty && doEmpty) { + MessageDialog.openInformation(Display.getCurrent().getActiveShell(), + "Check of Refined State", + "A Refined State with empty action codes must have a non-empty sub state graph."); + return; + } + } + } getDiagramBehavior().getDiagramContainer().selectPictogramElements(new PictogramElement[] {}); ContextSwitcher.goUp(getDiagram(), sg); } |