001 /*
002 // $Id: //open/util/resgen/src/org/eigenbase/resgen/ResourceGen.java#7 $
003 // Package org.eigenbase.resgen is an i18n resource generator.
004 // Copyright (C) 2005-2005 The Eigenbase Project
005 // Copyright (C) 2005-2005 Disruptive Tech
006 // Copyright (C) 2005-2005 LucidEra, Inc.
007 // Portions Copyright (C) 2001-2005 Kana Software, Inc. and others.
008 //
009 // This library is free software; you can redistribute it and/or modify it
010 // under the terms of the GNU Lesser General Public License as published by the
011 // Free Software Foundation; either version 2 of the License, or (at your
012 // option) any later version approved by The Eigenbase Project.
013 //
014 // This library is distributed in the hope that it will be useful,
015 // but WITHOUT ANY WARRANTY; without even the implied warranty of
016 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
017 // GNU Lesser General Public License for more details.
018 //
019 // You should have received a copy of the GNU Lesser General Public License
020 // along with this library; if not, write to the Free Software
021 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
022 */
023
024 package org.eigenbase.resgen;
025 import org.eigenbase.xom.DOMWrapper;
026
027 import java.io.File;
028 import java.io.IOException;
029
030 /**
031 * <code>ResourceGen</code> parses an XML file containing error messages, and
032 * generates .java file to access the errors. Usage:<blockquote>
033 *
034 * <pre>ResourceGen xmlFile</pre>
035 *
036 * </blockquote>For example,<blockquote>
037 *
038 * <pre>java org.eigenbase.resgen.ResourceGen MyResource_en.xml</pre>
039 *
040 * </blockquote></p>
041 *
042 * <p>This will create class <code>MyResource</code>, with a
043 * function corresponding to each error message in
044 * <code>MyResource_en.xml</code>.</p>
045 *
046 * <p>See also the ANT Task, {@link ResourceGenTask}.</p>
047 *
048 * @author jhyde
049 * @since 3 December, 2001
050 * @version $Id: //open/util/resgen/src/org/eigenbase/resgen/ResourceGen.java#7 $
051 */
052 public class ResourceGen
053 {
054
055 public static void main(String [] args) throws IOException
056 {
057 ResourceGenTask rootArgs = parse(args);
058 new ResourceGen().run(rootArgs);
059 }
060
061 static ResourceGenTask parse(String[] args)
062 {
063 ResourceGenTask rootArgs = new ResourceGenTask();
064 for (int i = 0; i < args.length; i++) {
065 String arg = args[i];
066 if (arg.equals("-mode") && i + 1 < args.length) {
067 rootArgs.setMode(args[++i]);
068 } else if (arg.equals("-srcdir") && i + 1 < args.length) {
069 rootArgs.setSrcdir(new File(args[++i]));
070 } else if (arg.equals("-destdir") && i + 1 < args.length) {
071 rootArgs.setDestdir(new File(args[++i]));
072 } else if (arg.equals("-resdir") && i + 1 < args.length) {
073 rootArgs.setResdir(new File(args[++i]));
074 } else if (arg.equals("-locales") && i + 1 < args.length) {
075 rootArgs.setLocales(args[++i]);
076 } else if (arg.equals("-style") && i + 1 < args.length) {
077 rootArgs.setStyle(args[++i]);
078 } else if (arg.equals("-force")) {
079 rootArgs.setForce(true);
080 } else if (arg.equals("-commentstyle")) {
081 rootArgs.setCommentStyle(args[++i]);
082 } else {
083 ResourceGenTask.Include resourceArgs =
084 new ResourceGenTask.Include();
085 rootArgs.addInclude(resourceArgs);
086 resourceArgs.setName(arg);
087 }
088 }
089 if (rootArgs.getIncludes().length == 0) {
090 throw new java.lang.Error("No input file specified.");
091 }
092 if (rootArgs.getDestdir() == null) {
093 rootArgs.setDestdir(rootArgs.getSrcdir());
094 }
095 return rootArgs;
096 }
097
098 void run(ResourceGenTask rootArgs) throws IOException {
099 rootArgs.validate();
100 final ResourceGenTask.Include[] includes = rootArgs.getIncludes();
101 for (int i = 0; i < includes.length; i++) {
102 includes[i].process(this);
103 }
104 }
105
106 /**
107 * Prints a message to the output stream.
108 */
109 void comment(String message)
110 {
111 System.out.println(message);
112 }
113
114 /**
115 * Returns the name of the resource with the first letter capitalized,
116 * suitable for use in method names. For example, "MyErrorMessage".
117 */
118 static String getResourceInitcap(ResourceDef.Resource resource)
119 {
120 String name = resource.name;
121 if (name.equals(name.toUpperCase())) {
122 return "_" + name;
123 } else {
124 return name.substring(0,1).toUpperCase() + name.substring(1);
125 }
126 }
127
128 /**
129 * Returns any comment relating to the message.
130 */
131 static String getComment(ResourceDef.Resource resource)
132 {
133 DOMWrapper[] children = resource.getDef().getChildren();
134 for (int i = 0; i < children.length; i++) {
135 DOMWrapper child = children[i];
136 if (child.getType() == DOMWrapper.COMMENT) {
137 return child.getText(); // first comment only
138 }
139 }
140 return null; // no comment
141 }
142
143 FileTask createXmlTask(
144 ResourceGenTask.Include include, String fileName, String className,
145 String baseClassName, boolean outputJava, String cppClassName,
146 String cppBaseClassName, boolean outputCpp)
147 {
148 return new XmlFileTask(
149 include, fileName, className, baseClassName,
150 outputJava, cppClassName, cppBaseClassName,
151 outputCpp);
152 }
153
154 FileTask createPropertiesTask(
155 ResourceGenTask.Include include, String fileName) {
156 return new PropertiesFileTask(include, fileName);
157 }
158
159 }
160
161 // End ResourceGen.java