Skip to content

Commit 5ca1c41

Browse files
committed
Fix menu 'Create Domain Model Project': Try to update content of the opened editor before modifing the Melange file
1 parent b7a785b commit 5ca1c41

File tree

2 files changed

+128
-55
lines changed

2 files changed

+128
-55
lines changed

framework/xdsml_framework/plugins/org.gemoc.xdsmlframework.ide.ui/src/org/gemoc/xdsmlframework/ide/ui/xdsml/wizards/CreateDomainModelWizardContextAction.java

Lines changed: 26 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,9 @@
11
package org.gemoc.xdsmlframework.ide.ui.xdsml.wizards;
22

3-
import java.io.IOException;
4-
import java.util.Map;
5-
63
import org.eclipse.core.resources.IFile;
74
import org.eclipse.core.resources.IProject;
8-
import org.eclipse.core.resources.IResource;
95
import org.eclipse.core.resources.ResourcesPlugin;
106
import org.eclipse.core.runtime.CoreException;
11-
import org.eclipse.core.runtime.NullProgressMonitor;
12-
import org.eclipse.core.runtime.Path;
13-
import org.eclipse.emf.common.util.URI;
14-
import org.eclipse.emf.ecore.resource.Resource;
15-
import org.eclipse.emf.ecore.resource.ResourceSet;
16-
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
17-
import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl;
187
import org.eclipse.emf.ecoretools.design.wizard.EcoreModelerWizard;
198
import org.eclipse.jface.viewers.IStructuredSelection;
209
import org.eclipse.jface.wizard.IWizard;
@@ -30,6 +19,8 @@
3019
import org.gemoc.xdsmlframework.ide.ui.Activator;
3120
import org.gemoc.xdsmlframework.ui.utils.dialogs.SelectEMFIProjectDialog;
3221

22+
import fr.inria.diverse.commons.eclipse.pde.manifest.ManifestChanger;
23+
3324
/**
3425
* This class is both a context for the wizard and a Command that will be
3526
* executed
@@ -49,6 +40,7 @@ public enum CreateDomainModelAction {
4940
// directly in the model
5041
protected IProject gemocLanguageIProject = null;
5142
protected LanguageDefinition gemocLanguageModel = null;
43+
private IProject createdProject = null;
5244

5345
public CreateDomainModelWizardContextAction(
5446
IProject updatedGemocLanguageProject) {
@@ -115,7 +107,7 @@ protected void createNewEMFProject() {
115107
if (res == WizardDialog.OK) {
116108
ResourcesPlugin.getWorkspace()
117109
.removeResourceChangeListener(workspaceListener);
118-
IProject createdProject = workspaceListener
110+
createdProject = workspaceListener
119111
.getLastCreatedProject();
120112
// update the project configuration model
121113
if (createdProject != null) {
@@ -154,37 +146,12 @@ protected void addEMFProjectToConf(IProject emfProject) {
154146

155147
protected void addEMFProjectToConf(IProject emfProject,
156148
IProject gemocProject) {
157-
IFile configFile = gemocProject.getFile(new Path(
158-
Activator.GEMOC_PROJECT_CONFIGURATION_FILE));
159-
if (configFile.exists()) {
160-
Resource.Factory.Registry reg = Resource.Factory.Registry.INSTANCE;
161-
Map<String, Object> m = reg.getExtensionToFactoryMap();
162-
m.put(Activator.GEMOC_PROJECT_CONFIGURATION_FILE_EXTENSION,
163-
new XMIResourceFactoryImpl());
164-
165-
// Obtain a new resource set
166-
ResourceSet resSet = new ResourceSetImpl();
167-
168-
// get the resource
169-
Resource resource = resSet
170-
.getResource(URI.createURI(configFile.getLocationURI()
171-
.toString()), true);
172-
173-
LanguageDefinition gemocLanguageWorkbenchConfiguration = (LanguageDefinition) resource
174-
.getContents().get(0);
175-
addEMFProjectToConf(emfProject, gemocLanguageWorkbenchConfiguration);
176-
177-
try {
178-
resource.save(null);
179-
} catch (IOException e) {
180-
Activator.error(e.getMessage(), e);
181-
}
182-
}
149+
ManifestChanger manifestChanger = new ManifestChanger(gemocProject);
183150
try {
184-
configFile.refreshLocal(IResource.DEPTH_ZERO,
185-
new NullProgressMonitor());
186-
} catch (CoreException e) {
187-
Activator.error(e.getMessage(), e);
151+
manifestChanger.addPluginDependency(emfProject.getName());
152+
manifestChanger.commit();
153+
} catch (Exception e) {
154+
e.printStackTrace();
188155
}
189156
}
190157

@@ -211,5 +178,22 @@ protected void addEMFProjectToConf(IProject emfProject,
211178
Activator.error(e.getMessage(), e);
212179
}
213180
}
181+
182+
public String getCreatedEcoreUri(){
183+
if(createdProject != null){
184+
FileFinderVisitor ecoreProjectVisitor = new FileFinderVisitor(
185+
"ecore");
186+
try {
187+
createdProject.accept(ecoreProjectVisitor);
188+
IFile ecoreIFile = ecoreProjectVisitor.getFile();
189+
if (ecoreIFile != null) {
190+
return "platform:/resource"+ecoreIFile.getFullPath().toString();
191+
}
192+
} catch (CoreException e) {
193+
Activator.error(e.getMessage(), e);
194+
}
195+
}
196+
return "";
197+
}
214198

215199
}
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,124 @@
11
package org.gemoc.execution.sequential.javaxdsml.ide.ui.commands;
22

3+
import java.io.IOException;
4+
import java.nio.file.Files;
5+
import java.nio.file.Paths;
6+
import java.util.List;
7+
38
import org.eclipse.core.commands.ExecutionEvent;
49
import org.eclipse.core.commands.ExecutionException;
510
import org.eclipse.core.commands.IHandler;
611
import org.eclipse.core.resources.IProject;
7-
import org.gemoc.xdsmlframework.ide.ui.commands.AbstractGemocLanguageProjectHandler;
12+
import org.eclipse.core.resources.ResourcesPlugin;
13+
import org.eclipse.core.runtime.OperationCanceledException;
14+
import org.eclipse.core.runtime.jobs.Job;
15+
import org.eclipse.emf.common.util.URI;
16+
import org.eclipse.emf.ecore.EStructuralFeature;
17+
import org.eclipse.xtext.nodemodel.INode;
18+
import org.eclipse.xtext.nodemodel.util.NodeModelUtils;
19+
import org.eclipse.xtext.resource.XtextResource;
20+
import org.eclipse.xtext.ui.editor.XtextEditor;
21+
import org.eclipse.xtext.ui.editor.model.IXtextDocument;
22+
import org.eclipse.xtext.ui.editor.utils.EditorUtils;
23+
import org.gemoc.xdsmlframework.ide.ui.commands.AbstractMelangeSelectHandler;
824
import org.gemoc.xdsmlframework.ide.ui.xdsml.wizards.CreateDomainModelWizardContextAction;
925
import org.gemoc.xdsmlframework.ide.ui.xdsml.wizards.CreateDomainModelWizardContextAction.CreateDomainModelAction;
1026
//import org.eclipse.jface.dialogs.MessageDialog;
1127

12-
public class CreateDomainModelProjectHandler extends AbstractGemocLanguageProjectHandler implements
28+
import fr.inria.diverse.melange.metamodel.melange.Language;
29+
30+
public class CreateDomainModelProjectHandler extends AbstractMelangeSelectHandler implements
1331
IHandler {
1432

1533
@Override
16-
public Object execute(ExecutionEvent event) throws ExecutionException {
17-
18-
// get the optional selection and eventually project data to preset the wizard
19-
IProject updatedGemocLanguageProject = getUpdatedGemocLanguageProjectFromSelection(event);
20-
21-
// launch the wizard that will select the action and do the job
22-
//WizardDialog wizardDialog = new WizardDialog(HandlerUtil.getActiveWorkbenchWindow(event).getShell(),
23-
// new CreateDomainModelWizard(updatedGemocLanguageProject));
24-
//wizardDialog.open();
25-
26-
// FIXME if the selection is a melange file we should precise which language must be updated
34+
public Object executeForSelectedLanguage(ExecutionEvent event,
35+
IProject updatedGemocLanguageProject, Language language)
36+
throws ExecutionException {
2737
CreateDomainModelWizardContextAction action = new CreateDomainModelWizardContextAction(
2838
updatedGemocLanguageProject, null);
2939
action.actionToExecute = CreateDomainModelAction.CREATE_NEW_EMF_PROJECT;
3040
action.execute();
3141

42+
if(action.getCreatedEcoreUri() != null){
43+
waitForAutoBuild();
44+
updateMelange(event,language,action.getCreatedEcoreUri());
45+
}
46+
3247
return null;
3348
}
49+
50+
protected void updateMelange(ExecutionEvent event, Language language, String ecoreURI){
51+
// Compute offset & new string
52+
int startOffset = -1;
53+
int length = -1;
54+
String newRegion = null;
55+
56+
EStructuralFeature operators = language.eClass().getEStructuralFeature("operators");
57+
List<INode> nodesOp = NodeModelUtils.findNodesForFeature(language, operators);
58+
int lastOffset = Integer.MAX_VALUE;
59+
for(INode node : nodesOp){
60+
if(node.getOffset() < lastOffset) lastOffset = node.getOffset();
61+
}
62+
if(lastOffset != Integer.MAX_VALUE){
63+
startOffset = lastOffset;
64+
length = 0;
65+
newRegion = "syntax \""+ecoreURI+"\"\n\t";
66+
}
67+
68+
// Replace in document or Melange file
69+
if(startOffset != -1 && length != -1 && newRegion != null){
70+
int _startOffset = startOffset;
71+
int _length = length;
72+
String _newRegion = newRegion;
73+
XtextEditor editor = EditorUtils.getActiveXtextEditor();
74+
if (editor != null) { //Update the editor content
75+
IXtextDocument document = editor.getDocument();
76+
document.modify((XtextResource it) -> {
77+
document.replace(_startOffset,_length, _newRegion);
78+
return null; // no computed value
79+
});
80+
}
81+
else{ //Update the Melange file content
82+
83+
try {
84+
//Load Melange file
85+
String melangeWSLocation = language.eResource().getURI().toPlatformString(true);
86+
URI uri = language.eResource().getURI();
87+
String melangeLocation =ResourcesPlugin.getWorkspace().getRoot().getLocation().toOSString()+melangeWSLocation;
88+
List<String> lines = Files.readAllLines(Paths.get(melangeLocation));
89+
90+
StringBuffer newContent = new StringBuffer();
91+
lines.forEach(
92+
line -> newContent.append(line+"\n")
93+
);
94+
95+
newContent.replace(startOffset,startOffset+length, newRegion);
96+
97+
//Write new content
98+
Files.write(Paths.get(melangeLocation), newContent.toString().getBytes());
99+
} catch (IOException e) {
100+
e.printStackTrace();
101+
}
102+
}
103+
}
104+
}
105+
106+
protected void waitForAutoBuild() {
107+
boolean wasInterrupted = false;
108+
do {
109+
try {
110+
Job.getJobManager().join(ResourcesPlugin.FAMILY_AUTO_BUILD, null);
111+
wasInterrupted = false;
112+
} catch (OperationCanceledException e) {
113+
e.printStackTrace();
114+
} catch (InterruptedException e) {
115+
wasInterrupted = true;
116+
}
117+
} while (wasInterrupted);
118+
}
34119

120+
@Override
121+
public String getSelectionMessage() {
122+
return "Select Melange language that will be used to initialize the new Domain Model project";
123+
}
35124
}

0 commit comments

Comments
 (0)