001/** 002 * Copyright 2005-2016 The Kuali Foundation 003 * 004 * Licensed under the Educational Community License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.opensource.org/licenses/ecl2.php 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016package edu.sampleu.common; 017 018import freemarker.template.Configuration; 019import freemarker.template.Template; 020import freemarker.template.TemplateException; 021import org.apache.commons.io.FileUtils; 022import org.kuali.rice.testtools.common.PropertiesUtils; 023import org.springframework.ui.freemarker.FreeMarkerTemplateUtils; 024 025import java.io.File; 026import java.io.IOException; 027import java.io.InputStream; 028import java.util.Properties; 029 030/** 031 * FreemarkerUtil loads properties from user defined InputStream. systemPropertiesOverride should be used to override properties 032 * using a given key to identify them from JVM args. (i.e. -Dkey.name to override the name property in the key file.) 033 * TODO setup so the loading and overriding of properties is done for the user rather then them having to call it. 034 * @author Kuali Rice Team (rice.collab@kuali.org) 035 */ 036public class FreemarkerUtil { 037 038 protected Configuration cfg; 039 040 /** 041 * Calls ftlWrite that also accepts a key, using the output getName as the key. 042 * @param output 043 * @param template 044 * @return 045 * @throws java.io.IOException 046 * @throws freemarker.template.TemplateException 047 */ 048 public static File ftlWrite(File output, Template template, InputStream inputStream) throws IOException, TemplateException { 049 050 return ftlWrite(output.getName(), output, template, inputStream); 051 } 052 053 /** 054 * Loads properties from user defined properties file, if not available uses resource file 055 * 056 * writes processed template to file 057 * @param key 058 * @param output 059 * @param template 060 * @throws IOException 061 * @throws TemplateException 062 */ 063 public static File ftlWrite(String key, File output, Template template, InputStream inputStream) throws IOException, TemplateException { 064 PropertiesUtils propUtils = new PropertiesUtils(); 065 Properties props = propUtils.loadProperties(inputStream); 066 props.put("baseName", output.getName().substring(0, output.getName().indexOf("ST"))); 067 props.put("className", output.getName().substring(0, output.getName().indexOf("ST"))); // backwards compatibility 068 if (output.getName().contains("TmplMthd")) { // Template method pattern 069 props.put("className", output.getName().substring(0, output.getName().indexOf("TmplMthd"))); 070 } 071 072 if (props.get("test1") == null ) { // backwards compatibility for Smoke Test Freemarker Generation 073 props.put("test1", "test" + props.get("className") + "Bookmark"); 074 props.put("test2", "test" + props.get("className") + "Nav"); 075 } 076 077 props = propUtils.systemPropertiesOverride(props, key); 078 props = propUtils.transformNumberedPropertiesToList(props); 079 File outputFile = writeTemplateToFile(output, template, props); 080 081 return outputFile; 082 } 083 084 protected static Properties loadProperties(InputStream inputStream) throws IOException { 085 Properties props = new Properties(); 086 087 if(inputStream != null) { 088 props.load(inputStream); 089 } 090 091 return props; 092 } 093 094 /** 095 * 096 * @param file 097 * @param template 098 * @param props 099 * @return 100 * @throws IOException 101 * @throws freemarker.template.TemplateException 102 */ 103 protected static File writeTemplateToFile(File file, Template template, Properties props) throws IOException, TemplateException { 104 String output = FreeMarkerTemplateUtils.processTemplateIntoString(template, props); 105 FileUtils.writeStringToFile(file, output); 106 107 return file; 108 } 109}