diff options
author | Henrik Rentz-Reichert | 2018-01-05 21:16:05 +0000 |
---|---|---|
committer | Henrik Rentz-Reichert | 2018-01-08 19:47:48 +0000 |
commit | 33e5411e9632baa741e2e93e91922cd40693cfd3 (patch) | |
tree | 1814b0a170406345b83937901b928040fd58c6a9 /plugins/org.eclipse.etrice.core.room.ui/src | |
parent | 97db531e8fa6d639abf4ac2bbbb1dbdb5ad79f15 (diff) | |
download | org.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')
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); + } + }); + } } |