1 | package resource.tools.xtools; |
---|
2 | |
---|
3 | |
---|
4 | import java.io.File; |
---|
5 | import java.util.ArrayList; |
---|
6 | import java.util.Collection; |
---|
7 | import java.util.List; |
---|
8 | |
---|
9 | import org.eclipse.emf.common.util.EList; |
---|
10 | import org.eclipse.emf.ecore.EObject; |
---|
11 | import org.eclipse.emf.ecore.EStructuralFeature.Setting; |
---|
12 | import org.eclipse.emf.ecore.EValidator; |
---|
13 | import org.eclipse.emf.ecore.resource.Resource; |
---|
14 | import org.eclipse.emf.ecore.util.EObjectValidator; |
---|
15 | import org.eclipse.emf.ecore.util.EcoreUtil; |
---|
16 | import org.eclipse.xtext.EcoreUtil2; |
---|
17 | import org.eclipse.xtext.nodemodel.ICompositeNode; |
---|
18 | import org.eclipse.xtext.nodemodel.util.NodeModelUtils; |
---|
19 | import org.slf4j.LoggerFactory; |
---|
20 | |
---|
21 | import de.ugoe.cs.swe.bnftools.EbnfStandaloneSetup; |
---|
22 | import de.ugoe.cs.swe.bnftools.ebnf.EbnfPackage; |
---|
23 | import de.ugoe.cs.swe.bnftools.ebnf.EtsiBnf; |
---|
24 | import de.ugoe.cs.swe.bnftools.ebnf.Rule; |
---|
25 | import de.ugoe.cs.swe.bnftools.ebnf.RuleReference; |
---|
26 | import de.ugoe.cs.swe.bnftools.ebnf.impl.EbnfPackageImpl; |
---|
27 | import resource.tools.xtools.ResourceTool; |
---|
28 | |
---|
29 | public class EbnfResourceTool extends ResourceTool { |
---|
30 | |
---|
31 | public EbnfResourceTool(){ |
---|
32 | super(); |
---|
33 | log = LoggerFactory.getLogger(EbnfResourceTool.class); |
---|
34 | EbnfPackageImpl.init(); |
---|
35 | initializeValidator(); |
---|
36 | injector = new EbnfStandaloneSetup().createInjectorAndDoEMFRegistration(); |
---|
37 | } |
---|
38 | |
---|
39 | @Override |
---|
40 | protected void initializeValidator(){ |
---|
41 | super.initializeValidator(); |
---|
42 | EObjectValidator validator = new EObjectValidator(); |
---|
43 | EValidator.Registry.INSTANCE.put(EbnfPackage.eINSTANCE, validator); |
---|
44 | } |
---|
45 | |
---|
46 | public void processFile(File xtextFile) { |
---|
47 | |
---|
48 | //TODO: extract as configuration |
---|
49 | String extension = "bnf"; |
---|
50 | String workspace = xtextFile.getParentFile().getAbsolutePath(); |
---|
51 | String xTextLocation = xtextFile.getAbsolutePath(); |
---|
52 | String outputPath = xtextFile.getAbsolutePath()+".ebnf"; |
---|
53 | String outputPathValidated = xtextFile.getAbsolutePath()+".ebnf"; |
---|
54 | |
---|
55 | Resource resource = loadResourceFromXtext(workspace,xTextLocation,true); |
---|
56 | findReferences(resource); |
---|
57 | storeResourceContents(resource.getContents(), outputPath, extension); |
---|
58 | Resource fromXMI = loadResourceFromXMI(outputPath, extension); |
---|
59 | // validateResource(fromXMI); |
---|
60 | storeResourceContents(fromXMI.getContents(), outputPathValidated, extension); |
---|
61 | } |
---|
62 | |
---|
63 | private void findReferences(Resource resource) { |
---|
64 | //custom reference finding, specific for BNF rule references |
---|
65 | //could be generalized for any references at the Ecore level |
---|
66 | //but maybe it is fully sufficient |
---|
67 | EtsiBnf bnf = (EtsiBnf) resource.getContents().get(0); |
---|
68 | |
---|
69 | //first approach |
---|
70 | System.out.println("first approach (top down)"); |
---|
71 | List<Rule> rules = EcoreUtil2.getAllContentsOfType(bnf, Rule.class); |
---|
72 | for (Rule r : rules) { |
---|
73 | System.out.println("Processing rule "+r.getName()); |
---|
74 | for (RuleReference ref : EcoreUtil2.getAllContentsOfType(r, RuleReference.class)) { |
---|
75 | EcoreUtil2.getContainerOfType(ref, Rule.class); |
---|
76 | System.out.println(" " + r.getName() + " references " + ref.getRuleref().getName()); |
---|
77 | System.out.println(" -> reference index shall contain \"" + ref.getRuleref().getName() + " referenced in " + r.getName() + "\""); |
---|
78 | |
---|
79 | } |
---|
80 | } |
---|
81 | |
---|
82 | //second approach |
---|
83 | System.out.println("second approach (bottom up)"); |
---|
84 | for (RuleReference ref : EcoreUtil2.getAllContentsOfType(bnf, RuleReference.class)) { |
---|
85 | Rule r = EcoreUtil2.getContainerOfType(ref, Rule.class); |
---|
86 | System.out.println("" + r.getName() + " references " + ref.getRuleref().getName()); |
---|
87 | System.out.println(" -> reference index shall contain \"" + ref.getRuleref().getName() + " referenced in " + r.getName() + "\""); |
---|
88 | |
---|
89 | } |
---|
90 | |
---|
91 | //third approach |
---|
92 | System.out.println("thir approach (cross referencing)"); |
---|
93 | for (Rule r : rules) { |
---|
94 | System.out.println("Processing rule "+r.getName()); |
---|
95 | for (Setting s : EcoreUtil.UsageCrossReferencer.find(r, bnf)) { |
---|
96 | RuleReference ref = (RuleReference) s.getEObject(); |
---|
97 | Rule referencingRule = EcoreUtil2.getContainerOfType(ref, Rule.class); |
---|
98 | System.out.println("" + referencingRule.getName() + " references " + r.getName()); |
---|
99 | System.out.println(" -> reference index shall contain \"" + r.getName() + " referenced in " + referencingRule.getName() + "\""); |
---|
100 | } |
---|
101 | } |
---|
102 | |
---|
103 | |
---|
104 | } |
---|
105 | |
---|
106 | public void process(String workspace) { |
---|
107 | |
---|
108 | //TODO: extract as configuration |
---|
109 | String extension = "tplan2x"; |
---|
110 | String xTextLocation = workspace+"/model."+extension; |
---|
111 | String outputPath = workspace+"/model.tplan2"; |
---|
112 | String outputPathValidated = workspace+"/model.tplan2"; |
---|
113 | |
---|
114 | Resource resource = loadResourceFromXtext(workspace,xTextLocation,true); |
---|
115 | storeResourceContents(resource.getContents(), outputPath, extension); |
---|
116 | Resource fromXMI = loadResourceFromXMI(outputPath, extension); |
---|
117 | // validateResource(fromXMI); |
---|
118 | storeResourceContents(fromXMI.getContents(), outputPathValidated, extension); |
---|
119 | } |
---|
120 | |
---|
121 | } |
---|