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

Import OpenAPI query and header parameters.

parent ca704ad9
Loading
Loading
Loading
Loading
Loading
+92 −12
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ import org.etsi.mts.tdl.DataElementUse;
import org.etsi.mts.tdl.DataInstance;
import org.etsi.mts.tdl.DataResourceMapping;
import org.etsi.mts.tdl.DataType;
import org.etsi.mts.tdl.DataUse;
import org.etsi.mts.tdl.ElementImport;
import org.etsi.mts.tdl.EnumDataType;
import org.etsi.mts.tdl.Extension;
@@ -28,11 +29,13 @@ import org.etsi.mts.tdl.MemberAssignment;
import org.etsi.mts.tdl.NamedElement;
import org.etsi.mts.tdl.Package;
import org.etsi.mts.tdl.PackageableElement;
import org.etsi.mts.tdl.ParameterBinding;
import org.etsi.mts.tdl.ParameterMapping;
import org.etsi.mts.tdl.SimpleDataInstance;
import org.etsi.mts.tdl.SimpleDataType;
import org.etsi.mts.tdl.StructuredDataInstance;
import org.etsi.mts.tdl.StructuredDataType;
import org.etsi.mts.tdl.UnassignedMemberTreatment;
import org.etsi.mts.tdl.tdlFactory;
import org.etsi.mts.tdl.tdlPackage;
import org.etsi.mts.tdl.helper.TDLHelper;
@@ -56,6 +59,8 @@ import io.swagger.v3.oas.models.PathItem.HttpMethod;
import io.swagger.v3.oas.models.Paths;
import io.swagger.v3.oas.models.media.MediaType;
import io.swagger.v3.oas.models.media.Schema;
import io.swagger.v3.oas.models.parameters.Parameter;
import io.swagger.v3.oas.models.parameters.QueryParameter;
import io.swagger.v3.oas.models.parameters.RequestBody;
import io.swagger.v3.parser.core.models.ParseOptions;
import io.swagger.v3.parser.util.InlineModelResolver;
@@ -226,6 +231,8 @@ public class OpenAPI2TDLTranslatorNext extends AbstractTranslator {
		

		StructuredDataType httpRequest = null;
		CollectionDataType httpRequestParameters = null;
		EnumDataType httpParameterLocationEnum = null;
		EnumDataType httpMethodEnum = null;
		if (httpMessageBasedPackage != null) {
			for (PackageableElement e : httpMessageBasedPackage.getPackagedElement()) {
@@ -235,12 +242,17 @@ public class OpenAPI2TDLTranslatorNext extends AbstractTranslator {
				} else if (e.eClass().equals(tdlPackage.eINSTANCE.getEnumDataType())) {
					if (e.getName().equals("Method"))
						httpMethodEnum = (EnumDataType) e;
					else if (e.getName().equals("Location"))
						httpParameterLocationEnum = (EnumDataType) e;
				} else if (e.eClass().equals(tdlPackage.eINSTANCE.getCollectionDataType())) {
					if (e.getName().equals("Parameters"))
						httpRequestParameters = (CollectionDataType) e;
				}
			}
		}
		
		if (useMessageBasedApi) {
			createOperationWrapper(noContentOperations, httpRequest, httpMethodEnum);
			createOperationWrapper(noContentOperations, httpRequest, httpMethodEnum, httpRequestParameters, httpParameterLocationEnum);
		}
		for (String schemaName : model.getComponents().getSchemas().keySet()) {
			Schema<?> schema = model.getComponents().getSchemas().get(schemaName);
@@ -250,7 +262,7 @@ public class OpenAPI2TDLTranslatorNext extends AbstractTranslator {
			if (useMessageBasedApi) {
				Set<PathOperation> ops = schemaOperations.get(schemaName);
				if (ops != null)
					createOperationWrapper(ops, httpRequest, httpMethodEnum);
					createOperationWrapper(ops, httpRequest, httpMethodEnum, httpRequestParameters, httpParameterLocationEnum);
			}
		}

@@ -260,7 +272,9 @@ public class OpenAPI2TDLTranslatorNext extends AbstractTranslator {
		ensureUniqueNames(getGeneratedPackage());
	}
	
	private void createOperationWrapper(Set<PathOperation> ops, StructuredDataType httpRequest, EnumDataType httpMethodEnum) {
	private void createOperationWrapper(Set<PathOperation> ops, StructuredDataType httpRequest,
			EnumDataType httpMethodEnum, CollectionDataType httpRequestParameters,
			EnumDataType httpParameterLocationEnum) {

		for (PathOperation pathOperation : ops) {
			Operation op = pathOperation.operation;
@@ -277,9 +291,52 @@ public class OpenAPI2TDLTranslatorNext extends AbstractTranslator {
			SimpleDataInstance methodValue = findContentWithName(pathOperation.method.name(), httpMethodEnum, tdlPackage.eINSTANCE.getSimpleDataInstance());
			setMemberValue(requestData, "method", methodValue);
			
//			for (Parameter par: op.getParameters()) {
//				System.out.println(par);
//			}
			List<Parameter> opParams = op.getParameters();
			if (opParams != null && opParams.size() > 0) {
				/*
				 * Not the best approach
				DataElementUse parametersCollection = tdlFactory.eINSTANCE.createDataElementUse();
				parametersCollection.setUnassignedMember(UnassignedMemberTreatment.ANY_VALUE_OR_OMIT);
				parametersCollection.setDataElement(httpRequestParameters);
				setMemberValue(requestData, "parameters", parametersCollection);
				*/
				
				Map<String, Parameter> params = model.getComponents().getParameters();
				for (Parameter par: op.getParameters()) {
					if (par.get$ref() != null) {
						String paraName = par.get$ref();
						paraName = paraName.replace("#/components/parameters/", "");
						Parameter p = params.get(paraName);
						if (p == null)
							System.err.println("Invalid parameter reference at " + par.get$ref());
						par = p;
					}
					
					String in = par.getIn();
					if (in.equals("query") || in.equals("path")) {
						String parameterName = par.getName();
						DataType parameterType = httpRequestParameters.getItemType();
						/*
						DataElementUse parameter = tdlFactory.eINSTANCE.createDataElementUse();
						parameter.setDataElement(parameterType);
						*/
						StructuredDataInstance parameter = getStructuredDataInstanceFor(name + "__" + parameterName);
						parameter.setDataType(parameterType);
						
						SimpleDataInstance queryValue = findContentWithName(in, httpParameterLocationEnum, tdlPackage.eINSTANCE.getSimpleDataInstance());
						/*
						setParameterValue(parameter, parameterType, "location", queryValue);
						setParameterValue(parameter, parameterType, "name", par.getName());
						
						parametersCollection.getItem().add(parameter);
						*/
						setMemberValue(parameter, "location", queryValue);
						setMemberValue(parameter, "name", parameterName);
						
					} else
						System.err.println("Unsupported parameter type: " + in + " at " + par.get$ref());
				}
			}
//			Member headersMember = findContentWithName("headers", httpRequest, tdlPackage.eINSTANCE.getMember());
//			Member parametersMember = findContentWithName("parameters", httpRequest, tdlPackage.eINSTANCE.getMember());
		}
@@ -287,9 +344,9 @@ public class OpenAPI2TDLTranslatorNext extends AbstractTranslator {
	
	private void setMemberValue(StructuredDataInstance data, String memberName, Object value) {
		
		Member uriMember = findContentWithName(memberName, data.getDataType(), tdlPackage.eINSTANCE.getMember());
		Member member = findContentWithName(memberName, data.getDataType(), tdlPackage.eINSTANCE.getMember());
		MemberAssignment assignment = tdlFactory.eINSTANCE.createMemberAssignment();
		assignment.setMember(uriMember);
		assignment.setMember(member);
		if (value instanceof String) {
			LiteralValueUse dataUse = tdlFactory.eINSTANCE.createLiteralValueUse();
			dataUse.setValue((String) value);
@@ -299,11 +356,34 @@ public class OpenAPI2TDLTranslatorNext extends AbstractTranslator {
			DataElementUse dataUse = tdlFactory.eINSTANCE.createDataElementUse();
			dataUse.setDataElement((DataInstance) value);
			assignment.setMemberSpec(dataUse);
		} else if (value instanceof DataUse) {
			assignment.setMemberSpec((DataUse) value);
		}
		data.getMemberAssignment().add(assignment);
		
	}
	
	private void setParameterValue(DataElementUse data, DataType type, String parameterName, Object value) {
		
		org.etsi.mts.tdl.Parameter parameter = findContentWithName(parameterName, type, tdlPackage.eINSTANCE.getParameter());
		ParameterBinding binding = tdlFactory.eINSTANCE.createParameterBinding();
		binding.setParameter(parameter);
		if (value instanceof String) {
			LiteralValueUse dataUse = tdlFactory.eINSTANCE.createLiteralValueUse();
			dataUse.setValue((String) value);
			binding.setDataUse(dataUse);
			
		} else if (value instanceof DataInstance) {
			DataElementUse dataUse = tdlFactory.eINSTANCE.createDataElementUse();
			dataUse.setDataElement((DataInstance) value);
			binding.setDataUse(dataUse);
		} else if (value instanceof DataUse) {
			binding.setDataUse((DataUse) value);
		}
		data.getArgument().add(binding);
		
	}

	@Override
	public void setTargetResource(Resource targetResource) {
		super.setTargetResource(targetResource);