/* * Copyright 2001-2008 Geert Bevin (gbevin[remove] at uwyn dot com) * Licensed under the Apache License, Version 2.0 (the "License") * $Id: TemplateDeployer.java 3957 2008-05-26 07:57:51Z gbevin $ */ package com.uwyn.rife.template; import com.uwyn.rife.config.RifeConfig; import com.uwyn.rife.resources.ResourceFinderClasspath; import com.uwyn.rife.resources.ResourceFinderDirectories; import com.uwyn.rife.resources.ResourceFinderGroup; import com.uwyn.rife.template.exceptions.TemplateException; import com.uwyn.rife.tools.FileUtils; import com.uwyn.rife.tools.SortListComparables; import com.uwyn.rife.tools.StringUtils; import java.io.File; import java.util.ArrayList; import java.util.List; import java.util.regex.Pattern; public class TemplateDeployer { private boolean mVerbose = false; private File[] mDirectories = null; private TemplateFactory mTemplateFactory = null; private Pattern mInclude = null; private Pattern mExclude = null; private TemplateDeployer(boolean verbose, ArrayList<String> directoryPaths, TemplateFactory templateFactory, Pattern include, Pattern exclude) { assert directoryPaths != null; assert directoryPaths.size() > 0; mVerbose = verbose; mTemplateFactory = templateFactory; mInclude = include; mExclude = exclude; ArrayList<File> directories = new ArrayList<File>(); File directory_file = null; for (String directory_path : directoryPaths) { directory_file = new File(directory_path); if (!directory_file.exists()) { System.err.println("The path '"+directory_path+"' doesn't exist."); System.exit(1); } if (!directory_file.isDirectory()) { System.err.println("The path '"+directory_path+"' is not a directory."); System.exit(1); } if (!directory_file.canRead()) { System.err.println("The directory '"+directory_path+"' is not readable."); System.exit(1); } directories.add(directory_file); } mDirectories = new File[directories.size()]; mDirectories = directories.toArray(mDirectories); } private void execute() throws TemplateException { ArrayList<String> files = null; String classname = null; for (File directory : mDirectories) { ResourceFinderGroup group = new ResourceFinderGroup() .add(new ResourceFinderDirectories(new File[] {directory})) .add(ResourceFinderClasspath.getInstance()); mTemplateFactory.setResourceFinder(group); files = FileUtils.getFileList(directory, Pattern.compile(".*\\"+mTemplateFactory.getParser().getExtension()+"$"), Pattern.compile(".*(SCCS|CVS|\\.svn).*")); for (String file : files) { if (!StringUtils.filter(file, mInclude, mExclude)) { continue; } if (mVerbose) { System.out.print(directory.getPath()+" : "+file+" ... "); } classname = file.replace(File.separatorChar, '.'); classname = classname.substring(0, classname.length()-mTemplateFactory.getParser().getExtension().length()); mTemplateFactory.parse(classname, null, null); if (mVerbose) { System.out.println("done."); } } } } private static void listTemplateTypes() { ArrayList<String> types = new ArrayList<String>(TemplateFactory.getFactoryTypes()); SortListComparables sort = new SortListComparables(); sort.sort(types); for (Object type : types) { System.err.println(" "+type); } } public TemplateDeployer() { super(); } public static void main(String[] arguments) { boolean valid_arguments = true; boolean verbose = false; ArrayList<String> directory_paths = new ArrayList<String>(); String template_type = "enginehtml"; Pattern include = null; Pattern exclude = null; if (arguments.length < 1) { valid_arguments = false; } else { for (int i = 0; i < arguments.length; i++) { if (arguments[i].startsWith("-")) { if (arguments[i].equals("-t")) { i++; if (arguments[i].startsWith("-")) { valid_arguments = false; } else { template_type = arguments[i]; } } else if (arguments[i].equals("-l")) { System.err.println("The supported template types are:"); listTemplateTypes(); System.exit(0); } else if (arguments[i].equals("-verbose")) { verbose = true; } else if (arguments[i].equals("-d")) { i++; if (arguments[i].startsWith("-")) { valid_arguments = false; } else { RifeConfig.Template.setGenerationPath(arguments[i]); } } else if (arguments[i].equals("-encoding")) { i++; if (arguments[i].startsWith("-")) { valid_arguments = false; } else { RifeConfig.Template.setDefaultEncoding(arguments[i]); } } else if (arguments[i].equals("-preload")) { i++; if (arguments[i].startsWith("-")) { valid_arguments = false; } else { List<String> class_names = StringUtils.split(arguments[i], ":"); for (String class_name : class_names) { try { Class.forName(class_name); } catch (ClassNotFoundException e) { throw new RuntimeException(e); } } } } else if (arguments[i].equals("-i")) { i++; if (arguments[i].startsWith("-")) { valid_arguments = false; } else { include = Pattern.compile(arguments[i]); } } else if (arguments[i].equals("-e")) { i++; if (arguments[i].startsWith("-")) { valid_arguments = false; } else { exclude = Pattern.compile(arguments[i]); } } else { valid_arguments = false; } } else { directory_paths.add(arguments[i]); } if (!valid_arguments) { break; } } } if (0 == directory_paths.size()) { valid_arguments = false; } if (!valid_arguments) { System.err.println("Usage : java "+TemplateDeployer.class.getName()+" <options> <directories>"); System.err.println("Compiles RIFE templates to class files."); System.err.println("All the files of the active template type that are found in the provided"); System.err.println("directories will be parsed and compiled to java bytecode into the"); System.err.println("destination directory."); System.err.println(" -t <type> Specify which template type to use (default enginehtml)"); System.err.println(" -l List the known template types"); System.err.println(" -verbose Output messages about what the parser is doing"); System.err.println(" -d <directory> Specify where to place generated class files"); System.err.println(" -encoding <encoding> Specify character encoding used by template files"); System.err.println(" -preload <classes> Colon seperated list of classes to preload"); System.err.println(" -i <regexp> Regexp to include certain files"); System.err.println(" -e <regexp> Regexp to exclude certain files"); System.err.println(" -help Print a synopsis of standard options"); System.exit(1); } TemplateFactory factory = null; factory = TemplateFactory.getFactory(template_type); if (null == factory) { System.err.println("The template type '"+template_type+"' is not supported."); System.err.println("The list of valid types is:"); listTemplateTypes(); System.exit(1); } RifeConfig.Template.setGenerateClasses(true); TemplateDeployer deployer = new TemplateDeployer(verbose, directory_paths, factory, include, exclude); deployer.execute(); } }