/******************************************************************************* * 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.extended.initializer; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFolder; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.emf.codegen.ecore.genmodel.GenModel; import org.eclipse.emf.codegen.ecore.genmodel.GenPackage; import org.eclipse.emf.common.util.TreeIterator; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EPackage; 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.eef.EEFGen.EEFGenFactory; import org.eclipse.emf.eef.EEFGen.EEFGenModel; import org.eclipse.emf.eef.EEFGen.GenEditionContext; import org.eclipse.emf.eef.EEFGen.GenViewsRepository; import org.eclipse.emf.eef.codegen.core.initializer.AbstractPropertiesInitializer; import org.eclipse.emf.eef.codegen.core.util.EMFHelper; import org.eclipse.emf.eef.codegen.flow.util.GenmodelHelper; import org.eclipse.emf.eef.components.PropertiesEditionContext; import org.eclipse.emf.eef.views.ViewsRepository; /** * @author <a href="mailto:goulwen.lefur@obeo.fr">Goulwen Le Fur</a> * */ public class EEFEditorModelInitializer extends AbstractPropertiesInitializer { /** * {@inheritDoc} * @see org.eclipse.emf.eef.codegen.core.initializer.IPropertiesInitializer#initialize(org.eclipse.emf.common.util.URI, org.eclipse.core.resources.IContainer) */ public void initialize(URI modelURI, IContainer targetFolder) throws IOException, CoreException { ResourceSet resourceSet = new ResourceSetImpl(); registerResourceFactories(resourceSet); registerPackages(resourceSet); EObject model = EMFHelper.load(modelURI, resourceSet); if (!targetFolder.exists()) { if (targetFolder instanceof IFolder) ((IFolder)targetFolder).create(true, true, new NullProgressMonitor()); else return; } EEFPagesTransformer pagesTransformer = new EEFPagesTransformer(); TreeIterator<EObject> allContents = model.eAllContents(); Map<ViewsRepository, String> repositories = new HashMap<ViewsRepository, String>(); List<PropertiesEditionContext> contexts = new ArrayList<PropertiesEditionContext>(); while (allContents.hasNext()) { EObject next = allContents.next(); if (next instanceof GenPackage) { GenPackage genPack = (GenPackage)next; if (genPack.eContents().size() >= 1) { ViewsRepository repository = pagesTransformer.genPackage2ViewsRepository(genPack); String completePackage = genPack.getBasePackage(); if (completePackage != null && completePackage.length() > 0) { completePackage += "." + ecoreStringHierarchy(genPack); } else { completePackage = ecoreStringHierarchy(genPack); } repositories.put(repository, completePackage); EEFEditorContributionTransformer contributionTransformer = new EEFEditorContributionTransformer(pagesTransformer.getWorkingResolvTemp()); PropertiesEditionContext context = contributionTransformer.genPackage2Context(genPack); contexts.add(context); } } } URI contributionsModelUri = GenmodelHelper.computeEditorComponentsModelURI(targetFolder, model.eResource().getURI()); Resource contributionsResource = model.eResource().getResourceSet().createResource(contributionsModelUri); for (PropertiesEditionContext context : contexts) contributionsResource.getContents().add(context); for (ViewsRepository repository : repositories.keySet()) contributionsResource.getContents().add(repository); EEFGenModel eefGenModel = createEEFGenModel((GenModel) model, repositories, contexts, targetFolder); contributionsResource.save(Collections.EMPTY_MAP); URI eefgenModelUri = GenmodelHelper.computeEditorEEFGenModelURI(targetFolder, model.eResource().getURI()); Resource eefgenResource = model.eResource().getResourceSet().createResource(eefgenModelUri); eefgenResource.getContents().add(eefGenModel); eefgenResource.save(Collections.EMPTY_MAP); return; } public String ecoreStringHierarchy(GenPackage genPack) { String result = ""; List<EPackage> ecorePackageHierarchy = ecorePackageHierarchy(genPack); for (int i = ecorePackageHierarchy.size() - 1; i >= 0; i--) { EPackage next = ecorePackageHierarchy.get(i); result += next.getName(); if (i > 0) result += "."; } return genPack.getEcorePackage().getName(); } public List<EPackage> ecorePackageHierarchy(GenPackage genPack) { List<EPackage> hierarchy = new ArrayList<EPackage>(); EObject current = genPack.getEcorePackage(); while (current instanceof EPackage) { hierarchy.add((EPackage) current); current = current.eContainer(); } return hierarchy; } private EEFGenModel createEEFGenModel(GenModel inputGenmodel, Map<ViewsRepository, String> repositories, List<PropertiesEditionContext> contexts, IContainer targetFolder) { EEFGenModel eefGenModel = EEFGenFactory.eINSTANCE.createEEFGenModel(); eefGenModel.setGenDirectory(findGenDirectory(inputGenmodel)); for (PropertiesEditionContext context : contexts) eefGenModel.getEditionContexts().add(createGenEditionContext(context)); String contextPackage = ""; if (contexts.size() > 0) { String findBasePackage = findBasePackage(contexts.get(0).getModel()); if (findBasePackage != null && !findBasePackage.equals("")) { contextPackage = findBasePackage + "."; } contextPackage = contextPackage + contexts.get(0).getModel().getEcorePackage().getName().toLowerCase(); } for (ViewsRepository repository : repositories.keySet()) eefGenModel.getViewsRepositories().add(createGenViewsRepository(repository, repositories.get(repository))); return eefGenModel; } private GenEditionContext createGenEditionContext(PropertiesEditionContext context) { GenEditionContext genEditionContext = EEFGenFactory.eINSTANCE.createGenEditionContext(); genEditionContext.setPropertiesEditionContext(context); if (context.getModel() != null) genEditionContext.setBasePackage(findBasePackage(context.getModel())); genEditionContext.setDescriptorsGenericPropertiesViews(true); return genEditionContext; } private GenViewsRepository createGenViewsRepository(ViewsRepository repository, String contextPackage) { GenViewsRepository genViewsRepository = EEFGenFactory.eINSTANCE.createGenViewsRepository(); genViewsRepository.setViewsRepository(repository); genViewsRepository.setBasePackage(contextPackage); genViewsRepository.setSwtViews(true); genViewsRepository.setFormViews(true); return genViewsRepository; } private String findBasePackage(GenPackage genPackage) { if (genPackage.getBasePackage() != null) return genPackage.getBasePackage(); return ""; } private String findGenDirectory(GenModel genmodel) { return genmodel.getEditorDirectory(); } }