/*
* Copyright 2011 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.informer.write.questionnaire;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Formatter;
import java.util.Iterator;
import org.drools.informer.util.TemplateManager;
import org.drools.io.impl.ByteArrayResource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.drools.informer.domain.questionnaire.Application;
import org.drools.informer.domain.questionnaire.Page;
import org.drools.informer.domain.questionnaire.PageElement;
import org.drools.informer.write.questionnaire.helpers.CopyrightWriter;
public class PageTemplate {
private static final Logger logger = LoggerFactory.getLogger(PageTemplate.class);
protected Page pg;
public PageTemplate(Page page) {
super();
this.pg = page;
}
/**
* Create the page based DRL file
*
* @param application
* @param directory
* @param importDirectory
* @param count
* @param seperatePageDirectories
* @return
*/
public boolean generateDRLFile(Application application, String directory, String importDirectory, int count, boolean seperatePageDirectories) {
String pageNumber = String.valueOf(count);
if (pageNumber.length() == 1) {
pageNumber = "page0" + pageNumber;
}
else {
pageNumber = "page" + pageNumber;
}
String subDirectory = directory + "/" + pageNumber;
if (!seperatePageDirectories) {
subDirectory = directory;
}
String fileName = subDirectory + "/" + pg.getId().replace(' ', '_') + ".drl";
//logger.debug("Preparing to write file: " + fileName);
try {
File outdir = new File(subDirectory);
//Basic directory existence checks
if (outdir.exists() && !outdir.isDirectory()) {
throw new IOException(subDirectory + " is not a valid directory.");
}
// create the directory if it doesn't exist.
if(!outdir.exists()) {
if(!outdir.mkdir()) {
throw new IOException("Unable to create directory: " + subDirectory);
}
}
Formatter fmtFile;
fmtFile = new Formatter(new FileOutputStream(fileName));
CopyrightWriter.writeCopyright(fmtFile, importDirectory);
writeDRLFileContents(application, LoaderTemplateManager.getInstance(), fmtFile, false);
fmtFile.close();
} catch (IOException e) {
logger.debug(e.getMessage());
e.printStackTrace();
return false;
}
logger.debug("The " + fileName + " file has been written");
return true;
}
public void compileDRL(TemplateManager tm, Formatter fmtFile, Application application, int count) {
writeDRLFileContents(application, tm, fmtFile, true);
fmtFile.close();
}
protected void writeDRLForPageElement(Application application, TemplateManager tm, Formatter fmt, PageElement element) {
if (element.isAGroupType()) {
for (Iterator<PageElement> i = element.getChildren().iterator(); i.hasNext();) {
PageElement child = (PageElement) i.next();
child.addGroupId(element.getId());
}
}
new PageElementTemplate(element).compileContentsToDRL(application, tm, fmt);
for (Iterator<PageElement> i = element.getChildren().iterator(); i.hasNext();) {
PageElement child = (PageElement) i.next();
writeDRLForPageElement(application, tm, fmt, child);
}
}
protected void writeDRLFileContents(Application application, TemplateManager tm, Formatter fmt, boolean append) {
// if (! append) {
// fmt.format("package %s.%s;\n\n", application.getApplicationClass(), pg.getSheetName().replace(' ', '_').toLowerCase());
// }
// fmt.format("import java.util.Calendar;\n"); // TODO only include if rule require it?
//
// fmt.format("import org.drools.informer.Group;\n");
// fmt.format("import org.drools.informer.InvalidAnswer;\n");
// fmt.format("import org.drools.informer.MultipleChoiceQuestion;\n");
// fmt.format("import org.drools.informer.MultipleChoiceQuestion.PossibleAnswer;\n");
// fmt.format("import org.drools.informer.Note;\n");
// fmt.format("import org.drools.informer.Question;\n");
// fmt.format("import org.drools.informer.Answer;\n");
// fmt.format("import org.drools.informer.Questionnaire;\n");
// fmt.format("import %s.*;\n\n", application.getApplicationClass()); // needed for the definitions of the display facts
if ((pg.getElements() != null) && (pg.getElements().size() > 0)) {
writeDRLForPageElement(application, tm, fmt, pg.getElements().get(0));
}
}
}