/******************************************************************************* * Copyright (c) 2008, 2012 Obeo. * 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: * Obeo - initial API and implementation *******************************************************************************/ package org.eclipse.emf.eef.codegen.ui.generators.actions; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.eclipse.core.resources.IFile; import org.eclipse.core.runtime.Status; import org.eclipse.emf.common.util.Diagnostic; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.resource.ResourceSet; import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl; import org.eclipse.emf.ecore.util.Diagnostician; import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl; import org.eclipse.emf.eef.EEFGen.EEFGenModel; import org.eclipse.emf.eef.EEFGen.EEFGenModelReference; import org.eclipse.emf.eef.EEFGen.GenEditionContext; import org.eclipse.emf.eef.EEFGen.GenViewsRepository; import org.eclipse.emf.eef.codegen.EEFCodegenPlugin; /** * @author <a href="mailto:goulwen.lefur@obeo.fr">Goulwen Le Fur</a> */ public class GenerateEEFAction extends AbstractGenerateEEFAction { /** * Constructor for Action1. */ public GenerateEEFAction() { super(); } /** * {@inheritDoc} * * @see org.eclipse.emf.eef.codegen.ui.generators.actions.AbstractGenerateEEFAction#initEEFGenModel() */ protected List<EEFGenModel> initEEFGenModel() throws IOException { List<EEFGenModel> eefgenmodels = new ArrayList<EEFGenModel>(selectedFiles.size()); if (!selectedFiles.isEmpty()) { for (IFile selectedFile : selectedFiles) { ResourceSet resourceSet = new ResourceSetImpl(); URI modelURI = URI.createPlatformResourceURI(selectedFile.getFullPath().toString(), true); String fileExtension = modelURI.fileExtension(); if (fileExtension == null || fileExtension.length() == 0) { fileExtension = Resource.Factory.Registry.DEFAULT_EXTENSION; } final Resource.Factory.Registry registry = Resource.Factory.Registry.INSTANCE; final Object resourceFactory = registry.getExtensionToFactoryMap().get(fileExtension); if (resourceFactory != null) { resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap() .put(fileExtension, resourceFactory); } else { resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap() .put(fileExtension, new XMIResourceFactoryImpl()); } Resource res = resourceSet.createResource(modelURI); res.load(Collections.EMPTY_MAP); EcoreUtil.resolveAll(resourceSet); if (res.getContents().size() > 0) { EObject object = res.getContents().get(0); if (object instanceof EEFGenModel) { eefgenmodels.add((EEFGenModel)object); } } } } // validate eefgenmodels and components recursively return validateEEFGenmodels(eefgenmodels); } /** * @param eefgenmodels * @return * @since 2.0 */ private List<EEFGenModel> validateEEFGenmodels(List<EEFGenModel> eefgenmodels) { List<EEFGenModel> eefModels = new ArrayList<EEFGenModel>(eefgenmodels.size()); eefModels.addAll(eefgenmodels); for (EEFGenModel eefGenModel : eefgenmodels) { if (!validateOneEEFGenModel(eefGenModel)) eefModels.remove(eefGenModel); // validate also referenced EEFGenModels if (!validateReferencedEEFGenModels(eefGenModel)) eefModels.remove(eefGenModel); } return eefModels; } /** * @param eefGenModel */ private boolean validateReferencedEEFGenModels(EEFGenModel eefGenModel) { for (EEFGenModelReference eefGenModelReference : eefGenModel.getReferences()) { EEFGenModel referencedEEFGenModel = eefGenModelReference.getReferencedContext(); if (!validateOneEEFGenModel(referencedEEFGenModel)) return false; return validateReferencedEEFGenModels(referencedEEFGenModel); } return true; } /** * @param eefGenModel * @return * @since 2.0 */ private boolean validateOneEEFGenModel(EEFGenModel eefGenModel) { // validate eefgenmodels final Diagnostic diag = Diagnostician.INSTANCE.validate(eefGenModel); if (diag.getSeverity() != Diagnostic.OK) { Status status = new Status(diag.getSeverity(), EEFCodegenPlugin.PLUGIN_ID, "EEFGenmodel '" + eefGenModel.eResource().getURI() + "' contains errors."); EEFCodegenPlugin.getDefault().getLog().log(status); return false; } // validate PropertiesEditionContext for (GenEditionContext genEditionContext : eefGenModel.getEditionContexts()) { final Diagnostic diag2 = Diagnostician.INSTANCE.validate(genEditionContext .getPropertiesEditionContext()); if (diag2.getSeverity() != Diagnostic.OK) { Status status = new Status(diag2.getSeverity(), EEFCodegenPlugin.PLUGIN_ID, "PropertiesEditionContext '" + genEditionContext.getPropertiesEditionContext().eResource().getURI() + "' contains errors."); EEFCodegenPlugin.getDefault().getLog().log(status); return false; } } // validate ViewsRepository for (GenViewsRepository genViewsRepository : eefGenModel.getViewsRepositories()) { final Diagnostic diag2 = Diagnostician.INSTANCE.validate(genViewsRepository.getViewsRepository()); if (diag2.getSeverity() != Diagnostic.OK) { Status status = new Status(diag2.getSeverity(), EEFCodegenPlugin.PLUGIN_ID, "ViewsRepository '" + genViewsRepository.getViewsRepository().eResource().getURI() + "' contains errors."); EEFCodegenPlugin.getDefault().getLog().log(status); return false; } } return true; } }