/* * Copyright (C) 2014 Civilian Framework. * * Licensed under the Civilian License (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.civilian-framework.org/license.txt * * 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.civilian.tool.resource; import java.io.StringWriter; import org.civilian.Application; import org.civilian.Resource; import org.civilian.internal.source.OutputFile; import org.civilian.internal.source.OutputLocation; import org.civilian.template.TemplateWriter; import org.civilian.util.Arguments; import org.civilian.util.Check; import org.civilian.util.ClassUtil; /** * ClientResConstGenerator is a tool class to generate * a Java class which defines constants for all resources of a * Civilian application and which can be used in a client program. */ public class ClientConstGenerator { public static final String DEFAULT_ENCODING = "UTF-8"; private enum Language { JAVA, JAVASCRIPT, } public static void main(String[] args) throws Exception { if (args.length == 0) printHelp(); else run(new Arguments(args)); } /** * Prints a help screen. */ private static void printHelp() { System.out.println("Usage:"); System.out.println("java " + ClientConstGenerator.class.getName() + " [<parameter>]* <app-class>"); System.out.println(); System.out.println("Parameters: default:"); System.out.println("-enc <enc> encoding of generated file " + DEFAULT_ENCODING); System.out.println("-ts <true|false> print generation timestamp into file false"); System.out.println("-v turn on verbose messages false"); System.out.println(); System.out.println("If you want to generate a Java class, then add"); System.out.println("-java <classname> generate a Java class for the resource tree"); System.out.println("-javaout:dir <dir> write to directory, or"); System.out.println("-javaout:package <dir> write to package subdirectory below dir"); // System.out.println(); // System.out.println("If you want to generate a Javascript file, then add"); // System.out.println("-js generate a Javascript file"); // System.out.println("-jsout <file> write to file"); } public static void run(Arguments args) throws Exception { Options options = new Options(); while(args.startsWith("-")) { if (args.consume("-enc")) options.encoding = args.next("encoding"); else if (args.consume("-ts")) options.timestamp = args.nextBoolean("timestamp mode"); else if (args.consume("-v")) options.verbose = true; else if (args.consume("-java")) { options.language = Language.JAVA; options.javaClass = args.next("java class name"); } else if (args.startsWith("-javaout:")) { args.replace("-" + args.get().substring(5)); options.javaOutputLoc = OutputLocation.parse(args, true, true); } else if (args.consume("-js")) options.language = Language.JAVASCRIPT; else if (args.consume("-jsout")) options.jsOutputLoc = new OutputLocation(OutputLocation.Type.TO_FILE, args.nextFile("script file")); else throw new IllegalArgumentException("unknown option " + args.next()); } options.setApplication(args.next("application class")); run(options); } public static void run(Options options) throws Exception { if (options.app == null) throw new IllegalArgumentException("missing -app parameter for application class"); options.complete(); ClientConstGenerator generator = new ClientConstGenerator(options); generator.run(); } private ClientConstGenerator(Options options) { options_ = options; } private void run() throws Exception { log("scanning resources"); Resource root = options_.app.generateResourceTree(null); TemplateWriter out = new TemplateWriter(new StringWriter()); switch(options_.language) { case JAVA: writeJava(root, out); break; case JAVASCRIPT: writeJavascript(root, out); break; } } private void writeJava(Resource root, TemplateWriter out) throws Exception { String javaPackage = ClassUtil.getPackageName(options_.javaClass); String javaSimpleClass = ClassUtil.cutPackageName(options_.javaClass); // generate in memory ClientJavaTemplate t = new ClientJavaTemplate(root, javaPackage, javaSimpleClass, options_.app, options_.timestamp); t.print(out); // write to class file OutputFile outputFile = options_.javaOutputLoc.getOutputFile(javaPackage, javaSimpleClass + ".java"); log("writing " + outputFile.file.getAbsolutePath()); outputFile.write(options_.encoding, out.toString()); } private void writeJavascript(Resource root, TemplateWriter out) { throw new UnsupportedOperationException("not yet implemented"); } private void log(String message) { if (options_.verbose) System.out.println(message); } /** * Holds options for a generator run. */ public static class Options { public Application app; public String encoding; public boolean timestamp; public boolean verbose; public Language language; public OutputLocation javaOutputLoc; public String javaClass; public OutputLocation jsOutputLoc; public void setApplication(String className) throws Exception { Check.notNull(className, "application class name"); app = ClassUtil.getClass(className, Application.class, null).newInstance(); } public void complete() { Check.notNull(app, "app"); if (encoding == null) encoding = DEFAULT_ENCODING; if (language == null) throw new IllegalArgumentException("no language specified"); switch(language) { case JAVA: if (javaOutputLoc == null) throw new IllegalArgumentException("no java output location specified"); if (javaClass == null) throw new IllegalArgumentException("no java class specified"); break; case JAVASCRIPT: if (jsOutputLoc == null) throw new IllegalArgumentException("no javascript file specified"); break; } } } private Options options_; }