/*
* Copyright 2003-2016 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;
import jetbrains.mps.generator.GenerationCanceledException;
import jetbrains.mps.generator.GenerationSessionContext;
import jetbrains.mps.generator.IGeneratorLogger;
import jetbrains.mps.generator.impl.RoleValidation.RoleValidator;
import jetbrains.mps.generator.impl.query.GeneratorQueryProvider;
import jetbrains.mps.generator.impl.query.GeneratorQueryProvider.Source;
import jetbrains.mps.generator.runtime.TemplateContext;
import jetbrains.mps.generator.template.ITemplateGenerator;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.mps.openapi.language.SContainmentLink;
import org.jetbrains.mps.openapi.language.SReferenceLink;
import org.jetbrains.mps.openapi.model.SModel;
import org.jetbrains.mps.openapi.model.SNode;
import org.jetbrains.mps.openapi.model.SNodeId;
import org.jetbrains.mps.openapi.model.SNodeReference;
import org.jetbrains.mps.openapi.util.ProgressMonitor;
import java.util.List;
public abstract class AbstractTemplateGenerator implements ITemplateGenerator {
private GenerationSessionContext myOperationContext;
protected ProgressMonitor myProgressMonitor;
protected final SModel myInputModel;
protected final SModel myOutputModel;
private final RoleValidation myValidation;
private final GeneratorMappings myMappings;
private final Source myQuerySource;
protected AbstractTemplateGenerator(GenerationSessionContext operationContext, SModel inputModel, SModel outputModel, GeneratorMappings mappings, GeneratorQueryProvider.Source gqps) {
myOperationContext = operationContext;
myInputModel = inputModel;
myOutputModel = outputModel;
myValidation = operationContext.getRoleValidationFacility();
myMappings = mappings;
myQuerySource = gqps;
}
@Override
public GenerationSessionContext getGeneratorSessionContext() {
return myOperationContext;
}
protected void checkMonitorCanceled() throws GenerationCanceledException {
if (myProgressMonitor != null && myProgressMonitor.isCanceled()) throw new GenerationCanceledException();
}
@Override
public IGeneratorLogger getLogger() {
return myOperationContext.getLogger();
}
@Override
public SModel getInputModel() {
return myInputModel;
}
@Override
public SModel getOutputModel() {
return myOutputModel;
}
public GeneratorMappings getMappings() {
return myMappings;
}
@NotNull
@Override
public GeneratorQueryProvider getQueryProvider(@NotNull SNodeReference templateNodeRef) {
return myQuerySource.getQueryProvider(templateNodeRef);
}
@Override
public void registerMappingLabel(SNode inputNode, String mappingName, SNode outputNode) {
if (inputNode != null) {
myMappings.addOutputNodeByInputNodeAndMappingName(inputNode, mappingName, outputNode);
} else {
myMappings.addNewOutputNode(mappingName, outputNode);
}
}
public SNode findOutputNodeByTemplateNodeUnique(String templateNode) {
return myMappings.findOutputNodeByTemplateNodeUnique(templateNode);
}
@Override
public SNode findOutputNodeByInputNodeAndMappingName(SNode inputNode, String mappingName) {
if (inputNode != null) {
return myMappings.findOutputNodeByInputNodeAndMappingName(inputNode, mappingName);
} else {
return myMappings.findNewOutputNode(mappingName);
}
}
@Override
public List<SNode> findAllOutputNodesByInputNodeAndMappingName(SNode inputNode, String mappingName) {
return myMappings.findAllOutputNodesByInputNodeAndMappingName(inputNode, mappingName);
}
@Override
public SNode findCopiedOutputNodeForInputNode(SNode inputNode) {
if (inputNode == null) return null;
SNode outputNode = myMappings.findCopiedOutputNodeForInputNode(inputNode);
if (outputNode == null) {
outputNode = findOutputNodeById(inputNode.getNodeId());
}
return outputNode;
}
protected void addCopiedOutputNodeForInputNode(SNode inputNode, SNode outputNode) {
myMappings.addCopiedOutputNodeForInputNode(inputNode, outputNode);
}
public void addOutputNodeByInputAndTemplateNode(SNode inputNode, String templateNodeId, SNode outputNode) {
myMappings.addOutputNodeByInputAndTemplateNode(inputNode, templateNodeId, outputNode);
}
void nodeCopied(TemplateContext context, SNode outputNode, String templateNodeId) {
myMappings.addOutputNodeForContext(context, templateNodeId, outputNode);
}
public SNode findCopiedOutputNodeForInputNode_unique(SNode inputNode) {
SNode node = findCopiedOutputNodeForInputNode(inputNode);
if (myMappings.isInputNodeHasUniqueCopiedOutputNode(inputNode)) return node;
return null;
}
public SNode findOutputNodeByInputAndTemplateNode(SNode inputNode, String templateNodeId) {
return myMappings.findOutputNodeByInputAndTemplateNode(inputNode, templateNodeId);
}
public SNode findOutputNodeById(SNodeId nodeId) {
return getOutputModel().getNode(nodeId);
}
public RoleValidator getChildRoleValidator(SNode parent, SContainmentLink role) {
return myValidation.getValidator(parent, role);
}
public RoleValidator getReferentRoleValidator(SNode source, SReferenceLink role) {
return myValidation.getValidator(source, role);
}
}