/**
* Copyright (c) 2005-2012 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM - Initial API and implementation
*/
package org.eclipse.emf.ecore.xcore.importer;
import java.util.List;
import org.eclipse.core.runtime.IPath;
import org.eclipse.emf.codegen.ecore.genmodel.GenModel;
import org.eclipse.emf.codegen.ecore.genmodel.GenModelPackage;
import org.eclipse.emf.codegen.ecore.genmodel.GenPackage;
import org.eclipse.emf.codegen.ecore.genmodel.GenRuntimePlatform;
import org.eclipse.emf.common.util.BasicDiagnostic;
import org.eclipse.emf.common.util.Diagnostic;
import org.eclipse.emf.common.util.DiagnosticException;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.common.util.Monitor;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.converter.ConverterPlugin;
import org.eclipse.emf.converter.util.ConverterUtil;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EcorePackage;
import org.eclipse.emf.ecore.plugin.EcorePlugin;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.ecore.xcore.XPackage;
import org.eclipse.emf.ecore.xcore.XcorePackage;
import org.eclipse.emf.ecore.xcore.generator.XcoreGenerator;
import org.eclipse.emf.importer.ModelImporter;
import org.eclipse.xtext.resource.XtextResourceSet;
import com.google.inject.Inject;
public class XcoreImporter extends ModelImporter
{
@Inject
protected XcoreGenerator xcoreGenerator;
protected ResourceSet resourceSet;
public XcoreImporter()
{
resourceSet = new XtextResourceSet();
resourceSet.getURIConverter().getURIMap().putAll(EcorePlugin.computePlatformURIMap(true));
}
@Override
public String getID()
{
return "org.eclipse.emf.ecore.xcore.importer";
}
@Override
protected Diagnostic doComputeEPackages(Monitor monitor) throws Exception
{
BasicDiagnostic basicDiagnostic = null;
List<URI> locationURIs = getModelLocationURIs();
if (locationURIs.isEmpty())
{
basicDiagnostic =
new BasicDiagnostic
(Diagnostic.ERROR,
ConverterPlugin.ID,
ConverterUtil.ACTION_DIALOG_NONE | ConverterUtil.ACTION_MESSAGE_SET_ERROR,
XcoreImporterPlugin.INSTANCE.getString("_UI_SpecifyAValidXcore_message"),
null);
}
else
{
resourceSet.getResources().clear();
monitor.beginTask("", 2);
monitor.subTask(XcoreImporterPlugin.INSTANCE.getString("_UI_Loading_message", new Object []{ locationURIs }));
for (URI locationURI : locationURIs)
{
Resource inputResource = resourceSet.getResource(locationURI, true);
EcoreUtil.resolveAll(resourceSet);
XPackage xPackage = (XPackage)EcoreUtil.getObjectByType(inputResource.getContents(), XcorePackage.Literals.XPACKAGE);
if (xPackage != null)
{
xcoreGenerator.generateBodyAnnotations(xPackage);
}
}
for (URI locationURI : locationURIs)
{
Resource inputResource = resourceSet.getResource(locationURI, false);
GenModel genModel = (GenModel)EcoreUtil.getObjectByType(inputResource.getContents(), GenModelPackage.Literals.GEN_MODEL);
if (genModel != null)
{
EPackage ePackage = (EPackage)EcoreUtil.getObjectByType(inputResource.getContents(), EcorePackage.Literals.EPACKAGE);
List<EPackage> ePackages = getEPackages();
if (ePackage != null)
{
inputResource.getContents().remove(ePackage);
ePackages.add(ePackage);
}
EList<GenPackage> usedGenPackages = genModel.getUsedGenPackages();
for (GenPackage usedGenPackage : usedGenPackages)
{
ePackages.add(usedGenPackage.getEcorePackage());
}
getReferencedGenPackages().addAll(usedGenPackages);
}
}
}
if (basicDiagnostic == null)
{
return Diagnostic.OK_INSTANCE;
}
else
{
return basicDiagnostic;
}
}
@Override
protected void adjustGenModel(Monitor monitor)
{
super.adjustGenModel(monitor);
IPath genModelFileFullPath = getGenModelPath();
URI genModelURI = createFileURI(genModelFileFullPath.toString());
for (URI uri : getModelLocationURIs())
{
getGenModel().getForeignModel().add(makeRelative(uri, genModelURI).toString());
}
}
@Override
protected void handleOriginalGenModel() throws DiagnosticException
{
URI genModelURI = getOriginalGenModel().eResource().getURI();
StringBuffer text = new StringBuffer();
for (String value : getOriginalGenModel().getForeignModel())
{
if (value.endsWith(".xcore"))
{
text.append(makeAbsolute(URI.createURI(value), genModelURI).toString());
text.append(" ");
}
}
setModelLocation(text.toString().trim());
}
@Override
public void prepareGenModelAndEPackages(Monitor monitor)
{
super.prepareGenModelAndEPackages(monitor);
// Make sure to pull in all the GenModel settings that were specified in the Xcore annotations.
//
GenModel oldOriginalGenModel = originalGenModel;
if (oldOriginalGenModel == null)
{
GenModel mainGenModel = getGenModel();
for (Resource xcoreResource : resourceSet.getResources())
{
GenModel genModel = (GenModel)EcoreUtil.getObjectByType(xcoreResource.getContents(), GenModelPackage.Literals.GEN_MODEL);
if (genModel != null && EcoreUtil.getObjectByType(xcoreResource.getContents(), EcorePackage.Literals.EPACKAGE) == null)
{
mainGenModel.reconcile(genModel);
}
}
GenRuntimePlatform runtimePlatform = mainGenModel.getRuntimePlatform();
originalGenModel = null;
adjustGenModel(monitor);
originalGenModel = oldOriginalGenModel;
mainGenModel.setRuntimePlatform(runtimePlatform);
}
}
}