Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenrik Rentz-Reichert2018-01-05 21:16:05 +0000
committerHenrik Rentz-Reichert2018-01-08 19:47:48 +0000
commit33e5411e9632baa741e2e93e91922cd40693cfd3 (patch)
tree1814b0a170406345b83937901b928040fd58c6a9 /plugins/org.eclipse.etrice.core.room.ui/src
parent97db531e8fa6d639abf4ac2bbbb1dbdb5ad79f15 (diff)
downloadorg.eclipse.etrice-33e5411e9632baa741e2e93e91922cd40693cfd3.tar.gz
org.eclipse.etrice-33e5411e9632baa741e2e93e91922cd40693cfd3.tar.xz
org.eclipse.etrice-33e5411e9632baa741e2e93e91922cd40693cfd3.zip
Bug 529445 - [newfsmgen] make old style transition data deprecated
Implementation as suggested in the bug. Change-Id: I6a6f6ea966e4060646427078d82cb2b12eb046b6
Diffstat (limited to 'plugins/org.eclipse.etrice.core.room.ui/src')
-rw-r--r--plugins/org.eclipse.etrice.core.room.ui/src/org/eclipse/etrice/core/ui/handlers/MigrateActionCodes.xtend77
-rw-r--r--plugins/org.eclipse.etrice.core.room.ui/src/org/eclipse/etrice/core/ui/handlers/MigrateTransitionData.xtend112
-rw-r--r--plugins/org.eclipse.etrice.core.room.ui/src/org/eclipse/etrice/core/ui/labeling/RoomLabelProvider.java6
-rw-r--r--plugins/org.eclipse.etrice.core.room.ui/src/org/eclipse/etrice/core/ui/quickfix/RoomQuickfixProvider.java12
4 files changed, 204 insertions, 3 deletions
diff --git a/plugins/org.eclipse.etrice.core.room.ui/src/org/eclipse/etrice/core/ui/handlers/MigrateActionCodes.xtend b/plugins/org.eclipse.etrice.core.room.ui/src/org/eclipse/etrice/core/ui/handlers/MigrateActionCodes.xtend
new file mode 100644
index 000000000..1dc00e46b
--- /dev/null
+++ b/plugins/org.eclipse.etrice.core.room.ui/src/org/eclipse/etrice/core/ui/handlers/MigrateActionCodes.xtend
@@ -0,0 +1,77 @@
+/*******************************************************************************
+ * Copyright (c) 2011 protos software gmbh (http://www.protos.de).
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * CONTRIBUTORS:
+ * Henrik Rentz-Reichert (initial contribution)
+ *
+ *******************************************************************************/
+
+package org.eclipse.etrice.core.ui.handlers
+
+import org.eclipse.core.commands.AbstractHandler
+import org.eclipse.core.commands.ExecutionEvent
+import org.eclipse.core.commands.ExecutionException
+import org.eclipse.emf.ecore.EObject
+import org.eclipse.jface.dialogs.MessageDialog
+import org.eclipse.swt.widgets.Display
+import org.eclipse.xtext.resource.XtextResource
+import org.eclipse.xtext.ui.editor.utils.EditorUtils
+import org.eclipse.xtext.util.concurrent.IUnitOfWork
+import org.eclipse.etrice.core.fsm.fSM.DetailCode
+import com.google.inject.Inject
+import org.eclipse.xtext.formatting.IWhitespaceInformationProvider
+
+class MigrateActionCodes extends AbstractHandler {
+
+ @Inject
+ IWhitespaceInformationProvider whitespaceProvider;
+
+ String lineSep
+ int actionCodesChanged = 0
+
+ override execute(ExecutionEvent event) throws ExecutionException {
+
+ val proceed = MessageDialog.openQuestion(
+ Display.current.activeShell,
+ "Migrate action codes to smart strings",
+ "This migration will convert all action codes to smart strings.\n\n"
+ + "Proceed?"
+ )
+ if (proceed) {
+ val editor = EditorUtils.getActiveXtextEditor(event)
+ if (editor!==null) {
+ editor.getDocument().modify(new IUnitOfWork.Void<XtextResource>() {
+ override void process(XtextResource state) throws Exception {
+ lineSep = whitespaceProvider.getLineSeparatorInformation(state.URI).lineSeparator
+ for (model : state.getContents()) {
+ migrateModel(model)
+ }
+ }
+ });
+ MessageDialog.openInformation(
+ Display.current.activeShell,
+ "Migrate action codes to smart strings",
+ "Changed " + actionCodesChanged + " action codes to smart strings.\n\n"
+ + "It might be necessary to format (ctrl+shift+F) the model."
+ )
+ }
+ }
+ return null;
+ }
+
+ private def void migrateModel(EObject model) {
+ model.eAllContents.toIterable.filter(DetailCode).filter[used].forEach[
+ val ccString = lines.join(whitespaceProvider.getLineSeparatorInformation(eResource.URI).lineSeparator)
+
+ used = false
+ lines.clear
+ lines += ccString
+
+ actionCodesChanged++
+ ]
+ }
+} \ No newline at end of file
diff --git a/plugins/org.eclipse.etrice.core.room.ui/src/org/eclipse/etrice/core/ui/handlers/MigrateTransitionData.xtend b/plugins/org.eclipse.etrice.core.room.ui/src/org/eclipse/etrice/core/ui/handlers/MigrateTransitionData.xtend
new file mode 100644
index 000000000..7adecfa6e
--- /dev/null
+++ b/plugins/org.eclipse.etrice.core.room.ui/src/org/eclipse/etrice/core/ui/handlers/MigrateTransitionData.xtend
@@ -0,0 +1,112 @@
+/*******************************************************************************
+ * Copyright (c) 2011 protos software gmbh (http://www.protos.de).
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * CONTRIBUTORS:
+ * Henrik Rentz-Reichert (initial contribution)
+ *
+ *******************************************************************************/
+
+package org.eclipse.etrice.core.ui.handlers
+
+import org.eclipse.core.commands.AbstractHandler
+import org.eclipse.core.commands.ExecutionEvent
+import org.eclipse.core.commands.ExecutionException
+import org.eclipse.etrice.core.fsm.fSM.FSMFactory
+import org.eclipse.etrice.core.fsm.fSM.TriggeredTransition
+import org.eclipse.etrice.core.room.Message
+import org.eclipse.etrice.core.room.MessageData
+import org.eclipse.etrice.core.room.RoomModel
+import org.eclipse.jface.dialogs.MessageDialog
+import org.eclipse.swt.widgets.Display
+import org.eclipse.xtext.resource.XtextResource
+import org.eclipse.xtext.ui.editor.utils.EditorUtils
+import org.eclipse.xtext.util.concurrent.IUnitOfWork
+import org.eclipse.etrice.core.fsm.fSM.DetailCode
+import org.eclipse.emf.ecore.EObject
+import org.eclipse.etrice.core.room.MessageHandler
+import com.google.inject.Inject
+import org.eclipse.xtext.formatting.IWhitespaceInformationProvider
+
+class MigrateTransitionData extends AbstractHandler {
+
+ public static final String genericDataName = "transitionData"
+
+ @Inject
+ IWhitespaceInformationProvider whitespaceProvider;
+
+ String lineSep
+ int actionCodeReplacements = 0
+ int messageNamesRemoved = 0
+
+ override Object execute(ExecutionEvent event) throws ExecutionException {
+
+ val proceed = MessageDialog.openQuestion(
+ Display.current.activeShell,
+ "Migrate to new style of transition data",
+ "This migration will\n"
+ + "* remove all names of message data\n"
+ + "* replace textual occurrences of old data names with the generic name '" + genericDataName + "'\n\n"
+ + "Proceed?"
+ )
+ if (proceed) {
+ val editor = EditorUtils.getActiveXtextEditor(event)
+ if (editor!==null) {
+ editor.getDocument().modify(new IUnitOfWork.Void<XtextResource>() {
+ override void process(XtextResource state) throws Exception {
+ lineSep = whitespaceProvider.getLineSeparatorInformation(state.URI).lineSeparator
+ for (model : state.getContents()) {
+ if (model instanceof RoomModel) {
+ migrateModel(model)
+ }
+ }
+ }
+ });
+ MessageDialog.openInformation(
+ Display.current.activeShell,
+ "Migrate to new style of transition data",
+ "Did replacements in " + actionCodeReplacements + " action codes.\n"
+ + "In " + messageNamesRemoved + " messages the data names have been removed."
+ )
+ }
+ }
+ return null;
+ }
+
+ private def void migrateModel(RoomModel model) {
+ // (1) parse detail code and make replacements (before names are nulled in (2))
+ // consider only TriggeredTransition (which is not quite accurate)
+ model.eAllContents.toIterable.filter(TriggeredTransition).forEach[action = makeActionCodeReplacements(triggers.head?.msgFromIfPairs.head?.message, action)]
+ model.eAllContents.toIterable.filter(MessageHandler).forEach[detailCode = makeActionCodeReplacements(msg, detailCode)]
+
+ // (2) remove names of message data
+ model.eAllContents.toIterable.filter(MessageData).forEach[
+ deprecatedName = null
+ messageNamesRemoved++
+ ]
+ }
+
+ private def makeActionCodeReplacements(EObject msg, DetailCode action) {
+ // inaccurate assumption: we can look at the first trigger message only
+ if (msg instanceof Message) {
+ if (msg.data!==null && msg.data.deprecatedName!==null && action!==null && !action.lines.empty) {
+ // we turn a multiline detail code into a single line one. Otherwise the serializer will fail because of the CC_STRING
+ if (action.lines.join.contains(msg.data.deprecatedName)) {
+ actionCodeReplacements++
+ return FSMFactory.eINSTANCE.createDetailCode => [
+ val replaced = action.lines.map[replace(msg.data.deprecatedName, genericDataName)].join(lineSep)
+ lines.add(replaced)
+ used = false
+ ]
+ }
+ }
+ }
+
+ // return the unchanged code
+ return action
+ }
+
+} \ No newline at end of file
diff --git a/plugins/org.eclipse.etrice.core.room.ui/src/org/eclipse/etrice/core/ui/labeling/RoomLabelProvider.java b/plugins/org.eclipse.etrice.core.room.ui/src/org/eclipse/etrice/core/ui/labeling/RoomLabelProvider.java
index 648697b7d..9395725b8 100644
--- a/plugins/org.eclipse.etrice.core.room.ui/src/org/eclipse/etrice/core/ui/labeling/RoomLabelProvider.java
+++ b/plugins/org.eclipse.etrice.core.room.ui/src/org/eclipse/etrice/core/ui/labeling/RoomLabelProvider.java
@@ -36,6 +36,7 @@ import org.eclipse.etrice.core.room.ExternalType;
import org.eclipse.etrice.core.room.LogicalSystem;
import org.eclipse.etrice.core.room.LogicalThread;
import org.eclipse.etrice.core.room.Message;
+import org.eclipse.etrice.core.room.MessageData;
import org.eclipse.etrice.core.room.Operation;
import org.eclipse.etrice.core.room.Port;
import org.eclipse.etrice.core.room.PortOperation;
@@ -48,7 +49,6 @@ import org.eclipse.etrice.core.room.ServiceImplementation;
import org.eclipse.etrice.core.room.SubProtocol;
import org.eclipse.etrice.core.room.SubSystemClass;
import org.eclipse.etrice.core.room.SubSystemRef;
-import org.eclipse.etrice.core.room.VarDecl;
import org.eclipse.etrice.core.room.util.RoomHelpers;
import org.eclipse.jface.viewers.StyledString;
@@ -332,8 +332,8 @@ public class RoomLabelProvider extends FSMLabelProvider {
String text(Message m) {
String signature = "";
if (m.getData()!=null) {
- VarDecl data = m.getData();
- signature = data.getName()+":"+data.getRefType().getType().getName() + (data.getRefType().isRef() ? " ref" : "");
+ MessageData data = m.getData();
+ signature = data.getRefType().getType().getName() + (data.getRefType().isRef() ? " ref" : "");
}
signature = "("+signature+")";
return m.getName()+signature;
diff --git a/plugins/org.eclipse.etrice.core.room.ui/src/org/eclipse/etrice/core/ui/quickfix/RoomQuickfixProvider.java b/plugins/org.eclipse.etrice.core.room.ui/src/org/eclipse/etrice/core/ui/quickfix/RoomQuickfixProvider.java
index 2ceeb6d05..87e35da1b 100644
--- a/plugins/org.eclipse.etrice.core.room.ui/src/org/eclipse/etrice/core/ui/quickfix/RoomQuickfixProvider.java
+++ b/plugins/org.eclipse.etrice.core.room.ui/src/org/eclipse/etrice/core/ui/quickfix/RoomQuickfixProvider.java
@@ -32,6 +32,7 @@ import org.eclipse.etrice.core.fsm.fSM.ComponentCommunicationType;
import org.eclipse.etrice.core.fsm.ui.quickfix.FSMQuickfixProvider;
import org.eclipse.etrice.core.room.ActorClass;
import org.eclipse.etrice.core.room.ActorRef;
+import org.eclipse.etrice.core.room.MessageData;
import org.eclipse.etrice.core.room.ReferenceType;
import org.eclipse.etrice.core.room.StandardOperation;
import org.eclipse.etrice.core.validation.RoomJavaValidator;
@@ -330,5 +331,16 @@ public class RoomQuickfixProvider extends FSMQuickfixProvider {
}
});
}
+
+ @Fix(RoomJavaValidator.DEPRECATED_MESSAGE_DATA_NAME)
+ public void removeDeprecatedMessageDataName(final Issue issue, IssueResolutionAcceptor acceptor) {
+ acceptor.accept(issue, "Omit message data name.", "Remove the deprecated name for the message data.", "correction_change.gif", new ISemanticModification() {
+ @Override
+ public void apply(EObject element, IModificationContext context) throws Exception {
+ MessageData d = (MessageData) element;
+ d.setDeprecatedName(null);
+ }
+ });
+ }
}

Back to the top