/* * Copyright 2003-2017 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package jetbrains.mps.generator.impl.interpreted; import jetbrains.mps.generator.impl.GenerationFailureException; import jetbrains.mps.generator.impl.RuleUtil; import jetbrains.mps.generator.impl.query.QueryKey; import jetbrains.mps.generator.impl.query.QueryKeyImpl; import jetbrains.mps.generator.impl.query.QueryProviderBase; import jetbrains.mps.generator.impl.query.ScriptCodeBlock; import jetbrains.mps.generator.runtime.TemplateMappingScript; import jetbrains.mps.generator.template.ITemplateGenerator; import jetbrains.mps.generator.template.MappingScriptContext; import org.jetbrains.mps.openapi.model.SModel; import org.jetbrains.mps.openapi.model.SNode; import org.jetbrains.mps.openapi.model.SNodeReference; /** * Evgeny Gryaznov, Nov 30, 2010 */ public class TemplateMappingScriptInterpreted implements TemplateMappingScript { private final SNode scriptNode; private ScriptCodeBlock myCodeBlock; private final boolean myMissingCodeBlock; public TemplateMappingScriptInterpreted(SNode scriptNode) { this.scriptNode = scriptNode; myMissingCodeBlock = null == RuleUtil.getMappingScript_CodeBlock(scriptNode); // FIXME shall pass log (and QueryProvider factory) here from outside // and log missing code block only once. } @Override public SNodeReference getScriptNode() { return scriptNode.getReference(); } @Override public String getLongName() { return String.format("'%s' (%s)", scriptNode.getName(), scriptNode.getModel().getName()); } @Override public int getKind() { return RuleUtil.getMappingScript_IsPreProcess(scriptNode) ? PREPROCESS : POSTPROCESS; } @Override public void apply(SModel model, ITemplateGenerator generator) throws GenerationFailureException { if (myMissingCodeBlock) { generator.getLogger().warning(getScriptNode(), String.format("cannot run script '%s' : no code-block", scriptNode.getName())); return; } if (myCodeBlock == null) { SNode codeBlock = RuleUtil.getMappingScript_CodeBlock(scriptNode); if (codeBlock != null) { QueryKey identity = new QueryKeyImpl(getScriptNode(), codeBlock.getNodeId(), scriptNode); myCodeBlock = generator.getQueryProvider(getScriptNode()).getScriptCodeBlock(identity); } else { myCodeBlock = new QueryProviderBase.Defaults(); } } myCodeBlock.invoke(new MappingScriptContext(model, getScriptNode(), generator)); } @Override public boolean modifiesModel() { return RuleUtil.getMappingScript_ModifiesModel(scriptNode); } }