/*
* 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.RuleUtil;
import jetbrains.mps.generator.impl.query.GeneratorQueryProvider;
import jetbrains.mps.generator.runtime.TemplateDeclaration;
import jetbrains.mps.generator.runtime.TemplateMappingConfiguration;
import jetbrains.mps.generator.runtime.TemplateModelBase;
import jetbrains.mps.generator.runtime.TemplateModule;
import jetbrains.mps.generator.runtime.TemplateSwitchMapping;
import org.apache.log4j.Logger;
import org.jetbrains.mps.openapi.language.SConcept;
import org.jetbrains.mps.openapi.model.SModel;
import org.jetbrains.mps.openapi.model.SModelReference;
import org.jetbrains.mps.openapi.model.SNode;
import org.jetbrains.mps.openapi.model.SNodeReference;
import java.util.ArrayList;
import java.util.Collection;
/**
* Evgeny Gryaznov, Nov 29, 2010
*/
public class TemplateModelInterpreted extends TemplateModelBase {
private final SModel myModel;
private Collection<TemplateSwitchMapping> mySwitches;
private Collection<TemplateMappingConfiguration> myMappings;
public TemplateModelInterpreted(TemplateModule module, SModel model) {
super(module);
myModel = model;
mySwitches = new ArrayList<>();
myMappings = new ArrayList<>();
init();
}
private void init() {
for (SNode root : myModel.getRootNodes()) {
SConcept c = root.getConcept();
if (RuleUtil.concept_TemplateSwitch.equals(c)) {
mySwitches.add(new TemplateSwitchMappingInterpreted(root));
} else if (RuleUtil.concept_MappingConfiguration.equals(c)) {
myMappings.add(new TemplateMappingConfigurationInterpreted(this, root));
}
}
}
@Override
public Collection<TemplateSwitchMapping> getSwitches() {
return mySwitches;
}
@Override
public Collection<TemplateMappingConfiguration> getConfigurations() {
return myMappings;
}
@Override
public TemplateDeclaration loadTemplate(SNodeReference template, Object... arguments) {
assert template.getModelReference().equals(getSModelReference());
SNode templateNode = template.resolve(myModel.getRepository());
if (templateNode == null || !RuleUtil.concept_TemplateDeclaration.equals(templateNode.getConcept())) {
return null;
}
return TemplateDeclarationInterpreted.create(templateNode, arguments);
}
@Override
public String getLongName() {
return myModel.getName().getLongName();
}
@Override
public SModelReference getSModelReference() {
return myModel.getReference();
}
@Override
public GeneratorQueryProvider getQueryProvider() {
String packageName = getSModelReference().getName().getLongName();
String queriesClassName = packageName + ".QueriesGenerated";
try {
Class<?> qg = getModule().loadClass(queriesClassName);
if (GeneratorQueryProvider.class.isAssignableFrom(qg)) {
@SuppressWarnings("unchecked")
Class<GeneratorQueryProvider> providerClass = (Class<GeneratorQueryProvider>) qg;
return providerClass.newInstance();
}
return reflectiveProvider(qg);
} catch (ClassNotFoundException ex) {
String msg = String.format("Failed to load class with generated queries: %s", queriesClassName);
Logger.getLogger(TemplateModelInterpreted.class).error(msg, ex);
return null;
} catch (IllegalAccessException | InstantiationException ex) {
String msg = String.format("Failed to instantiate class with generated queries: %s", queriesClassName);
Logger.getLogger(TemplateModelInterpreted.class).error(msg, ex);
return null;
}
}
}