Commit a4bf849d authored by Philip Makedonski's avatar Philip Makedonski
Browse files

+ updates to asn1 translator

parent 8ef9f4ee
Loading
Loading
Loading
Loading
+69 −38
Original line number Diff line number Diff line
@@ -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;
@@ -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);
@@ -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);
@@ -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) {
@@ -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() && 
@@ -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());
			}
@@ -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);
@@ -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()) {
@@ -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) {
@@ -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 {
@@ -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()) {
+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;
@@ -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);
	}
@@ -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);
@@ -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);