blob: 251cab35e3da31155dbb4d698fb2dfe3439f6263 [file] [log] [blame]
package org.eclipse.stem.model.transform;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.SubMonitor;
import org.eclipse.emf.codegen.ecore.genmodel.GenModel;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.stem.model.metamodel.Package;
public class MetamodelRegenerateValidator
{
private Package metamodel;
private IFile metamodelFile;
public MetamodelRegenerateValidator(Package metamodel, IFile metamodelFile) {
this.metamodel = metamodel;
this.metamodelFile = metamodelFile;
}
private static URI getUriForPath(IPath path) {
return URI.createPlatformResourceURI(path.toString(), true);
}
private static void safeClose(Reader r) {
if (r == null) return;
try {
r.close();
} catch (Throwable t) { }
}
private String getGenModelFileAsString(IProgressMonitor monitor) throws CoreException, IOException
{
monitor.beginTask("Reading models", 1);
BufferedReader reader = null;
try {
IFile genModelFile = ResourcesPlugin.getWorkspace().getRoot().getFileForLocation(
metamodelFile.getLocation().removeFileExtension().addFileExtension("genmodel"));
if (genModelFile == null) {
return "";
}
reader = new BufferedReader(new InputStreamReader(genModelFile.getContents()));
StringBuilder builder = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
builder.append(line);
}
monitor.worked(1);
return builder.toString();
} finally {
safeClose(reader);
monitor.done();
}
}
private String getGenModelAsString(IProgressMonitor monitor) throws CoreException, IOException {
SubMonitor subMonitor = SubMonitor.convert(monitor,"Serializing models", 100);
try {
URI genModelUri = getUriForPath(getGenModelPath());
URI ecoreUri = getUriForPath(getEcorePath());
ModelGenerator generator = new ModelGenerator(metamodel);
generator.generateEcoreAndGenmodel(subMonitor.split(70));
GenModel genModel = generator.getGenModel();
EPackage ecore = generator.getEcore();
subMonitor.subTask("Creating Ecore Resource");
ResourceSet rs = generator.getResourceSet();
Resource ecoreResource = rs.createResource(ecoreUri);
ecoreResource.getContents().add(ecore);
subMonitor.worked(10);
subMonitor.subTask("Creating GenModel Resource");
Resource genModelResource = rs.createResource(genModelUri);
genModelResource.getContents().add(genModel);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
genModelResource.save(baos, null);
subMonitor.worked(20);
genModelResource.unload();
ecoreResource.unload();
return baos.toString();
} finally {
//monitor.done();
}
}
private IPath getMetamodelPath() {
return metamodelFile.getFullPath();
}
private IPath getGenModelPath() {
return getMetamodelPath().removeFileExtension().addFileExtension("genmodel");
}
private IPath getEcorePath() {
return getMetamodelPath().removeFileExtension().addFileExtension("ecore");
}
public boolean checkNeedRegeneration( IProgressMonitor monitor) throws IOException, CoreException
{
SubMonitor subMonitor = SubMonitor.convert(monitor, "Comparing Model Generator output", 50);
try {
String currentGenModel = getGenModelFileAsString(subMonitor.split(10));
String newGenModel = getGenModelAsString(subMonitor.split(40));
currentGenModel = currentGenModel.replaceAll("\\s","");
newGenModel = newGenModel.replaceAll("\\s","");
return (currentGenModel.compareTo(newGenModel) != 0);
} finally {
//monitor.done();
}
}
}