/** * <copyright> * * Copyright (c) 2011 Christian Kerl * 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: * Christian Kerl - Initial API and implementation * * </copyright> */ package org.eclipselab.emf.ecore.protobuf.internal.mapping; import java.util.Arrays; import java.util.HashSet; import java.util.Set; import org.eclipse.emf.ecore.EClassifier; import org.eclipse.emf.ecore.EDataType; import org.eclipse.emf.ecore.EcorePackage; import org.eclipselab.emf.ecore.protobuf.mapping.BasicEClassifierMapperImpl; import org.eclipselab.emf.ecore.protobuf.mapping.EClassifierMapper; import org.eclipselab.emf.ecore.protobuf.mapping.MappingException; import com.google.protobuf.DescriptorProtos.FieldDescriptorProto; import com.google.protobuf.DescriptorProtos.FileDescriptorProto.Builder; /** * EcoreEDataTypeMapperImpl provides an {@link EClassifierMapper} implementation for * mapping {@link EDataType}s defined in {@link EcorePackage} to their {@link FieldDescriptorProto.Type} * representation. * * @author Christian Kerl */ public class EcoreEDataTypeMapperImpl extends BasicEClassifierMapperImpl<EDataType> { private Set<Integer> supportedEClassifierIds = new HashSet<Integer>(Arrays.asList( EcorePackage.EBOOLEAN, EcorePackage.EBOOLEAN_OBJECT, EcorePackage.ECHAR, EcorePackage.ECHARACTER_OBJECT, EcorePackage.EBYTE, EcorePackage.EBYTE_OBJECT, EcorePackage.ESHORT, EcorePackage.ESHORT_OBJECT, EcorePackage.EINT, EcorePackage.EINTEGER_OBJECT, EcorePackage.ELONG, EcorePackage.ELONG_OBJECT, EcorePackage.EFLOAT, EcorePackage.EFLOAT_OBJECT, EcorePackage.EDOUBLE, EcorePackage.EDOUBLE_OBJECT, EcorePackage.EBYTE_ARRAY, EcorePackage.ESTRING, EcorePackage.EDATE )); @Override public boolean supports(EClassifier eClassifier) { return eClassifier instanceof EDataType && EcorePackage.eINSTANCE == eClassifier.getEPackage() && supportedEClassifierIds.contains(eClassifier.getClassifierID()); } @Override protected void doMap(EDataType eDataType, Builder context) { } @Override protected void doMapReference(EDataType eDataType, FieldDescriptorProto.Builder pbField) { switch (eDataType.getClassifierID()) { case EcorePackage.EBOOLEAN: case EcorePackage.EBOOLEAN_OBJECT: pbField.setType(FieldDescriptorProto.Type.TYPE_BOOL); break; case EcorePackage.ECHAR: case EcorePackage.ECHARACTER_OBJECT: case EcorePackage.EBYTE: case EcorePackage.EBYTE_OBJECT: case EcorePackage.ESHORT: case EcorePackage.ESHORT_OBJECT: case EcorePackage.EINT: case EcorePackage.EINTEGER_OBJECT: pbField.setType(FieldDescriptorProto.Type.TYPE_SINT32); break; case EcorePackage.ELONG: case EcorePackage.ELONG_OBJECT: pbField.setType(FieldDescriptorProto.Type.TYPE_SINT64); break; case EcorePackage.EFLOAT: case EcorePackage.EFLOAT_OBJECT: pbField.setType(FieldDescriptorProto.Type.TYPE_FLOAT); break; case EcorePackage.EDOUBLE: case EcorePackage.EDOUBLE_OBJECT: pbField.setType(FieldDescriptorProto.Type.TYPE_DOUBLE); break; case EcorePackage.EBYTE_ARRAY: pbField.setType(FieldDescriptorProto.Type.TYPE_BYTES); break; case EcorePackage.ESTRING: pbField.setType(FieldDescriptorProto.Type.TYPE_STRING); break; case EcorePackage.EDATE: pbField.setType(FieldDescriptorProto.Type.TYPE_INT64); break; default: throw MappingException.causeMissingMapper(eDataType); } } }