Loading plugins/org.etsi.mts.tdl.asn2tdl/src/org/etsi/mts/tdl/asn2tdl/ASN2TDLTranslator.java +69 −38 Original line number Diff line number Diff line Loading @@ -38,6 +38,7 @@ import com.beanit.asn1bean.compiler.model.AsnNull; import com.beanit.asn1bean.compiler.model.AsnObjectIdentifier; import com.beanit.asn1bean.compiler.model.AsnOctetString; import com.beanit.asn1bean.compiler.model.AsnParameter; import com.beanit.asn1bean.compiler.model.AsnSelectionType; import com.beanit.asn1bean.compiler.model.AsnSequenceOf; import com.beanit.asn1bean.compiler.model.AsnSequenceSet; import com.beanit.asn1bean.compiler.model.AsnTaggedType; Loading @@ -46,6 +47,12 @@ import com.beanit.asn1bean.compiler.parser.ASNLexer; import com.beanit.asn1bean.compiler.parser.ASNParser; public class ASN2TDLTranslator extends AbstractTranslator { public enum PASS { TYPES, PROPERTIES, SELECTION, MAPPINGS } public void translate(String filename) throws Exception { AsnModel model = getAsnModelFromAsn1File(filename); Loading @@ -70,14 +77,27 @@ public class ASN2TDLTranslator extends AbstractTranslator { private void translateTypes(AsnModule module) { if (module.typesByName!=null) { //First pass //First pass: types translateTypes(module, PASS.TYPES); //Second pass: properties translateTypes(module, PASS.PROPERTIES); //Third pass: selection translateTypes(module, PASS.SELECTION); //Fourth pass - data element mappings for (String e : module.typesByName.keySet()) { AsnType type = module.typesByName.get(e); System.out.println("Type: "+type.name); translateType(type, "", true); DataType dataType = getTypeFor(e, tdlPackage.Literals.DATA_TYPE); DataElementMapping mapping = getTypeFor(e+"_MAPPING", tdlPackage.Literals.DATA_ELEMENT_MAPPING); mapping.setMappableDataElement(dataType); mapping.setElementURI("\""+e+"\""); mapping.setDataResourceMapping(drm); } //Second pass } } private void translateTypes(AsnModule module, PASS pass) { System.out.println("PASS: "+pass.name()); for (String e : module.typesByName.keySet()) { AsnType type = module.typesByName.get(e); System.out.println(" Type: "+type.name); Loading @@ -87,38 +107,27 @@ public class ASN2TDLTranslator extends AbstractTranslator { System.out.println(" "+p.dummyReference+" : "+p.paramGovernor); } } translateType(type, "", false); } //Third pass for (String e : module.typesByName.keySet()) { DataType dataType = getTypeFor(e, tdlPackage.Literals.DATA_TYPE); DataElementMapping mapping = getTypeFor(e+"_MAPPING", tdlPackage.Literals.DATA_ELEMENT_MAPPING); mapping.setMappableDataElement(dataType); mapping.setElementURI("\""+e+"\""); mapping.setDataResourceMapping(drm); } translateType(type, "", pass); } } private DataType translateType(AsnType type, String prefix, boolean flat) { private DataType translateType(AsnType type, String prefix, PASS pass) { final DataType generatedType; if (type instanceof AsnSequenceSet) { generatedType = getStructuredDataTypeFor(type.name); if (!flat) { if (pass!=PASS.TYPES) { for (AsnElementType c : ((AsnSequenceSet) type).componentTypes) { translateMember((StructuredDataType)generatedType, c); translateMember((StructuredDataType)generatedType, c, pass); } } } else if (type instanceof AsnChoice) { generatedType = getStructuredDataTypeFor(type.name); if (!flat) { if (pass!=PASS.TYPES) { constrainWith(generatedType, "union"); annotateWith(generatedType, "CHOICE"); //annotateWith(generatedType, "CHOICE"); for (AsnElementType c : ((AsnChoice) type).componentTypes) { translateMember((StructuredDataType)generatedType, c); translateMember((StructuredDataType)generatedType, c, pass); } } } else if (type instanceof AsnSequenceOf) { Loading @@ -127,7 +136,7 @@ public class ASN2TDLTranslator extends AbstractTranslator { // Type TYPE___attribute___collection___item // Collection TYPE___attribute___collection of ...___item generatedType = getTypeFor(cleanName(type.name), tdlPackage.Literals.COLLECTION_DATA_TYPE); if (!flat) { if (pass!=PASS.TYPES) { AsnElementType componentType = ((AsnSequenceOf) type).componentType; String itemTypePrefix = ""; if (componentType.name.isEmpty() && Loading @@ -135,12 +144,12 @@ public class ASN2TDLTranslator extends AbstractTranslator { itemTypePrefix = generatedType.getName()+"___item"; //TODO: process internals } DataType itemType = translateType(componentType, itemTypePrefix, false); DataType itemType = translateType(componentType, itemTypePrefix, pass); ((CollectionDataType) generatedType).setItemType(itemType); System.out.println(" Flat collection: "+generatedType.getName() +" of " +itemType.getName()); } else { AsnElementType componentType = ((AsnSequenceOf) type).componentType; DataType itemType = translateType(componentType, "", false); DataType itemType = translateType(componentType, "", pass); ((CollectionDataType) generatedType).setItemType(itemType); System.out.println(" Extended collection: "+generatedType.getName() +" of " +itemType.getName()); } Loading @@ -166,14 +175,14 @@ public class ASN2TDLTranslator extends AbstractTranslator { eType.typeReference.name = prefix+eType.name; } generatedType = translateType(eType.typeReference, "", false); generatedType = translateType(eType.typeReference, "", pass); } else { //TODO: handle properly (usually due to "|" present in definition - not supported by parser) generatedType = getStructuredDataTypeFor(prefix+cleanName(type.name)); System.out.println(" Element type: "+type.name+" : " +type.getClass().getSimpleName()+" not supported yet"); } } else if (type instanceof AsnTaggedType) { generatedType = translateTagged(type, flat); generatedType = translateTagged(type, pass); } else if (type instanceof AsnDefinedType) { //TODO: handle somehow? generatedType = getSimpleDataTypeFor(type.name); Loading Loading @@ -222,6 +231,29 @@ public class ASN2TDLTranslator extends AbstractTranslator { if (!type.name.isEmpty()) { annotateWith(generatedType, type.getClass().getSimpleName()); } } else if (type instanceof AsnSelectionType) { //TODO: document handling, applicable to Choice only, also illustrate with example String typeName = type.name; String propertyName = ((AsnSelectionType) type).selectionID; if (pass==PASS.SELECTION) { if (((AsnSelectionType)type).type instanceof AsnDefinedType) { String selectionType = ((AsnDefinedType) ((AsnSelectionType)type).type).typeName; StructuredDataType dataType = getStructuredDataTypeFor(selectionType); Member selectedMember = findContentWithName(cleanName(propertyName), dataType, tdlPackage.Literals.MEMBER); if (selectedMember != null) { generatedType = selectedMember.getDataType(); } else { System.out.println(" Selection for "+propertyName+" in mapping for type: "+selectionType+" not found"); generatedType = getSimpleDataTypeFor(typeName); } } else { System.out.println(" Selection for "+type.name+" : " +((AsnSelectionType)type).type.getClass().getSimpleName()+" not supported yet"); generatedType = getSimpleDataTypeFor(typeName); } } else { System.out.println(" Skipping Selection for "+propertyName+"..."); generatedType = getSimpleDataTypeFor("Selection"); } } else { String typeName = type.name; if (typeName.isEmpty()) { Loading @@ -235,7 +267,7 @@ public class ASN2TDLTranslator extends AbstractTranslator { return generatedType; } private DataType translateTagged(AsnType type, boolean flat) { private DataType translateTagged(AsnType type, PASS pass) { final DataType generatedType; AsnTaggedType taggedType = ((AsnTaggedType) type); if (taggedType.typeReference!=null) { Loading @@ -243,7 +275,7 @@ public class ASN2TDLTranslator extends AbstractTranslator { //TODO: check if this is always the case taggedType.typeReference.name = taggedType.name; } generatedType = translateType(taggedType.typeReference, "", flat); generatedType = translateType(taggedType.typeReference, "", pass); annotateWith(generatedType, taggedType.tag.clazz); //TODO: handle tagged types } else { Loading @@ -253,11 +285,10 @@ public class ASN2TDLTranslator extends AbstractTranslator { return generatedType; } private void translateMember(StructuredDataType generatedType, AsnElementType c) { Member m = tdlFactory.eINSTANCE.createMember(); m.setName(cleanName(c.name)); private void translateMember(StructuredDataType generatedType, AsnElementType c, PASS pass) { Member m = getContentWithName(c.name, generatedType, tdlPackage.Literals.MEMBER); String prefix = generatedType.getName()+"___"; DataType dataType = translateType(c, prefix, false); DataType dataType = translateType(c, prefix, pass); m.setDataType(dataType); if (dataType.getName().isEmpty()) { if (generatedType.getName().isEmpty()) { Loading plugins/org.etsi.mts.tdl.common/src/org/etsi/mts/tdl/transform/AbstractTranslator.java +15 −1 Original line number Diff line number Diff line package org.etsi.mts.tdl.transform; import java.util.Optional; import java.util.TreeMap; import java.util.function.Predicate; import org.eclipse.emf.ecore.EClass; Loading Loading @@ -50,6 +51,10 @@ public abstract class AbstractTranslator { generatedPackage.getImport().add(sourceImport); } protected DataType getDataTypeFor(String name) { return getTypeFor(cleanName(name), tdlPackage.Literals.DATA_TYPE); } protected SimpleDataType getSimpleDataTypeFor(String name) { return getTypeFor(cleanName(name), tdlPackage.Literals.SIMPLE_DATA_TYPE); } Loading @@ -76,6 +81,15 @@ public abstract class AbstractTranslator { @SuppressWarnings("unchecked") protected <T extends PackageableElement> T getTypeFor(String name, EClass targetType) { String cleanName = cleanName(name); //TODO: move to ASN2TDL specialisation TreeMap<String, String> mappings = new TreeMap<>(); mappings.put("AsnInteger", "Integer"); mappings.put("AsnBoolean", "Boolean"); // mappings.put("AsnCharacterString", "String"); mappings.put("AsnOctetString", "OCTETSTRING"); mappings.put("AsnBitString", "BITSTRING"); mappings.put("AsnReal", "Real"); cleanName = mappings.getOrDefault(cleanName, cleanName); T generatedType = findElementOfType(cleanName, targetType); if (generatedType == null) { generatedType = (T) tdlFactory.eINSTANCE.create(targetType); Loading Loading @@ -117,7 +131,7 @@ public abstract class AbstractTranslator { @SuppressWarnings("unchecked") protected <T extends NamedElement> T getContentWithName(String name, NamedElement container, EClass targetType) { String cleanName = cleanName(name); T content = findContentWithName(name, container, targetType); T content = findContentWithName(cleanName, container, targetType); if (content == null) { content = (T) tdlFactory.eINSTANCE.create(targetType); content.setName(cleanName); Loading Loading
plugins/org.etsi.mts.tdl.asn2tdl/src/org/etsi/mts/tdl/asn2tdl/ASN2TDLTranslator.java +69 −38 Original line number Diff line number Diff line Loading @@ -38,6 +38,7 @@ import com.beanit.asn1bean.compiler.model.AsnNull; import com.beanit.asn1bean.compiler.model.AsnObjectIdentifier; import com.beanit.asn1bean.compiler.model.AsnOctetString; import com.beanit.asn1bean.compiler.model.AsnParameter; import com.beanit.asn1bean.compiler.model.AsnSelectionType; import com.beanit.asn1bean.compiler.model.AsnSequenceOf; import com.beanit.asn1bean.compiler.model.AsnSequenceSet; import com.beanit.asn1bean.compiler.model.AsnTaggedType; Loading @@ -46,6 +47,12 @@ import com.beanit.asn1bean.compiler.parser.ASNLexer; import com.beanit.asn1bean.compiler.parser.ASNParser; public class ASN2TDLTranslator extends AbstractTranslator { public enum PASS { TYPES, PROPERTIES, SELECTION, MAPPINGS } public void translate(String filename) throws Exception { AsnModel model = getAsnModelFromAsn1File(filename); Loading @@ -70,14 +77,27 @@ public class ASN2TDLTranslator extends AbstractTranslator { private void translateTypes(AsnModule module) { if (module.typesByName!=null) { //First pass //First pass: types translateTypes(module, PASS.TYPES); //Second pass: properties translateTypes(module, PASS.PROPERTIES); //Third pass: selection translateTypes(module, PASS.SELECTION); //Fourth pass - data element mappings for (String e : module.typesByName.keySet()) { AsnType type = module.typesByName.get(e); System.out.println("Type: "+type.name); translateType(type, "", true); DataType dataType = getTypeFor(e, tdlPackage.Literals.DATA_TYPE); DataElementMapping mapping = getTypeFor(e+"_MAPPING", tdlPackage.Literals.DATA_ELEMENT_MAPPING); mapping.setMappableDataElement(dataType); mapping.setElementURI("\""+e+"\""); mapping.setDataResourceMapping(drm); } //Second pass } } private void translateTypes(AsnModule module, PASS pass) { System.out.println("PASS: "+pass.name()); for (String e : module.typesByName.keySet()) { AsnType type = module.typesByName.get(e); System.out.println(" Type: "+type.name); Loading @@ -87,38 +107,27 @@ public class ASN2TDLTranslator extends AbstractTranslator { System.out.println(" "+p.dummyReference+" : "+p.paramGovernor); } } translateType(type, "", false); } //Third pass for (String e : module.typesByName.keySet()) { DataType dataType = getTypeFor(e, tdlPackage.Literals.DATA_TYPE); DataElementMapping mapping = getTypeFor(e+"_MAPPING", tdlPackage.Literals.DATA_ELEMENT_MAPPING); mapping.setMappableDataElement(dataType); mapping.setElementURI("\""+e+"\""); mapping.setDataResourceMapping(drm); } translateType(type, "", pass); } } private DataType translateType(AsnType type, String prefix, boolean flat) { private DataType translateType(AsnType type, String prefix, PASS pass) { final DataType generatedType; if (type instanceof AsnSequenceSet) { generatedType = getStructuredDataTypeFor(type.name); if (!flat) { if (pass!=PASS.TYPES) { for (AsnElementType c : ((AsnSequenceSet) type).componentTypes) { translateMember((StructuredDataType)generatedType, c); translateMember((StructuredDataType)generatedType, c, pass); } } } else if (type instanceof AsnChoice) { generatedType = getStructuredDataTypeFor(type.name); if (!flat) { if (pass!=PASS.TYPES) { constrainWith(generatedType, "union"); annotateWith(generatedType, "CHOICE"); //annotateWith(generatedType, "CHOICE"); for (AsnElementType c : ((AsnChoice) type).componentTypes) { translateMember((StructuredDataType)generatedType, c); translateMember((StructuredDataType)generatedType, c, pass); } } } else if (type instanceof AsnSequenceOf) { Loading @@ -127,7 +136,7 @@ public class ASN2TDLTranslator extends AbstractTranslator { // Type TYPE___attribute___collection___item // Collection TYPE___attribute___collection of ...___item generatedType = getTypeFor(cleanName(type.name), tdlPackage.Literals.COLLECTION_DATA_TYPE); if (!flat) { if (pass!=PASS.TYPES) { AsnElementType componentType = ((AsnSequenceOf) type).componentType; String itemTypePrefix = ""; if (componentType.name.isEmpty() && Loading @@ -135,12 +144,12 @@ public class ASN2TDLTranslator extends AbstractTranslator { itemTypePrefix = generatedType.getName()+"___item"; //TODO: process internals } DataType itemType = translateType(componentType, itemTypePrefix, false); DataType itemType = translateType(componentType, itemTypePrefix, pass); ((CollectionDataType) generatedType).setItemType(itemType); System.out.println(" Flat collection: "+generatedType.getName() +" of " +itemType.getName()); } else { AsnElementType componentType = ((AsnSequenceOf) type).componentType; DataType itemType = translateType(componentType, "", false); DataType itemType = translateType(componentType, "", pass); ((CollectionDataType) generatedType).setItemType(itemType); System.out.println(" Extended collection: "+generatedType.getName() +" of " +itemType.getName()); } Loading @@ -166,14 +175,14 @@ public class ASN2TDLTranslator extends AbstractTranslator { eType.typeReference.name = prefix+eType.name; } generatedType = translateType(eType.typeReference, "", false); generatedType = translateType(eType.typeReference, "", pass); } else { //TODO: handle properly (usually due to "|" present in definition - not supported by parser) generatedType = getStructuredDataTypeFor(prefix+cleanName(type.name)); System.out.println(" Element type: "+type.name+" : " +type.getClass().getSimpleName()+" not supported yet"); } } else if (type instanceof AsnTaggedType) { generatedType = translateTagged(type, flat); generatedType = translateTagged(type, pass); } else if (type instanceof AsnDefinedType) { //TODO: handle somehow? generatedType = getSimpleDataTypeFor(type.name); Loading Loading @@ -222,6 +231,29 @@ public class ASN2TDLTranslator extends AbstractTranslator { if (!type.name.isEmpty()) { annotateWith(generatedType, type.getClass().getSimpleName()); } } else if (type instanceof AsnSelectionType) { //TODO: document handling, applicable to Choice only, also illustrate with example String typeName = type.name; String propertyName = ((AsnSelectionType) type).selectionID; if (pass==PASS.SELECTION) { if (((AsnSelectionType)type).type instanceof AsnDefinedType) { String selectionType = ((AsnDefinedType) ((AsnSelectionType)type).type).typeName; StructuredDataType dataType = getStructuredDataTypeFor(selectionType); Member selectedMember = findContentWithName(cleanName(propertyName), dataType, tdlPackage.Literals.MEMBER); if (selectedMember != null) { generatedType = selectedMember.getDataType(); } else { System.out.println(" Selection for "+propertyName+" in mapping for type: "+selectionType+" not found"); generatedType = getSimpleDataTypeFor(typeName); } } else { System.out.println(" Selection for "+type.name+" : " +((AsnSelectionType)type).type.getClass().getSimpleName()+" not supported yet"); generatedType = getSimpleDataTypeFor(typeName); } } else { System.out.println(" Skipping Selection for "+propertyName+"..."); generatedType = getSimpleDataTypeFor("Selection"); } } else { String typeName = type.name; if (typeName.isEmpty()) { Loading @@ -235,7 +267,7 @@ public class ASN2TDLTranslator extends AbstractTranslator { return generatedType; } private DataType translateTagged(AsnType type, boolean flat) { private DataType translateTagged(AsnType type, PASS pass) { final DataType generatedType; AsnTaggedType taggedType = ((AsnTaggedType) type); if (taggedType.typeReference!=null) { Loading @@ -243,7 +275,7 @@ public class ASN2TDLTranslator extends AbstractTranslator { //TODO: check if this is always the case taggedType.typeReference.name = taggedType.name; } generatedType = translateType(taggedType.typeReference, "", flat); generatedType = translateType(taggedType.typeReference, "", pass); annotateWith(generatedType, taggedType.tag.clazz); //TODO: handle tagged types } else { Loading @@ -253,11 +285,10 @@ public class ASN2TDLTranslator extends AbstractTranslator { return generatedType; } private void translateMember(StructuredDataType generatedType, AsnElementType c) { Member m = tdlFactory.eINSTANCE.createMember(); m.setName(cleanName(c.name)); private void translateMember(StructuredDataType generatedType, AsnElementType c, PASS pass) { Member m = getContentWithName(c.name, generatedType, tdlPackage.Literals.MEMBER); String prefix = generatedType.getName()+"___"; DataType dataType = translateType(c, prefix, false); DataType dataType = translateType(c, prefix, pass); m.setDataType(dataType); if (dataType.getName().isEmpty()) { if (generatedType.getName().isEmpty()) { Loading
plugins/org.etsi.mts.tdl.common/src/org/etsi/mts/tdl/transform/AbstractTranslator.java +15 −1 Original line number Diff line number Diff line package org.etsi.mts.tdl.transform; import java.util.Optional; import java.util.TreeMap; import java.util.function.Predicate; import org.eclipse.emf.ecore.EClass; Loading Loading @@ -50,6 +51,10 @@ public abstract class AbstractTranslator { generatedPackage.getImport().add(sourceImport); } protected DataType getDataTypeFor(String name) { return getTypeFor(cleanName(name), tdlPackage.Literals.DATA_TYPE); } protected SimpleDataType getSimpleDataTypeFor(String name) { return getTypeFor(cleanName(name), tdlPackage.Literals.SIMPLE_DATA_TYPE); } Loading @@ -76,6 +81,15 @@ public abstract class AbstractTranslator { @SuppressWarnings("unchecked") protected <T extends PackageableElement> T getTypeFor(String name, EClass targetType) { String cleanName = cleanName(name); //TODO: move to ASN2TDL specialisation TreeMap<String, String> mappings = new TreeMap<>(); mappings.put("AsnInteger", "Integer"); mappings.put("AsnBoolean", "Boolean"); // mappings.put("AsnCharacterString", "String"); mappings.put("AsnOctetString", "OCTETSTRING"); mappings.put("AsnBitString", "BITSTRING"); mappings.put("AsnReal", "Real"); cleanName = mappings.getOrDefault(cleanName, cleanName); T generatedType = findElementOfType(cleanName, targetType); if (generatedType == null) { generatedType = (T) tdlFactory.eINSTANCE.create(targetType); Loading Loading @@ -117,7 +131,7 @@ public abstract class AbstractTranslator { @SuppressWarnings("unchecked") protected <T extends NamedElement> T getContentWithName(String name, NamedElement container, EClass targetType) { String cleanName = cleanName(name); T content = findContentWithName(name, container, targetType); T content = findContentWithName(cleanName, container, targetType); if (content == null) { content = (T) tdlFactory.eINSTANCE.create(targetType); content.setName(cleanName); Loading