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

+ added ported test documentation generator from STF576 to openapi generator

parent 8e20b202
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -9,5 +9,6 @@ Require-Bundle: org.etsi.mts.tdl.model,
 org.etsi.mts.tdl.common,
 org.etsi.mts.tdl.openapi.generator.wrapper,
 org.etsi.mts.tdl.helper
Export-Package: org.etsi.mts.tdl.openapi2tdl.next
Export-Package: org.etsi.mts.tdl.openapi2tdl.next,
 org.etsi.mts.tdl.openapi2tdl.next.doc
Bundle-ClassPath: .
+58 −0
Original line number Diff line number Diff line
package org.etsi.mts.tdl.openapi2tdl.next.doc;

import org.openapitools.codegen.utils.ModelUtils;

import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.Operation;
import io.swagger.v3.oas.models.media.Schema;
import io.swagger.v3.oas.models.parameters.Parameter;
import io.swagger.v3.oas.models.responses.ApiResponse;

public class Describe extends OpenAPIVisitor  {

	@Override
	public void preamble(OpenAPI model) {
		System.out.printf("Title: %s\n", model.getInfo().getTitle());
	}

	@Override
	public void path(String path) {
		System.out.printf("Path %s:\n", path);
	}

	@Override
	public void operation(String path, String method, Operation op) {
		System.out.printf("  %s: [%s] %s\n", method,
				op.getOperationId(), op.getSummary());
		if (op.getParameters() != null) {
			for (Parameter param : op.getParameters()) {
				if (param.get$ref() != null) {
					param = ModelUtils.getReferencedParameter(model, param);
				}
				System.out.printf("    %s[%s]:, %s - %s\n", param.getName(), param.getIn(), getParameterType(param),
						param.getDescription());
			}
		}
		if (op.getResponses() != null) {
			for (String r : op.getResponses().keySet()) {
				ApiResponse response = op.getResponses().get(r);
				if (response.get$ref() != null) {
					response = ModelUtils.getReferencedApiResponse(model, response);
				}
				System.out.printf("    %s: %s\n", r, response.getDescription());
				if (response.getContent() != null) {
					for (String c : response.getContent().keySet()) {
						Schema<?> schema = response.getContent().get(c).getSchema();
						if (schema.get$ref() != null) {
							String schemaName = ModelUtils.getSimpleRef(schema.get$ref());
							System.out.printf("      %s\n",schemaName);
//							schema = ModelUtils.getReferencedSchema(model, op.getResponses().get(r).getContent().get(c).getSchema());
						}
//						System.out.printf("      %s\n",op.getResponses().get(r).getContent().get(c).getSchema().getName());
					}
				}
			}
		}
	}
	
}
+88 −0
Original line number Diff line number Diff line
package org.etsi.mts.tdl.openapi2tdl.next.doc;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Map.Entry;

import org.etsi.mts.tdl.openapi2tdl.next.OpenAPI2TDLTranslatorNext;

import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.Operation;
import io.swagger.v3.oas.models.PathItem;
import io.swagger.v3.oas.models.PathItem.HttpMethod;

public class Doc {
	StringBuffer content = new StringBuffer();
	private OpenAPI model;

	public void append(String s) {
		content.append(s);
	}
	
	public static void main(String[] args) throws Exception {
		boolean validate = !(args.length >= 1 && args[0].equals("-n"));
		Doc doc = new Doc();
		doc.processModel(args[1], validate);
		Files.writeString(Path.of(args[1]+"-RQ-ICS-TSS.md"), doc.content);
	}
	public void processModel(String filename, boolean validate) throws Exception {
		
		model = OpenAPI2TDLTranslatorNext.parseSpec(filename, true);
//		processModel(model, Describe.init(model, content));
		append(String.format("== Model %s\n", filename));
		append("# Generated Documentation\n");

		processModel(model, new RQ().init(model, this));
		append("\n## Implementation Conformance Statements\n");

		processModel(model, new ICSDetail().init(model, this));
		processModel(model, new ICSMethod().init(model, this));
		processModel(model, new ICSPath().init(model, this));
		processModel(model, new ICSHierarchical().init(model, this));
		processModel(model, new TSS().init(model, this));

		append("------\n\n");
	}

	private static void processModel(OpenAPI model, OpenAPIVisitor visitor)  {
		visitor.preamble(model);
		for (Entry<String, PathItem> pathEntry : model.getPaths().entrySet()) {
			String path = pathEntry.getKey();
			PathItem pathItem = pathEntry.getValue();
			visitor.path(path);
			for (Entry<HttpMethod, Operation> o : pathItem.readOperationsMap().entrySet()) {
				visitor.operation(path, o.getKey().name(), o.getValue());
			}
		}
		visitor.postamble(model);

	}
	//convert to word with pandoc

	private static void getICSTemplate(OpenAPI model) {
		String level = "Template";
		System.out.printf("\n#### %s\n\n", level);

		String header = 
				"| ID | Resource  | Reference | Method | Type  | Request | Response |\n" + 
				"| -- | --------- | --------- | ------ | ----- | ------- | -------- |";
		String footer = 
				"[Table X.Y: Extracted ICS ("+level+")]{custom-style=\"FL\"}";
		System.out.println(header);

		for (Entry<String, PathItem> pathEntry : model.getPaths().entrySet()) {
			String path = pathEntry.getKey();
			PathItem pathItem = pathEntry.getValue();
			for (Entry<HttpMethod, Operation> op : pathItem.readOperationsMap().entrySet()) {
				for (String r : op.getValue().getResponses().keySet()) {
				}
			}
		}
		
		System.out.println(footer);
	}

	public StringBuffer getContent() {
		return content;
	}
	
}
+74 −0
Original line number Diff line number Diff line
package org.etsi.mts.tdl.openapi2tdl.next.doc;

import java.util.List;
import java.util.Map.Entry;
import java.util.stream.Collectors;

import org.openapitools.codegen.utils.ModelUtils;

import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.Operation;
import io.swagger.v3.oas.models.PathItem;
import io.swagger.v3.oas.models.PathItem.HttpMethod;
import io.swagger.v3.oas.models.media.Schema;
import io.swagger.v3.oas.models.parameters.Parameter;
import io.swagger.v3.oas.models.responses.ApiResponse;

public class ICSDetail extends OpenAPIVisitor  {
	int ri = 0;
	int oi = 0;
	private String level = "Detail";

	@Override
	public void preamble(OpenAPI model) {
		content.append(String.format("\n#### %s\n\n", level));

		String header = 
				"| ID | Resource  | Reference | Method | Type  | Request | Response |\n" + 
				"| -- | --------- | --------- | ------ | ----- | ------- | -------- |\n";
		content.append(header);
	}

	@Override
	public void path(String path) {
		ri = 0;
	}
	
	@Override
	public void operation(String path, String method, Operation op) {
		String cleanPath = path.toUpperCase()
				.replaceAll("/", "")
				.replaceAll("[\\{\\}]", "_")
				.replaceAll("_$", "");
		for (String r : op.getResponses().keySet()) {
			ri++;

			String reference = "Path: "+path + " : "+op.getOperationId();
			String response = r;
			String type = "M";
			String resource = path;
			String request = "(fill in request)";

			String id = "D_"+cleanPath
					+"_"+method
					+"_"+r
					+"_00"+ri;
			content.append(
					   "| " + id
					+ " | " + resource
					+ " | " + reference
					+ " | " + method
					+ " | " + type
					+ " | " + request
					+ " | " + response
					+ " |\n");
		}
	}

	@Override
	public void postamble(OpenAPI model) {
		String footer =
				"\n[Table X.Y: Extracted ICS ("+level+")]{custom-style=\"FL\"}\n";
		content.append(footer);
	}
}
+123 −0
Original line number Diff line number Diff line
package org.etsi.mts.tdl.openapi2tdl.next.doc;

import java.util.List;
import java.util.Map.Entry;
import java.util.stream.Collectors;

import org.openapitools.codegen.utils.ModelUtils;

import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.Operation;
import io.swagger.v3.oas.models.PathItem;
import io.swagger.v3.oas.models.PathItem.HttpMethod;
import io.swagger.v3.oas.models.media.Schema;
import io.swagger.v3.oas.models.parameters.Parameter;
import io.swagger.v3.oas.models.responses.ApiResponse;

public class ICSHierarchical extends OpenAPIVisitor  {
	int pi = 0;
	int ri = 0;
	int oi = 0;
	private String level = "Hierarchical";

	@Override
	public void preamble(OpenAPI model) {
		content.append(String.format("\n#### %s\n\n", level));

		String header = 
				"| ID | Resource  | Reference | Method | Type  | Request | Response |\n" + 
				"| -- | --------- | --------- | ------ | ----- | ------- | -------- |\n";
		content.append(header);
	}

	@Override
	public void path(String path) {
		String cleanPath = path
				.replaceAll("/", "")
				.replaceAll("[\\{\\}]", "_")
				.replaceAll("_$", "");
		pi++;
		oi = 0;
		String pid = "P"+pi;
		
		String type = "M";
		String resource = path;
		String request = "(fill in request)";
		PathItem pathItem = model.getPaths().get(path);

		List<String> ops = pathItem.readOperationsMap().keySet().stream()
				.map(e -> e.name())
				.collect(Collectors.toList());
		
		List<String> opIds = pathItem.readOperationsMap().values().stream()
			.map(e -> e.getOperationId())
			.collect(Collectors.toList());

		List<String> allResponses = pathItem.readOperationsMap().values().stream()
				.flatMap(e -> e.getResponses().keySet().stream())
				.collect(Collectors.toList());
		
		String id = pid;
		String methods = String.join(",", ops);
		String pathReference = "Path: "+path + " : "+String.join(",", opIds);
		
		content.append(String.format(
				"| " + id
				+ " | " + resource
				+ " | " + pathReference
				+ " | " + methods
				+ " | " + type
				+ " | " + request
				+ " | " + String.join(",", allResponses)
				+ " |\n"));
	}
	
	@Override
	public void operation(String path, String method, Operation op) {
		oi++;
		String reference = "Path: "+path + " : "+op.getOperationId();
		String responses = String.join(",", op.getResponses().keySet());
		String oid = "M"+oi;

		String pid = "P"+pi;
		
		String type = "M";
		String resource = path;
		String request = "(fill in request)";

		String id = pid+"_"+oid;
		content.append(
				   "| " + id
				+ " | " + resource
				+ " | " + reference
				+ " | " + method
				+ " | " + type
				+ " | " + request
				+ " | " + responses
				+ " |\n");
		ri = 0;
		for (String r : op.getResponses().keySet()) {
			ri++;
			String rid = "R"+ri;
			String response = r;
			id = pid+"_"+oid+"_"+rid;
			
			content.append(String.format(
					   "| " + id
					+ " | " + resource
					+ " | " + reference
					+ " | " + method
					+ " | " + type
					+ " | " + request
					+ " | " + response
					+ " |\n"));
		}
	}

	@Override
	public void postamble(OpenAPI model) {
		String footer =
				"\n[Table X.Y: Extracted ICS ("+level+")]{custom-style=\"FL\"}\n";
		content.append(footer);
	}
}
Loading