package iac_emf.generator2.main; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.util.HashMap; import java.util.Iterator; import javax.swing.JOptionPane; import org.eclipse.emf.common.util.URI; 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.ecore.xmi.impl.XMIResourceFactoryImpl; import statechart.Node; import statechart.StatechartFactory; import statechart.StatechartPackage; import IAC.IACFactory; import IAC.IACPackage; public class ModelConvertor { private IAC.Node IACroot; private statechart.Node root; private IAC.Model IACModel; private statechart.Model model; public ModelConvertor(){ IACroot = IACFactory.eINSTANCE.createNode(); IACModel = IACFactory.eINSTANCE.createModel(); root = StatechartFactory.eINSTANCE.createNode(); model = StatechartFactory.eINSTANCE.createModel(); } public String IACToStateChart(String filename, String Path){ String file= new String(); IAC.Model old = (IAC.Model) IACFactory.eINSTANCE.createModel(); ResourceSet resourceSet1 = new ResourceSetImpl(); resourceSet1.getResourceFactoryRegistry().getExtensionToFactoryMap() .put(Resource.Factory.Registry.DEFAULT_EXTENSION, new XMIResourceFactoryImpl()); resourceSet1.getPackageRegistry().put(IACPackage.eNS_URI, IACPackage.eINSTANCE); Resource resource = resourceSet1.createResource(URI .createURI(IACPackage.eNS_URI)); try { File source = new File(filename); resource.load(new FileInputStream(source), new HashMap<Object,Object>()); resource.load(null); old = (IAC.Model) resource.getContents().get(0); root = StatechartFactory.eINSTANCE.createNode(); statechart.Node node = StatechartFactory.eINSTANCE.createNode(); model = StatechartFactory.eINSTANCE.createModel(); for(Iterator<IAC.Node> it = old.getNodes().iterator(); it.hasNext();){ IAC.Node cur = it.next(); node = IACNodeToStateChartNode(cur); if(cur.getFather_of().size()==0){ root = node; model.getNodes().add(root); }else{ addNodeStatechart(node, cur.getFather_of().get(0).getLabel()); } } statechart.Transition item = StatechartFactory.eINSTANCE.createTransition(); for(Iterator<IAC.Transition> it = old.getTransitions().iterator(); it.hasNext();){ IAC.Transition cur = it.next(); item = StatechartFactory.eINSTANCE.createTransition(); item.setName(cur.getName()); if(cur.getTE()!=null) item.setTE(cur.getTE()); item.setSource(getNodeStateChart(cur.getSource().getLabel())); item.setTarget(getNodeStateChart(cur.getTarget().getLabel())); model.getTransitions().add(item); } statechart.Variable var; IAC.Variable vIAC = IACFactory.eINSTANCE.createVariable(); for(Iterator<IAC.Variable> it = old.getVariables().iterator(); it.hasNext();){ vIAC = it.next(); var = StatechartFactory.eINSTANCE.createVariable(); var.setName(vIAC.getName()); var.setType(vIAC.getType()); model.getVariables().add(var); } model.setName(old.getName()); ResourceSet resourceSet = new ResourceSetImpl(); // Register the appropriate resource factory to handle all file // extensions. // resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap() .put(Resource.Factory.Registry.DEFAULT_EXTENSION, new XMIResourceFactoryImpl()); // Register the package to ensure it is available during loading. // resourceSet.getPackageRegistry().put(StatechartPackage.eNS_URI, StatechartPackage.eINSTANCE); Resource resource1 = resourceSet.createResource(URI .createURI(StatechartPackage.eNS_URI)); resource1.getContents().add(model); try { file =Path+ File.separator+ model.getName() +"_new.stct"; FileOutputStream out = new FileOutputStream( new File(file)); resource1.save(out, null); System.out.println("The new Model is in the file : " +file); } catch (Exception e) { // TODO: handle exception System.out.println(e.getMessage()); } } catch (FileNotFoundException e) { // TODO Auto-generated catch block // createDialog(e.getMessage()); System.out.println(e.getMessage()); } catch (IOException e) { // TODO Auto-generated catch block // createDialog(e.getMessage()); System.out.println(e.getMessage()); } return file; } public String StateChartToIAC(String filename, String Path){ String file = new String(); statechart.Model old = (statechart.Model) StatechartFactory.eINSTANCE.createModel(); ResourceSet resourceSet1 = new ResourceSetImpl(); resourceSet1.getResourceFactoryRegistry().getExtensionToFactoryMap() .put(Resource.Factory.Registry.DEFAULT_EXTENSION, new XMIResourceFactoryImpl()); resourceSet1.getPackageRegistry().put(StatechartPackage.eNS_URI, StatechartPackage.eINSTANCE); Resource resource = resourceSet1.createResource(URI .createURI(StatechartPackage.eNS_URI)); try { File source = new File(filename); resource.load(new FileInputStream(source), new HashMap<Object,Object>()); resource.load(null); old = (statechart.Model) resource.getContents().get(0); root = old.getNodes().get(0); IACroot = StatechartNodeToIACNode(root); IACModel.getNodes().add(IACroot); for(int i=0; i<root.getChildren().size(); i++){ IACModel.getNodes().add(StatechartNodeToIACNode(root.getChildren().get(i))); DFAccess(root.getChildren().get(i)); } IAC.Transition item = IACFactory.eINSTANCE.createTransition(); for(Iterator<statechart.Transition> it = old.getTransitions().iterator(); it.hasNext();){ statechart.Transition cur = it.next(); item = IACFactory.eINSTANCE.createTransition(); item.setName(cur.getName()); if(cur.getTE()!=null) item.setTE(cur.getTE()); item.setSource(getNodeIAC(cur.getSource().getLabel())); item.setTarget(getNodeIAC(cur.getTarget().getLabel())); IACModel.getTransitions().add(item); } IAC.Variable var; for(int i=0; i<old.getVariables().size(); i++){ var= IACFactory.eINSTANCE.createVariable(); var.setName(old.getVariables().get(i).getName()); var.setType(old.getVariables().get(i).getType()); IACModel.getVariables().add(var); } DFAddVariables(root); IACModel.setName(old.getName()); ResourceSet resourceSet = new ResourceSetImpl(); // Register the appropriate resource factory to handle all file // extensions. // resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap() .put(Resource.Factory.Registry.DEFAULT_EXTENSION, new XMIResourceFactoryImpl()); // Register the package to ensure it is available during loading. // resourceSet.getPackageRegistry().put(StatechartPackage.eNS_URI, IACPackage.eINSTANCE); Resource resource1 = resourceSet.createResource(URI .createURI(IACPackage.eNS_URI)); resource1.getContents().add(IACModel); try { file =Path+ File.separator+ IACModel.getName() +"_new.iac"; FileOutputStream out = new FileOutputStream( new File(file)); resource1.save(out, null); //createDialog("The new Model is in the file : " +file); } catch (Exception e) { // TODO: handle exception JOptionPane.showMessageDialog(null,e.getMessage()); } } catch (FileNotFoundException e) { // TODO Auto-generated catch block JOptionPane.showMessageDialog(null,e.getMessage()); } catch (IOException e) { // TODO Auto-generated catch block JOptionPane.showMessageDialog(null,e.getMessage()); } return file; } private IAC.Node getNodeIAC(String label){ for( Iterator<IAC.Node> it = (Iterator<IAC.Node>) IACModel.getNodes().iterator(); it.hasNext();){ IAC.Node cur = it.next(); if(cur.getLabel().equals(label)) return cur; } return null; } private statechart.Node getNodeStateChart(String label){ if(root.getLabel().equals(label)) return root; else return DFSearch(root, label); } private void DFAccess(statechart.Node father){ for(int i=0; i<father.getChildren().size(); i++){ IACModel.getNodes().add(StatechartNodeToIACNode(father.getChildren().get(i))); DFAccess(father.getChildren().get(i)); } } private void DFAddVariables(statechart.Node father){ for(int i=0; i<father.getChildren().size(); i++){ if(!father.getChildren().get(i).getVariables().isEmpty()){ for(int j=0; j<IACModel.getNodes().size(); j++){ IAC.Node n = IACModel.getNodes().get(j); if(IACModel.getNodes().get(j).getLabel().equals(father.getChildren().get(i).getLabel())){ IAC.Variable var = IACFactory.eINSTANCE.createVariable(); for(int q=0; q<father.getChildren().get(i).getVariables().size(); q++){ System.out.println("StateChartVAR "+father.getChildren().get(i).getVariables().get(q)); var.setName(father.getChildren().get(i).getVariables().get(q).getName()); var.setType(father.getChildren().get(i).getVariables().get(q).getType()); System.out.println("VAR "+ var); for(int p=0; p<IACModel.getVariables().size(); p++){ System.out.println("IACMODEL VAR "+ IACModel.getVariables().get(p)); if(var.getName().equals(IACModel.getVariables().get(p).getName()) && var.getType().equals(IACModel.getVariables().get(p).getType())){ System.out.println("IACMODEL VAR "+ IACModel.getVariables().get(p)); n.getVariables().add(IACModel.getVariables().get(p)); if(!n.getVariables().isEmpty()){ System.out.println(n.getVariables().get(0)); } } } } IACModel.getNodes().set(j, n); break; } } } DFAddVariables(father.getChildren().get(i)); } } private statechart.Node DFSearch(statechart.Node root, String label){ Iterator<Node> it = root.getChildren().iterator(); statechart.Node search = null; while( it.hasNext()){ search = it.next(); if(search.getLabel().equals(label)){ System.out.println("Label : " + search.getLabel()); return search; } else if(search.getChildren().size()>0){ statechart.Node newsearch = DFSearch(search, label); if (newsearch!=null) return newsearch; } } if(search!=null) System.out.println("To teleutaio "+ search.getLabel()); return null; } private statechart.Node IACNodeToStateChartNode(IAC.Node node){ if(node==null) return null; statechart.Node item = StatechartFactory.eINSTANCE.createNode(); item.setActivity(node.getActivity()); item.setLabel(node.getLabel()); item.setName(node.getName()); item.setType(node.getType()); return item; } private IAC.Node StatechartNodeToIACNode(statechart.Node node){ if(node==null) return null; IAC.Node item = IACFactory.eINSTANCE.createNode(); item.setActivity(node.getActivity()); item.setLabel(node.getLabel()); item.setName(node.getName()); item.setType(node.getType()); if(node.getFather_of()!=null) item.getFather_of().add(getNodeIAC(node.getFather_of().getLabel())); return item; } private void addNodeStatechart( statechart.Node node, String fatherLabel){ if(root.getLabel().equals(fatherLabel)) root.getChildren().add(node); else{ DFSAdd(root, fatherLabel, node); } } private statechart.Node DFSAdd(Node root, String label, statechart.Node node){ Iterator<Node> it = root.getChildren().iterator(); statechart.Node search = null; while( it.hasNext()){ search = it.next(); if(search.getLabel().equals(label)){ search.getChildren().add((Node) node); return search; } else if(search.getChildren().size()>0){ Node newsearch = DFSAdd(search, label, node); if (newsearch!=null){ return newsearch; } } } return null; } }