| /******************************************************************************* |
| * Copyright (c) 2010-2015, Abel Hegedus, Tamas Borbas, Istvan Rath and Daniel Varro |
| * This program and the accompanying materials are made available under the |
| * terms of the Eclipse Public License v. 2.0 which is available at |
| * http://www.eclipse.org/legal/epl-v20.html. |
| * |
| * SPDX-License-Identifier: EPL-2.0 |
| *******************************************************************************/ |
| package org.eclipse.viatra.modelobfuscator.ui.handlers; |
| |
| import java.io.ByteArrayInputStream; |
| import java.io.UnsupportedEncodingException; |
| import java.text.DateFormat; |
| import java.text.SimpleDateFormat; |
| import java.util.Date; |
| import java.util.Map; |
| |
| import org.eclipse.core.commands.AbstractHandler; |
| import org.eclipse.core.commands.ExecutionEvent; |
| import org.eclipse.core.commands.ExecutionException; |
| import org.eclipse.core.resources.IFile; |
| import org.eclipse.core.resources.ResourcesPlugin; |
| import org.eclipse.core.runtime.CoreException; |
| import org.eclipse.core.runtime.ILog; |
| import org.eclipse.core.runtime.Path; |
| import org.eclipse.core.runtime.Status; |
| import org.eclipse.emf.common.command.AbstractCommand; |
| import org.eclipse.emf.ecore.resource.Resource; |
| import org.eclipse.emf.ecore.resource.ResourceSet; |
| import org.eclipse.emf.edit.domain.EditingDomain; |
| import org.eclipse.emf.edit.domain.IEditingDomainProvider; |
| import org.eclipse.jface.dialogs.MessageDialog; |
| import org.eclipse.jface.viewers.ISelection; |
| import org.eclipse.jface.viewers.IStructuredSelection; |
| import org.eclipse.ui.IEditorPart; |
| import org.eclipse.ui.handlers.HandlerUtil; |
| import org.eclipse.viatra.modelobfuscator.api.ModelObfuscator; |
| import org.eclipse.viatra.modelobfuscator.ui.ModelObfuscatorUIPlugin; |
| import org.eclipse.viatra.modelobfuscator.ui.util.ModelObfuscatorUIHelper; |
| |
| public abstract class AbstractModelObfuscatorHandler extends AbstractHandler { |
| |
| protected String mapFilePath; |
| |
| protected abstract ModelObfuscator createModelObfuscator(ResourceSet resourceSet, final EditingDomain editingDomain, ExecutionEvent event); |
| |
| @Override |
| public Object execute(ExecutionEvent event) throws ExecutionException { |
| IEditorPart editorPart = HandlerUtil.getActiveEditor(event); |
| final Resource selectedResource = getSelectedResource(event); |
| if(selectedResource==null) { |
| MessageDialog.openInformation(HandlerUtil.getActiveShell(event), "Model obfuscation", "Sorry, there is no selected resource. You may need to open a diagram."); |
| return null; |
| } |
| final String mapFilePath = selectedResource.getURI().toPlatformString(true)+".mapping_"+getDate(); |
| ResourceSet resourceSet = null; |
| if (editorPart instanceof IEditingDomainProvider) { |
| IEditingDomainProvider editingDomainProvider = (IEditingDomainProvider) editorPart; |
| final EditingDomain editingDomain = editingDomainProvider.getEditingDomain(); |
| resourceSet = editingDomain.getResourceSet(); |
| if (resourceSet != null) { |
| ILog logger = ModelObfuscatorUIPlugin.getDefault().getLog(); |
| final ModelObfuscator obfuscator = createModelObfuscator(resourceSet, editingDomain, event); |
| if(obfuscator==null) { |
| return null; |
| } |
| final String seed = obfuscator.getStringObfuscator().getSeed(); |
| final String salt = obfuscator.getStringObfuscator().getSalt(); |
| final String prefix = obfuscator.getStringObfuscator().getPrefix(); |
| |
| StringBuilder messageBuilder = new StringBuilder(); |
| messageBuilder.append("This tool replaces all string attribute values with obfuscated values.\n"); |
| messageBuilder.append("You can Undo the operation or restore the original values with\n"); |
| messageBuilder.append("- seed: ").append(seed); |
| if(!salt.isEmpty()){ |
| messageBuilder.append("\n- salt: ").append(salt); |
| } |
| if(!prefix.isEmpty()){ |
| messageBuilder.append("\n- prefix: ").append(prefix); |
| } |
| String logMessage = messageBuilder.toString(); |
| messageBuilder.append("\n(logged also as an Info level event and saved in mapping file)"); |
| messageBuilder.append("\nDo you want to perform model obfuscation?"); |
| String message = messageBuilder.toString(); |
| boolean confirmed = MessageDialog.openConfirm( |
| HandlerUtil.getActiveShell(event), |
| "Model obfuscation", |
| message); |
| if (confirmed) { |
| logger.log(new Status(Status.INFO, ModelObfuscatorUIPlugin.PLUGIN_ID, logMessage)); |
| AbstractCommand obfuscationCommand = new AbstractCommand("Obfuscate model") { |
| |
| @Override |
| public void redo() { |
| // obfuscation with the same seed is deterministic |
| obfuscator.obfuscate(); |
| } |
| |
| @Override |
| public void undo() { |
| obfuscator.restore(); |
| } |
| |
| @Override |
| public void execute() { |
| obfuscator.obfuscate(); |
| Map<String,String> oMap = obfuscator.getObfuscationMap(); |
| printout(oMap); |
| } |
| |
| @Override |
| protected boolean prepare() { |
| super.prepare(); |
| return true; |
| } |
| |
| private void printout(Map<String,String> oMap) { |
| if(oMap!=null) { |
| StringBuffer mapContent = new StringBuffer("Original;Modified;Obfuscation seed: " + seed + ";"); |
| if(!salt.isEmpty()){ |
| mapContent.append("Salt: " + salt + ";"); |
| } |
| if(!prefix.isEmpty()){ |
| mapContent.append("Prefix: " + prefix + ";"); |
| } |
| for (String key : oMap.keySet()) { |
| mapContent.append("\n"+key+";"+oMap.get(key)+";"); |
| } |
| print(mapFilePath, mapContent.toString()); |
| } |
| } |
| }; |
| editingDomain.getCommandStack().execute(obfuscationCommand); |
| } |
| } |
| } |
| return null; |
| } |
| |
| private String getDate() { |
| DateFormat dateFormat = new SimpleDateFormat("yyyyMMdd_HHmm"); |
| Date date = new Date(); |
| return dateFormat.format(date); |
| } |
| |
| protected Resource getSelectedResource(ExecutionEvent event) { |
| ISelection selection = HandlerUtil.getCurrentSelection(event); |
| |
| if (selection instanceof IStructuredSelection && ((IStructuredSelection)selection).toList().size()>0){ |
| Object selectedElement = ((IStructuredSelection)selection).toList().get(0); |
| return ModelObfuscatorUIHelper.getResource(selectedElement); |
| } |
| return null; |
| } |
| |
| protected void print(String mapFilePath,String content) { |
| try { |
| IFile mapFile = ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(mapFilePath+".csv")); |
| int i = 0; |
| while(mapFile.exists()) { |
| i++; |
| mapFile = ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(mapFilePath+"_"+i+".csv")); |
| } |
| try { |
| mapFile.create(new ByteArrayInputStream(content.getBytes("UTF-8")), true, null); |
| } catch (CoreException e) { |
| e.printStackTrace(); |
| } catch (UnsupportedEncodingException e) { |
| e.printStackTrace(); |
| } |
| } catch (Exception ex) { |
| ex.printStackTrace(); |
| System.out.println(content); |
| } |
| } |
| } |