/*******************************************************************************
* 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.core.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.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.NullProgressMonitor;
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.util.EMFHelper;
import org.eclipse.emf.eef.codegen.flow.util.GenmodelHelper;
import org.eclipse.emf.eef.components.PropertiesEditionContext;
import org.eclipse.emf.eef.views.View;
import org.eclipse.emf.eef.views.ViewsFactory;
import org.eclipse.emf.eef.views.ViewsRepository;
/**
* @author <a href="mailto:goulwen.lefur@obeo.fr">Goulwen Le Fur</a>
*/
public class PropertiesInitializer extends AbstractPropertiesInitializer {
private static final String SWT_TOOLKIT_NAME = "SWT";
private static final String EMF_PROPERTIES_TOOLKIT_NAME = "EMFProperties";
private static String swt_pathmap = null;
private static String emfproperties_pathmap = null;
private static String findToolkitPath(EObject view, String str) {
String res = "platform:/plugin/org.eclipse.emf.eef.views/std/" + str + ".toolkits";
return res;
}
public static String getSWTPathmap(EObject view) {
if (swt_pathmap == null) {
swt_pathmap = findToolkitPath(view, SWT_TOOLKIT_NAME);
}
return swt_pathmap;
}
public static String getEMFPropertiesPathmap(EObject view) {
if (emfproperties_pathmap == null) {
emfproperties_pathmap = findToolkitPath(view, EMF_PROPERTIES_TOOLKIT_NAME);
}
return emfproperties_pathmap;
}
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;
}
Map<String, EObject> toolkits = new HashMap<String, EObject>();
View instanceView = ViewsFactory.eINSTANCE.createView();
toolkits.put(SWT_TOOLKIT_NAME, EMFHelper.load(URI.createURI(getSWTPathmap(instanceView), false), model.eResource().getResourceSet()));
toolkits.put(EMF_PROPERTIES_TOOLKIT_NAME, EMFHelper.load(URI.createURI(getEMFPropertiesPathmap(instanceView), false), model.eResource().getResourceSet()));
ViewTransformer viewTransformer = new ViewTransformer(toolkits);
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.getGenClassifiers().size() >= 1) {
ViewsRepository repository = viewTransformer.genPackage2ViewsRepository(genPack, SWT_TOOLKIT_NAME);
String completePackage = genPack.getBasePackage();
if (completePackage != null && completePackage.length() > 0) {
completePackage += "." + ecoreStringHierarchy(genPack);
} else {
completePackage = ecoreStringHierarchy(genPack);
}
repositories.put(repository, completePackage);
ComponentTransformer componentTransformer = new ComponentTransformer(viewTransformer.getWorkingResolvTemp());
PropertiesEditionContext context = componentTransformer.genPackage2Context(genPack);
contexts.add(context);
}
}
}
URI componentsModelUri = GenmodelHelper.computePropertiesComponentsModelURI(targetFolder, model.eResource().getURI());
Resource componentsResource = model.eResource().getResourceSet().createResource(componentsModelUri);
for (PropertiesEditionContext context : contexts)
componentsResource.getContents().add(context);
for (ViewsRepository repository : repositories.keySet())
componentsResource.getContents().add(repository);
componentsResource.save(Collections.EMPTY_MAP);
EEFGenModel eefGenModel = createEEFGenModel(repositories, contexts, targetFolder);
URI eefgenModelUri = GenmodelHelper.computePropertiesEEFGenModelURI(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(Map<ViewsRepository, String> repositories, List<PropertiesEditionContext> contexts, IContainer targetFolder) {
EEFGenModel eefGenModel = EEFGenFactory.eINSTANCE.createEEFGenModel();
eefGenModel.setGenDirectory(findGenDirectory(targetFolder));
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(IContainer targetFolder) {
IProject project;
if (targetFolder instanceof IFolder) {
project = targetFolder.getProject();
} else {
project = (IProject) targetFolder;
}
return project.getFullPath().toString() + "/src-gen";
}
}