blob: bd0a0559aacc888544eda5e305112e2a93888711 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2016 Fundación Tecnalia Research & Innovation.
*
* 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:
* Huascar Espinoza - initial API and implementation
* Alejandra Ruíz - initial API and implementation
* Idoya Del Río - initial API and implementation
* Mari Carmen Palacios - initial API and implementation
* Angel López - initial API and implementation
*******************************************************************************/
package org.eclipse.opencert.pkm.refframework.refframework.diagram.part;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Scanner;
import org.eclipse.jface.action.ContributionItem;
import org.eclipse.jface.action.IContributionItem;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IEditorReference;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.actions.CompoundContributionItem;
//import org.eclipse.ui.internal.ActivateEditorHandler;
import org.eclipse.ui.menus.CommandContributionItem;
import org.eclipse.ui.menus.CommandContributionItemParameter;
import org.eclipse.ui.part.FileEditorInput;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.emf.common.ui.URIEditorInput;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.common.util.WrappedException;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.emf.transaction.TransactionalEditingDomain;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.EditPartViewer;
import org.eclipse.gmf.runtime.notation.Diagram;
import org.eclipse.gmf.runtime.notation.impl.NodeImpl;
import org.eclipse.opencert.pkm.refframework.refframework.diagram.edit.parts.RefActivity2EditPart;
import org.eclipse.opencert.pkm.refframework.refframework.diagram.edit.parts.RefActivityEditPart;
import org.eclipse.opencert.pkm.refframework.refframework.diagram.edit.parts.RefArtefactEditPart;
import org.eclipse.opencert.pkm.refframework.refframework.diagram.edit.parts.RefFrameworkEditPart;
import org.eclipse.opencert.pkm.refframework.refframework.diagram.edit.parts.RefRoleEditPart;
import org.eclipse.opencert.pkm.refframework.refframework.impl.RefActivityImpl;
/**
* This class is used to generate the items of the AssociateDiagram menu
*
* @author Mª Carmen Palacios
*/
/**
* @generated NOT
*/
public class AssociateDiagram extends CompoundContributionItem {
private static ISelection selection;
private static ArrayList fileList = new ArrayList();
/**
* @generated NOT
*/
private static class NobodyHereContribution extends ContributionItem {
/**
* @generated NOT
*/
/* (non-Javadoc)
* @see org.eclipse.jface.action.ContributionItem#fill(org.eclipse.swt.widgets.Menu, int)
*/
public void fill(Menu menu, int index) {
MenuItem item = new MenuItem(menu, SWT.NONE, index);
item.setText("Any file here"); // a mostrar si no hay subitems...
item.setEnabled(false);
}
}
/**
* @generated NOT
*/
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.actions.CompoundContributionItem#getContributionItems()
*/
protected IContributionItem[] getContributionItems() {
ArrayList menuList = new ArrayList();
IWorkbenchWindow window = PlatformUI.getWorkbench()
.getActiveWorkbenchWindow();
IWorkbenchPart part = window.getActivePage().getActivePart();
selection = window.getActivePage().getSelection();
IStructuredSelection s = (IStructuredSelection)this.selection;
if(s == null || s.isEmpty() ||
!(s.getFirstElement() instanceof RefActivityEditPart || s.getFirstElement() instanceof RefActivity2EditPart || s.getFirstElement() instanceof RefArtefactEditPart || s.getFirstElement() instanceof RefRoleEditPart ))
{
menuList.add(new NobodyHereContribution());
return (IContributionItem[]) menuList
.toArray(new IContributionItem[menuList.size()]);
}
// obtner lista de ficheros con diagramas de tipo refframework
String path = getPath2(part.getTitle());
String diagramfullFileName="";
List<IFile> listf2 = getDiagramFiles(getProject(part.getTitle()));
//Filtar solo diagramas con el mismo modelo
// obtener nombre del fichero con el modelo
String modelFile = null;
NodeImpl nodo = null;
if(s.getFirstElement() instanceof RefActivityEditPart)
{
RefActivityEditPart obj = (RefActivityEditPart)s.getFirstElement();
nodo = (NodeImpl)obj.getModel();
}
else if(s.getFirstElement() instanceof RefActivity2EditPart)
{
RefActivity2EditPart obj = (RefActivity2EditPart)s.getFirstElement();
nodo = (NodeImpl)obj.getModel();
}
else if(s.getFirstElement() instanceof RefArtefactEditPart)
{
RefArtefactEditPart obj = (RefArtefactEditPart)s.getFirstElement();
nodo = (NodeImpl)obj.getModel();
}
else if (s.getFirstElement() instanceof RefRoleEditPart )
{
RefRoleEditPart obj = (RefRoleEditPart)s.getFirstElement();
nodo = (NodeImpl)obj.getModel();
}
EList<Resource> resList = nodo.eContainer().eResource().getResourceSet().getResources();
for (int i = 0; i < resList.size(); i++) {
if(resList.get(i).getURI().toString().contains(RefFrameworkEditPart.FILE_MODEL_ID) &&
!resList.get(i).getURI().toString().contains(RefFrameworkEditPart.FILE_DIAGRAM_ID))
{
modelFile = resList.get(i).getURI().lastSegment();
break;
}
}
ResourceSet rSet = new ResourceSetImpl();
// filtar los ficheros con el mismo modelo
List<IFile> listf = new ArrayList();
for (IFile element : listf2)
{
try {
//if(canBeAssociated(element.getFullPath().toFile(), "href=\""+modelFile+"#"))
//if(canBeAssociated(new File (getFileURI(element, rSet).toFileString()), "href=\""+modelFile+"#"))
//if(canBeAssociated(element.getContents(), ((File) element).length(), "href=\""+modelFile+"#"))
if(canBeAssociated(element.getContents(), "href=\""+modelFile+"#"))
listf.add(element);
//} catch (IOException | CoreException e) {
} catch (Exception e) {
e.printStackTrace();
}
}
fileList.clear();
int cont = 1;
for(IFile element : listf)
{
//diagramfullFileName = path + element.getName();
URI diagramfullFileNameURI = getFileURI(element, rSet);
//String kk2 = diagramfullFileNameURI.toFileString();
diagramfullFileName = diagramfullFileNameURI.toString();
if(!diagramfullFileName.contains(part.getTitle())) // si no es el current diagram
{
try {
menuList.add(createItem(cont++, diagramfullFileName));
fileList.add(diagramfullFileName);
}
catch (PartInitException e) {
}
}
}
if (menuList.isEmpty()) {
menuList.add(new NobodyHereContribution());
}
return (IContributionItem[]) menuList
.toArray(new IContributionItem[menuList.size()]);
}
/**
* @generated NOT
*/
private IContributionItem createItem(int i, String file)
throws PartInitException {
CommandContributionItemParameter p = new CommandContributionItemParameter(
PlatformUI.getWorkbench(), null, AssociateDiagramHandler.ID,
CommandContributionItem.STYLE_PUSH);
p.parameters = new HashMap();
p.parameters.put(AssociateDiagramHandler.PARM_EDITOR, new Integer(i));
String menuNum = Integer.toString(i);
p.label = menuNum + " " + file;
p.mnemonic = menuNum;
return new CommandContributionItem(p);
}
/**
* @generated NOT
*/
private Collection<Diagram> getDiagrams(IProject p) {
final List<IFile> files = getDiagramFiles(p);
final List<Diagram> diagramList = new ArrayList<Diagram>();
final ResourceSet rSet = new ResourceSetImpl();
for (final IFile file : files) {
final Diagram diagram = getDiagramFromFile(file, rSet);
if (diagram != null) {
diagramList.add(diagram);
}
}
return diagramList;
}
/**
* @generated NOT
*/
private List<IFile> getDiagramFiles(IContainer folder) {
final List<IFile> ret = new ArrayList<IFile>();
try {
final IResource[] members = folder.members();
for (final IResource resource : members) {
if (resource instanceof IContainer) {
ret.addAll(getDiagramFiles((IContainer) resource));
} else if (resource instanceof IFile) {
final IFile file = (IFile) resource;
if (file.getName().endsWith(RefFrameworkEditPart.FILE_DIAGRAM_ID)) {
ret.add(file);
}
}
}
} catch (final CoreException e) {
e.printStackTrace();
}
return ret;
}
/**
* @generated NOT
*/
private Diagram getDiagramFromFile(IFile file,
ResourceSet resourceSet) {
// Get the URI of the model file.
final URI resourceURI = getFileURI(file, resourceSet);
// Demand load the resource for this file.
Resource resource;
try {
resource = resourceSet.getResource(resourceURI, true);
if (resource != null) {
// does resource contain a diagram as root object?
final EList<EObject> contents = resource.getContents();
for (final EObject object : contents) {
if (object instanceof Diagram) {
return (Diagram) object;
}
}
}
} catch (final WrappedException e) {
e.printStackTrace();
}
return null;
}
/**
* @generated NOT
*/
private URI getFileURI(IFile file, ResourceSet resourceSet) {
final String pathName = file.getFullPath().toString();
URI resourceURI = URI.createFileURI(pathName);
resourceURI = resourceSet.getURIConverter().normalize(resourceURI);
return resourceURI;
}
/**
* @generated NOT
*/
private String getPath2(String fileName)
{
String path = "";
IProject[] projects = ResourcesPlugin.getWorkspace().getRoot().getProjects();
for(int i=0;i<projects.length;i++)
{
IProject curr = projects[i];
List<IFile> list = getDiagramFiles(curr);
for(IFile element : list)
{
if(element.getName().contains(fileName))
{
path = element.getFullPath().toString();
int lind = path.lastIndexOf(fileName);
String path2 = path.substring(0, lind);
return path2;
}
}
}
return path;
}
/**
* @generated NOT
*/
private IProject getProject(String fileName)
{
IProject curr = null;
IProject[] projects = ResourcesPlugin.getWorkspace().getRoot().getProjects();
for(int i=0;i<projects.length;i++)
{
curr = projects[i];
List<IFile> list = getDiagramFiles(curr);
for(IFile element : list)
{
if(element.getName().contains(fileName))
{
return curr;
}
}
}
return curr;
}
/**
* @generated NOT
*/
public static String getFile(int ind)
{
String fileName = (String) fileList.get(ind-1);
return fileName;
}
/**
* @generated NOT
*/
public static ISelection geSelection()
{
return selection;
}
/**
* @generated NOT
*/
/*
public void fha(InputStream is1, InputStream is2) throws IOException {
Scanner sc1 = new Scanner(is1);
Scanner sc2 = new Scanner(is2);
while (sc1.hasNext() && sc2.hasNext()) {
String str1 = sc1.next();
String str2 = sc2.next();
if (!str1.equals(str2))
System.out.println(str1 + " != " + str2);
}
while (sc1.hasNext())
System.out.println(sc1.next() + " != EOF");
while (sc2.hasNext())
System.out.println("EOF != " + sc2.next());
sc1.close();
sc2.close();
}
*/
/**
* @generated NOT
*/
/*
public boolean canBeAssociated(File is1, String str) throws IOException {
boolean res = false;
Scanner sc1 = new Scanner(is1).useDelimiter("\\s*"+str+"\\s*");
if(sc1.hasNext()) res = true;
String kk = sc1.next();
sc1.close();
return res;
}
*/
/**
* @generated NOT
*/
public boolean canBeAssociated(InputStream is1, String str) throws IOException {
boolean res = false;
//MCP???OJO: Puede dar problemas de desbordamiento de memoria con ficheros muy grandes
Scanner sc1 = new Scanner(is1).useDelimiter("\\s*"+str+"\\s*");
if(sc1.hasNext())
{
String firstT = sc1.next();
/* NO FUNCIONA
//long length = Integer.MAX_VALUE;//public static final int MAX_VALUE = 2147483647;
long length = 1000; //MCP chapuzilla
//Read the file Bytes
byte [] contentsNew = new byte[Integer.parseInt(""+length)];
DataInputStream dis = new DataInputStream(is1);
if(firstT.length() < length) dis.readFully(contentsNew, 0, firstT.length());
else dis.readFully(contentsNew, 0, Integer.parseInt(""+length));
//dis.close();
if(!contentsNew.toString().equalsIgnoreCase(firstT.substring(0, Integer.parseInt(""+length)))) res = true;
*/
//MCP???OJO: chapuzilla. Si no hemos llegado al final del fichero...
if(sc1.hasNext()) res = true;
}
sc1.close();
return res;
}
}