Commit 23ee319d authored by Philip Makedonski's avatar Philip Makedonski
Browse files

* asn2tdl moved methods, improved enum literals, added basic mappings

parent 3d70084b
Loading
Loading
Loading
Loading
+15 −20
Original line number Diff line number Diff line
package org.etsi.mts.tdl.asn2tdl;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Paths;
@@ -10,6 +11,7 @@ import org.etsi.mts.tdl.AnnotationType;
import org.etsi.mts.tdl.CollectionDataType;
import org.etsi.mts.tdl.Constraint;
import org.etsi.mts.tdl.ConstraintType;
import org.etsi.mts.tdl.DataElementMapping;
import org.etsi.mts.tdl.DataType;
import org.etsi.mts.tdl.EnumDataType;
import org.etsi.mts.tdl.Member;
@@ -47,6 +49,8 @@ public class ASN2TDLTranslator extends AbstractTranslator {
	public void translate(String filename) throws Exception {

		AsnModel model = getAsnModelFromAsn1File(filename);
		drm = getTypeFor("SOURCE_MAPPING", tdlPackage.Literals.DATA_RESOURCE_MAPPING);
		drm.setResourceURI("\""+new File(filename).getName()+"\"");

		for (String moduleName : model.modulesByName.keySet()) {
			//TODO: handle multiple modules?
@@ -86,6 +90,15 @@ public class ASN2TDLTranslator extends AbstractTranslator {
					
				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);

			}			
		}
	}
	
@@ -167,10 +180,10 @@ public class ASN2TDLTranslator extends AbstractTranslator {
		} else if (type instanceof AsnEnum) {
			//TODO: add enum values from ((AsnEnum)type).namedNumberList.namedNumbers
			generatedType = getEnumDataTypeFor(type.name);
			annotateWith(generatedType, "ENUM");
//			annotateWith(generatedType, "ENUM");
			for (AsnNamedNumber literal : ((AsnEnum)type).namedNumberList.namedNumbers) {
				SimpleDataInstance enumLiteral = tdlFactory.eINSTANCE.createSimpleDataInstance();
				enumLiteral.setName(literal.name);
				enumLiteral.setName(cleanName(literal.name));
				enumLiteral.setDataType(generatedType);
				((EnumDataType)generatedType).getValue().add(enumLiteral);
			}
@@ -222,24 +235,6 @@ public class ASN2TDLTranslator extends AbstractTranslator {
		return generatedType;
	}

	private void annotateWith(final DataType generatedType, String annotationName) {
		AnnotationType annotationType = getTypeFor(cleanName(annotationName), tdlPackage.Literals.ANNOTATION_TYPE);
		if (!generatedType.getAnnotation().stream().anyMatch(a->a.getKey()==annotationType)) {
			Annotation annotation = tdlFactory.eINSTANCE.createAnnotation();
			annotation.setKey(annotationType);
			generatedType.getAnnotation().add(annotation);
		}
	}

	private void constrainWith(final DataType generatedType, String constraintName) {
		ConstraintType constraintType = getTypeFor(cleanName(constraintName), tdlPackage.Literals.CONSTRAINT_TYPE);
		if (!generatedType.getConstraint().stream().anyMatch(a->a.getType()==constraintType)) {
			Constraint constraint = tdlFactory.eINSTANCE.createConstraint();
			constraint.setType(constraintType);
			generatedType.getConstraint().add(constraint);
		}
	}
	
	private DataType translateTagged(AsnType type, boolean flat) {
		final DataType generatedType;
		AsnTaggedType taggedType = ((AsnTaggedType) type);
+56 −3
Original line number Diff line number Diff line
@@ -5,6 +5,12 @@ import java.util.function.Predicate;

import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.resource.Resource;
import org.etsi.mts.tdl.Annotation;
import org.etsi.mts.tdl.AnnotationType;
import org.etsi.mts.tdl.Constraint;
import org.etsi.mts.tdl.ConstraintType;
import org.etsi.mts.tdl.DataResourceMapping;
import org.etsi.mts.tdl.DataType;
import org.etsi.mts.tdl.Element;
import org.etsi.mts.tdl.ElementImport;
import org.etsi.mts.tdl.EnumDataType;
@@ -17,6 +23,7 @@ import org.etsi.mts.tdl.tdlFactory;
import org.etsi.mts.tdl.tdlPackage;

public abstract class AbstractTranslator {
	protected DataResourceMapping drm;
	private Package generatedPackage;
	protected SimpleDataType stringType;
	private Resource targetResource;
@@ -56,7 +63,7 @@ public abstract class AbstractTranslator {

	public String cleanName(String name) {
		//TODO: use keywords filter?
		if (name.equals("Message") || name.equals("Time") || name.equals("type") || name.equals("name") ) {
		if (name.equals("Message") || name.equals("Time") || name.equals("type") || name.equals("name")  || name.equals("instance") ) {
			name = "^"+name;
		}
		name = name.replaceAll("-", "_")
@@ -90,8 +97,35 @@ public abstract class AbstractTranslator {
		}
		return generatedType;
	}

	@SuppressWarnings("unchecked")
	protected <T extends NamedElement> Optional<T> getContentWithName(String name, NamedElement container, Class<T> type) {
	protected <T extends NamedElement> T findContentWithName(String name, NamedElement container, EClass targetType) {
		Optional<T> optional = container.eContents().stream()
				.filter(e->targetType.isInstance(e))
				.map(e->(T) e)
				.filter(e -> e.getName().equals(name))
				.findFirst();
		T content = null;
		if (optional.isPresent()) {
			content = (T) optional.get();
		}
		return content;
	}

	
	@SuppressWarnings("unchecked")
	protected <T extends NamedElement> T getContentWithName(String name, NamedElement container, EClass targetType) {
		String cleanName = cleanName(name);
		T content = findContentWithName(name, container, targetType);
		if (content == null) {
			content = (T) tdlFactory.eINSTANCE.create(targetType);
			content.setName(cleanName);
		}
		return content;
	}

	@SuppressWarnings("unchecked")
	protected <T extends Element> Optional<T> getContentWithName(String name, NamedElement container, Class<T> type) {
		Optional<T> optional = container.eContents().stream()
				.filter(e->type.isInstance(e))
				.map(e->(T) e)
@@ -110,6 +144,25 @@ public abstract class AbstractTranslator {
		return optional;
	}
	
	protected void annotateWith(final DataType generatedType, String annotationName) {
		AnnotationType annotationType = getTypeFor(cleanName(annotationName), tdlPackage.Literals.ANNOTATION_TYPE);
		if (!generatedType.getAnnotation().stream().anyMatch(a->a.getKey()==annotationType)) {
			Annotation annotation = tdlFactory.eINSTANCE.createAnnotation();
			annotation.setKey(annotationType);
			generatedType.getAnnotation().add(annotation);
		}
	}

	protected void constrainWith(final DataType generatedType, String constraintName) {
		ConstraintType constraintType = getTypeFor(cleanName(constraintName), tdlPackage.Literals.CONSTRAINT_TYPE);
		if (!generatedType.getConstraint().stream().anyMatch(a->a.getType()==constraintType)) {
			Constraint constraint = tdlFactory.eINSTANCE.createConstraint();
			constraint.setType(constraintType);
			generatedType.getConstraint().add(constraint);
		}
	}


	public Resource getTargetResource() {
		return targetResource;
	}