001    /**
002     * Copyright 2005-2013 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     */
016    package edu.samplu.common;
017    
018    import freemarker.template.Configuration;
019    import freemarker.template.Template;
020    import freemarker.template.TemplateException;
021    import org.apache.commons.io.FileUtils;
022    import org.kuali.rice.testtools.common.PropertiesUtils;
023    import org.springframework.ui.freemarker.FreeMarkerTemplateUtils;
024    
025    import java.io.File;
026    import java.io.IOException;
027    import java.io.InputStream;
028    import 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     */
036    public 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            Properties props = PropertiesUtils.loadProperties(inputStream);
065            props.put("baseName", output.getName().substring(0, output.getName().indexOf("ST")));
066            props.put("className", output.getName().substring(0, output.getName().indexOf("ST"))); // backwards compatibility
067            if (output.getName().contains("TmplMthd")) { // Template method pattern
068                props.put("className", output.getName().substring(0, output.getName().indexOf("TmplMthd")));
069            }
070    
071            if (props.get("test1") == null ) { // backwards compatibility for Smoke Test Freemarker Generation
072                props.put("test1", "test" + props.get("className") + "Bookmark");
073                props.put("test2", "test" + props.get("className") + "Nav");
074            }
075    
076            PropertiesUtils.systemPropertiesOverride(props, key);
077            PropertiesUtils.transformNumberedPropertiesToList(props);
078            File outputFile = writeTemplateToFile(output, template, props);
079    
080            return outputFile;
081        }
082    
083        protected static Properties loadProperties(InputStream inputStream) throws IOException {
084            Properties props = new Properties();
085    
086            if(inputStream != null) {
087                props.load(inputStream);
088            }
089    
090            return props;
091        }
092    
093        /**
094         *
095         * @param file
096         * @param template
097         * @param props
098         * @return
099         * @throws IOException
100         * @throws freemarker.template.TemplateException
101         */
102        protected static File writeTemplateToFile(File file, Template template, Properties props) throws IOException, TemplateException {
103            String output = FreeMarkerTemplateUtils.processTemplateIntoString(template, props);
104            FileUtils.writeStringToFile(file, output);
105    
106            return file;
107        }
108    }