Skip to content

Instantly share code, notes, and snippets.

@pvlasov
Created November 14, 2016 01:34
Show Gist options
  • Save pvlasov/12865f92535de195e25ad2207a21e098 to your computer and use it in GitHub Desktop.
Save pvlasov/12865f92535de195e25ad2207a21e098 to your computer and use it in GitHub Desktop.
Shows how use JMerger to merge generated and hand-crafted code
// --- Imports ---
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.IWorkspaceRunnable;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.emf.codegen.ecore.generator.GeneratorAdapterFactory;
import org.eclipse.emf.codegen.ecore.genmodel.GenModel;
import org.eclipse.emf.codegen.ecore.genmodel.GenModelFactory;
import org.eclipse.emf.codegen.ecore.genmodel.generator.GenModelGeneratorAdapterFactory;
import org.eclipse.emf.codegen.merge.java.JControlModel;
import org.eclipse.emf.codegen.merge.java.JMerger;
import org.eclipse.emf.codegen.merge.java.JPatternDictionary;
import org.eclipse.emf.codegen.merge.java.facade.JCompilationUnit;
import org.eclipse.emf.codegen.merge.java.facade.ast.ASTFacadeHelper;
import org.eclipse.emf.codegen.util.CodeGenUtil;
import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EOperation;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.JavaModelException;
// --- Code ---
IPackageFragment pkg = ...;
ICompilationUnit compilationUnit = pkg.getCompilationUnit(...);
String compilationUnitContent = ...;
if (compilationUnit.exists()) {
IWorkspaceRunnable mergeRunnable = new IWorkspaceRunnable() {
@Override
public void run(IProgressMonitor monitor) throws CoreException {
ICompilationUnit workingCopy = compilationUnit.getWorkingCopy(monitor);
try {
JControlModel controlModel = new JControlModel();
GenModel genModel = GenModelFactory.eINSTANCE.createGenModel();
// create adapter factory
GeneratorAdapterFactory adapterFactory = GenModelGeneratorAdapterFactory.DESCRIPTOR.createAdapterFactory();
adapterFactory.setGenerator(new org.eclipse.emf.codegen.ecore.generator.Generator());
adapterFactory.initialize(genModel);
// get merge rules URI
String mergeRulesURI = adapterFactory.getGenerator().getOptions().mergeRulesURI;
controlModel.initialize(CodeGenUtil.instantiateFacadeHelper(ASTFacadeHelper.class.getCanonicalName()), mergeRulesURI);
JMerger jMerger = new JMerger(controlModel);
JCompilationUnit scu = jMerger.createCompilationUnitForContents(compilationUnitContent.toString());
jMerger.setSourceCompilationUnit(scu);
JCompilationUnit tcu = jMerger.createCompilationUnitForContents(workingCopy.getSource());
jMerger.setTargetCompilationUnit(tcu);
jMerger.merge();
String newContent = jMerger.getTargetCompilationUnitContents();
if (!workingCopy.getSource().equals(newContent)) {
workingCopy.getBuffer().setContents(newContent);
workingCopy.commitWorkingCopy(false, monitor);
}
} finally {
workingCopy.discardWorkingCopy();
}
}
};
ResourcesPlugin.getWorkspace().run(
mergeRunnable,
ResourcesPlugin.getWorkspace().getRoot(),
IWorkspace.AVOID_UPDATE,
monitor);
} else {
pkg.createCompilationUnit(..., compilationUnitContent, false, monitor);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment