Skip to content

Commit

Permalink
Abstract PMCD deserialization and grammar generation
Browse files Browse the repository at this point in the history
  • Loading branch information
kevin-m-knight-gs committed Dec 7, 2023
1 parent ae32a6e commit 7346c9b
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@

package org.finos.legend.engine.ide.lsp.extension;

import com.fasterxml.jackson.databind.ObjectMapper;
import org.eclipse.collections.api.factory.Lists;
import org.eclipse.collections.api.factory.Maps;
import org.eclipse.collections.api.list.ImmutableList;
Expand All @@ -37,8 +38,11 @@
import org.finos.legend.engine.language.pure.grammar.from.PureGrammarParserContext;
import org.finos.legend.engine.language.pure.grammar.from.SectionSourceCode;
import org.finos.legend.engine.language.pure.grammar.from.extension.PureGrammarParserExtensions;
import org.finos.legend.engine.language.pure.grammar.to.PureGrammarComposer;
import org.finos.legend.engine.language.pure.grammar.to.PureGrammarComposerContext;
import org.finos.legend.engine.language.pure.modelManager.ModelManager;
import org.finos.legend.engine.protocol.pure.v1.ProtocolToClassifierPathLoader;
import org.finos.legend.engine.protocol.pure.v1.PureProtocolObjectMapperFactory;
import org.finos.legend.engine.protocol.pure.v1.model.SourceInformation;
import org.finos.legend.engine.protocol.pure.v1.model.context.PureModelContextData;
import org.finos.legend.engine.protocol.pure.v1.model.packageableElement.PackageableElement;
Expand All @@ -49,6 +53,7 @@
import org.finos.legend.engine.protocol.pure.v1.model.test.result.TestError;
import org.finos.legend.engine.protocol.pure.v1.model.test.result.TestExecuted;
import org.finos.legend.engine.protocol.pure.v1.model.test.result.TestResult;
import org.finos.legend.engine.shared.core.api.grammar.RenderStyle;
import org.finos.legend.engine.shared.core.deployment.DeploymentMode;
import org.finos.legend.engine.shared.core.operational.errorManagement.EngineException;
import org.finos.legend.engine.testable.TestableRunner;
Expand All @@ -60,8 +65,10 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.io.UncheckedIOException;
import java.util.Collections;
import java.util.List;
import java.util.Map;
Expand All @@ -88,6 +95,9 @@ abstract class AbstractLSPGrammarExtension implements LegendLSPGrammarExtension
private final Map<String, ? extends TestableRunnerExtension> testableRunners = TestableRunnerExtensionLoader.getClassifierPathToTestableRunnerMap();
private final Map<Class<? extends PackageableElement>, String> classToClassifier = ProtocolToClassifierPathLoader.getProtocolClassToClassifierMap();

private ObjectMapper protocolMapper;
private PureGrammarComposer composer;

@Override
public void initialize(SectionState section)
{
Expand Down Expand Up @@ -482,6 +492,47 @@ protected PureModelContextData buildPureModelContextData(GlobalState globalState
return builder.build();
}

protected PureModelContextData deserializePMCD(String json)
{
try
{
return getProtocolMapper().readValue(json, PureModelContextData.class);
}
catch (IOException e)
{
throw new UncheckedIOException(e);
}
}

private ObjectMapper getProtocolMapper()
{
synchronized (this)
{
if (this.protocolMapper == null)
{
this.protocolMapper = PureProtocolObjectMapperFactory.getNewObjectMapper();
}
return this.protocolMapper;
}
}

protected String toGrammar(PureModelContextData pmcd)
{
return getComposer().renderPureModelContextData(pmcd);
}

private PureGrammarComposer getComposer()
{
synchronized (this)
{
if (this.composer == null)
{
this.composer = PureGrammarComposer.newInstance(PureGrammarComposerContext.Builder.newInstance().withRenderStyle(RenderStyle.PRETTY).build());
}
return this.composer;
}
}

protected LegendDeclaration getDeclaration(PackageableElement element)
{
String path = element.getPath();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,6 @@
import org.finos.legend.engine.ide.lsp.extension.state.SectionState;
import org.finos.legend.engine.language.pure.compiler.toPureGraph.PureModel;
import org.finos.legend.engine.language.pure.grammar.from.RelationalGrammarParserExtension;
import org.finos.legend.engine.language.pure.grammar.to.PureGrammarComposer;
import org.finos.legend.engine.language.pure.grammar.to.PureGrammarComposerContext;
import org.finos.legend.engine.protocol.pure.v1.PureProtocolObjectMapperFactory;
import org.finos.legend.engine.protocol.pure.v1.model.context.PureModelContextData;
import org.finos.legend.engine.protocol.pure.v1.model.packageableElement.PackageableElement;
import org.finos.legend.engine.protocol.pure.v1.model.packageableElement.store.relational.model.Column;
Expand All @@ -33,7 +30,6 @@
import org.finos.legend.engine.protocol.pure.v1.model.packageableElement.store.relational.model.Schema;
import org.finos.legend.engine.protocol.pure.v1.model.packageableElement.store.relational.model.Table;
import org.finos.legend.engine.protocol.pure.v1.model.packageableElement.store.relational.model.View;
import org.finos.legend.engine.shared.core.api.grammar.RenderStyle;
import org.finos.legend.pure.generated.core_relational_relational_autogeneration_relationalToPure;
import org.finos.legend.pure.m2.relational.M2RelationalPaths;
import org.slf4j.Logger;
Expand Down Expand Up @@ -112,8 +108,8 @@ private Iterable<? extends LegendExecutionResult> generateModelsFromDatabaseSpec
org.finos.legend.pure.m3.coreinstance.meta.relational.metamodel.Database database = (org.finos.legend.pure.m3.coreinstance.meta.relational.metamodel.Database) pureModel.getStore(entityPath);
String targetPackage = element._package;
String result = core_relational_relational_autogeneration_relationalToPure.Root_meta_relational_transform_autogen_classesAssociationsAndMappingFromDatabase_Database_1__String_1__String_1_(database, targetPackage, pureModel.getExecutionSupport());
PureModelContextData pmcd = PureProtocolObjectMapperFactory.getNewObjectMapper().readValue(result, PureModelContextData.class);
String code = PureGrammarComposer.newInstance(PureGrammarComposerContext.Builder.newInstance().withRenderStyle(RenderStyle.PRETTY).build()).renderPureModelContextData(pmcd);
PureModelContextData pmcd = deserializePMCD(result);
String code = toGrammar(pmcd);
String warning = "***WARNING***\n" +
"These models and mappings are intended only as examples.\n" +
"They should not be considered a replacement for thoughtful modeling.\n" +
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,6 @@ public class ServiceLSPGrammarExtension extends AbstractSectionParserLSPGrammarE
private static final String RUN_LEGACY_TESTS_COMMAND_ID = "legend.service.runLegacyTests";
private static final String RUN_LEGACY_TESTS_COMMAND_TITLE = "Run legacy tests";


public ServiceLSPGrammarExtension()
{
super(ServiceParserExtension.NAME, new ServiceParserExtension());
Expand Down

0 comments on commit 7346c9b

Please sign in to comment.