Commit bdee3352 authored by Martti Käärik's avatar Martti Käärik
Browse files

OpenAPI and Java Execution: Improve mapping inheritance and HttpAdapter support #136

- OpenAPI: Refine schema reference resolution to ensure type reuse and correct naming.
- OpenAPI: Integrate HttpJavaMappings and map typed requests/responses to HttpAdapter's HttpRequestData/HttpResponseData.
- Java Execution: Implement parent mapping delegation in MappingImpl to support inherited parameter mappings.
- Java Execution: Update JUnitTestGenerator to link subtype mappings to supertype mappings based on TDL extensions.
parent 1c3e41b1
Loading
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -246,6 +246,7 @@ public class ResourceHandler {

	private static final String TDL_MODEL_NAME = "tdl";
	private static final String HTTP_MODEL_NAME = "http";
	private static final String HTTP_JAVA_NAME = "httpjavamappings";
	private static final String JAVA_MODEL_NAME = "java";
	private static final String[] MODEL_FILE_EXTENSIONS = new String[] {
			"tdl", "tdlan2", "tdltx", "tdltxi"
@@ -281,6 +282,10 @@ public class ResourceHandler {
		return getKnownPackage(resource, JAVA_MODEL_NAME);
	}

	public static Package getHttpJavaMappingsPackage(Resource resource) {
		return getKnownPackage(resource, HTTP_JAVA_NAME);
	}
	

	private static Package getKnownPackage(Resource resource, String packageName) {
		try {
+17 −2
Original line number Diff line number Diff line
@@ -678,6 +678,10 @@ public class JUnitTestGenerator extends Renderer {
				DataType mType = m.getDataType();
				declareType(mType, declaredTypes);
			}
			for (org.etsi.mts.tdl.Extension e : ((StructuredDataType) t).getExtension()) {
				DataType superType = (DataType) e.getExtending();
				declareType(superType, declaredTypes);
			}
		} else if (t instanceof CollectionDataType) {
			DataType iType = ((CollectionDataType) t).getItemType();
			declareType(iType, declaredTypes);
@@ -688,8 +692,19 @@ public class JUnitTestGenerator extends Renderer {
		if (mapping == null)
			mapping = getMapping(t, settings.useMapping);
		String mappingName = name + "_mapping";
		if (mapping != null)
		if (mapping != null) {
			writeMapping(mapping, mappingName, false);
			if (t instanceof StructuredDataType) {
				for (org.etsi.mts.tdl.Extension e : ((StructuredDataType) t).getExtension()) {
					StructuredDataType superType = (StructuredDataType) e.getExtending();
					DataElementMapping superMapping = getMapping(superType);
					if (superMapping != null) {
						String superMappingName = super.getElementName(superType) + "_mapping";
						line(mappingName + ".setParent(" + superMappingName + ");");
					}
				}
			}
		}

		line(CORE_PACKAGE + ".TypeImpl " + name + " = new " + CORE_PACKAGE + ".TypeImpl()");
		writeSetName(t);
+10 −1
Original line number Diff line number Diff line
@@ -13,6 +13,7 @@ public class MappingImpl extends ElementImpl implements Mapping, TriImpl<Mapping
	private String uri;

	private MappingImpl container;
	private MappingImpl parentMapping;
	private Map<String, MappingImpl> parameters = new Hashtable<String, MappingImpl>();

	public MappingImpl() {
@@ -23,6 +24,11 @@ public class MappingImpl extends ElementImpl implements Mapping, TriImpl<Mapping
		this.uri = uri;
	}

	public MappingImpl setParent(MappingImpl parent) {
		this.parentMapping = parent;
		return this;
	}

	@Override
	public String getUri() {
		return uri;
@@ -71,7 +77,10 @@ public class MappingImpl extends ElementImpl implements Mapping, TriImpl<Mapping

	@Override
	public MappingImpl getParameterMapping(String name) {
		return this.parameters.get(name);
		MappingImpl m = this.parameters.get(name);
		if (m == null && parentMapping != null)
			return parentMapping.getParameterMapping(name);
		return m;
	}

	@Override
+58 −35
Original line number Diff line number Diff line
@@ -81,6 +81,9 @@ public class OpenAPI2TDLTranslatorNext extends AbstractTranslator {
	private EnumDataType httpParameterLocationEnum;
	private EnumDataType httpMethodEnum;
	
	private DataResourceMapping httpAdapter;
	private DataResourceMapping drmTarget;

	public void translate(String filename) throws Exception {
		translate(filename, sourceMappingTag, targetMappingTag);
	}
@@ -197,6 +200,18 @@ public class OpenAPI2TDLTranslatorNext extends AbstractTranslator {
				javaImport.setImportedPackage(javaPackage);
				mappingsPackage.getImport().add(javaImport);
			}
			Package httpJavaMappingsPackage = ResourceHandler.getHttpJavaMappingsPackage(getTargetResource());
			httpAdapter = null;
			if (httpJavaMappingsPackage != null) {
				ElementImport httpJavaImport = tdlFactory.eINSTANCE.createElementImport();
				httpJavaImport.setImportedPackage(httpJavaMappingsPackage);
				mappingsPackage.getImport().add(httpJavaImport);
				for (PackageableElement e : httpJavaMappingsPackage.getPackagedElement()) {
					if (e instanceof DataResourceMapping && e.getName().equals("HttpAdapter"))
						httpAdapter = (DataResourceMapping) e;
				}
			}

			drmTarget = getTypeFor(targetMappingTag, tdlPackage.Literals.DATA_RESOURCE_MAPPING);
			mappingsPackage.getPackagedElement().add(drmTarget);
			drmTarget.setResourceURI(javaApiPackage);
@@ -538,6 +553,13 @@ public class OpenAPI2TDLTranslatorNext extends AbstractTranslator {
	}

	private DataType translate(Schema<?> schema, String prefix, DataType superType) {
		String reference = schema.get$ref();
		if (reference != null) {
			Schema<?> referencedSchema = ModelUtils.getReferencedSchema(model, schema);
			referencedSchema.setName(ModelUtils.getSimpleRef(reference));
			return translate(referencedSchema, "", superType);
		}

		Discriminator discriminator = schema.getDiscriminator();
		if (discriminator != null) {
			DataType baseType = translateObject(schema, schema.getName());
@@ -546,9 +568,7 @@ public class OpenAPI2TDLTranslatorNext extends AbstractTranslator {
			List<Schema> subTypes = schema.getOneOf();
			if (subTypes != null) {
				for (Schema subSchemaRef : subTypes) {
					Schema<?> subSchema = ModelUtils.getReferencedSchema(model, subSchemaRef);
					subSchema.setName(ModelUtils.getSimpleRef(subSchemaRef.get$ref()));
					translate(subSchema, "", baseType);
					translate(subSchemaRef, "", baseType);
				}
			}
			return baseType;
@@ -565,9 +585,7 @@ public class OpenAPI2TDLTranslatorNext extends AbstractTranslator {
				}
			}
			if (refCount == 1) {
				Schema<?> referencedSchema = ModelUtils.getReferencedSchema(model, refSchema);
				referencedSchema.setName(ModelUtils.getSimpleRef(refSchema.get$ref()));
				superType = translate(referencedSchema, "", null);
				superType = translate(refSchema, "", null);
			}
		}

@@ -875,6 +893,7 @@ public class OpenAPI2TDLTranslatorNext extends AbstractTranslator {
					}
				}

				if (httpAdapter != null) {
					for (PackageableElement pe : getGeneratedPackage().getPackagedElement()) {
						if (pe instanceof StructuredDataType) {
							StructuredDataType type = (StructuredDataType) pe;
@@ -887,14 +906,17 @@ public class OpenAPI2TDLTranslatorNext extends AbstractTranslator {
							}
							
							if (isRequest || isResponse) {
							String javaClass = isRequest ? "Request" : "Response";
								String javaClass = isRequest ? "HttpRequestData" : "HttpResponseData";
								DataResourceMapping targetResource = resourceMapping;

								targetResource = httpAdapter;
								
								DataElementMapping eMapping = tdlFactory.eINSTANCE.createDataElementMapping();
								mappingsPackage.getPackagedElement().add(eMapping);
								eMapping.setName(getCleanName(type.getName()) + "_Mapping");
								eMapping.setMappableDataElement(type);
								eMapping.setElementURI(javaClass);
							eMapping.setDataResourceMapping(resourceMapping);
								eMapping.setDataResourceMapping(targetResource);
								Annotation ca = tdlFactory.eINSTANCE.createAnnotation();
								ca.setKey(classAnnotation);
								eMapping.getAnnotation().add(ca);
@@ -910,6 +932,7 @@ public class OpenAPI2TDLTranslatorNext extends AbstractTranslator {
							}
						}
					}
				}
				
				//return super.postProcessSupportingFileData(objs);
				return objs;