From 1470a8c41ff31125fd61029e63fd8dae2d39da45 Mon Sep 17 00:00:00 2001 From: nbhusare Date: Thu, 28 Mar 2019 18:17:59 -0400 Subject: [PATCH 01/18] This adds an the exampledataprovider extension point that can be extended in the studio in order to provide a dummy data provider for json schema. The ExampleDataProvider is an interface that the implementation data provider would extend. The content assist processor binds the new content assist extension. The ExampleDataContentASsistExt provides an extension to the content assist at position definitions/any. The schemas folder is made available as part of the binary buld by adding it in the build file --- .../build.properties | 3 +- com.reprezen.swagedit.openapi3/plugin.xml | 1 + ...zen.swagedit.openapi3.exampleprovider.exsd | 102 +++++++++++++++ .../openapi3/ExampleDataProvider.java | 16 +++ .../OpenApi3ContentAssistProcessor.java | 4 +- .../ext/ExampleDataContentAssistExt.java | 120 ++++++++++++++++++ .../openapi3/editor/OpenApi3Editor.java | 6 + 7 files changed, 250 insertions(+), 2 deletions(-) create mode 100644 com.reprezen.swagedit.openapi3/schema/com.reprezen.swagedit.openapi3.exampleprovider.exsd create mode 100644 com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/ExampleDataProvider.java create mode 100644 com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/assist/ext/ExampleDataContentAssistExt.java diff --git a/com.reprezen.swagedit.openapi3/build.properties b/com.reprezen.swagedit.openapi3/build.properties index 1f537c21..bf796502 100644 --- a/com.reprezen.swagedit.openapi3/build.properties +++ b/com.reprezen.swagedit.openapi3/build.properties @@ -5,4 +5,5 @@ bin.includes = META-INF/,\ OSGI-INF/,\ plugin.xml,\ icons/,\ - resources/ + resources/,\ + schema/ diff --git a/com.reprezen.swagedit.openapi3/plugin.xml b/com.reprezen.swagedit.openapi3/plugin.xml index 191f00d5..27417b6d 100644 --- a/com.reprezen.swagedit.openapi3/plugin.xml +++ b/com.reprezen.swagedit.openapi3/plugin.xml @@ -1,6 +1,7 @@ + + + + + + + + + [Enter description of this extension point.] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [Enter the first release in which this extension point appears.] + + + + + + + + + [Enter extension point usage example here.] + + + + + + + + + [Enter API information here.] + + + + + + + + + [Enter information about supplied implementation of this extension point.] + + + + + diff --git a/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/ExampleDataProvider.java b/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/ExampleDataProvider.java new file mode 100644 index 00000000..54de37cb --- /dev/null +++ b/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/ExampleDataProvider.java @@ -0,0 +1,16 @@ +/******************************************************************************* + * Copyright (c) 2016 ModelSolv, Inc. and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * ModelSolv, Inc. - initial API and implementation and/or initial documentation + *******************************************************************************/ +package com.reprezen.swagedit.openapi3; + +public interface ExampleDataProvider { + + String getData(String json); +} diff --git a/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/assist/OpenApi3ContentAssistProcessor.java b/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/assist/OpenApi3ContentAssistProcessor.java index f1890f78..fd6c1acd 100644 --- a/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/assist/OpenApi3ContentAssistProcessor.java +++ b/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/assist/OpenApi3ContentAssistProcessor.java @@ -24,6 +24,7 @@ import com.reprezen.swagedit.core.schema.CompositeSchema; import com.reprezen.swagedit.openapi3.Activator; import com.reprezen.swagedit.openapi3.assist.ext.CallbacksContentAssistExt; +import com.reprezen.swagedit.openapi3.assist.ext.ExampleDataContentAssistExt; import com.reprezen.swagedit.openapi3.assist.ext.ParameterInContentAssistExt; import com.reprezen.swagedit.openapi3.assist.ext.SchemaFormatContentAssistExt; import com.reprezen.swagedit.openapi3.assist.ext.SchemaTypeContentAssistExt; @@ -36,7 +37,8 @@ public class OpenApi3ContentAssistProcessor extends JsonContentAssistProcessor { new SchemaFormatContentAssistExt(), // new ParameterInContentAssistExt(), // new ResponseCodeContentAssistExt(), // - new MediaTypeContentAssistExt()); + new MediaTypeContentAssistExt(), + new ExampleDataContentAssistExt()); public OpenApi3ContentAssistProcessor(ContentAssistant ca) { super(ca, proposalProvider, new OpenApi3ReferenceProposalProvider()); diff --git a/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/assist/ext/ExampleDataContentAssistExt.java b/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/assist/ext/ExampleDataContentAssistExt.java new file mode 100644 index 00000000..77946c18 --- /dev/null +++ b/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/assist/ext/ExampleDataContentAssistExt.java @@ -0,0 +1,120 @@ +/** + * + */ +package com.reprezen.swagedit.openapi3.assist.ext; + +import java.util.Arrays; +import java.util.Collection; + +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IConfigurationElement; +import org.eclipse.core.runtime.Platform; + +import com.fasterxml.jackson.core.JsonPointer; +import com.reprezen.swagedit.core.assist.ProposalDescriptor; +import com.reprezen.swagedit.core.assist.ext.ContentAssistExt; +import com.reprezen.swagedit.core.model.AbstractNode; +import com.reprezen.swagedit.core.model.ObjectNode; +import com.reprezen.swagedit.core.schema.TypeDefinition; +import com.reprezen.swagedit.openapi3.ExampleDataProvider; + +public class ExampleDataContentAssistExt implements ContentAssistExt { + + private static final JsonPointer pointer = JsonPointer.compile("/definitions/any"); + + private static final ProposalDescriptor defaultProposal = new ProposalDescriptor("Generate Example") + .replacementString("example:").type("string"); + + @Override + public boolean canProvideContentAssist(TypeDefinition type) { + return type != null && type.getPointer() != null && pointer.equals(type.getPointer()); + } + + @Override + public Collection getProposals(TypeDefinition type, AbstractNode node, String prefix) { + final AbstractNode schemaNode = findSchemaNode(node); + + try { + final ExampleDataProvider exampleDataProvider = (ExampleDataProvider) getDataProvider(); + if (exampleDataProvider != null) { + return Arrays.asList(new ProposalDescriptor("Generate Example:") + .replacementString(exampleDataProvider.getData(schemaNode.getPointerString())).type("string")); + } else { + return Arrays.asList(defaultProposal); + } + } catch (CoreException e) { + return Arrays.asList(defaultProposal); + } + + } + + private AbstractNode findSchemaNode(AbstractNode node) { + if (node instanceof ObjectNode) { + final ObjectNode objectNode = (ObjectNode) node; + if (objectNode.get("schema") != null) { + return objectNode; + } + } + return findSchemaNode(node.getParent()); + } + + private ExampleDataProvider getDataProvider() throws CoreException { + final IConfigurationElement[] configurationElementsFor = Platform.getExtensionRegistry() + .getConfigurationElementsFor("com.reprezen.swagedit.openapi3.exampleprovider"); + return (ExampleDataProvider) configurationElementsFor[0].createExecutableExtension("class"); + } + +// private JsonNode getPointer(AbstractNode node) { +// final FileEditorInput activeEditorInput = DocumentUtils.getActiveEditorInput(); +// final OpenApi3Document openApi3Document = new OpenApi3Document(); +// try { +// openApi3Document.set(DocumentUtils.getDocumentContent(activeEditorInput.getPath())); +// return openApi3Document.asJson().at(node.getParent().getPointer()); +// } catch (IOException e) { +// // TODO: Handle exception +// } +// return null; +// } + +// @Override +// public Collection getProposals(TypeDefinition type, AbstractNode node, String prefix) { +// final FileEditorInput activeEditorInput = DocumentUtils.getActiveEditorInput(); +// try { +// final OpenApi3Document openApi3Document = new OpenApi3Document(); +// openApi3Document.set(DocumentUtils.getDocumentContent(activeEditorInput.getPath())); +// +// final JsonNode at = openApi3Document.asJson().at(node.getParent().getPointer()); +// JsonNode jsonNode = at.get("schema"); +// System.out.println(jsonNode); +// +// final AbstractNode abstractNode = node.getParent().get("schema"); +// final JsonReference create = factory.create(abstractNode); +// +// final JsonNode resolve = create.resolve(openApi3Document, activeEditorInput.getURI()); +// normalize(resolve, openApi3Document, activeEditorInput.getURI()); +// return Arrays.asList( +// new ProposalDescriptor("Generate Example").replacementString(resolve.toString()).type("string")); +// } catch (IOException e1) { +// return Arrays +// .asList(new ProposalDescriptor("Generate Example").replacementString("example:").type("string")); +// } +// +// } +// +// private void normalize(JsonNode node, OpenApi3Document document, URI baseURI) { +// node.fields().forEachRemaining(entry -> { +// JsonNode value = entry.getValue(); +// if (isReference(value)) { +// JsonReference reference = factory.create(value); +// value = reference.resolve(document, baseURI); +// +// if (value != null && !value.isMissingNode()) { +// ((ObjectNode) node).set(entry.getKey(), value); +// } +// } +// +// normalize(value, document, baseURI); +// }); +// } + +} diff --git a/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/editor/OpenApi3Editor.java b/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/editor/OpenApi3Editor.java index a9937184..f98e63e2 100644 --- a/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/editor/OpenApi3Editor.java +++ b/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/editor/OpenApi3Editor.java @@ -56,6 +56,12 @@ public class OpenApi3Editor extends JsonEditor { } } }; + + @Override + public boolean isDirty() { + // TODO Auto-generated method stub + return super.isDirty(); + } public OpenApi3Editor() { super(new OpenApi3DocumentProvider(), // From 24499d90d8c0c423d8f6478c931ee6e3dc9aa50a Mon Sep 17 00:00:00 2001 From: nbhusare Date: Sat, 30 Mar 2019 11:59:33 -0400 Subject: [PATCH 02/18] Passing the JSONDocument instance to all the ContentAssistExt classes Updated the ExampleDataContentAssistExt class to get the Schema object and resolve it before passing to the extendion implementation --- .../assist/JsonContentAssistProcessor.java | 2 +- .../core/assist/JsonProposalProvider.java | 25 ++-- .../core/assist/ext/ContentAssistExt.java | 3 +- .../assist/ext/MediaTypeContentAssistExt.java | 3 +- .../ext/ResponseCodeContentAssistExt.java | 3 +- .../assist/ext/CallbacksContentAssistExt.java | 3 +- .../ext/ExampleDataContentAssistExt.java | 133 ++++++++---------- .../ext/ParameterInContentAssistExt.java | 3 +- .../ext/SchemaFormatContentAssistExt.java | 3 +- .../ext/SchemaTypeContentAssistExt.java | 3 +- 10 files changed, 85 insertions(+), 96 deletions(-) diff --git a/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/JsonContentAssistProcessor.java b/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/JsonContentAssistProcessor.java index 88acaccb..28f6a6b0 100644 --- a/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/JsonContentAssistProcessor.java +++ b/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/JsonContentAssistProcessor.java @@ -146,7 +146,7 @@ public ICompletionProposal[] computeCompletionProposals(ITextViewer viewer, int kaizenProposals = referenceProposalProvider.getProposals(currentPath, document, currentScope); } else { clearStatus(); - kaizenProposals = proposalProvider.getProposals(currentPath, currentModel, prefix); + kaizenProposals = proposalProvider.getProposals(currentPath, currentModel, prefix, document); } final Collection proposals = getCompletionProposals(kaizenProposals, prefix, documentOffset, selection.getText()); diff --git a/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/JsonProposalProvider.java b/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/JsonProposalProvider.java index c775ff4b..ac884c75 100644 --- a/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/JsonProposalProvider.java +++ b/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/JsonProposalProvider.java @@ -23,6 +23,7 @@ import com.fasterxml.jackson.core.JsonPointer; import com.fasterxml.jackson.databind.JsonNode; import com.reprezen.swagedit.core.assist.ext.ContentAssistExt; +import com.reprezen.swagedit.core.editor.JsonDocument; import com.reprezen.swagedit.core.model.AbstractNode; import com.reprezen.swagedit.core.model.Model; import com.reprezen.swagedit.core.schema.ArrayTypeDefinition; @@ -58,12 +59,12 @@ public JsonProposalProvider(ContentAssistExt... extensions) { * @param prefix * @return proposals */ - public Collection getProposals(JsonPointer pointer, Model model, String prefix) { + public Collection getProposals(JsonPointer pointer, Model model, String prefix, JsonDocument jsonDocument) { final AbstractNode node = model.find(pointer); if (node == null) { return Collections.emptyList(); } - return getProposals(node.getType(), node, prefix); + return getProposals(node.getType(), node, prefix, jsonDocument); } /** @@ -73,8 +74,8 @@ public Collection getProposals(JsonPointer pointer, Model mo * @param model * @return proposals */ - public Collection getProposals(JsonPointer pointer, Model model) { - return getProposals(pointer, model, null); + public Collection getProposals(JsonPointer pointer, Model model, JsonDocument jsonDocument) { + return getProposals(pointer, model, null, jsonDocument); } /** @@ -83,18 +84,18 @@ public Collection getProposals(JsonPointer pointer, Model mo * @param node * @return proposals */ - public Collection getProposals(AbstractNode node) { - return getProposals(node.getType(), node, null); + public Collection getProposals(AbstractNode node, JsonDocument jsonDocument) { + return getProposals(node.getType(), node, null, jsonDocument); } - protected Collection getProposals(TypeDefinition type, AbstractNode node, String prefix) { + protected Collection getProposals(TypeDefinition type, AbstractNode node, String prefix, JsonDocument jsonDocument) { if (type instanceof ReferenceTypeDefinition) { type = ((ReferenceTypeDefinition) type).resolve(); } ContentAssistExt ext = findExtension(type); if (ext != null) { - return ext.getProposals(type, node, prefix); + return ext.getProposals(type, node, prefix, jsonDocument); } switch (type.getType()) { @@ -113,12 +114,12 @@ protected Collection getProposals(TypeDefinition type, Abstr case ALL_OF: case ANY_OF: case ONE_OF: - return createComplextTypeProposals((ComplexTypeDefinition) type, node, prefix); + return createComplextTypeProposals((ComplexTypeDefinition) type, node, prefix, jsonDocument); case UNDEFINED: Collection proposals = new LinkedHashSet<>(); if (type instanceof MultipleTypeDefinition) { for (TypeDefinition currentType : ((MultipleTypeDefinition) type).getMultipleTypes()) { - proposals.addAll(getProposals(currentType, node, prefix)); + proposals.addAll(getProposals(currentType, node, prefix, jsonDocument)); } } return proposals; @@ -226,11 +227,11 @@ protected Collection createArrayProposals(ArrayTypeDefinitio } protected Collection createComplextTypeProposals(ComplexTypeDefinition type, AbstractNode node, - String prefix) { + String prefix, JsonDocument jsonDocument) { final Collection proposals = new LinkedHashSet<>(); for (TypeDefinition definition : type.getComplexTypes()) { - proposals.addAll(getProposals(definition, node, prefix)); + proposals.addAll(getProposals(definition, node, prefix, jsonDocument)); } return proposals; diff --git a/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/ext/ContentAssistExt.java b/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/ext/ContentAssistExt.java index 362c5628..8ac01585 100644 --- a/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/ext/ContentAssistExt.java +++ b/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/ext/ContentAssistExt.java @@ -13,6 +13,7 @@ import java.util.Collection; import com.reprezen.swagedit.core.assist.ProposalDescriptor; +import com.reprezen.swagedit.core.editor.JsonDocument; import com.reprezen.swagedit.core.model.AbstractNode; import com.reprezen.swagedit.core.schema.TypeDefinition; @@ -38,6 +39,6 @@ public interface ContentAssistExt { * @param prefix * @return proposals */ - Collection getProposals(TypeDefinition type, AbstractNode node, String prefix); + Collection getProposals(TypeDefinition type, AbstractNode node, String prefix, JsonDocument jsonDocument); } diff --git a/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/ext/MediaTypeContentAssistExt.java b/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/ext/MediaTypeContentAssistExt.java index cb4d3b60..e99152ea 100644 --- a/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/ext/MediaTypeContentAssistExt.java +++ b/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/ext/MediaTypeContentAssistExt.java @@ -22,6 +22,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.reprezen.swagedit.core.Activator; import com.reprezen.swagedit.core.assist.ProposalDescriptor; +import com.reprezen.swagedit.core.editor.JsonDocument; import com.reprezen.swagedit.core.model.AbstractNode; import com.reprezen.swagedit.core.schema.ArrayTypeDefinition; import com.reprezen.swagedit.core.schema.TypeDefinition; @@ -65,7 +66,7 @@ public boolean canProvideContentAssist(TypeDefinition type) { } @Override - public Collection getProposals(TypeDefinition type, AbstractNode node, String prefix) { + public Collection getProposals(TypeDefinition type, AbstractNode node, String prefix, JsonDocument jsonDocument) { Collection proposals = new ArrayList<>(); prefix = StringUtils.emptyToNull(prefix); diff --git a/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/ext/ResponseCodeContentAssistExt.java b/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/ext/ResponseCodeContentAssistExt.java index 4a537d07..4046a636 100644 --- a/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/ext/ResponseCodeContentAssistExt.java +++ b/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/ext/ResponseCodeContentAssistExt.java @@ -24,6 +24,7 @@ import com.fasterxml.jackson.databind.node.ArrayNode; import com.reprezen.swagedit.core.Activator; import com.reprezen.swagedit.core.assist.ProposalDescriptor; +import com.reprezen.swagedit.core.editor.JsonDocument; import com.reprezen.swagedit.core.model.AbstractNode; import com.reprezen.swagedit.core.schema.TypeDefinition; import com.reprezen.swagedit.core.utils.StringUtils; @@ -59,7 +60,7 @@ public boolean canProvideContentAssist(TypeDefinition type) { } @Override - public Collection getProposals(TypeDefinition type, AbstractNode node, String prefix) { + public Collection getProposals(TypeDefinition type, AbstractNode node, String prefix, JsonDocument jsonDocument) { Collection proposals = new ArrayList<>(); for (Iterator it = statusCodes(prefix); it.hasNext();) { diff --git a/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/assist/ext/CallbacksContentAssistExt.java b/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/assist/ext/CallbacksContentAssistExt.java index 383bc774..a78308ea 100644 --- a/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/assist/ext/CallbacksContentAssistExt.java +++ b/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/assist/ext/CallbacksContentAssistExt.java @@ -16,6 +16,7 @@ import com.fasterxml.jackson.core.JsonPointer; import com.reprezen.swagedit.core.assist.ProposalDescriptor; import com.reprezen.swagedit.core.assist.ext.ContentAssistExt; +import com.reprezen.swagedit.core.editor.JsonDocument; import com.reprezen.swagedit.core.model.AbstractNode; import com.reprezen.swagedit.core.schema.TypeDefinition; @@ -29,7 +30,7 @@ public boolean canProvideContentAssist(TypeDefinition type) { } @Override - public Collection getProposals(TypeDefinition type, AbstractNode node, String prefix) { + public Collection getProposals(TypeDefinition type, AbstractNode node, String prefix, JsonDocument jsonDocument) { return Arrays.asList( // new ProposalDescriptor("x-:").replacementString("x-").type("specificationExtension")); } diff --git a/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/assist/ext/ExampleDataContentAssistExt.java b/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/assist/ext/ExampleDataContentAssistExt.java index 77946c18..078b8ffb 100644 --- a/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/assist/ext/ExampleDataContentAssistExt.java +++ b/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/assist/ext/ExampleDataContentAssistExt.java @@ -3,19 +3,26 @@ */ package com.reprezen.swagedit.openapi3.assist.ext; +import static com.reprezen.swagedit.core.json.references.JsonReference.isReference; + +import java.net.URI; import java.util.Arrays; import java.util.Collection; import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IConfigurationElement; -import org.eclipse.core.runtime.Platform; import com.fasterxml.jackson.core.JsonPointer; +import com.fasterxml.jackson.databind.JsonNode; import com.reprezen.swagedit.core.assist.ProposalDescriptor; import com.reprezen.swagedit.core.assist.ext.ContentAssistExt; +import com.reprezen.swagedit.core.editor.JsonDocument; +import com.reprezen.swagedit.core.json.references.JsonReference; +import com.reprezen.swagedit.core.json.references.JsonReferenceFactory; import com.reprezen.swagedit.core.model.AbstractNode; -import com.reprezen.swagedit.core.model.ObjectNode; import com.reprezen.swagedit.core.schema.TypeDefinition; +import com.reprezen.swagedit.core.utils.DocumentUtils; +import com.reprezen.swagedit.core.utils.ExtensionUtils; +import com.reprezen.swagedit.core.utils.ModelUtils; import com.reprezen.swagedit.openapi3.ExampleDataProvider; public class ExampleDataContentAssistExt implements ContentAssistExt { @@ -25,96 +32,70 @@ public class ExampleDataContentAssistExt implements ContentAssistExt { private static final ProposalDescriptor defaultProposal = new ProposalDescriptor("Generate Example") .replacementString("example:").type("string"); + private static final String extensionPointName = "com.reprezen.swagedit.openapi3.exampleprovider"; + @Override public boolean canProvideContentAssist(TypeDefinition type) { return type != null && type.getPointer() != null && pointer.equals(type.getPointer()); } @Override - public Collection getProposals(TypeDefinition type, AbstractNode node, String prefix) { - final AbstractNode schemaNode = findSchemaNode(node); + public Collection getProposals(TypeDefinition type, AbstractNode node, String prefix, + JsonDocument jsonDocument) { + final JsonNode jsonSchemaNode = getSchemaNode(node, jsonDocument); + // TODO: Can the jsonschemaNode be null??? + new JsonSchemaNormalizer(jsonDocument, DocumentUtils.getActiveEditorInputURI()).normalize(jsonSchemaNode); try { - final ExampleDataProvider exampleDataProvider = (ExampleDataProvider) getDataProvider(); - if (exampleDataProvider != null) { - return Arrays.asList(new ProposalDescriptor("Generate Example:") - .replacementString(exampleDataProvider.getData(schemaNode.getPointerString())).type("string")); - } else { - return Arrays.asList(defaultProposal); - } + final ExampleDataProvider exampleDataProvider = (ExampleDataProvider) getExampleDataProvider(); + final String exampleData = exampleDataProvider.getData(jsonSchemaNode); + return Arrays + .asList(new ProposalDescriptor("Generate Example:").replacementString(exampleData).type("string")); } catch (CoreException e) { + // TODO: Log a message here and then return the default proposal return Arrays.asList(defaultProposal); } } - private AbstractNode findSchemaNode(AbstractNode node) { - if (node instanceof ObjectNode) { - final ObjectNode objectNode = (ObjectNode) node; - if (objectNode.get("schema") != null) { - return objectNode; - } - } - return findSchemaNode(node.getParent()); + private JsonNode getSchemaNode(AbstractNode node, JsonDocument jsonDocument) { + final AbstractNode schemaNode = ModelUtils.getParentNode(node, "schema"); + // TODO: What happens if there is no schema node????? + final JsonPointer schemaPointer = JsonPointer.compile(schemaNode.getPointerString()); + return jsonDocument.asJson().at(schemaPointer); } - private ExampleDataProvider getDataProvider() throws CoreException { - final IConfigurationElement[] configurationElementsFor = Platform.getExtensionRegistry() - .getConfigurationElementsFor("com.reprezen.swagedit.openapi3.exampleprovider"); - return (ExampleDataProvider) configurationElementsFor[0].createExecutableExtension("class"); + private ExampleDataProvider getExampleDataProvider() throws CoreException { + return (ExampleDataProvider) ExtensionUtils.createExecutableExtension(extensionPointName, "class"); } -// private JsonNode getPointer(AbstractNode node) { -// final FileEditorInput activeEditorInput = DocumentUtils.getActiveEditorInput(); -// final OpenApi3Document openApi3Document = new OpenApi3Document(); -// try { -// openApi3Document.set(DocumentUtils.getDocumentContent(activeEditorInput.getPath())); -// return openApi3Document.asJson().at(node.getParent().getPointer()); -// } catch (IOException e) { -// // TODO: Handle exception -// } -// return null; -// } - -// @Override -// public Collection getProposals(TypeDefinition type, AbstractNode node, String prefix) { -// final FileEditorInput activeEditorInput = DocumentUtils.getActiveEditorInput(); -// try { -// final OpenApi3Document openApi3Document = new OpenApi3Document(); -// openApi3Document.set(DocumentUtils.getDocumentContent(activeEditorInput.getPath())); -// -// final JsonNode at = openApi3Document.asJson().at(node.getParent().getPointer()); -// JsonNode jsonNode = at.get("schema"); -// System.out.println(jsonNode); -// -// final AbstractNode abstractNode = node.getParent().get("schema"); -// final JsonReference create = factory.create(abstractNode); -// -// final JsonNode resolve = create.resolve(openApi3Document, activeEditorInput.getURI()); -// normalize(resolve, openApi3Document, activeEditorInput.getURI()); -// return Arrays.asList( -// new ProposalDescriptor("Generate Example").replacementString(resolve.toString()).type("string")); -// } catch (IOException e1) { -// return Arrays -// .asList(new ProposalDescriptor("Generate Example").replacementString("example:").type("string")); -// } -// -// } -// -// private void normalize(JsonNode node, OpenApi3Document document, URI baseURI) { -// node.fields().forEachRemaining(entry -> { -// JsonNode value = entry.getValue(); -// if (isReference(value)) { -// JsonReference reference = factory.create(value); -// value = reference.resolve(document, baseURI); -// -// if (value != null && !value.isMissingNode()) { -// ((ObjectNode) node).set(entry.getKey(), value); -// } -// } -// -// normalize(value, document, baseURI); -// }); -// } + private static class JsonSchemaNormalizer { + + private final JsonDocument document; + private final URI baseURI; + + private static final JsonReferenceFactory factory = new JsonReferenceFactory(); + + public JsonSchemaNormalizer(JsonDocument document, URI baseURI) { + this.document = document; + this.baseURI = baseURI; + } + + private void normalize(JsonNode node) { + node.fields().forEachRemaining(entry -> { + JsonNode value = entry.getValue(); + if (isReference(value)) { + final JsonReference reference = factory.create(value); + value = reference.resolve(document, baseURI); + + if (value != null && !value.isMissingNode()) { + ((com.fasterxml.jackson.databind.node.ObjectNode) node).set(entry.getKey(), value); + } + } + normalize(value); + }); + } + + } } diff --git a/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/assist/ext/ParameterInContentAssistExt.java b/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/assist/ext/ParameterInContentAssistExt.java index 6d282c78..ca272dea 100644 --- a/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/assist/ext/ParameterInContentAssistExt.java +++ b/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/assist/ext/ParameterInContentAssistExt.java @@ -16,6 +16,7 @@ import com.fasterxml.jackson.core.JsonPointer; import com.reprezen.swagedit.core.assist.ProposalDescriptor; import com.reprezen.swagedit.core.assist.ext.ContentAssistExt; +import com.reprezen.swagedit.core.editor.JsonDocument; import com.reprezen.swagedit.core.model.AbstractNode; import com.reprezen.swagedit.core.schema.TypeDefinition; @@ -30,7 +31,7 @@ public boolean canProvideContentAssist(TypeDefinition type) { } @Override - public Collection getProposals(TypeDefinition type, AbstractNode node, String prefix) { + public Collection getProposals(TypeDefinition type, AbstractNode node, String prefix, JsonDocument jsonDocument) { return Arrays.asList( // new ProposalDescriptor("query").replacementString("query").description(description).type("string"), new ProposalDescriptor("header").replacementString("header").description(description).type("string"), diff --git a/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/assist/ext/SchemaFormatContentAssistExt.java b/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/assist/ext/SchemaFormatContentAssistExt.java index a06f6bc1..b9eccb83 100644 --- a/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/assist/ext/SchemaFormatContentAssistExt.java +++ b/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/assist/ext/SchemaFormatContentAssistExt.java @@ -24,6 +24,7 @@ import com.fasterxml.jackson.core.JsonPointer; import com.reprezen.swagedit.core.assist.ProposalDescriptor; import com.reprezen.swagedit.core.assist.ext.ContentAssistExt; +import com.reprezen.swagedit.core.editor.JsonDocument; import com.reprezen.swagedit.core.model.AbstractNode; import com.reprezen.swagedit.core.schema.TypeDefinition; @@ -61,7 +62,7 @@ public boolean canProvideContentAssist(TypeDefinition type) { } @Override - public Collection getProposals(TypeDefinition type, AbstractNode node, String prefix) { + public Collection getProposals(TypeDefinition type, AbstractNode node, String prefix, JsonDocument jsonDocument) { List proposals = new ArrayList<>(); if (node.getParent() != null && node.getParent().get("type") != null) { diff --git a/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/assist/ext/SchemaTypeContentAssistExt.java b/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/assist/ext/SchemaTypeContentAssistExt.java index c0572d3a..a71b75a4 100644 --- a/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/assist/ext/SchemaTypeContentAssistExt.java +++ b/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/assist/ext/SchemaTypeContentAssistExt.java @@ -16,6 +16,7 @@ import com.fasterxml.jackson.core.JsonPointer; import com.reprezen.swagedit.core.assist.ProposalDescriptor; import com.reprezen.swagedit.core.assist.ext.ContentAssistExt; +import com.reprezen.swagedit.core.editor.JsonDocument; import com.reprezen.swagedit.core.model.AbstractNode; import com.reprezen.swagedit.core.schema.TypeDefinition; @@ -29,7 +30,7 @@ public boolean canProvideContentAssist(TypeDefinition type) { } @Override - public Collection getProposals(TypeDefinition type, AbstractNode node, String prefix) { + public Collection getProposals(TypeDefinition type, AbstractNode node, String prefix, JsonDocument jsonDocument) { return Arrays.asList( // new ProposalDescriptor("array").replacementString("array").type("enum"), // new ProposalDescriptor("boolean").replacementString("boolean").type("enum"), // From 01af071ee92a6688ccd1a85db04782c2f435d78f Mon Sep 17 00:00:00 2001 From: nbhusare Date: Sat, 30 Mar 2019 12:00:56 -0400 Subject: [PATCH 03/18] Updated the getData method parameter to take a JsonNode as param --- .../com/reprezen/swagedit/openapi3/ExampleDataProvider.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/ExampleDataProvider.java b/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/ExampleDataProvider.java index 54de37cb..0d6567df 100644 --- a/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/ExampleDataProvider.java +++ b/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/ExampleDataProvider.java @@ -10,7 +10,9 @@ *******************************************************************************/ package com.reprezen.swagedit.openapi3; +import com.fasterxml.jackson.databind.JsonNode; + public interface ExampleDataProvider { - String getData(String json); + String getData(JsonNode schemaNode); } From ac4843a67baa048e0a97ee153d9dcd83f1c52ac9 Mon Sep 17 00:00:00 2001 From: nbhusare Date: Sat, 30 Mar 2019 12:01:53 -0400 Subject: [PATCH 04/18] Updated DocumentUtils to provide the URI of the document instance Added new Utility API namely ExtensionUtils and ModelUtils --- .../swagedit/core/utils/DocumentUtils.java | 5 +++++ .../swagedit/core/utils/ExtensionUtils.java | 15 ++++++++++++++ .../swagedit/core/utils/ModelUtils.java | 20 +++++++++++++++++++ 3 files changed, 40 insertions(+) create mode 100644 com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/utils/ExtensionUtils.java create mode 100644 com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/utils/ModelUtils.java diff --git a/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/utils/DocumentUtils.java b/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/utils/DocumentUtils.java index b26406ff..3d4df2e9 100644 --- a/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/utils/DocumentUtils.java +++ b/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/utils/DocumentUtils.java @@ -49,6 +49,11 @@ public static FileEditorInput getActiveEditorInput() { return input instanceof FileEditorInput ? (FileEditorInput) input : null; } + + public static URI getActiveEditorInputURI() { + final FileEditorInput activeEditorInput = getActiveEditorInput(); + return activeEditorInput != null ? activeEditorInput.getURI() : null; + } /** * Returns the swagger document if exists for the given path. diff --git a/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/utils/ExtensionUtils.java b/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/utils/ExtensionUtils.java new file mode 100644 index 00000000..18f43fd2 --- /dev/null +++ b/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/utils/ExtensionUtils.java @@ -0,0 +1,15 @@ +package com.reprezen.swagedit.core.utils; + +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IConfigurationElement; +import org.eclipse.core.runtime.Platform; + +public class ExtensionUtils { + + public static Object createExecutableExtension(String extensionPointId, String propertyName) throws CoreException { + final IConfigurationElement[] configurationElementsFor = Platform.getExtensionRegistry() + .getConfigurationElementsFor(extensionPointId); + return configurationElementsFor[0].createExecutableExtension(propertyName); + } + +} diff --git a/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/utils/ModelUtils.java b/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/utils/ModelUtils.java new file mode 100644 index 00000000..a28d7907 --- /dev/null +++ b/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/utils/ModelUtils.java @@ -0,0 +1,20 @@ +package com.reprezen.swagedit.core.utils; + +import com.reprezen.swagedit.core.model.AbstractNode; +import com.reprezen.swagedit.core.model.ObjectNode; + +public class ModelUtils { + + public static AbstractNode getParentNode(AbstractNode node, String name) { + if (node instanceof ObjectNode) { + final ObjectNode objectNode = (ObjectNode) node; + if (objectNode.get(name) != null) { + return objectNode; + } + } + + //TODO: Can node.getParent() be null????? Please check. + + return getParentNode(node.getParent(), name); + } +} From b69171e52e055ed274aa79ed633dc7eb511d053a Mon Sep 17 00:00:00 2001 From: nbhusare Date: Sat, 30 Mar 2019 12:20:41 -0400 Subject: [PATCH 05/18] Fixed the compilation issues in the unit-test --- ...eferenceProposalProvider_Quotes_Test.xtend | 2 +- .../JsonReferenceProposalProviderTest.xtend | 2 +- .../assist/SwaggerProposalProviderTest.xtend | 29 ++++++++++--------- 3 files changed, 17 insertions(+), 16 deletions(-) diff --git a/com.reprezen.swagedit.openapi3.tests/src/com/reprezen/swagedit/openapi3/assist/JsonReferenceProposalProvider_Quotes_Test.xtend b/com.reprezen.swagedit.openapi3.tests/src/com/reprezen/swagedit/openapi3/assist/JsonReferenceProposalProvider_Quotes_Test.xtend index 349bf543..4191a73b 100644 --- a/com.reprezen.swagedit.openapi3.tests/src/com/reprezen/swagedit/openapi3/assist/JsonReferenceProposalProvider_Quotes_Test.xtend +++ b/com.reprezen.swagedit.openapi3.tests/src/com/reprezen/swagedit/openapi3/assist/JsonReferenceProposalProvider_Quotes_Test.xtend @@ -147,7 +147,7 @@ components: MyType: properties: prop1: - «ref» + «ref» ''' } diff --git a/com.reprezen.swagedit.tests/src/com/reprezen/swagedit/assist/JsonReferenceProposalProviderTest.xtend b/com.reprezen.swagedit.tests/src/com/reprezen/swagedit/assist/JsonReferenceProposalProviderTest.xtend index cb8c8910..940744f3 100644 --- a/com.reprezen.swagedit.tests/src/com/reprezen/swagedit/assist/JsonReferenceProposalProviderTest.xtend +++ b/com.reprezen.swagedit.tests/src/com/reprezen/swagedit/assist/JsonReferenceProposalProviderTest.xtend @@ -10,6 +10,7 @@ *******************************************************************************/ package com.reprezen.swagedit.assist +import com.reprezen.swagedit.core.assist.ProposalDescriptor import com.reprezen.swagedit.core.assist.contexts.RegexContextType import com.reprezen.swagedit.core.utils.SwaggerFileFinder.Scope import com.reprezen.swagedit.editor.SwaggerDocument @@ -20,7 +21,6 @@ import org.junit.Test import static org.hamcrest.core.IsCollectionContaining.* import static org.junit.Assert.* -import com.reprezen.swagedit.core.assist.ProposalDescriptor class JsonReferenceProposalProviderTest { diff --git a/com.reprezen.swagedit.tests/src/com/reprezen/swagedit/assist/SwaggerProposalProviderTest.xtend b/com.reprezen.swagedit.tests/src/com/reprezen/swagedit/assist/SwaggerProposalProviderTest.xtend index 2c21b64f..08e772f9 100644 --- a/com.reprezen.swagedit.tests/src/com/reprezen/swagedit/assist/SwaggerProposalProviderTest.xtend +++ b/com.reprezen.swagedit.tests/src/com/reprezen/swagedit/assist/SwaggerProposalProviderTest.xtend @@ -12,6 +12,7 @@ import static org.hamcrest.core.IsCollectionContaining.* import static org.junit.Assert.* import com.reprezen.swagedit.schema.SwaggerSchema import com.reprezen.swagedit.core.assist.JsonProposalProvider +import com.reprezen.swagedit.editor.SwaggerDocument class SwaggerProposalProviderTest { @@ -31,7 +32,7 @@ class SwaggerProposalProviderTest { val node = model.objectNode(null, "".ptr) node.type = schema.getType(node) - assertThat(provider.getProposals(node).map[getReplacementString], hasItems( + assertThat(provider.getProposals(node, new SwaggerDocument()).map[getReplacementString], hasItems( "swagger:", "info:", "host:", @@ -56,7 +57,7 @@ class SwaggerProposalProviderTest { val node = model.valueNode(null, "/swagger".ptr, null) node.type = schema.getType(node) - assertThat(provider.getProposals(node).map [ + assertThat(provider.getProposals(node, new SwaggerDocument()).map [ getReplacementString ], hasItems("\"2.0\"")) } @@ -66,7 +67,7 @@ class SwaggerProposalProviderTest { val node = model.objectNode(null, "/info".ptr) node.type = schema.getType(node) - assertThat(provider.getProposals(node).map [ + assertThat(provider.getProposals(node, new SwaggerDocument()).map [ getReplacementString ], hasItems( "title:", @@ -83,7 +84,7 @@ class SwaggerProposalProviderTest { val node = model.arrayNode(null, "/schemes".ptr) node.type = schema.getType(node) - assertThat(provider.getProposals(node).map [ + assertThat(provider.getProposals(node, new SwaggerDocument()).map [ getReplacementString ], hasItems( "- http", @@ -98,7 +99,7 @@ class SwaggerProposalProviderTest { val node = model.objectNode(null, "/paths".ptr) node.type = schema.getType(node) - assertThat(provider.getProposals(node).map [ + assertThat(provider.getProposals(node, new SwaggerDocument()).map [ getReplacementString ], hasItems( "/:", @@ -111,7 +112,7 @@ class SwaggerProposalProviderTest { val node = model.objectNode(null, "/definitions".ptr) node.type = schema.getType(node) - assertThat(provider.getProposals(node).map [ + assertThat(provider.getProposals(node, new SwaggerDocument()).map [ getReplacementString ], hasItems( "(schema name):" @@ -123,7 +124,7 @@ class SwaggerProposalProviderTest { val node = model.objectNode(null, "/definitions/MyType/properties".ptr) node.type = schema.getType(node) - assertThat(provider.getProposals(node).map [ + assertThat(provider.getProposals(node, new SwaggerDocument()).map [ getReplacementString ], hasItems( "(property name):" @@ -135,7 +136,7 @@ class SwaggerProposalProviderTest { val node = model.objectNode(null, "/paths/~1/get".ptr) node.type = schema.getType(node) - assertThat(provider.getProposals(node).map [ + assertThat(provider.getProposals(node, new SwaggerDocument()).map [ getReplacementString ], hasItems( "tags:", @@ -159,7 +160,7 @@ class SwaggerProposalProviderTest { val node = model.arrayNode(null, "/paths/~1/get/parameters".ptr) node.type = schema.getType(node) - assertThat(provider.getProposals(node).map [ + assertThat(provider.getProposals(node, new SwaggerDocument()).map [ getReplacementString ], hasItems( "-" @@ -171,7 +172,7 @@ class SwaggerProposalProviderTest { val node = model.valueNode(null, "/paths/~1/get/parameters/0/in".ptr, null) node.type = schema.getType(node) - assertThat(provider.getProposals(node).map [ + assertThat(provider.getProposals(node, new SwaggerDocument()).map [ getReplacementString ], hasItems( "header", @@ -187,7 +188,7 @@ class SwaggerProposalProviderTest { val node = model.objectNode(null, "/paths/~1/get/responses/200".ptr) node.type = schema.getType(node) - assertThat(provider.getProposals(node).map [ + assertThat(provider.getProposals(node, new SwaggerDocument()).map [ getReplacementString ], hasItems( "description:", @@ -206,7 +207,7 @@ class SwaggerProposalProviderTest { assertTrue(node.type instanceof MultipleTypeDefinition) - assertThat(provider.getProposals(node).map [ + assertThat(provider.getProposals(node, new SwaggerDocument()).map [ getReplacementString ], hasItems( "", @@ -229,7 +230,7 @@ class SwaggerProposalProviderTest { assertEquals(JsonType.ONE_OF, node.type.type) - val values = provider.getProposals(node).map [ + val values = provider.getProposals(node, new SwaggerDocument()).map [ getReplacementString ] @@ -241,7 +242,7 @@ class SwaggerProposalProviderTest { val node = model.objectNode(null, "/paths/~1foo/get/responses/200/schema/type".ptr) node.type = schema.getType(node) - val values = provider.getProposals(node).map [ + val values = provider.getProposals(node, new SwaggerDocument()).map [ getReplacementString ] From 6840dbb90a5bc4156950764a449297695e57cc77 Mon Sep 17 00:00:00 2001 From: nbhusare Date: Tue, 2 Apr 2019 19:11:43 -0400 Subject: [PATCH 06/18] Added an extension to the JsonReferenceProposalProvider, namely OpenApi3ExampleProposalProvider which gets trigger when the user hits content assit at a location where example or examples/example-name/value is required. It internally calls the ExampleDataProvider to get the example data. Reverted back the changes made to the existing codebase --- .../assist/JsonContentAssistProcessor.java | 30 +++- .../core/assist/JsonProposalProvider.java | 25 ++- .../core/assist/ext/ContentAssistExt.java | 2 +- .../assist/ext/MediaTypeContentAssistExt.java | 3 +- .../ext/ResponseCodeContentAssistExt.java | 3 +- .../swagedit/core/utils/ModelUtils.java | 35 +++- ...eferenceProposalProvider_Quotes_Test.xtend | 2 +- .../OpenApi3ContentAssistProcessor.java | 10 +- .../OpenApi3ExampleProposalProvider.java | 159 ++++++++++++++++++ .../assist/ext/CallbacksContentAssistExt.java | 3 +- .../ext/ExampleDataContentAssistExt.java | 101 ----------- .../ext/ParameterInContentAssistExt.java | 3 +- .../ext/SchemaFormatContentAssistExt.java | 3 +- .../ext/SchemaTypeContentAssistExt.java | 3 +- .../assist/SwaggerProposalProviderTest.xtend | 29 ++-- .../assist/SwaggerContentAssistProcessor.java | 2 +- 16 files changed, 247 insertions(+), 166 deletions(-) create mode 100644 com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/assist/OpenApi3ExampleProposalProvider.java delete mode 100644 com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/assist/ext/ExampleDataContentAssistExt.java diff --git a/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/JsonContentAssistProcessor.java b/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/JsonContentAssistProcessor.java index 28f6a6b0..b7732ccc 100644 --- a/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/JsonContentAssistProcessor.java +++ b/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/JsonContentAssistProcessor.java @@ -67,6 +67,7 @@ public abstract class JsonContentAssistProcessor extends TemplateCompletionProce private final JsonProposalProvider proposalProvider; private final JsonReferenceProposalProvider referenceProposalProvider; + private final JsonReferenceProposalProvider exampleProposalProvider; private final ContentAssistant contentAssistant; /** @@ -93,15 +94,19 @@ public abstract class JsonContentAssistProcessor extends TemplateCompletionProce public JsonContentAssistProcessor(ContentAssistant ca, String fileContentType) { this(ca, new JsonProposalProvider(), + new JsonReferenceProposalProvider(ContextType.emptyContentTypeCollection(), fileContentType), new JsonReferenceProposalProvider(ContextType.emptyContentTypeCollection(), fileContentType)); } - - public JsonContentAssistProcessor(ContentAssistant ca, JsonProposalProvider proposalProvider, JsonReferenceProposalProvider referenceProposalProvider) { - this.contentAssistant = ca; - this.proposalProvider = proposalProvider; - this.referenceProposalProvider = referenceProposalProvider; - this.textMessages = initTextMessages(); - } + + public JsonContentAssistProcessor(ContentAssistant ca, JsonProposalProvider proposalProvider, + JsonReferenceProposalProvider referenceProposalProvider, + JsonReferenceProposalProvider exampleProposalProvider) { + this.contentAssistant = ca; + this.proposalProvider = proposalProvider; + this.referenceProposalProvider = referenceProposalProvider; + this.exampleProposalProvider = exampleProposalProvider; + this.textMessages = initTextMessages(); + } protected abstract TemplateStore getTemplateStore(); @@ -145,8 +150,15 @@ public ICompletionProposal[] computeCompletionProposals(ITextViewer viewer, int updateStatus(); kaizenProposals = referenceProposalProvider.getProposals(currentPath, document, currentScope); } else { - clearStatus(); - kaizenProposals = proposalProvider.getProposals(currentPath, currentModel, prefix, document); + final boolean isExampleCompletion = exampleProposalProvider.canProvideProposal(currentModel, currentPath); + if (isExampleCompletion) { + //TODO: Update or clear status ??????? + kaizenProposals = exampleProposalProvider.getProposals(currentPath, document, currentScope); + } else { + clearStatus(); + kaizenProposals = proposalProvider.getProposals(currentPath, currentModel, prefix); + } + } final Collection proposals = getCompletionProposals(kaizenProposals, prefix, documentOffset, selection.getText()); diff --git a/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/JsonProposalProvider.java b/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/JsonProposalProvider.java index ac884c75..c775ff4b 100644 --- a/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/JsonProposalProvider.java +++ b/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/JsonProposalProvider.java @@ -23,7 +23,6 @@ import com.fasterxml.jackson.core.JsonPointer; import com.fasterxml.jackson.databind.JsonNode; import com.reprezen.swagedit.core.assist.ext.ContentAssistExt; -import com.reprezen.swagedit.core.editor.JsonDocument; import com.reprezen.swagedit.core.model.AbstractNode; import com.reprezen.swagedit.core.model.Model; import com.reprezen.swagedit.core.schema.ArrayTypeDefinition; @@ -59,12 +58,12 @@ public JsonProposalProvider(ContentAssistExt... extensions) { * @param prefix * @return proposals */ - public Collection getProposals(JsonPointer pointer, Model model, String prefix, JsonDocument jsonDocument) { + public Collection getProposals(JsonPointer pointer, Model model, String prefix) { final AbstractNode node = model.find(pointer); if (node == null) { return Collections.emptyList(); } - return getProposals(node.getType(), node, prefix, jsonDocument); + return getProposals(node.getType(), node, prefix); } /** @@ -74,8 +73,8 @@ public Collection getProposals(JsonPointer pointer, Model mo * @param model * @return proposals */ - public Collection getProposals(JsonPointer pointer, Model model, JsonDocument jsonDocument) { - return getProposals(pointer, model, null, jsonDocument); + public Collection getProposals(JsonPointer pointer, Model model) { + return getProposals(pointer, model, null); } /** @@ -84,18 +83,18 @@ public Collection getProposals(JsonPointer pointer, Model mo * @param node * @return proposals */ - public Collection getProposals(AbstractNode node, JsonDocument jsonDocument) { - return getProposals(node.getType(), node, null, jsonDocument); + public Collection getProposals(AbstractNode node) { + return getProposals(node.getType(), node, null); } - protected Collection getProposals(TypeDefinition type, AbstractNode node, String prefix, JsonDocument jsonDocument) { + protected Collection getProposals(TypeDefinition type, AbstractNode node, String prefix) { if (type instanceof ReferenceTypeDefinition) { type = ((ReferenceTypeDefinition) type).resolve(); } ContentAssistExt ext = findExtension(type); if (ext != null) { - return ext.getProposals(type, node, prefix, jsonDocument); + return ext.getProposals(type, node, prefix); } switch (type.getType()) { @@ -114,12 +113,12 @@ protected Collection getProposals(TypeDefinition type, Abstr case ALL_OF: case ANY_OF: case ONE_OF: - return createComplextTypeProposals((ComplexTypeDefinition) type, node, prefix, jsonDocument); + return createComplextTypeProposals((ComplexTypeDefinition) type, node, prefix); case UNDEFINED: Collection proposals = new LinkedHashSet<>(); if (type instanceof MultipleTypeDefinition) { for (TypeDefinition currentType : ((MultipleTypeDefinition) type).getMultipleTypes()) { - proposals.addAll(getProposals(currentType, node, prefix, jsonDocument)); + proposals.addAll(getProposals(currentType, node, prefix)); } } return proposals; @@ -227,11 +226,11 @@ protected Collection createArrayProposals(ArrayTypeDefinitio } protected Collection createComplextTypeProposals(ComplexTypeDefinition type, AbstractNode node, - String prefix, JsonDocument jsonDocument) { + String prefix) { final Collection proposals = new LinkedHashSet<>(); for (TypeDefinition definition : type.getComplexTypes()) { - proposals.addAll(getProposals(definition, node, prefix, jsonDocument)); + proposals.addAll(getProposals(definition, node, prefix)); } return proposals; diff --git a/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/ext/ContentAssistExt.java b/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/ext/ContentAssistExt.java index 8ac01585..4569232b 100644 --- a/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/ext/ContentAssistExt.java +++ b/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/ext/ContentAssistExt.java @@ -39,6 +39,6 @@ public interface ContentAssistExt { * @param prefix * @return proposals */ - Collection getProposals(TypeDefinition type, AbstractNode node, String prefix, JsonDocument jsonDocument); + Collection getProposals(TypeDefinition type, AbstractNode node, String prefix); } diff --git a/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/ext/MediaTypeContentAssistExt.java b/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/ext/MediaTypeContentAssistExt.java index e99152ea..cb4d3b60 100644 --- a/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/ext/MediaTypeContentAssistExt.java +++ b/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/ext/MediaTypeContentAssistExt.java @@ -22,7 +22,6 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.reprezen.swagedit.core.Activator; import com.reprezen.swagedit.core.assist.ProposalDescriptor; -import com.reprezen.swagedit.core.editor.JsonDocument; import com.reprezen.swagedit.core.model.AbstractNode; import com.reprezen.swagedit.core.schema.ArrayTypeDefinition; import com.reprezen.swagedit.core.schema.TypeDefinition; @@ -66,7 +65,7 @@ public boolean canProvideContentAssist(TypeDefinition type) { } @Override - public Collection getProposals(TypeDefinition type, AbstractNode node, String prefix, JsonDocument jsonDocument) { + public Collection getProposals(TypeDefinition type, AbstractNode node, String prefix) { Collection proposals = new ArrayList<>(); prefix = StringUtils.emptyToNull(prefix); diff --git a/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/ext/ResponseCodeContentAssistExt.java b/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/ext/ResponseCodeContentAssistExt.java index 4046a636..4a537d07 100644 --- a/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/ext/ResponseCodeContentAssistExt.java +++ b/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/ext/ResponseCodeContentAssistExt.java @@ -24,7 +24,6 @@ import com.fasterxml.jackson.databind.node.ArrayNode; import com.reprezen.swagedit.core.Activator; import com.reprezen.swagedit.core.assist.ProposalDescriptor; -import com.reprezen.swagedit.core.editor.JsonDocument; import com.reprezen.swagedit.core.model.AbstractNode; import com.reprezen.swagedit.core.schema.TypeDefinition; import com.reprezen.swagedit.core.utils.StringUtils; @@ -60,7 +59,7 @@ public boolean canProvideContentAssist(TypeDefinition type) { } @Override - public Collection getProposals(TypeDefinition type, AbstractNode node, String prefix, JsonDocument jsonDocument) { + public Collection getProposals(TypeDefinition type, AbstractNode node, String prefix) { Collection proposals = new ArrayList<>(); for (Iterator it = statusCodes(prefix); it.hasNext();) { diff --git a/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/utils/ModelUtils.java b/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/utils/ModelUtils.java index a28d7907..f578d203 100644 --- a/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/utils/ModelUtils.java +++ b/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/utils/ModelUtils.java @@ -1,20 +1,41 @@ package com.reprezen.swagedit.core.utils; +import java.util.Optional; + +import com.fasterxml.jackson.core.JsonPointer; import com.reprezen.swagedit.core.model.AbstractNode; import com.reprezen.swagedit.core.model.ObjectNode; public class ModelUtils { - public static AbstractNode getParentNode(AbstractNode node, String name) { + public static Optional findParentContainingField(AbstractNode node, String fieldName) { + if (node instanceof ObjectNode) { + final ObjectNode objectNode = (ObjectNode) node; + if (objectNode.get(fieldName) != null) { + return Optional.of(objectNode); + } + } + + if (node == null) { + return Optional.empty(); + } + + return findParentContainingField(node.getParent(), fieldName); + } + + public static Optional findParent(AbstractNode node, JsonPointer pointer) { if (node instanceof ObjectNode) { final ObjectNode objectNode = (ObjectNode) node; - if (objectNode.get(name) != null) { - return objectNode; + if (pointer.equals(objectNode.getType().getPointer())) { + return Optional.of(objectNode); } } - - //TODO: Can node.getParent() be null????? Please check. - - return getParentNode(node.getParent(), name); + + if (node == null) { + return Optional.empty(); + } + + return findParent(node.getParent(), pointer); } + } diff --git a/com.reprezen.swagedit.openapi3.tests/src/com/reprezen/swagedit/openapi3/assist/JsonReferenceProposalProvider_Quotes_Test.xtend b/com.reprezen.swagedit.openapi3.tests/src/com/reprezen/swagedit/openapi3/assist/JsonReferenceProposalProvider_Quotes_Test.xtend index 4191a73b..349bf543 100644 --- a/com.reprezen.swagedit.openapi3.tests/src/com/reprezen/swagedit/openapi3/assist/JsonReferenceProposalProvider_Quotes_Test.xtend +++ b/com.reprezen.swagedit.openapi3.tests/src/com/reprezen/swagedit/openapi3/assist/JsonReferenceProposalProvider_Quotes_Test.xtend @@ -147,7 +147,7 @@ components: MyType: properties: prop1: - «ref» + «ref» ''' } diff --git a/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/assist/OpenApi3ContentAssistProcessor.java b/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/assist/OpenApi3ContentAssistProcessor.java index fd6c1acd..b452548e 100644 --- a/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/assist/OpenApi3ContentAssistProcessor.java +++ b/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/assist/OpenApi3ContentAssistProcessor.java @@ -24,7 +24,6 @@ import com.reprezen.swagedit.core.schema.CompositeSchema; import com.reprezen.swagedit.openapi3.Activator; import com.reprezen.swagedit.openapi3.assist.ext.CallbacksContentAssistExt; -import com.reprezen.swagedit.openapi3.assist.ext.ExampleDataContentAssistExt; import com.reprezen.swagedit.openapi3.assist.ext.ParameterInContentAssistExt; import com.reprezen.swagedit.openapi3.assist.ext.SchemaFormatContentAssistExt; import com.reprezen.swagedit.openapi3.assist.ext.SchemaTypeContentAssistExt; @@ -37,19 +36,18 @@ public class OpenApi3ContentAssistProcessor extends JsonContentAssistProcessor { new SchemaFormatContentAssistExt(), // new ParameterInContentAssistExt(), // new ResponseCodeContentAssistExt(), // - new MediaTypeContentAssistExt(), - new ExampleDataContentAssistExt()); + new MediaTypeContentAssistExt()); public OpenApi3ContentAssistProcessor(ContentAssistant ca) { - super(ca, proposalProvider, new OpenApi3ReferenceProposalProvider()); + super(ca, proposalProvider, new OpenApi3ReferenceProposalProvider(), new OpenApi3ExampleProposalProvider()); } public OpenApi3ContentAssistProcessor(ContentAssistant ca, CompositeSchema schema) { - super(ca, proposalProvider, new OpenApi3ReferenceProposalProvider(schema)); + super(ca, proposalProvider, new OpenApi3ReferenceProposalProvider(schema), new OpenApi3ExampleProposalProvider()); } public OpenApi3ContentAssistProcessor(ContentAssistant ca, JsonReferenceProposalProvider referenceProposalProvider) { - super(ca, proposalProvider, referenceProposalProvider); + super(ca, proposalProvider, referenceProposalProvider, new OpenApi3ExampleProposalProvider()); } @Override diff --git a/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/assist/OpenApi3ExampleProposalProvider.java b/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/assist/OpenApi3ExampleProposalProvider.java new file mode 100644 index 00000000..7a964223 --- /dev/null +++ b/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/assist/OpenApi3ExampleProposalProvider.java @@ -0,0 +1,159 @@ +package com.reprezen.swagedit.openapi3.assist; + +import static com.reprezen.swagedit.core.json.references.JsonReference.isReference; + +import java.net.URI; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +import org.eclipse.core.runtime.CoreException; + +import com.fasterxml.jackson.core.JsonPointer; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.node.NullNode; +import com.reprezen.swagedit.core.assist.JsonReferenceProposalProvider; +import com.reprezen.swagedit.core.assist.ProposalDescriptor; +import com.reprezen.swagedit.core.assist.contexts.ContextType; +import com.reprezen.swagedit.core.assist.contexts.ContextTypeCollection; +import com.reprezen.swagedit.core.assist.contexts.RegexContextType; +import com.reprezen.swagedit.core.editor.JsonDocument; +import com.reprezen.swagedit.core.json.references.JsonReference; +import com.reprezen.swagedit.core.json.references.JsonReferenceFactory; +import com.reprezen.swagedit.core.model.AbstractNode; +import com.reprezen.swagedit.core.utils.DocumentUtils; +import com.reprezen.swagedit.core.utils.ExtensionUtils; +import com.reprezen.swagedit.core.utils.ModelUtils; +import com.reprezen.swagedit.core.utils.SwaggerFileFinder.Scope; +import com.reprezen.swagedit.openapi3.ExampleDataProvider; +import com.reprezen.swagedit.openapi3.editor.OpenApi3ContentDescriber; + +public class OpenApi3ExampleProposalProvider extends JsonReferenceProposalProvider { + + private static final JsonReferenceFactory REFERENCE_FACTORY = new JsonReferenceFactory(); + + private static final String EXTENSION_POINT_NAME = "com.reprezen.swagedit.openapi3.exampleprovider"; + + private static final String EXTENSION_PROPERTY_NAME = "class"; + + private static final String SCHEMA_FIELD_NAME = "schema"; + + private static final String REFERENCE_KEY = "$ref"; + + private static final JsonPointer COMPONENTS_NODE_POINTER = JsonPointer.compile("/definitions/components"); + + private static enum PoiterRegEx { + + REQUEST_BODY_EXAMPLE_POINTER_REGEX(".*/content(/\\S+)/example$"), + REQUEST_BODY_EXAMPLES_EXAMPLE_VALUE_FIELD_POINTER_REGEX(".*/content(/\\S+)/examples(/\\S+)/value$"), + RESPONSE_BODY_EXAMPLE_POINTER_REGEX(".*/content(/\\S+)/example$"), + RESPONSE_BODY_EXAMPLES_EXAMPLE_VALUE_FIELD_POINTER_REGEX(".*/content(/\\S+)/examples(/\\S+)/value$"), + PARAMETER_EXAMPLE_POINTER_REGEX(".*/parameters(/\\S+)/example$"), + PARAMETER_EXAMPLES_EXAMPLE_VALUE_FIELD_POINTER_REGEX(".*/parameters(/\\S+)/examples(/\\S+)/value$"), + MODEL_EXAMPLE_POINTER_REGEX("/content(/\\S+)/schema/example$"), + HEADERS_EXAMPLE_POINTER_REGEX(".*/headers(/\\S+)/example$"), + HEADERS_EXAMPLES_POINTER_REGEX(".*/headers(/\\S+)/examples(/\\S+)/value$"), + COMPONENTS_SCHEMA_EXAMPLE_POINTER_REGEX(".*/components/schemas/\\S+/example$"); + + private final String regEx; + + private PoiterRegEx(String regEx) { + this.regEx = regEx; + } + + public String getRegEx() { + return regEx; + } + + } + + private static final ContextTypeCollection EXAMPLE_CONTEXT_TYPES; + + static { + final List contextTypes = Arrays.asList(PoiterRegEx.values()).stream().map(// + poiterRegEx -> new RegexContextType("Generate Example", "Example", poiterRegEx.getRegEx())// + ).collect(Collectors.toList()); + EXAMPLE_CONTEXT_TYPES = ContextType.newContentTypeCollection(contextTypes); + } + + public OpenApi3ExampleProposalProvider() { + super(EXAMPLE_CONTEXT_TYPES, OpenApi3ContentDescriber.CONTENT_TYPE_ID); + } + + @Override + public Collection getProposals(JsonPointer pointer, JsonDocument document, Scope scope) { + final AbstractNode nodeAtPointer = document.getModel().find(pointer); + + JsonNode normalized = null; + if (insideComponentsNode(nodeAtPointer)) { + final AbstractNode schemaNode = nodeAtPointer.getParent(); + normalized = normalize(schemaNode, document); + } else { + final Optional parentNode = ModelUtils.findParentContainingField(// + nodeAtPointer, SCHEMA_FIELD_NAME); + if (parentNode.isPresent()) { + final AbstractNode schemaNode = parentNode.get().get(SCHEMA_FIELD_NAME); + normalized = normalize(schemaNode, document); + } else { + normalized = NullNode.instance; // schema filed not found in parent + } + } + + final ExampleDataProvider exampleDataProvider = (ExampleDataProvider) getExampleDataProvider(); + final String exampleData = exampleDataProvider.getData(normalized); + return Arrays.asList(new ProposalDescriptor("Generate Example:").replacementString(exampleData).type("string")); + + } + + private boolean isSchemaReference(JsonNode jsonNode) { + return jsonNode.get(REFERENCE_KEY) != null; + } + + private ExampleDataProvider getExampleDataProvider() { + final ExampleDataProvider defaultDataProvider = (JsonNode jsonNode) -> "example:"; + + try { + final ExampleDataProvider exampleDataProvider = (ExampleDataProvider) ExtensionUtils + .createExecutableExtension(EXTENSION_POINT_NAME, EXTENSION_PROPERTY_NAME); + return exampleDataProvider != null ? exampleDataProvider : defaultDataProvider; + } catch (CoreException e) { + return defaultDataProvider; + } + } + + private boolean insideComponentsNode(AbstractNode node) { + return ModelUtils.findParent(node, COMPONENTS_NODE_POINTER).isPresent(); + } + + private JsonNode normalize(AbstractNode node, JsonDocument document) { + final URI filePath = DocumentUtils.getActiveEditorInputURI(); + final JsonNode schemaNode = document.asJson().at(node.getPointer()); + if (isSchemaReference(schemaNode)) { + final JsonReference schemaReference = REFERENCE_FACTORY.create(schemaNode); + final JsonNode resolve = schemaReference.resolve(document, filePath); + normalize(resolve, document, filePath); + return resolve; + } else { + normalize(schemaNode, document, filePath); + return schemaNode; + } + } + + private void normalize(JsonNode node, JsonDocument document, URI baseURI) { + node.fields().forEachRemaining(entry -> { + JsonNode value = entry.getValue(); + if (isReference(value)) { + final JsonReference reference = REFERENCE_FACTORY.create(value); + value = reference.resolve(document, baseURI); + + if (value != null && !value.isMissingNode()) { + ((com.fasterxml.jackson.databind.node.ObjectNode) node).set(entry.getKey(), value); + } + } + normalize(value, document, baseURI); + }); + } + +} diff --git a/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/assist/ext/CallbacksContentAssistExt.java b/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/assist/ext/CallbacksContentAssistExt.java index a78308ea..383bc774 100644 --- a/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/assist/ext/CallbacksContentAssistExt.java +++ b/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/assist/ext/CallbacksContentAssistExt.java @@ -16,7 +16,6 @@ import com.fasterxml.jackson.core.JsonPointer; import com.reprezen.swagedit.core.assist.ProposalDescriptor; import com.reprezen.swagedit.core.assist.ext.ContentAssistExt; -import com.reprezen.swagedit.core.editor.JsonDocument; import com.reprezen.swagedit.core.model.AbstractNode; import com.reprezen.swagedit.core.schema.TypeDefinition; @@ -30,7 +29,7 @@ public boolean canProvideContentAssist(TypeDefinition type) { } @Override - public Collection getProposals(TypeDefinition type, AbstractNode node, String prefix, JsonDocument jsonDocument) { + public Collection getProposals(TypeDefinition type, AbstractNode node, String prefix) { return Arrays.asList( // new ProposalDescriptor("x-:").replacementString("x-").type("specificationExtension")); } diff --git a/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/assist/ext/ExampleDataContentAssistExt.java b/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/assist/ext/ExampleDataContentAssistExt.java deleted file mode 100644 index 078b8ffb..00000000 --- a/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/assist/ext/ExampleDataContentAssistExt.java +++ /dev/null @@ -1,101 +0,0 @@ -/** - * - */ -package com.reprezen.swagedit.openapi3.assist.ext; - -import static com.reprezen.swagedit.core.json.references.JsonReference.isReference; - -import java.net.URI; -import java.util.Arrays; -import java.util.Collection; - -import org.eclipse.core.runtime.CoreException; - -import com.fasterxml.jackson.core.JsonPointer; -import com.fasterxml.jackson.databind.JsonNode; -import com.reprezen.swagedit.core.assist.ProposalDescriptor; -import com.reprezen.swagedit.core.assist.ext.ContentAssistExt; -import com.reprezen.swagedit.core.editor.JsonDocument; -import com.reprezen.swagedit.core.json.references.JsonReference; -import com.reprezen.swagedit.core.json.references.JsonReferenceFactory; -import com.reprezen.swagedit.core.model.AbstractNode; -import com.reprezen.swagedit.core.schema.TypeDefinition; -import com.reprezen.swagedit.core.utils.DocumentUtils; -import com.reprezen.swagedit.core.utils.ExtensionUtils; -import com.reprezen.swagedit.core.utils.ModelUtils; -import com.reprezen.swagedit.openapi3.ExampleDataProvider; - -public class ExampleDataContentAssistExt implements ContentAssistExt { - - private static final JsonPointer pointer = JsonPointer.compile("/definitions/any"); - - private static final ProposalDescriptor defaultProposal = new ProposalDescriptor("Generate Example") - .replacementString("example:").type("string"); - - private static final String extensionPointName = "com.reprezen.swagedit.openapi3.exampleprovider"; - - @Override - public boolean canProvideContentAssist(TypeDefinition type) { - return type != null && type.getPointer() != null && pointer.equals(type.getPointer()); - } - - @Override - public Collection getProposals(TypeDefinition type, AbstractNode node, String prefix, - JsonDocument jsonDocument) { - final JsonNode jsonSchemaNode = getSchemaNode(node, jsonDocument); - // TODO: Can the jsonschemaNode be null??? - new JsonSchemaNormalizer(jsonDocument, DocumentUtils.getActiveEditorInputURI()).normalize(jsonSchemaNode); - - try { - final ExampleDataProvider exampleDataProvider = (ExampleDataProvider) getExampleDataProvider(); - final String exampleData = exampleDataProvider.getData(jsonSchemaNode); - return Arrays - .asList(new ProposalDescriptor("Generate Example:").replacementString(exampleData).type("string")); - } catch (CoreException e) { - // TODO: Log a message here and then return the default proposal - return Arrays.asList(defaultProposal); - } - - } - - private JsonNode getSchemaNode(AbstractNode node, JsonDocument jsonDocument) { - final AbstractNode schemaNode = ModelUtils.getParentNode(node, "schema"); - // TODO: What happens if there is no schema node????? - final JsonPointer schemaPointer = JsonPointer.compile(schemaNode.getPointerString()); - return jsonDocument.asJson().at(schemaPointer); - } - - private ExampleDataProvider getExampleDataProvider() throws CoreException { - return (ExampleDataProvider) ExtensionUtils.createExecutableExtension(extensionPointName, "class"); - } - - private static class JsonSchemaNormalizer { - - private final JsonDocument document; - private final URI baseURI; - - private static final JsonReferenceFactory factory = new JsonReferenceFactory(); - - public JsonSchemaNormalizer(JsonDocument document, URI baseURI) { - this.document = document; - this.baseURI = baseURI; - } - - private void normalize(JsonNode node) { - node.fields().forEachRemaining(entry -> { - JsonNode value = entry.getValue(); - if (isReference(value)) { - final JsonReference reference = factory.create(value); - value = reference.resolve(document, baseURI); - - if (value != null && !value.isMissingNode()) { - ((com.fasterxml.jackson.databind.node.ObjectNode) node).set(entry.getKey(), value); - } - } - normalize(value); - }); - } - - } - -} diff --git a/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/assist/ext/ParameterInContentAssistExt.java b/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/assist/ext/ParameterInContentAssistExt.java index ca272dea..6d282c78 100644 --- a/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/assist/ext/ParameterInContentAssistExt.java +++ b/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/assist/ext/ParameterInContentAssistExt.java @@ -16,7 +16,6 @@ import com.fasterxml.jackson.core.JsonPointer; import com.reprezen.swagedit.core.assist.ProposalDescriptor; import com.reprezen.swagedit.core.assist.ext.ContentAssistExt; -import com.reprezen.swagedit.core.editor.JsonDocument; import com.reprezen.swagedit.core.model.AbstractNode; import com.reprezen.swagedit.core.schema.TypeDefinition; @@ -31,7 +30,7 @@ public boolean canProvideContentAssist(TypeDefinition type) { } @Override - public Collection getProposals(TypeDefinition type, AbstractNode node, String prefix, JsonDocument jsonDocument) { + public Collection getProposals(TypeDefinition type, AbstractNode node, String prefix) { return Arrays.asList( // new ProposalDescriptor("query").replacementString("query").description(description).type("string"), new ProposalDescriptor("header").replacementString("header").description(description).type("string"), diff --git a/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/assist/ext/SchemaFormatContentAssistExt.java b/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/assist/ext/SchemaFormatContentAssistExt.java index b9eccb83..a06f6bc1 100644 --- a/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/assist/ext/SchemaFormatContentAssistExt.java +++ b/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/assist/ext/SchemaFormatContentAssistExt.java @@ -24,7 +24,6 @@ import com.fasterxml.jackson.core.JsonPointer; import com.reprezen.swagedit.core.assist.ProposalDescriptor; import com.reprezen.swagedit.core.assist.ext.ContentAssistExt; -import com.reprezen.swagedit.core.editor.JsonDocument; import com.reprezen.swagedit.core.model.AbstractNode; import com.reprezen.swagedit.core.schema.TypeDefinition; @@ -62,7 +61,7 @@ public boolean canProvideContentAssist(TypeDefinition type) { } @Override - public Collection getProposals(TypeDefinition type, AbstractNode node, String prefix, JsonDocument jsonDocument) { + public Collection getProposals(TypeDefinition type, AbstractNode node, String prefix) { List proposals = new ArrayList<>(); if (node.getParent() != null && node.getParent().get("type") != null) { diff --git a/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/assist/ext/SchemaTypeContentAssistExt.java b/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/assist/ext/SchemaTypeContentAssistExt.java index a71b75a4..c0572d3a 100644 --- a/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/assist/ext/SchemaTypeContentAssistExt.java +++ b/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/assist/ext/SchemaTypeContentAssistExt.java @@ -16,7 +16,6 @@ import com.fasterxml.jackson.core.JsonPointer; import com.reprezen.swagedit.core.assist.ProposalDescriptor; import com.reprezen.swagedit.core.assist.ext.ContentAssistExt; -import com.reprezen.swagedit.core.editor.JsonDocument; import com.reprezen.swagedit.core.model.AbstractNode; import com.reprezen.swagedit.core.schema.TypeDefinition; @@ -30,7 +29,7 @@ public boolean canProvideContentAssist(TypeDefinition type) { } @Override - public Collection getProposals(TypeDefinition type, AbstractNode node, String prefix, JsonDocument jsonDocument) { + public Collection getProposals(TypeDefinition type, AbstractNode node, String prefix) { return Arrays.asList( // new ProposalDescriptor("array").replacementString("array").type("enum"), // new ProposalDescriptor("boolean").replacementString("boolean").type("enum"), // diff --git a/com.reprezen.swagedit.tests/src/com/reprezen/swagedit/assist/SwaggerProposalProviderTest.xtend b/com.reprezen.swagedit.tests/src/com/reprezen/swagedit/assist/SwaggerProposalProviderTest.xtend index 08e772f9..2c21b64f 100644 --- a/com.reprezen.swagedit.tests/src/com/reprezen/swagedit/assist/SwaggerProposalProviderTest.xtend +++ b/com.reprezen.swagedit.tests/src/com/reprezen/swagedit/assist/SwaggerProposalProviderTest.xtend @@ -12,7 +12,6 @@ import static org.hamcrest.core.IsCollectionContaining.* import static org.junit.Assert.* import com.reprezen.swagedit.schema.SwaggerSchema import com.reprezen.swagedit.core.assist.JsonProposalProvider -import com.reprezen.swagedit.editor.SwaggerDocument class SwaggerProposalProviderTest { @@ -32,7 +31,7 @@ class SwaggerProposalProviderTest { val node = model.objectNode(null, "".ptr) node.type = schema.getType(node) - assertThat(provider.getProposals(node, new SwaggerDocument()).map[getReplacementString], hasItems( + assertThat(provider.getProposals(node).map[getReplacementString], hasItems( "swagger:", "info:", "host:", @@ -57,7 +56,7 @@ class SwaggerProposalProviderTest { val node = model.valueNode(null, "/swagger".ptr, null) node.type = schema.getType(node) - assertThat(provider.getProposals(node, new SwaggerDocument()).map [ + assertThat(provider.getProposals(node).map [ getReplacementString ], hasItems("\"2.0\"")) } @@ -67,7 +66,7 @@ class SwaggerProposalProviderTest { val node = model.objectNode(null, "/info".ptr) node.type = schema.getType(node) - assertThat(provider.getProposals(node, new SwaggerDocument()).map [ + assertThat(provider.getProposals(node).map [ getReplacementString ], hasItems( "title:", @@ -84,7 +83,7 @@ class SwaggerProposalProviderTest { val node = model.arrayNode(null, "/schemes".ptr) node.type = schema.getType(node) - assertThat(provider.getProposals(node, new SwaggerDocument()).map [ + assertThat(provider.getProposals(node).map [ getReplacementString ], hasItems( "- http", @@ -99,7 +98,7 @@ class SwaggerProposalProviderTest { val node = model.objectNode(null, "/paths".ptr) node.type = schema.getType(node) - assertThat(provider.getProposals(node, new SwaggerDocument()).map [ + assertThat(provider.getProposals(node).map [ getReplacementString ], hasItems( "/:", @@ -112,7 +111,7 @@ class SwaggerProposalProviderTest { val node = model.objectNode(null, "/definitions".ptr) node.type = schema.getType(node) - assertThat(provider.getProposals(node, new SwaggerDocument()).map [ + assertThat(provider.getProposals(node).map [ getReplacementString ], hasItems( "(schema name):" @@ -124,7 +123,7 @@ class SwaggerProposalProviderTest { val node = model.objectNode(null, "/definitions/MyType/properties".ptr) node.type = schema.getType(node) - assertThat(provider.getProposals(node, new SwaggerDocument()).map [ + assertThat(provider.getProposals(node).map [ getReplacementString ], hasItems( "(property name):" @@ -136,7 +135,7 @@ class SwaggerProposalProviderTest { val node = model.objectNode(null, "/paths/~1/get".ptr) node.type = schema.getType(node) - assertThat(provider.getProposals(node, new SwaggerDocument()).map [ + assertThat(provider.getProposals(node).map [ getReplacementString ], hasItems( "tags:", @@ -160,7 +159,7 @@ class SwaggerProposalProviderTest { val node = model.arrayNode(null, "/paths/~1/get/parameters".ptr) node.type = schema.getType(node) - assertThat(provider.getProposals(node, new SwaggerDocument()).map [ + assertThat(provider.getProposals(node).map [ getReplacementString ], hasItems( "-" @@ -172,7 +171,7 @@ class SwaggerProposalProviderTest { val node = model.valueNode(null, "/paths/~1/get/parameters/0/in".ptr, null) node.type = schema.getType(node) - assertThat(provider.getProposals(node, new SwaggerDocument()).map [ + assertThat(provider.getProposals(node).map [ getReplacementString ], hasItems( "header", @@ -188,7 +187,7 @@ class SwaggerProposalProviderTest { val node = model.objectNode(null, "/paths/~1/get/responses/200".ptr) node.type = schema.getType(node) - assertThat(provider.getProposals(node, new SwaggerDocument()).map [ + assertThat(provider.getProposals(node).map [ getReplacementString ], hasItems( "description:", @@ -207,7 +206,7 @@ class SwaggerProposalProviderTest { assertTrue(node.type instanceof MultipleTypeDefinition) - assertThat(provider.getProposals(node, new SwaggerDocument()).map [ + assertThat(provider.getProposals(node).map [ getReplacementString ], hasItems( "", @@ -230,7 +229,7 @@ class SwaggerProposalProviderTest { assertEquals(JsonType.ONE_OF, node.type.type) - val values = provider.getProposals(node, new SwaggerDocument()).map [ + val values = provider.getProposals(node).map [ getReplacementString ] @@ -242,7 +241,7 @@ class SwaggerProposalProviderTest { val node = model.objectNode(null, "/paths/~1foo/get/responses/200/schema/type".ptr) node.type = schema.getType(node) - val values = provider.getProposals(node, new SwaggerDocument()).map [ + val values = provider.getProposals(node).map [ getReplacementString ] diff --git a/com.reprezen.swagedit/src/com/reprezen/swagedit/assist/SwaggerContentAssistProcessor.java b/com.reprezen.swagedit/src/com/reprezen/swagedit/assist/SwaggerContentAssistProcessor.java index fd79291f..b349b6ff 100644 --- a/com.reprezen.swagedit/src/com/reprezen/swagedit/assist/SwaggerContentAssistProcessor.java +++ b/com.reprezen.swagedit/src/com/reprezen/swagedit/assist/SwaggerContentAssistProcessor.java @@ -33,7 +33,7 @@ public class SwaggerContentAssistProcessor extends JsonContentAssistProcessor { new ResponseCodeContentAssistExt()); public SwaggerContentAssistProcessor(ContentAssistant ca) { - super(ca, proposalProvider, new SwaggerReferenceProposalProvider()); + super(ca, proposalProvider, new SwaggerReferenceProposalProvider(), new SwaggerReferenceProposalProvider()); } @Override From a0b947f29f937f2e4d551c31458778da3f9808b7 Mon Sep 17 00:00:00 2001 From: nbhusare Date: Tue, 2 Apr 2019 19:21:59 -0400 Subject: [PATCH 07/18] Reverted back changes that were not required Added copyright to new files --- .../swagedit/core/assist/ext/ContentAssistExt.java | 1 - .../reprezen/swagedit/core/utils/ExtensionUtils.java | 10 ++++++++++ .../com/reprezen/swagedit/core/utils/ModelUtils.java | 10 ++++++++++ .../assist/OpenApi3ExampleProposalProvider.java | 10 ++++++++++ .../swagedit/openapi3/editor/OpenApi3Editor.java | 6 ------ .../assist/JsonReferenceProposalProviderTest.xtend | 2 +- 6 files changed, 31 insertions(+), 8 deletions(-) diff --git a/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/ext/ContentAssistExt.java b/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/ext/ContentAssistExt.java index 4569232b..362c5628 100644 --- a/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/ext/ContentAssistExt.java +++ b/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/ext/ContentAssistExt.java @@ -13,7 +13,6 @@ import java.util.Collection; import com.reprezen.swagedit.core.assist.ProposalDescriptor; -import com.reprezen.swagedit.core.editor.JsonDocument; import com.reprezen.swagedit.core.model.AbstractNode; import com.reprezen.swagedit.core.schema.TypeDefinition; diff --git a/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/utils/ExtensionUtils.java b/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/utils/ExtensionUtils.java index 18f43fd2..c23b276f 100644 --- a/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/utils/ExtensionUtils.java +++ b/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/utils/ExtensionUtils.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * Copyright (c) 2019 ModelSolv, Inc. and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * ModelSolv, Inc. - initial API and implementation and/or initial documentation + *******************************************************************************/ package com.reprezen.swagedit.core.utils; import org.eclipse.core.runtime.CoreException; diff --git a/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/utils/ModelUtils.java b/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/utils/ModelUtils.java index f578d203..43f1144e 100644 --- a/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/utils/ModelUtils.java +++ b/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/utils/ModelUtils.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * Copyright (c) 2019 ModelSolv, Inc. and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * ModelSolv, Inc. - initial API and implementation and/or initial documentation + *******************************************************************************/ package com.reprezen.swagedit.core.utils; import java.util.Optional; diff --git a/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/assist/OpenApi3ExampleProposalProvider.java b/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/assist/OpenApi3ExampleProposalProvider.java index 7a964223..81878249 100644 --- a/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/assist/OpenApi3ExampleProposalProvider.java +++ b/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/assist/OpenApi3ExampleProposalProvider.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * Copyright (c) 2019 ModelSolv, Inc. and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * ModelSolv, Inc. - initial API and implementation and/or initial documentation + *******************************************************************************/ package com.reprezen.swagedit.openapi3.assist; import static com.reprezen.swagedit.core.json.references.JsonReference.isReference; diff --git a/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/editor/OpenApi3Editor.java b/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/editor/OpenApi3Editor.java index f98e63e2..a9937184 100644 --- a/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/editor/OpenApi3Editor.java +++ b/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/editor/OpenApi3Editor.java @@ -56,12 +56,6 @@ public class OpenApi3Editor extends JsonEditor { } } }; - - @Override - public boolean isDirty() { - // TODO Auto-generated method stub - return super.isDirty(); - } public OpenApi3Editor() { super(new OpenApi3DocumentProvider(), // diff --git a/com.reprezen.swagedit.tests/src/com/reprezen/swagedit/assist/JsonReferenceProposalProviderTest.xtend b/com.reprezen.swagedit.tests/src/com/reprezen/swagedit/assist/JsonReferenceProposalProviderTest.xtend index 940744f3..cb8c8910 100644 --- a/com.reprezen.swagedit.tests/src/com/reprezen/swagedit/assist/JsonReferenceProposalProviderTest.xtend +++ b/com.reprezen.swagedit.tests/src/com/reprezen/swagedit/assist/JsonReferenceProposalProviderTest.xtend @@ -10,7 +10,6 @@ *******************************************************************************/ package com.reprezen.swagedit.assist -import com.reprezen.swagedit.core.assist.ProposalDescriptor import com.reprezen.swagedit.core.assist.contexts.RegexContextType import com.reprezen.swagedit.core.utils.SwaggerFileFinder.Scope import com.reprezen.swagedit.editor.SwaggerDocument @@ -21,6 +20,7 @@ import org.junit.Test import static org.hamcrest.core.IsCollectionContaining.* import static org.junit.Assert.* +import com.reprezen.swagedit.core.assist.ProposalDescriptor class JsonReferenceProposalProviderTest { From 08cac077a47711ab775f447ff79a99955da5288c Mon Sep 17 00:00:00 2001 From: nbhusare Date: Tue, 2 Apr 2019 19:26:10 -0400 Subject: [PATCH 08/18] Renamed ExampleDataProvider to ExampleProvider --- ...com.reprezen.swagedit.openapi3.exampleprovider.exsd | 2 +- .../{ExampleDataProvider.java => ExampleProvider.java} | 4 ++-- .../assist/OpenApi3ExampleProposalProvider.java | 10 +++++----- 3 files changed, 8 insertions(+), 8 deletions(-) rename com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/{ExampleDataProvider.java => ExampleProvider.java} (89%) diff --git a/com.reprezen.swagedit.openapi3/schema/com.reprezen.swagedit.openapi3.exampleprovider.exsd b/com.reprezen.swagedit.openapi3/schema/com.reprezen.swagedit.openapi3.exampleprovider.exsd index a8ee8377..c656db72 100644 --- a/com.reprezen.swagedit.openapi3/schema/com.reprezen.swagedit.openapi3.exampleprovider.exsd +++ b/com.reprezen.swagedit.openapi3/schema/com.reprezen.swagedit.openapi3.exampleprovider.exsd @@ -55,7 +55,7 @@ - + diff --git a/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/ExampleDataProvider.java b/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/ExampleProvider.java similarity index 89% rename from com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/ExampleDataProvider.java rename to com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/ExampleProvider.java index 0d6567df..7d4e4c84 100644 --- a/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/ExampleDataProvider.java +++ b/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/ExampleProvider.java @@ -12,7 +12,7 @@ import com.fasterxml.jackson.databind.JsonNode; -public interface ExampleDataProvider { +public interface ExampleProvider { - String getData(JsonNode schemaNode); + String getData(JsonNode node); } diff --git a/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/assist/OpenApi3ExampleProposalProvider.java b/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/assist/OpenApi3ExampleProposalProvider.java index 81878249..9db69aae 100644 --- a/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/assist/OpenApi3ExampleProposalProvider.java +++ b/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/assist/OpenApi3ExampleProposalProvider.java @@ -37,7 +37,7 @@ import com.reprezen.swagedit.core.utils.ExtensionUtils; import com.reprezen.swagedit.core.utils.ModelUtils; import com.reprezen.swagedit.core.utils.SwaggerFileFinder.Scope; -import com.reprezen.swagedit.openapi3.ExampleDataProvider; +import com.reprezen.swagedit.openapi3.ExampleProvider; import com.reprezen.swagedit.openapi3.editor.OpenApi3ContentDescriber; public class OpenApi3ExampleProposalProvider extends JsonReferenceProposalProvider { @@ -111,7 +111,7 @@ public Collection getProposals(JsonPointer pointer, JsonDocu } } - final ExampleDataProvider exampleDataProvider = (ExampleDataProvider) getExampleDataProvider(); + final ExampleProvider exampleDataProvider = (ExampleProvider) getExampleDataProvider(); final String exampleData = exampleDataProvider.getData(normalized); return Arrays.asList(new ProposalDescriptor("Generate Example:").replacementString(exampleData).type("string")); @@ -121,11 +121,11 @@ private boolean isSchemaReference(JsonNode jsonNode) { return jsonNode.get(REFERENCE_KEY) != null; } - private ExampleDataProvider getExampleDataProvider() { - final ExampleDataProvider defaultDataProvider = (JsonNode jsonNode) -> "example:"; + private ExampleProvider getExampleDataProvider() { + final ExampleProvider defaultDataProvider = (JsonNode jsonNode) -> "example:"; try { - final ExampleDataProvider exampleDataProvider = (ExampleDataProvider) ExtensionUtils + final ExampleProvider exampleDataProvider = (ExampleProvider) ExtensionUtils .createExecutableExtension(EXTENSION_POINT_NAME, EXTENSION_PROPERTY_NAME); return exampleDataProvider != null ? exampleDataProvider : defaultDataProvider; } catch (CoreException e) { From a1d3ab71d03c3e78f09ea5a169f78a6c89649de1 Mon Sep 17 00:00:00 2001 From: nbhusare Date: Wed, 3 Apr 2019 23:03:56 -0400 Subject: [PATCH 09/18] Removed the extension point and the ExampleProvider. Both have been moved to the swagedit.core project so that they can be reused in Swagger and OpenApi3 propesalproviders --- ...zen.swagedit.openapi3.exampleprovider.exsd | 102 ------------------ .../swagedit/openapi3/ExampleProvider.java | 18 ---- 2 files changed, 120 deletions(-) delete mode 100644 com.reprezen.swagedit.openapi3/schema/com.reprezen.swagedit.openapi3.exampleprovider.exsd delete mode 100644 com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/ExampleProvider.java diff --git a/com.reprezen.swagedit.openapi3/schema/com.reprezen.swagedit.openapi3.exampleprovider.exsd b/com.reprezen.swagedit.openapi3/schema/com.reprezen.swagedit.openapi3.exampleprovider.exsd deleted file mode 100644 index c656db72..00000000 --- a/com.reprezen.swagedit.openapi3/schema/com.reprezen.swagedit.openapi3.exampleprovider.exsd +++ /dev/null @@ -1,102 +0,0 @@ - - - - - - - - - [Enter description of this extension point.] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - [Enter the first release in which this extension point appears.] - - - - - - - - - [Enter extension point usage example here.] - - - - - - - - - [Enter API information here.] - - - - - - - - - [Enter information about supplied implementation of this extension point.] - - - - - diff --git a/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/ExampleProvider.java b/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/ExampleProvider.java deleted file mode 100644 index 7d4e4c84..00000000 --- a/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/ExampleProvider.java +++ /dev/null @@ -1,18 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2016 ModelSolv, Inc. and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * ModelSolv, Inc. - initial API and implementation and/or initial documentation - *******************************************************************************/ -package com.reprezen.swagedit.openapi3; - -import com.fasterxml.jackson.databind.JsonNode; - -public interface ExampleProvider { - - String getData(JsonNode node); -} From 35316805e1d3c11a23068f127a96aa3d068428e5 Mon Sep 17 00:00:00 2001 From: nbhusare Date: Wed, 3 Apr 2019 23:05:06 -0400 Subject: [PATCH 10/18] Removed the extension from the plugin.xml file --- com.reprezen.swagedit.openapi3/plugin.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/com.reprezen.swagedit.openapi3/plugin.xml b/com.reprezen.swagedit.openapi3/plugin.xml index 27417b6d..191f00d5 100644 --- a/com.reprezen.swagedit.openapi3/plugin.xml +++ b/com.reprezen.swagedit.openapi3/plugin.xml @@ -1,7 +1,6 @@ - Date: Wed, 3 Apr 2019 23:07:18 -0400 Subject: [PATCH 11/18] Renamed extension point to com.reprezen.swagedit.core.exampleprovider Renamed the schema file too Moved the ExamplePovider to the core.exampleprovider package inside the swagedit.core project --- .../META-INF/MANIFEST.MF | 1 + com.reprezen.swagedit.core/build.properties | 3 +- com.reprezen.swagedit.core/plugin.xml | 1 + ...eprezen.swagedit.core.exampleprovider.exsd | 102 ++++++++++++++++++ .../exampleprovider/ExampleProvider.java | 18 ++++ 5 files changed, 124 insertions(+), 1 deletion(-) create mode 100644 com.reprezen.swagedit.core/schema/com.reprezen.swagedit.core.exampleprovider.exsd create mode 100644 com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/exampleprovider/ExampleProvider.java diff --git a/com.reprezen.swagedit.core/META-INF/MANIFEST.MF b/com.reprezen.swagedit.core/META-INF/MANIFEST.MF index 7631d231..a2a471fa 100644 --- a/com.reprezen.swagedit.core/META-INF/MANIFEST.MF +++ b/com.reprezen.swagedit.core/META-INF/MANIFEST.MF @@ -29,6 +29,7 @@ Export-Package: com.github.fge.jsonschema.core.exceptions, com.reprezen.swagedit.core, com.reprezen.swagedit.core.assist, com.reprezen.swagedit.core.assist.contexts, + com.reprezen.swagedit.core.assist.exampleprovider, com.reprezen.swagedit.core.assist.ext, com.reprezen.swagedit.core.editor, com.reprezen.swagedit.core.editor.outline, diff --git a/com.reprezen.swagedit.core/build.properties b/com.reprezen.swagedit.core/build.properties index 0061b942..b71e5667 100644 --- a/com.reprezen.swagedit.core/build.properties +++ b/com.reprezen.swagedit.core/build.properties @@ -16,5 +16,6 @@ bin.includes = .,\ lib/org.apache.commons.lang3_3.2.1.jar,\ icons/,\ plugin.xml,\ - resources/ + resources/,\ + schema/ jars.compile.order = . diff --git a/com.reprezen.swagedit.core/plugin.xml b/com.reprezen.swagedit.core/plugin.xml index 8aecf00f..fb10e0af 100644 --- a/com.reprezen.swagedit.core/plugin.xml +++ b/com.reprezen.swagedit.core/plugin.xml @@ -1,6 +1,7 @@ + + + + + + + + + [Enter description of this extension point.] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [Enter the first release in which this extension point appears.] + + + + + + + + + [Enter extension point usage example here.] + + + + + + + + + [Enter API information here.] + + + + + + + + + [Enter information about supplied implementation of this extension point.] + + + + + diff --git a/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/exampleprovider/ExampleProvider.java b/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/exampleprovider/ExampleProvider.java new file mode 100644 index 00000000..b4526082 --- /dev/null +++ b/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/exampleprovider/ExampleProvider.java @@ -0,0 +1,18 @@ +/******************************************************************************* + * Copyright (c) 2016 ModelSolv, Inc. and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * ModelSolv, Inc. - initial API and implementation and/or initial documentation + *******************************************************************************/ +package com.reprezen.swagedit.core.assist.exampleprovider; + +import com.fasterxml.jackson.databind.JsonNode; + +public interface ExampleProvider { + + String getData(JsonNode node); +} From 35f505dd6c146ff3218121179597aaac9e63744e Mon Sep 17 00:00:00 2001 From: nbhusare Date: Wed, 3 Apr 2019 23:09:47 -0400 Subject: [PATCH 12/18] Added base class JsonExampleProposalProvider to encapsulate common logic from Swagger and OpenAPI3 proposal providers Added separate Proposal providers for swagger and openapi3 --- .../assist/JsonContentAssistProcessor.java | 6 +- .../assist/JsonExampleProposalProvider.java | 111 ++++++++++++++++++ .../OpenApi3ExampleProposalProvider.java | 96 +++------------ .../assist/SwaggerContentAssistProcessor.java | 2 +- .../SwaggerExampleProposalProvider.java | 97 +++++++++++++++ 5 files changed, 228 insertions(+), 84 deletions(-) create mode 100644 com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/JsonExampleProposalProvider.java create mode 100644 com.reprezen.swagedit/src/com/reprezen/swagedit/assist/SwaggerExampleProposalProvider.java diff --git a/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/JsonContentAssistProcessor.java b/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/JsonContentAssistProcessor.java index b7732ccc..8e347d3d 100644 --- a/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/JsonContentAssistProcessor.java +++ b/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/JsonContentAssistProcessor.java @@ -67,7 +67,7 @@ public abstract class JsonContentAssistProcessor extends TemplateCompletionProce private final JsonProposalProvider proposalProvider; private final JsonReferenceProposalProvider referenceProposalProvider; - private final JsonReferenceProposalProvider exampleProposalProvider; + private final JsonExampleProposalProvider exampleProposalProvider; private final ContentAssistant contentAssistant; /** @@ -95,12 +95,12 @@ public abstract class JsonContentAssistProcessor extends TemplateCompletionProce public JsonContentAssistProcessor(ContentAssistant ca, String fileContentType) { this(ca, new JsonProposalProvider(), new JsonReferenceProposalProvider(ContextType.emptyContentTypeCollection(), fileContentType), - new JsonReferenceProposalProvider(ContextType.emptyContentTypeCollection(), fileContentType)); + new JsonExampleProposalProvider(ContextType.emptyContentTypeCollection())); } public JsonContentAssistProcessor(ContentAssistant ca, JsonProposalProvider proposalProvider, JsonReferenceProposalProvider referenceProposalProvider, - JsonReferenceProposalProvider exampleProposalProvider) { + JsonExampleProposalProvider exampleProposalProvider) { this.contentAssistant = ca; this.proposalProvider = proposalProvider; this.referenceProposalProvider = referenceProposalProvider; diff --git a/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/JsonExampleProposalProvider.java b/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/JsonExampleProposalProvider.java new file mode 100644 index 00000000..a1369810 --- /dev/null +++ b/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/JsonExampleProposalProvider.java @@ -0,0 +1,111 @@ +/******************************************************************************* + * Copyright (c) 2019 ModelSolv, Inc. and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * ModelSolv, Inc. - initial API and implementation and/or initial documentation + *******************************************************************************/ +package com.reprezen.swagedit.core.assist; + +import static com.reprezen.swagedit.core.json.references.JsonReference.isReference; + +import java.net.URI; +import java.util.Collection; +import java.util.Collections; + +import org.eclipse.core.runtime.CoreException; + +import com.fasterxml.jackson.core.JsonPointer; +import com.fasterxml.jackson.databind.JsonNode; +import com.reprezen.swagedit.core.assist.contexts.ContextType; +import com.reprezen.swagedit.core.assist.contexts.ContextTypeCollection; +import com.reprezen.swagedit.core.assist.exampleprovider.ExampleProvider; +import com.reprezen.swagedit.core.editor.JsonDocument; +import com.reprezen.swagedit.core.json.references.JsonReference; +import com.reprezen.swagedit.core.json.references.JsonReferenceFactory; +import com.reprezen.swagedit.core.model.AbstractNode; +import com.reprezen.swagedit.core.model.Model; +import com.reprezen.swagedit.core.utils.DocumentUtils; +import com.reprezen.swagedit.core.utils.ExtensionUtils; +import com.reprezen.swagedit.core.utils.SwaggerFileFinder.Scope; + +/** + * Completion proposal provider for JSON examples. + */ +public class JsonExampleProposalProvider { + + private static final JsonReferenceFactory REFERENCE_FACTORY = new JsonReferenceFactory(); + protected static final String EXTENSION_POINT_NAME = "com.reprezen.swagedit.core.exampleprovider"; + protected static final String EXTENSION_PROPERTY_NAME = "class"; + protected static final String SCHEMA_FIELD_NAME = "schema"; + private static final String REFERENCE_KEY = "$ref"; + private final ContextTypeCollection contextTypes; + + public JsonExampleProposalProvider(ContextTypeCollection contextTypes) { + this.contextTypes = contextTypes; + } + + public boolean canProvideProposal(Model model, JsonPointer pointer) { + return pointer != null && contextTypes.get(model, pointer) != ContextType.UNKNOWN; + } + + public Collection getProposals(JsonPointer pointer, JsonDocument document, + Scope scope) { + return Collections.emptyList(); + } + + private boolean isSchemaReference(JsonNode jsonNode) { + return jsonNode.get(REFERENCE_KEY) != null; + } + + protected JsonNode normalize(AbstractNode node, JsonDocument document) { + final URI filePath = DocumentUtils.getActiveEditorInputURI(); + final JsonNode schemaNode = document.asJson().at(node.getPointer()); + if (isSchemaReference(schemaNode)) { + final JsonReference schemaReference = REFERENCE_FACTORY.create(schemaNode); + final JsonNode resolve = schemaReference.resolve(document, filePath); + normalize(resolve, document, filePath); + return resolve; + } else { + normalize(schemaNode, document, filePath); + return schemaNode; + } + } + + private void normalize(JsonNode node, JsonDocument document, URI baseURI) { + node.fields().forEachRemaining(entry -> { + JsonNode value = entry.getValue(); + if (isReference(value)) { + final JsonReference reference = REFERENCE_FACTORY.create(value); + value = reference.resolve(document, baseURI); + + if (value != null && !value.isMissingNode()) { + ((com.fasterxml.jackson.databind.node.ObjectNode) node).set(entry.getKey(), value); + } + } + normalize(value, document, baseURI); + }); + } + + protected ExampleProvider getExampleDataProvider() { + final ExampleProvider defaultDataProvider = (JsonNode jsonNode) -> "example:"; + + try { + final ExampleProvider exampleDataProvider = (ExampleProvider) ExtensionUtils + .createExecutableExtension(EXTENSION_POINT_NAME, EXTENSION_PROPERTY_NAME); + return exampleDataProvider != null ? exampleDataProvider : defaultDataProvider; + } catch (CoreException e) { + return defaultDataProvider; + } + } + + protected String getProposal(JsonNode normalized) { + final ExampleProvider exampleDataProvider = (ExampleProvider) getExampleDataProvider(); + final String exampleData = exampleDataProvider.getData(normalized); + return exampleData; + } + +} diff --git a/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/assist/OpenApi3ExampleProposalProvider.java b/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/assist/OpenApi3ExampleProposalProvider.java index 9db69aae..5c9ee561 100644 --- a/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/assist/OpenApi3ExampleProposalProvider.java +++ b/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/assist/OpenApi3ExampleProposalProvider.java @@ -10,61 +10,40 @@ *******************************************************************************/ package com.reprezen.swagedit.openapi3.assist; -import static com.reprezen.swagedit.core.json.references.JsonReference.isReference; - -import java.net.URI; import java.util.Arrays; import java.util.Collection; import java.util.List; import java.util.Optional; import java.util.stream.Collectors; -import org.eclipse.core.runtime.CoreException; - import com.fasterxml.jackson.core.JsonPointer; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.NullNode; -import com.reprezen.swagedit.core.assist.JsonReferenceProposalProvider; +import com.reprezen.swagedit.core.assist.JsonExampleProposalProvider; import com.reprezen.swagedit.core.assist.ProposalDescriptor; import com.reprezen.swagedit.core.assist.contexts.ContextType; import com.reprezen.swagedit.core.assist.contexts.ContextTypeCollection; import com.reprezen.swagedit.core.assist.contexts.RegexContextType; import com.reprezen.swagedit.core.editor.JsonDocument; -import com.reprezen.swagedit.core.json.references.JsonReference; -import com.reprezen.swagedit.core.json.references.JsonReferenceFactory; import com.reprezen.swagedit.core.model.AbstractNode; -import com.reprezen.swagedit.core.utils.DocumentUtils; -import com.reprezen.swagedit.core.utils.ExtensionUtils; import com.reprezen.swagedit.core.utils.ModelUtils; import com.reprezen.swagedit.core.utils.SwaggerFileFinder.Scope; -import com.reprezen.swagedit.openapi3.ExampleProvider; -import com.reprezen.swagedit.openapi3.editor.OpenApi3ContentDescriber; - -public class OpenApi3ExampleProposalProvider extends JsonReferenceProposalProvider { - - private static final JsonReferenceFactory REFERENCE_FACTORY = new JsonReferenceFactory(); - - private static final String EXTENSION_POINT_NAME = "com.reprezen.swagedit.openapi3.exampleprovider"; - - private static final String EXTENSION_PROPERTY_NAME = "class"; - private static final String SCHEMA_FIELD_NAME = "schema"; - - private static final String REFERENCE_KEY = "$ref"; +public class OpenApi3ExampleProposalProvider extends JsonExampleProposalProvider { private static final JsonPointer COMPONENTS_NODE_POINTER = JsonPointer.compile("/definitions/components"); private static enum PoiterRegEx { - REQUEST_BODY_EXAMPLE_POINTER_REGEX(".*/content(/\\S+)/example$"), - REQUEST_BODY_EXAMPLES_EXAMPLE_VALUE_FIELD_POINTER_REGEX(".*/content(/\\S+)/examples(/\\S+)/value$"), + REQUEST_BODY_EXAMPLE_POINTER_REGEX(".*/content/\\S+/example$"), + REQUEST_BODY_EXAMPLES_EXAMPLE_VALUE_FIELD_POINTER_REGEX(".*/content/\\S+/examples/\\S+/value$"), RESPONSE_BODY_EXAMPLE_POINTER_REGEX(".*/content(/\\S+)/example$"), - RESPONSE_BODY_EXAMPLES_EXAMPLE_VALUE_FIELD_POINTER_REGEX(".*/content(/\\S+)/examples(/\\S+)/value$"), - PARAMETER_EXAMPLE_POINTER_REGEX(".*/parameters(/\\S+)/example$"), - PARAMETER_EXAMPLES_EXAMPLE_VALUE_FIELD_POINTER_REGEX(".*/parameters(/\\S+)/examples(/\\S+)/value$"), - MODEL_EXAMPLE_POINTER_REGEX("/content(/\\S+)/schema/example$"), - HEADERS_EXAMPLE_POINTER_REGEX(".*/headers(/\\S+)/example$"), - HEADERS_EXAMPLES_POINTER_REGEX(".*/headers(/\\S+)/examples(/\\S+)/value$"), + RESPONSE_BODY_EXAMPLES_EXAMPLE_VALUE_FIELD_POINTER_REGEX(".*/content/\\S+/examples/\\S+/value$"), + PARAMETER_EXAMPLE_POINTER_REGEX(".*/parameters/\\S+/example$"), + PARAMETER_EXAMPLES_EXAMPLE_VALUE_FIELD_POINTER_REGEX(".*/parameters/\\S+/examples/\\S+/value$"), + MODEL_EXAMPLE_POINTER_REGEX("/content/\\S+/schema/example$"), + HEADERS_EXAMPLE_POINTER_REGEX(".*/headers/\\S+/example$"), + HEADERS_EXAMPLES_POINTER_REGEX(".*/headers/\\S+/examples(/\\S+)/value$"), COMPONENTS_SCHEMA_EXAMPLE_POINTER_REGEX(".*/components/schemas/\\S+/example$"); private final String regEx; @@ -88,8 +67,12 @@ public String getRegEx() { EXAMPLE_CONTEXT_TYPES = ContextType.newContentTypeCollection(contextTypes); } + public OpenApi3ExampleProposalProvider(ContextTypeCollection contextTypes) { + super(EXAMPLE_CONTEXT_TYPES); + } + public OpenApi3ExampleProposalProvider() { - super(EXAMPLE_CONTEXT_TYPES, OpenApi3ContentDescriber.CONTENT_TYPE_ID); + this(EXAMPLE_CONTEXT_TYPES); } @Override @@ -111,59 +94,12 @@ public Collection getProposals(JsonPointer pointer, JsonDocu } } - final ExampleProvider exampleDataProvider = (ExampleProvider) getExampleDataProvider(); - final String exampleData = exampleDataProvider.getData(normalized); + final String exampleData = getProposal(normalized); return Arrays.asList(new ProposalDescriptor("Generate Example:").replacementString(exampleData).type("string")); - - } - - private boolean isSchemaReference(JsonNode jsonNode) { - return jsonNode.get(REFERENCE_KEY) != null; - } - - private ExampleProvider getExampleDataProvider() { - final ExampleProvider defaultDataProvider = (JsonNode jsonNode) -> "example:"; - - try { - final ExampleProvider exampleDataProvider = (ExampleProvider) ExtensionUtils - .createExecutableExtension(EXTENSION_POINT_NAME, EXTENSION_PROPERTY_NAME); - return exampleDataProvider != null ? exampleDataProvider : defaultDataProvider; - } catch (CoreException e) { - return defaultDataProvider; - } } private boolean insideComponentsNode(AbstractNode node) { return ModelUtils.findParent(node, COMPONENTS_NODE_POINTER).isPresent(); } - private JsonNode normalize(AbstractNode node, JsonDocument document) { - final URI filePath = DocumentUtils.getActiveEditorInputURI(); - final JsonNode schemaNode = document.asJson().at(node.getPointer()); - if (isSchemaReference(schemaNode)) { - final JsonReference schemaReference = REFERENCE_FACTORY.create(schemaNode); - final JsonNode resolve = schemaReference.resolve(document, filePath); - normalize(resolve, document, filePath); - return resolve; - } else { - normalize(schemaNode, document, filePath); - return schemaNode; - } - } - - private void normalize(JsonNode node, JsonDocument document, URI baseURI) { - node.fields().forEachRemaining(entry -> { - JsonNode value = entry.getValue(); - if (isReference(value)) { - final JsonReference reference = REFERENCE_FACTORY.create(value); - value = reference.resolve(document, baseURI); - - if (value != null && !value.isMissingNode()) { - ((com.fasterxml.jackson.databind.node.ObjectNode) node).set(entry.getKey(), value); - } - } - normalize(value, document, baseURI); - }); - } - } diff --git a/com.reprezen.swagedit/src/com/reprezen/swagedit/assist/SwaggerContentAssistProcessor.java b/com.reprezen.swagedit/src/com/reprezen/swagedit/assist/SwaggerContentAssistProcessor.java index b349b6ff..44bf2826 100644 --- a/com.reprezen.swagedit/src/com/reprezen/swagedit/assist/SwaggerContentAssistProcessor.java +++ b/com.reprezen.swagedit/src/com/reprezen/swagedit/assist/SwaggerContentAssistProcessor.java @@ -33,7 +33,7 @@ public class SwaggerContentAssistProcessor extends JsonContentAssistProcessor { new ResponseCodeContentAssistExt()); public SwaggerContentAssistProcessor(ContentAssistant ca) { - super(ca, proposalProvider, new SwaggerReferenceProposalProvider(), new SwaggerReferenceProposalProvider()); + super(ca, proposalProvider, new SwaggerReferenceProposalProvider(), new SwaggerExampleProposalProvider()); } @Override diff --git a/com.reprezen.swagedit/src/com/reprezen/swagedit/assist/SwaggerExampleProposalProvider.java b/com.reprezen.swagedit/src/com/reprezen/swagedit/assist/SwaggerExampleProposalProvider.java new file mode 100644 index 00000000..b438b368 --- /dev/null +++ b/com.reprezen.swagedit/src/com/reprezen/swagedit/assist/SwaggerExampleProposalProvider.java @@ -0,0 +1,97 @@ +/******************************************************************************* + * Copyright (c) 2016 ModelSolv, Inc. and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * ModelSolv, Inc. - initial API and implementation and/or initial documentation + *******************************************************************************/ +package com.reprezen.swagedit.assist; + +import java.util.Arrays; +import java.util.Collection; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +import com.fasterxml.jackson.core.JsonPointer; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.node.NullNode; +import com.reprezen.swagedit.core.assist.JsonExampleProposalProvider; +import com.reprezen.swagedit.core.assist.ProposalDescriptor; +import com.reprezen.swagedit.core.assist.contexts.ContextType; +import com.reprezen.swagedit.core.assist.contexts.ContextTypeCollection; +import com.reprezen.swagedit.core.assist.contexts.RegexContextType; +import com.reprezen.swagedit.core.editor.JsonDocument; +import com.reprezen.swagedit.core.model.AbstractNode; +import com.reprezen.swagedit.core.utils.ModelUtils; +import com.reprezen.swagedit.core.utils.SwaggerFileFinder.Scope; + +public class SwaggerExampleProposalProvider extends JsonExampleProposalProvider { + + private static final JsonPointer DEFINITIONS_NODE_POINTER = JsonPointer.compile("/definitions/definitions"); + + private static enum PoiterRegEx { + + RESPONSE_BODY_EXAMPLES_REGEX(".*/responses/\\S+/examples/.*$"), + DEFINITIONS_MODEL_EXAMPLE_REGEX(".*/definitions/\\S+/example$"), + PARAMETERS_SCHEMA_EXAMPLE_REGEX(".*/parameters/\\S+/schema/example$"); + + private final String regEx; + + private PoiterRegEx(String regEx) { + this.regEx = regEx; + } + + public String getRegEx() { + return regEx; + } + + } + + private static final ContextTypeCollection EXAMPLE_CONTEXT_TYPES; + + static { + final List contextTypes = Arrays.asList(PoiterRegEx.values()).stream().map(// + poiterRegEx -> new RegexContextType("Generate Example", "Example", poiterRegEx.getRegEx())// + ).collect(Collectors.toList()); + EXAMPLE_CONTEXT_TYPES = ContextType.newContentTypeCollection(contextTypes); + } + + public SwaggerExampleProposalProvider(ContextTypeCollection contextTypes) { + super(EXAMPLE_CONTEXT_TYPES); + } + + public SwaggerExampleProposalProvider() { + super(EXAMPLE_CONTEXT_TYPES); + } + + @Override + public Collection getProposals(JsonPointer pointer, JsonDocument document, Scope scope) { + final AbstractNode nodeAtPointer = document.getModel().find(pointer); + + JsonNode normalized = null; + if (insideDefinitionsNode(nodeAtPointer)) { + final AbstractNode schemaNode = nodeAtPointer.getParent(); + normalized = normalize(schemaNode, document); + } else { + final Optional parentNode = ModelUtils.findParentContainingField(// + nodeAtPointer, SCHEMA_FIELD_NAME); + if (parentNode.isPresent()) { + final AbstractNode schemaNode = parentNode.get().get(SCHEMA_FIELD_NAME); + normalized = normalize(schemaNode, document); + } else { + normalized = NullNode.instance; // schema filed not found in parent + } + } + + final String exampleData = getProposal(normalized); + return Arrays.asList(new ProposalDescriptor("Generate Example:").replacementString(exampleData).type("string")); + } + + private boolean insideDefinitionsNode(AbstractNode node) { + return ModelUtils.findParent(node, DEFINITIONS_NODE_POINTER).isPresent(); + } +} From e7121c9c160cf8100007288ce4f54cbff604a699 Mon Sep 17 00:00:00 2001 From: nbhusare Date: Thu, 4 Apr 2019 22:04:23 -0400 Subject: [PATCH 13/18] Added generic regular expressions for example and examples --- .../assist/JsonExampleProposalProvider.java | 2 +- .../OpenApi3ExampleProposalProvider.java | 35 +++---------------- .../SwaggerExampleProposalProvider.java | 27 +++----------- 3 files changed, 11 insertions(+), 53 deletions(-) diff --git a/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/JsonExampleProposalProvider.java b/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/JsonExampleProposalProvider.java index a1369810..b7dbfca4 100644 --- a/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/JsonExampleProposalProvider.java +++ b/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/JsonExampleProposalProvider.java @@ -58,7 +58,7 @@ public Collection getProposals(JsonPointer pointer, JsonDocu } private boolean isSchemaReference(JsonNode jsonNode) { - return jsonNode.get(REFERENCE_KEY) != null; + return jsonNode.has(REFERENCE_KEY); } protected JsonNode normalize(AbstractNode node, JsonDocument document) { diff --git a/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/assist/OpenApi3ExampleProposalProvider.java b/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/assist/OpenApi3ExampleProposalProvider.java index 5c9ee561..712da364 100644 --- a/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/assist/OpenApi3ExampleProposalProvider.java +++ b/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/assist/OpenApi3ExampleProposalProvider.java @@ -14,7 +14,6 @@ import java.util.Collection; import java.util.List; import java.util.Optional; -import java.util.stream.Collectors; import com.fasterxml.jackson.core.JsonPointer; import com.fasterxml.jackson.databind.JsonNode; @@ -33,38 +32,14 @@ public class OpenApi3ExampleProposalProvider extends JsonExampleProposalProvider private static final JsonPointer COMPONENTS_NODE_POINTER = JsonPointer.compile("/definitions/components"); - private static enum PoiterRegEx { - - REQUEST_BODY_EXAMPLE_POINTER_REGEX(".*/content/\\S+/example$"), - REQUEST_BODY_EXAMPLES_EXAMPLE_VALUE_FIELD_POINTER_REGEX(".*/content/\\S+/examples/\\S+/value$"), - RESPONSE_BODY_EXAMPLE_POINTER_REGEX(".*/content(/\\S+)/example$"), - RESPONSE_BODY_EXAMPLES_EXAMPLE_VALUE_FIELD_POINTER_REGEX(".*/content/\\S+/examples/\\S+/value$"), - PARAMETER_EXAMPLE_POINTER_REGEX(".*/parameters/\\S+/example$"), - PARAMETER_EXAMPLES_EXAMPLE_VALUE_FIELD_POINTER_REGEX(".*/parameters/\\S+/examples/\\S+/value$"), - MODEL_EXAMPLE_POINTER_REGEX("/content/\\S+/schema/example$"), - HEADERS_EXAMPLE_POINTER_REGEX(".*/headers/\\S+/example$"), - HEADERS_EXAMPLES_POINTER_REGEX(".*/headers/\\S+/examples(/\\S+)/value$"), - COMPONENTS_SCHEMA_EXAMPLE_POINTER_REGEX(".*/components/schemas/\\S+/example$"); - - private final String regEx; - - private PoiterRegEx(String regEx) { - this.regEx = regEx; - } - - public String getRegEx() { - return regEx; - } - - } - private static final ContextTypeCollection EXAMPLE_CONTEXT_TYPES; static { - final List contextTypes = Arrays.asList(PoiterRegEx.values()).stream().map(// - poiterRegEx -> new RegexContextType("Generate Example", "Example", poiterRegEx.getRegEx())// - ).collect(Collectors.toList()); - EXAMPLE_CONTEXT_TYPES = ContextType.newContentTypeCollection(contextTypes); + final List contentTypes = Arrays.asList(// + new RegexContextType("Generate Example", "Example", ".*/example$"), + new RegexContextType("Generate Example", "Example", ".*/examples/\\S+/value$")// + ); + EXAMPLE_CONTEXT_TYPES = ContextType.newContentTypeCollection(contentTypes); } public OpenApi3ExampleProposalProvider(ContextTypeCollection contextTypes) { diff --git a/com.reprezen.swagedit/src/com/reprezen/swagedit/assist/SwaggerExampleProposalProvider.java b/com.reprezen.swagedit/src/com/reprezen/swagedit/assist/SwaggerExampleProposalProvider.java index b438b368..be4eacf8 100644 --- a/com.reprezen.swagedit/src/com/reprezen/swagedit/assist/SwaggerExampleProposalProvider.java +++ b/com.reprezen.swagedit/src/com/reprezen/swagedit/assist/SwaggerExampleProposalProvider.java @@ -33,31 +33,14 @@ public class SwaggerExampleProposalProvider extends JsonExampleProposalProvider private static final JsonPointer DEFINITIONS_NODE_POINTER = JsonPointer.compile("/definitions/definitions"); - private static enum PoiterRegEx { - - RESPONSE_BODY_EXAMPLES_REGEX(".*/responses/\\S+/examples/.*$"), - DEFINITIONS_MODEL_EXAMPLE_REGEX(".*/definitions/\\S+/example$"), - PARAMETERS_SCHEMA_EXAMPLE_REGEX(".*/parameters/\\S+/schema/example$"); - - private final String regEx; - - private PoiterRegEx(String regEx) { - this.regEx = regEx; - } - - public String getRegEx() { - return regEx; - } - - } - private static final ContextTypeCollection EXAMPLE_CONTEXT_TYPES; static { - final List contextTypes = Arrays.asList(PoiterRegEx.values()).stream().map(// - poiterRegEx -> new RegexContextType("Generate Example", "Example", poiterRegEx.getRegEx())// - ).collect(Collectors.toList()); - EXAMPLE_CONTEXT_TYPES = ContextType.newContentTypeCollection(contextTypes); + final List contentTypes = Arrays.asList(// + new RegexContextType("Generate Example", "Example", ".*/example$"), + new RegexContextType("Generate Example", "Example", ".*/examples/.*$")// + ); + EXAMPLE_CONTEXT_TYPES = ContextType.newContentTypeCollection(contentTypes); } public SwaggerExampleProposalProvider(ContextTypeCollection contextTypes) { From be826c343c9eea68e9eaacd5ccab1734795af2ee Mon Sep 17 00:00:00 2001 From: nbhusare Date: Fri, 5 Apr 2019 09:39:06 -0400 Subject: [PATCH 14/18] Minor method rename in the ExtensionUtils ADded initial unit test- wip --- .../assist/JsonExampleProposalProvider.java | 2 +- .../swagedit/core/utils/ExtensionUtils.java | 2 +- .../SwaggerExampleProposalProviderTest.xtend | 54 +++++++++++++++++++ 3 files changed, 56 insertions(+), 2 deletions(-) create mode 100644 com.reprezen.swagedit.tests/src/com/reprezen/swagedit/assist/SwaggerExampleProposalProviderTest.xtend diff --git a/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/JsonExampleProposalProvider.java b/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/JsonExampleProposalProvider.java index b7dbfca4..5d97d36e 100644 --- a/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/JsonExampleProposalProvider.java +++ b/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/JsonExampleProposalProvider.java @@ -95,7 +95,7 @@ protected ExampleProvider getExampleDataProvider() { try { final ExampleProvider exampleDataProvider = (ExampleProvider) ExtensionUtils - .createExecutableExtension(EXTENSION_POINT_NAME, EXTENSION_PROPERTY_NAME); + .getExtension(EXTENSION_POINT_NAME, EXTENSION_PROPERTY_NAME); return exampleDataProvider != null ? exampleDataProvider : defaultDataProvider; } catch (CoreException e) { return defaultDataProvider; diff --git a/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/utils/ExtensionUtils.java b/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/utils/ExtensionUtils.java index c23b276f..525e03b3 100644 --- a/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/utils/ExtensionUtils.java +++ b/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/utils/ExtensionUtils.java @@ -16,7 +16,7 @@ public class ExtensionUtils { - public static Object createExecutableExtension(String extensionPointId, String propertyName) throws CoreException { + public static Object getExtension(String extensionPointId, String propertyName) throws CoreException { final IConfigurationElement[] configurationElementsFor = Platform.getExtensionRegistry() .getConfigurationElementsFor(extensionPointId); return configurationElementsFor[0].createExecutableExtension(propertyName); diff --git a/com.reprezen.swagedit.tests/src/com/reprezen/swagedit/assist/SwaggerExampleProposalProviderTest.xtend b/com.reprezen.swagedit.tests/src/com/reprezen/swagedit/assist/SwaggerExampleProposalProviderTest.xtend new file mode 100644 index 00000000..22b60d9a --- /dev/null +++ b/com.reprezen.swagedit.tests/src/com/reprezen/swagedit/assist/SwaggerExampleProposalProviderTest.xtend @@ -0,0 +1,54 @@ +package com.reprezen.swagedit.assist + +import com.reprezen.swagedit.core.assist.JsonExampleProposalProvider +import com.reprezen.swagedit.core.model.Model +import com.reprezen.swagedit.editor.SwaggerDocument +import com.reprezen.swagedit.schema.SwaggerSchema +import com.reprezen.swagedit.tests.utils.PointerHelpers +import org.junit.Before +import org.junit.Test + +class SwaggerExampleProposalProviderTest { + + extension PointerHelpers = new PointerHelpers + + val schema = new SwaggerSchema + var JsonExampleProposalProvider provider + var Model model + + @Before + def void setUp() { + model = Model.empty(schema) + provider = new SwaggerExampleProposalProvider + } + + def void testGetExampleProposals_ResponseObject() { + val text = ''' + paths: + /pets/{petId}: + get: + responses: + '200': + schema: + $ref: + description: OK + content: + application/json: + schema: + $ref: "#/components/schemas/Pet" + example: + + definitions: + Valid: + type: string + ''' + val document = new SwaggerDocument + document.set(text) + + val pointer = "/paths/~1pets/get/responses/200/content/application~1json/example" + val proposals = provider.getProposals(pointer.ptr, document, null) + + } + + +} From 0d6290bc3dcd5226794c451fe54dc641de4814aa Mon Sep 17 00:00:00 2001 From: nbhusare Date: Tue, 9 Apr 2019 17:09:41 -0400 Subject: [PATCH 15/18] Removed the normalization code from the Example proposal providers Updated the ExampleProvider interface --- .../assist/JsonContentAssistProcessor.java | 2 +- .../assist/JsonExampleProposalProvider.java | 61 ++----------------- .../exampleprovider/ExampleProvider.java | 7 ++- .../OpenApi3ExampleProposalProvider.java | 17 +++--- .../SwaggerExampleProposalProvider.java | 14 +++-- 5 files changed, 27 insertions(+), 74 deletions(-) diff --git a/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/JsonContentAssistProcessor.java b/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/JsonContentAssistProcessor.java index 8e347d3d..d51190d1 100644 --- a/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/JsonContentAssistProcessor.java +++ b/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/JsonContentAssistProcessor.java @@ -153,7 +153,7 @@ public ICompletionProposal[] computeCompletionProposals(ITextViewer viewer, int final boolean isExampleCompletion = exampleProposalProvider.canProvideProposal(currentModel, currentPath); if (isExampleCompletion) { //TODO: Update or clear status ??????? - kaizenProposals = exampleProposalProvider.getProposals(currentPath, document, currentScope); + kaizenProposals = exampleProposalProvider.getProposals(currentPath, document); } else { clearStatus(); kaizenProposals = proposalProvider.getProposals(currentPath, currentModel, prefix); diff --git a/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/JsonExampleProposalProvider.java b/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/JsonExampleProposalProvider.java index 07ea4cd6..3822f3b0 100644 --- a/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/JsonExampleProposalProvider.java +++ b/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/JsonExampleProposalProvider.java @@ -10,38 +10,26 @@ *******************************************************************************/ package com.reprezen.swagedit.core.assist; -import static com.reprezen.swagedit.core.json.references.JsonReference.isReference; - import java.net.URI; import java.util.Collection; import java.util.Collections; import java.util.Set; -import org.eclipse.core.runtime.CoreException; - import com.fasterxml.jackson.core.JsonPointer; -import com.fasterxml.jackson.databind.JsonNode; import com.reprezen.swagedit.core.assist.contexts.ContextType; import com.reprezen.swagedit.core.assist.contexts.ContextTypeCollection; import com.reprezen.swagedit.core.assist.exampleprovider.ExampleProvider; import com.reprezen.swagedit.core.editor.JsonDocument; -import com.reprezen.swagedit.core.json.references.JsonReference; -import com.reprezen.swagedit.core.json.references.JsonReferenceFactory; -import com.reprezen.swagedit.core.model.AbstractNode; import com.reprezen.swagedit.core.model.Model; -import com.reprezen.swagedit.core.utils.DocumentUtils; import com.reprezen.swagedit.core.utils.ExtensionUtils; -import com.reprezen.swagedit.core.utils.SwaggerFileFinder.Scope; /** * Completion proposal provider for JSON examples. */ public class JsonExampleProposalProvider { - private static final JsonReferenceFactory REFERENCE_FACTORY = new JsonReferenceFactory(); - public static final String ID = "com.reprezen.swagedit.core.exampleprovider"; + public static final String ID = "com.reprezen.swagedit.exampleprovider"; protected static final String SCHEMA_FIELD_NAME = "schema"; - private static final String REFERENCE_KEY = "$ref"; private final ContextTypeCollection contextTypes; public JsonExampleProposalProvider(ContextTypeCollection contextTypes) { @@ -52,47 +40,14 @@ public boolean canProvideProposal(Model model, JsonPointer pointer) { return pointer != null && contextTypes.get(model, pointer) != ContextType.UNKNOWN; } - public Collection getProposals(JsonPointer pointer, JsonDocument document, - Scope scope) { + public Collection getProposals(JsonPointer pointer, JsonDocument document) { return Collections.emptyList(); } - private boolean isSchemaReference(JsonNode jsonNode) { - return jsonNode.has(REFERENCE_KEY); - } - - protected JsonNode normalize(AbstractNode node, JsonDocument document) { - final URI filePath = DocumentUtils.getActiveEditorInputURI(); - final JsonNode schemaNode = document.asJson().at(node.getPointer()); - if (isSchemaReference(schemaNode)) { - final JsonReference schemaReference = REFERENCE_FACTORY.create(schemaNode); - final JsonNode resolve = schemaReference.resolve(document, filePath); - normalize(resolve, document, filePath); - return resolve; - } else { - normalize(schemaNode, document, filePath); - return schemaNode; - } - } - - private void normalize(JsonNode node, JsonDocument document, URI baseURI) { - node.fields().forEachRemaining(entry -> { - JsonNode value = entry.getValue(); - if (isReference(value)) { - final JsonReference reference = REFERENCE_FACTORY.create(value); - value = reference.resolve(document, baseURI); - - if (value != null && !value.isMissingNode()) { - ((com.fasterxml.jackson.databind.node.ObjectNode) node).set(entry.getKey(), value); - } - } - normalize(value, document, baseURI); - }); - } - protected ExampleProvider getExampleDataProvider() { - final ExampleProvider defaultExampleProvider = (JsonNode jsonNode) -> "example:"; - + final ExampleProvider defaultExampleProvider = (JsonPointer jsonPointer, JsonDocument document, + URI uri) -> "example:"; + final Set exampleProviders = ExtensionUtils.getExampleProviders(); if (exampleProviders != null && !exampleProviders.isEmpty()) { return exampleProviders.iterator().next(); @@ -101,10 +56,4 @@ protected ExampleProvider getExampleDataProvider() { } } - protected String getProposal(JsonNode normalized) { - final ExampleProvider exampleDataProvider = (ExampleProvider) getExampleDataProvider(); - final String exampleData = exampleDataProvider.getData(normalized); - return exampleData; - } - } diff --git a/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/exampleprovider/ExampleProvider.java b/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/exampleprovider/ExampleProvider.java index b4526082..50e001dd 100644 --- a/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/exampleprovider/ExampleProvider.java +++ b/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/exampleprovider/ExampleProvider.java @@ -10,9 +10,12 @@ *******************************************************************************/ package com.reprezen.swagedit.core.assist.exampleprovider; -import com.fasterxml.jackson.databind.JsonNode; +import java.net.URI; + +import com.fasterxml.jackson.core.JsonPointer; +import com.reprezen.swagedit.core.editor.JsonDocument; public interface ExampleProvider { - String getData(JsonNode node); + String getData(JsonPointer jsonPointer, JsonDocument document, URI baseURI); } diff --git a/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/assist/OpenApi3ExampleProposalProvider.java b/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/assist/OpenApi3ExampleProposalProvider.java index 712da364..76be9890 100644 --- a/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/assist/OpenApi3ExampleProposalProvider.java +++ b/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/assist/OpenApi3ExampleProposalProvider.java @@ -16,8 +16,6 @@ import java.util.Optional; import com.fasterxml.jackson.core.JsonPointer; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.NullNode; import com.reprezen.swagedit.core.assist.JsonExampleProposalProvider; import com.reprezen.swagedit.core.assist.ProposalDescriptor; import com.reprezen.swagedit.core.assist.contexts.ContextType; @@ -25,8 +23,8 @@ import com.reprezen.swagedit.core.assist.contexts.RegexContextType; import com.reprezen.swagedit.core.editor.JsonDocument; import com.reprezen.swagedit.core.model.AbstractNode; +import com.reprezen.swagedit.core.utils.DocumentUtils; import com.reprezen.swagedit.core.utils.ModelUtils; -import com.reprezen.swagedit.core.utils.SwaggerFileFinder.Scope; public class OpenApi3ExampleProposalProvider extends JsonExampleProposalProvider { @@ -51,25 +49,26 @@ public OpenApi3ExampleProposalProvider() { } @Override - public Collection getProposals(JsonPointer pointer, JsonDocument document, Scope scope) { + public Collection getProposals(JsonPointer pointer, JsonDocument document) { final AbstractNode nodeAtPointer = document.getModel().find(pointer); - JsonNode normalized = null; + JsonPointer jsonPointer = null; if (insideComponentsNode(nodeAtPointer)) { final AbstractNode schemaNode = nodeAtPointer.getParent(); - normalized = normalize(schemaNode, document); + jsonPointer = schemaNode.getPointer(); } else { final Optional parentNode = ModelUtils.findParentContainingField(// nodeAtPointer, SCHEMA_FIELD_NAME); if (parentNode.isPresent()) { final AbstractNode schemaNode = parentNode.get().get(SCHEMA_FIELD_NAME); - normalized = normalize(schemaNode, document); + jsonPointer = schemaNode.getPointer(); } else { - normalized = NullNode.instance; // schema filed not found in parent + //TODO: Add code to handle this case + jsonPointer = null; // schema filed not found in parent } } - final String exampleData = getProposal(normalized); + final String exampleData = getExampleDataProvider().getData(jsonPointer, document, DocumentUtils.getActiveEditorInputURI()); return Arrays.asList(new ProposalDescriptor("Generate Example:").replacementString(exampleData).type("string")); } diff --git a/com.reprezen.swagedit/src/com/reprezen/swagedit/assist/SwaggerExampleProposalProvider.java b/com.reprezen.swagedit/src/com/reprezen/swagedit/assist/SwaggerExampleProposalProvider.java index be4eacf8..cbdb12ad 100644 --- a/com.reprezen.swagedit/src/com/reprezen/swagedit/assist/SwaggerExampleProposalProvider.java +++ b/com.reprezen.swagedit/src/com/reprezen/swagedit/assist/SwaggerExampleProposalProvider.java @@ -26,6 +26,7 @@ import com.reprezen.swagedit.core.assist.contexts.RegexContextType; import com.reprezen.swagedit.core.editor.JsonDocument; import com.reprezen.swagedit.core.model.AbstractNode; +import com.reprezen.swagedit.core.utils.DocumentUtils; import com.reprezen.swagedit.core.utils.ModelUtils; import com.reprezen.swagedit.core.utils.SwaggerFileFinder.Scope; @@ -52,25 +53,26 @@ public SwaggerExampleProposalProvider() { } @Override - public Collection getProposals(JsonPointer pointer, JsonDocument document, Scope scope) { + public Collection getProposals(JsonPointer pointer, JsonDocument document) { final AbstractNode nodeAtPointer = document.getModel().find(pointer); - JsonNode normalized = null; + JsonPointer jsonPointer = null; if (insideDefinitionsNode(nodeAtPointer)) { final AbstractNode schemaNode = nodeAtPointer.getParent(); - normalized = normalize(schemaNode, document); + jsonPointer = schemaNode.getPointer(); } else { final Optional parentNode = ModelUtils.findParentContainingField(// nodeAtPointer, SCHEMA_FIELD_NAME); if (parentNode.isPresent()) { final AbstractNode schemaNode = parentNode.get().get(SCHEMA_FIELD_NAME); - normalized = normalize(schemaNode, document); + jsonPointer = schemaNode.getPointer(); } else { - normalized = NullNode.instance; // schema filed not found in parent + //TODO: Add code to handle this case + jsonPointer = null; // schema filed not found in parent } } - final String exampleData = getProposal(normalized); + final String exampleData = getExampleDataProvider().getData(jsonPointer, document, DocumentUtils.getActiveEditorInputURI()); return Arrays.asList(new ProposalDescriptor("Generate Example:").replacementString(exampleData).type("string")); } From 8d45338a845bb2523d29ba2571f53d7745c21b11 Mon Sep 17 00:00:00 2001 From: nbhusare Date: Wed, 10 Apr 2019 16:59:56 -0400 Subject: [PATCH 16/18] ZP-3764 : dummy push to create a new build --- .../swagedit/core/assist/JsonExampleProposalProvider.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/JsonExampleProposalProvider.java b/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/JsonExampleProposalProvider.java index 3822f3b0..1364071d 100644 --- a/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/JsonExampleProposalProvider.java +++ b/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/JsonExampleProposalProvider.java @@ -46,7 +46,7 @@ public Collection getProposals(JsonPointer pointer, JsonDocu protected ExampleProvider getExampleDataProvider() { final ExampleProvider defaultExampleProvider = (JsonPointer jsonPointer, JsonDocument document, - URI uri) -> "example:"; + URI uri) -> "example:"; final Set exampleProviders = ExtensionUtils.getExampleProviders(); if (exampleProviders != null && !exampleProviders.isEmpty()) { From e7d415343347d1fd877d63290962a1b9e368e2f2 Mon Sep 17 00:00:00 2001 From: nbhusare Date: Wed, 10 Apr 2019 17:15:40 -0400 Subject: [PATCH 17/18] Removed the schema folder from the swagedit.openapi3 project and also removed it from the build.properties bin.includes field --- com.reprezen.swagedit.openapi3/build.properties | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/com.reprezen.swagedit.openapi3/build.properties b/com.reprezen.swagedit.openapi3/build.properties index bf796502..1f537c21 100644 --- a/com.reprezen.swagedit.openapi3/build.properties +++ b/com.reprezen.swagedit.openapi3/build.properties @@ -5,5 +5,4 @@ bin.includes = META-INF/,\ OSGI-INF/,\ plugin.xml,\ icons/,\ - resources/,\ - schema/ + resources/ From e719e19c22d8038fabb90a647f20e15054eeda1c Mon Sep 17 00:00:00 2001 From: nbhusare Date: Wed, 10 Apr 2019 17:20:50 -0400 Subject: [PATCH 18/18] Removed ExampleProposalProvider Test --- .../SwaggerExampleProposalProviderTest.xtend | 54 ------------------- 1 file changed, 54 deletions(-) delete mode 100644 com.reprezen.swagedit.tests/src/com/reprezen/swagedit/assist/SwaggerExampleProposalProviderTest.xtend diff --git a/com.reprezen.swagedit.tests/src/com/reprezen/swagedit/assist/SwaggerExampleProposalProviderTest.xtend b/com.reprezen.swagedit.tests/src/com/reprezen/swagedit/assist/SwaggerExampleProposalProviderTest.xtend deleted file mode 100644 index 22b60d9a..00000000 --- a/com.reprezen.swagedit.tests/src/com/reprezen/swagedit/assist/SwaggerExampleProposalProviderTest.xtend +++ /dev/null @@ -1,54 +0,0 @@ -package com.reprezen.swagedit.assist - -import com.reprezen.swagedit.core.assist.JsonExampleProposalProvider -import com.reprezen.swagedit.core.model.Model -import com.reprezen.swagedit.editor.SwaggerDocument -import com.reprezen.swagedit.schema.SwaggerSchema -import com.reprezen.swagedit.tests.utils.PointerHelpers -import org.junit.Before -import org.junit.Test - -class SwaggerExampleProposalProviderTest { - - extension PointerHelpers = new PointerHelpers - - val schema = new SwaggerSchema - var JsonExampleProposalProvider provider - var Model model - - @Before - def void setUp() { - model = Model.empty(schema) - provider = new SwaggerExampleProposalProvider - } - - def void testGetExampleProposals_ResponseObject() { - val text = ''' - paths: - /pets/{petId}: - get: - responses: - '200': - schema: - $ref: - description: OK - content: - application/json: - schema: - $ref: "#/components/schemas/Pet" - example: - - definitions: - Valid: - type: string - ''' - val document = new SwaggerDocument - document.set(text) - - val pointer = "/paths/~1pets/get/responses/200/content/application~1json/example" - val proposals = provider.getProposals(pointer.ptr, document, null) - - } - - -}