/******************************************************************************* * 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.ecore.services.wrappers; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import org.eclipse.core.runtime.Path; import org.eclipse.emf.codegen.ecore.genmodel.GenClass; import org.eclipse.emf.codegen.ecore.genmodel.GenClass.ChildCreationData; import org.eclipse.emf.codegen.ecore.genmodel.GenEnum; import org.eclipse.emf.codegen.ecore.genmodel.GenFeature; import org.eclipse.emf.codegen.ecore.genmodel.GenModel; import org.eclipse.emf.codegen.ecore.genmodel.GenOperation; import org.eclipse.emf.codegen.ecore.genmodel.GenPackage; import org.eclipse.emf.codegen.ecore.genmodel.GenTypeParameter; import org.eclipse.emf.codegen.ecore.genmodel.generator.GenPackageGeneratorAdapter; import org.eclipse.emf.codegen.util.GIFEmitter; import org.eclipse.emf.common.util.Monitor; import org.eclipse.emf.eef.codegen.ecore.EMFCodegenPlugin; /** * @author <a href="mailto:stephane.bouchet@obeo.fr">Stephane Bouchet</a> */ public class GenPackageWrapper { public Set<?> getExtendedChildCreationDataEntrySet(GenPackage genPackage) { return genPackage.getExtendedChildCreationData().entrySet(); } public Set<?> getPackageEntryValueEntrySet(Object packageEntry) { Map<GenPackage, Map<GenClass, List<ChildCreationData>>> map = (Map<GenPackage, Map<GenClass, List<ChildCreationData>>>)((Map.Entry)packageEntry) .getValue(); return map.entrySet(); } /** * @since 1.1 */ public String getDefaultClassUniqueName(GenPackage genPackage) { return genPackage.getClassUniqueName(null); } public List<?> getClassEntryChildCreationData(Object classEntry) { if (classEntry instanceof Map.Entry<?, ?>) { return (List<?>)((Map.Entry)classEntry).getValue(); } return null; } public GenPackage getPackageEntryKey(Object packageEntry) { if (packageEntry instanceof Map.Entry<?, ?>) { return (GenPackage)((Map.Entry)packageEntry).getKey(); } return null; } public GenClass getClassEntryKey(Object classEntry) { if (classEntry instanceof Map.Entry<?, ?>) { return (GenClass)((Map.Entry)classEntry).getKey(); } return null; } /** * used to wrap icon creation. * * @see GenPackageGeneratorAdapter#generateCreateChildIcons(GenPackage, Monitor) * @param genPackage */ public void generateCreateChildIcons(GenPackage genPackage) { GenModel genModel = genPackage.getGenModel(); if (genModel.isCreationCommands() && genModel.isCreationIcons() && genPackage.isChildCreationExtenders()) { for (Map.Entry<GenPackage, Map<GenClass, List<GenClass.ChildCreationData>>> packageEntry : genPackage .getExtendedChildCreationData().entrySet()) { for (Map.Entry<GenClass, List<GenClass.ChildCreationData>> classEntry : packageEntry .getValue().entrySet()) { GenClass genClass = classEntry.getKey(); for (GenClass.ChildCreationData childCreationData : classEntry.getValue()) { if (childCreationData.createClassifier instanceof GenClass && (childCreationData.delegatedFeature == null || classEntry.getKey() .getAllGenFeatures().contains(childCreationData.delegatedFeature))) { GenClass childClass = (GenClass)childCreationData.createClassifier; GenFeature feature = childCreationData.createFeature; String inputFile = getClass().getResource("/templates/edit/CreateChild.gif") .toString(); GIFEmitter gifEmitter = new GIFEmitter(inputFile); byte[] contents = gifEmitter .generateGIF(genClass.getName(), childClass.getName()); Path targetPath = new Path(genClass.getCreateChildIconFileName(genModel, feature, childClass)); EMFCodegenPlugin.getDefault().createGIF(contents, targetPath); } } } } } } /** * used to wrap icon creation. * * @see GenPackageGeneratorAdapter#generateModelIcon(GenPackage, Monitor) * @param genPackage */ public void generateModelIcon(GenPackage genPackage) { if (genPackage.hasConcreteClasses()) { String inputFile = getClass().getResource("/templates/editor/ModelFile.gif").toString(); GIFEmitter gifEmitter = new GIFEmitter(inputFile); byte[] contents = gifEmitter.generateGIF(genPackage.getPrefix(), null); Path targetPath = new Path(genPackage.getModelIconFileName()); EMFCodegenPlugin.getDefault().createGIF(contents, targetPath); } } /** * used to wrap icon creation. * * @see GenPackageGeneratorAdapter#generateModelWizardIcon(GenPackage, Monitor) * @param genPackage */ public void generateModelWizardIcon(GenPackage genPackage) { if (genPackage.hasConcreteClasses() && genPackage.isGenerateModelWizard()) { String inputFile = getClass().getResource("/templates/editor/NewModel.gif").toString(); GIFEmitter gifEmitter = new GIFEmitter(inputFile); byte[] contents = gifEmitter.generateGIF(genPackage.getPrefix(), null); Path targetPath = new Path(genPackage.getModelWizardIconFileName()); EMFCodegenPlugin.getDefault().createGIF(contents, targetPath); } } /** * Indicates whether the given GenPackage represents the XMLTypePackage. * * @param genPackage * @return * @since 1.1 */ public boolean isXMLTypePackage(GenPackage genPackage) { return org.eclipse.emf.ecore.xml.type.XMLTypePackage.eNS_URI.equals(genPackage.getNSURI()); } private boolean needsAddEOperation = false; private boolean needsAddEParameter = false; /** * @since 1.1 */ public void requireAddEOperation(GenPackage genPackage) { needsAddEOperation = true; } /** * @since 1.1 */ public void requireAddEParameter(GenPackage genPackage) { needsAddEParameter = true; } /** * @since 1.1 */ public boolean needsAddEOperation(GenPackage genPackage) { return needsAddEOperation; } /** * @since 1.1 */ public boolean needsAddEParameter(GenPackage genPackage) { return needsAddEParameter; } /** * Counter to reproduce the way EMF manages generic types. */ private int maxGenericTypeAssignment = 0; /** * @since 1.1 */ public void resetMaxGenericTypeAssignment() { maxGenericTypeAssignment = 0; } /** * @since 1.1 */ public String prefix(GenPackage genPackage, int depth) { String prefix = ""; if (maxGenericTypeAssignment <= depth) { ++maxGenericTypeAssignment; prefix = genPackage.getGenModel().getImportedName("org.eclipse.emf.ecore.EGenericType") + " "; } return prefix; } private boolean firstPrefix = true; /** * @since 1.1 */ public String prefix(GenOperation genOperation) { if (firstPrefix) { firstPrefix = false; return genOperation.getGenModel().getImportedName("org.eclipse.emf.ecore.EOperation") + " op = "; } return "op = "; } /** * @since 1.1 */ public void resetGenOperationPrefix() { firstPrefix = true; } /** * @since 1.1 */ public String typePrefix(GenPackage genPackage, int depth) { String typePrefix = ""; if (maxGenericTypeAssignment <= depth) { ++maxGenericTypeAssignment; typePrefix = genPackage.getGenModel().getImportedName("org.eclipse.emf.ecore.EGenericType") + " "; } return typePrefix; } /** * @since 1.1 */ public String computeSwitchGenericTypeName(GenPackage genPackage) { Set<String> usedNames = new HashSet<String>(); for (GenEnum genEnum : genPackage.getGenEnums()) { usedNames.add(genEnum.getName()); } for (GenClass genClass : genPackage.getAllSwitchGenClasses()) { if (!genClass.isDynamic() && !genClass.isExternalInterface()) { usedNames.add(genClass.getName()); } for (GenTypeParameter genTypeParameter : genClass.getGenTypeParameters()) { usedNames.add(genTypeParameter.getName()); } } String templateParameterName = "T"; for (int i = 1; usedNames.contains(templateParameterName); ++i) { templateParameterName = "T" + i; } return templateParameterName; } }