blob: a35342b1157a199ea7da1a0669c6185bee2d0d56 [file] [log] [blame]
/*******************************************************************************
* 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);
}
}
}