diff --git a/com.reprezen.swagedit.core/META-INF/MANIFEST.MF b/com.reprezen.swagedit.core/META-INF/MANIFEST.MF index 718d52e7..1db5795f 100644 --- a/com.reprezen.swagedit.core/META-INF/MANIFEST.MF +++ b/com.reprezen.swagedit.core/META-INF/MANIFEST.MF @@ -30,6 +30,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/plugin.xml b/com.reprezen.swagedit.core/plugin.xml index 8c2b3a73..8b0301e5 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/JsonContentAssistProcessor.java b/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/JsonContentAssistProcessor.java index 88acaccb..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 @@ -67,6 +67,7 @@ public abstract class JsonContentAssistProcessor extends TemplateCompletionProce private final JsonProposalProvider proposalProvider; private final JsonReferenceProposalProvider referenceProposalProvider; + private final JsonExampleProposalProvider 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), + new JsonExampleProposalProvider(ContextType.emptyContentTypeCollection())); + } + + public JsonContentAssistProcessor(ContentAssistant ca, JsonProposalProvider proposalProvider, + JsonReferenceProposalProvider referenceProposalProvider, + JsonExampleProposalProvider exampleProposalProvider) { + this.contentAssistant = ca; + this.proposalProvider = proposalProvider; + this.referenceProposalProvider = referenceProposalProvider; + this.exampleProposalProvider = exampleProposalProvider; + this.textMessages = initTextMessages(); } - - public JsonContentAssistProcessor(ContentAssistant ca, JsonProposalProvider proposalProvider, JsonReferenceProposalProvider referenceProposalProvider) { - this.contentAssistant = ca; - this.proposalProvider = proposalProvider; - this.referenceProposalProvider = referenceProposalProvider; - 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); + final boolean isExampleCompletion = exampleProposalProvider.canProvideProposal(currentModel, currentPath); + if (isExampleCompletion) { + //TODO: Update or clear status ??????? + kaizenProposals = exampleProposalProvider.getProposals(currentPath, document); + } 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/JsonExampleProposalProvider.java b/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/JsonExampleProposalProvider.java new file mode 100644 index 00000000..1364071d --- /dev/null +++ b/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/JsonExampleProposalProvider.java @@ -0,0 +1,59 @@ +/******************************************************************************* + * 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 java.net.URI; +import java.util.Collection; +import java.util.Collections; +import java.util.Set; + +import com.fasterxml.jackson.core.JsonPointer; +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.model.Model; +import com.reprezen.swagedit.core.utils.ExtensionUtils; + +/** + * Completion proposal provider for JSON examples. + */ +public class JsonExampleProposalProvider { + + public static final String ID = "com.reprezen.swagedit.exampleprovider"; + protected static final String SCHEMA_FIELD_NAME = "schema"; + 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) { + return Collections.emptyList(); + } + + protected ExampleProvider getExampleDataProvider() { + final ExampleProvider defaultExampleProvider = (JsonPointer jsonPointer, JsonDocument document, + URI uri) -> "example:"; + + final Set exampleProviders = ExtensionUtils.getExampleProviders(); + if (exampleProviders != null && !exampleProviders.isEmpty()) { + return exampleProviders.iterator().next(); + } else { + return defaultExampleProvider; + } + } + +} 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..50e001dd --- /dev/null +++ b/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/assist/exampleprovider/ExampleProvider.java @@ -0,0 +1,21 @@ +/******************************************************************************* + * 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 java.net.URI; + +import com.fasterxml.jackson.core.JsonPointer; +import com.reprezen.swagedit.core.editor.JsonDocument; + +public interface ExampleProvider { + + String getData(JsonPointer jsonPointer, JsonDocument document, URI baseURI); +} 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 index ccbb27f1..1384c1e5 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,15 +1,17 @@ /******************************************************************************* - * 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 + * 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.Collections; import java.util.Objects; import java.util.Set; import java.util.function.Predicate; @@ -21,45 +23,53 @@ import org.eclipse.core.runtime.Platform; import com.reprezen.swagedit.core.Activator; +import com.reprezen.swagedit.core.assist.JsonExampleProposalProvider; +import com.reprezen.swagedit.core.assist.exampleprovider.ExampleProvider; import com.reprezen.swagedit.core.providers.PreferenceProvider; import com.reprezen.swagedit.core.providers.ValidationProvider; public class ExtensionUtils { - @SuppressWarnings("unchecked") - private static Set resolveProviders(String ID, Predicate predicate) { - return Stream.of(Platform.getExtensionRegistry() // - .getConfigurationElementsFor(ID)) // - .filter(predicate) // - .map(e -> { - try { - return e.createExecutableExtension("class"); - } catch (CoreException ex) { - Activator.getDefault().logError(ex.getMessage(), ex); - return null; - } - }) // - .map(e -> { - try { - return (T) e; - } catch (ClassCastException ex) { - return null; - } - }) // - .filter(Objects::nonNull) // - .collect(Collectors.toSet()); - } + @SuppressWarnings("unchecked") + private static Set resolveProviders(String ID, Predicate predicate) { + return Stream.of(Platform.getExtensionRegistry() // + .getConfigurationElementsFor(ID)) // + .filter(predicate) // + .map(e -> { + try { + return e.createExecutableExtension("class"); + } catch (CoreException ex) { + Activator.getDefault().logError(ex.getMessage(), ex); + return Collections.emptySet(); + } + }) // + .map(e -> { + try { + return (T) e; + } catch (ClassCastException ex) { + Activator.getDefault().logError(ex.getMessage(), ex); + return null; + } + }) // + .filter(Objects::nonNull) // + .collect(Collectors.toSet()); + } + + public static Set getValidationProviders() { + return resolveProviders(ValidationProvider.ID, (e) -> true); + } + + public static Set getPreferenceProviders() { + return resolveProviders(PreferenceProvider.ID, (e) -> true); + } - public static Set getValidationProviders() { - return resolveProviders(ValidationProvider.ID, (e) -> true); - } + public static Set getPreferenceProviders(String preferencePage) { + return resolveProviders(PreferenceProvider.ID, + (e) -> preferencePage.equalsIgnoreCase(e.getAttribute("preferencePage"))); + } - public static Set getPreferenceProviders() { - return resolveProviders(PreferenceProvider.ID, (e) -> true); - } + public static Set getExampleProviders() { + return resolveProviders(JsonExampleProposalProvider.ID, (e) -> true); + } - public static Set getPreferenceProviders(String preferencePage) { - return resolveProviders(PreferenceProvider.ID, - (e) -> preferencePage.equalsIgnoreCase(e.getAttribute("preferencePage"))); - } } 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..43f1144e --- /dev/null +++ b/com.reprezen.swagedit.core/src/com/reprezen/swagedit/core/utils/ModelUtils.java @@ -0,0 +1,51 @@ +/******************************************************************************* + * 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; + +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 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 (pointer.equals(objectNode.getType().getPointer())) { + return Optional.of(objectNode); + } + } + + if (node == null) { + return Optional.empty(); + } + + return findParent(node.getParent(), pointer); + } + +} 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..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 @@ -36,18 +36,18 @@ public class OpenApi3ContentAssistProcessor extends JsonContentAssistProcessor { new SchemaFormatContentAssistExt(), // new ParameterInContentAssistExt(), // new ResponseCodeContentAssistExt(), // - new MediaTypeContentAssistExt()); + 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..76be9890 --- /dev/null +++ b/com.reprezen.swagedit.openapi3/src/com/reprezen/swagedit/openapi3/assist/OpenApi3ExampleProposalProvider.java @@ -0,0 +1,79 @@ +/******************************************************************************* + * 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 java.util.Arrays; +import java.util.Collection; +import java.util.List; +import java.util.Optional; + +import com.fasterxml.jackson.core.JsonPointer; +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.DocumentUtils; +import com.reprezen.swagedit.core.utils.ModelUtils; + +public class OpenApi3ExampleProposalProvider extends JsonExampleProposalProvider { + + private static final JsonPointer COMPONENTS_NODE_POINTER = JsonPointer.compile("/definitions/components"); + + private static final ContextTypeCollection EXAMPLE_CONTEXT_TYPES; + + static { + 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) { + super(EXAMPLE_CONTEXT_TYPES); + } + + public OpenApi3ExampleProposalProvider() { + this(EXAMPLE_CONTEXT_TYPES); + } + + @Override + public Collection getProposals(JsonPointer pointer, JsonDocument document) { + final AbstractNode nodeAtPointer = document.getModel().find(pointer); + + JsonPointer jsonPointer = null; + if (insideComponentsNode(nodeAtPointer)) { + final AbstractNode schemaNode = nodeAtPointer.getParent(); + 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); + jsonPointer = schemaNode.getPointer(); + } else { + //TODO: Add code to handle this case + jsonPointer = null; // schema filed not found in parent + } + } + + final String exampleData = getExampleDataProvider().getData(jsonPointer, document, DocumentUtils.getActiveEditorInputURI()); + return Arrays.asList(new ProposalDescriptor("Generate Example:").replacementString(exampleData).type("string")); + } + + private boolean insideComponentsNode(AbstractNode node) { + return ModelUtils.findParent(node, COMPONENTS_NODE_POINTER).isPresent(); + } + +} 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..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()); + 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..cbdb12ad --- /dev/null +++ b/com.reprezen.swagedit/src/com/reprezen/swagedit/assist/SwaggerExampleProposalProvider.java @@ -0,0 +1,82 @@ +/******************************************************************************* + * 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.DocumentUtils; +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 final ContextTypeCollection EXAMPLE_CONTEXT_TYPES; + + static { + 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) { + super(EXAMPLE_CONTEXT_TYPES); + } + + public SwaggerExampleProposalProvider() { + super(EXAMPLE_CONTEXT_TYPES); + } + + @Override + public Collection getProposals(JsonPointer pointer, JsonDocument document) { + final AbstractNode nodeAtPointer = document.getModel().find(pointer); + + JsonPointer jsonPointer = null; + if (insideDefinitionsNode(nodeAtPointer)) { + final AbstractNode schemaNode = nodeAtPointer.getParent(); + 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); + jsonPointer = schemaNode.getPointer(); + } else { + //TODO: Add code to handle this case + jsonPointer = null; // schema filed not found in parent + } + } + + final String exampleData = getExampleDataProvider().getData(jsonPointer, document, DocumentUtils.getActiveEditorInputURI()); + return Arrays.asList(new ProposalDescriptor("Generate Example:").replacementString(exampleData).type("string")); + } + + private boolean insideDefinitionsNode(AbstractNode node) { + return ModelUtils.findParent(node, DEFINITIONS_NODE_POINTER).isPresent(); + } +}