/**
* Copyright 2010 JBoss Inc
*
* 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 org.drools.guvnor.server.util;
import java.io.ByteArrayInputStream;
import org.drools.ide.common.client.modeldriven.brl.RuleModel;
import org.drools.ide.common.client.modeldriven.dt.TemplateModel;
import org.drools.ide.common.server.util.BRDRLPersistence;
import org.drools.ide.common.server.util.BRLPersistence;
import org.drools.template.DataProvider;
import org.drools.template.DataProviderCompiler;
import org.drools.template.objects.ArrayDataProvider;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* This class persists a {@link TemplateModel} to DRL template
*
* @author baunax
*/
public class BRDRTPersistence extends BRDRLPersistence {
private static final Logger log = LoggerFactory.getLogger(BRDRTPersistence.class);
private static final BRLPersistence INSTANCE = new BRDRTPersistence();
private static final String PACKAGE_DECLARATION = "\npackage __template_dummy_package__\n";
private BRDRTPersistence() {
super();
}
public static BRLPersistence getInstance() {
return INSTANCE;
}
@Override
public String marshal(RuleModel model) {
TemplateModel tplModel = (TemplateModel) model;
String ruleTemplate = super.marshalRule(model);
log.debug("ruleTemplate:\n{}", ruleTemplate);
DataProviderCompiler tplCompiler = new DataProviderCompiler();
DataProvider dataProvider;
if (tplModel.getRowsCount() > 0) {
dataProvider = new ArrayDataProvider(tplModel.getTableAsArray());
} else {
dataProvider = new ArrayDataProvider(generateEmptyIterator(tplModel));
}
String generatedDRl = tplCompiler.compile(dataProvider, new ByteArrayInputStream(ruleTemplate.getBytes()))
.substring(PACKAGE_DECLARATION.length()).trim();
log.debug("generated drl:\n{}", generatedDRl);
return generatedDRl;
}
private String[][] generateEmptyIterator(TemplateModel tplModel) {
String[][] rows = new String[1][];
String[] interpolationVariables = tplModel.getInterpolationVariablesList();
if (interpolationVariables == null || interpolationVariables.length == 0) {
rows[0] = new String[] { "" };
} else {
for (int i = 0; i < interpolationVariables.length; i++) {
interpolationVariables[i] += "_na";
}
rows[0] = interpolationVariables;
}
return rows;
}
@Override
protected void marshalHeader(RuleModel model, StringBuilder buf) {
TemplateModel tplModel = (TemplateModel) model;
buf.append("template header\n");
String[] interpolationVariables = tplModel.getInterpolationVariablesList();
if (interpolationVariables.length == 0) {
buf.append("test_var").append('\n');
} else {
for (String var : interpolationVariables) {
buf.append(var).append('\n');
}
}
buf.append(PACKAGE_DECLARATION)
.append("\ntemplate \"" + super.marshalRuleName(tplModel) + "\"\n\n");
super.marshalHeader(model, buf);
}
@Override
protected String marshalRuleName(RuleModel model) {
return super.marshalRuleName(model) + "_@{row.rowNumber}";
}
@Override
protected void marshalFooter(StringBuilder buf) {
super.marshalFooter(buf);
buf.append("\nend template");
}
}