2 * @(#)Main.java $Rev: 4 $ $Release: 0.5.1 $
4 * copyright(c) 2005 kuwata-lab all rights reserved.
9 import org.onap.sdc.common.onaplog.OnapLoggerDebug;
10 import org.onap.sdc.common.onaplog.OnapLoggerError;
11 import org.onap.sdc.common.onaplog.Enums.LogLevel;
13 import java.util.List;
15 import java.util.HashMap;
16 import java.util.Iterator;
17 import java.util.Collections;
18 import java.util.regex.Matcher;
19 import java.io.IOException;
22 * class for main program
25 * @release $Release: 0.5.1 $
29 private static OnapLoggerError errLogger = OnapLoggerError.getInstance();
30 private static OnapLoggerDebug debugLogger = OnapLoggerDebug.getInstance();
32 private String _command;
33 private boolean _flag_help = false; // print help
34 private boolean _flag_version = false; // print version
35 private boolean _flag_silent = false; // suppress messages
36 private boolean _flag_meta = false; // meta validation
37 private boolean _flag_untabify = false; // expand tab character to spaces
38 private boolean _flag_emacs = false; // show errors in emacs style
39 private boolean _flag_linenum = false; // show line number on where errors happened
40 private boolean _flag_debug = false; // internal use only
41 private String _schema_filename = null; // schema filename
42 private Map _properties = new HashMap();
45 boolean isDebug() { return _flag_debug; }
48 public String inspect() {
49 StringBuffer sb = new StringBuffer();
50 sb.append("command : ").append(_command ).append('\n');
51 sb.append("flag_help : ").append(_flag_help ).append('\n');
52 sb.append("flag_version : ").append(_flag_version ).append('\n');
53 sb.append("flag_silent : ").append(_flag_silent ).append('\n');
54 sb.append("flag_meta : ").append(_flag_meta ).append('\n');
55 sb.append("flag_untabify : ").append(_flag_untabify ).append('\n');
56 sb.append("flag_emacs : ").append(_flag_emacs ).append('\n');
57 sb.append("flag_linenum : ").append(_flag_linenum ).append('\n');
58 sb.append("flag_debug : ").append(_flag_debug ).append('\n');
59 sb.append("schema_filename : ").append(_schema_filename).append('\n');
60 sb.append("properties:\n");
61 for (Iterator it = _properties.keySet().iterator(); it.hasNext(); ) {
62 Object key = it.next();
63 Object val = _properties.get(key);
64 sb.append(" ").append(key).append(": ").append(val).append('\n');
70 private static final String REVISION = "$Release: 0.5.1 $";
71 private static final String HELP = ""
72 + "Usage1: %s [-hvstlE] -f schema.yaml doc.yaml [doc2.yaml ...]\n"
73 + "Usage2: %s [-hvstlE] -m schema.yaml [schema2.yaml ...]\n"
74 + " -h, --help : help\n"
77 + " -f schema.yaml : schema definition file\n"
78 + " -m : meta-validation mode\n"
79 + " -t : expand tab character automatically\n"
80 + " -l : show linenumber when errored (experimental)\n"
81 + " -E : show errors in emacs-style (implies '-l')\n"
85 public Main(String command) {
90 public String execute(String[] args) throws IOException, CommandOptionException, SyntaxException {
91 // parse command-line options
92 String[] filenames = parseOptions(args);
95 StringBuffer sb = new StringBuffer();
97 sb.append(version()).append('\n');
102 if (sb.length() > 0) {
103 return sb.toString();
109 s = metaValidate(filenames);
110 } else if (_schema_filename == null) {
111 throw optionError("command.option.noaction", '\0');
112 } else if (_flag_debug) {
113 s = inspectSchemaFile(_schema_filename);
115 s = validate(filenames, _schema_filename);
123 private String[] parseOptions(String[] args) throws CommandOptionException {
126 ret = Util.parseCommandOptions(args, "hvsmtlED", "f", null);
127 } catch (CommandOptionException ex) {
128 String error_symbol = ex.getErrorSymbol();
129 if (error_symbol.equals("command.option.noarg")) {
130 switch (ex.getOption()) {
131 case 'f': error_symbol = "command.option.noschema"; break;
136 throw optionError(error_symbol, ex.getOption());
139 Map options = (Map)ret[0];
140 Map properties = (Map)ret[1];
141 String[] filenames = (String[])ret[2];
143 _flag_help = options.get("h") != null;
144 _flag_version = options.get("v") != null;
145 _flag_silent = options.get("s") != null;
146 _flag_meta = options.get("m") != null;
147 _flag_untabify = options.get("t") != null;
148 _flag_emacs = options.get("E") != null;
149 _flag_linenum = options.get("l") != null || _flag_emacs;
150 _flag_debug = options.get("D") != null;
151 _schema_filename = (String)options.get("f");
154 _properties = properties;
155 if (_properties.get("help") != null) {
163 private String validate(String[] filenames, String schema_filename) throws IOException, SyntaxException {
164 String str = Util.readFile(schema_filename);
165 if (_flag_untabify) {
166 str = Util.untabify(str);
168 YamlParser parser = new YamlParser(str);
169 Object schema = parser.parse();
170 Validator validator = new Validator(schema);
171 String s = validateFiles(validator, filenames);
176 private String validateFiles(Validator validator, String[] filenames) throws IOException, SyntaxException {
177 if (filenames.length == 0) {
178 filenames = new String[] { null };
180 StringBuffer sb = new StringBuffer();
181 for (int j = 0; j < filenames.length; j++) {
182 String filename = filenames[j];
184 if (filename == null) {
185 str = Util.readInputStream(System.in);
186 filename = "(stdin)";
188 str = Util.readFile(filename);
190 if (_flag_untabify) {
191 str = Util.untabify(str);
193 YamlParser parser = new YamlParser(str);
195 while (parser.hasNext()) {
196 Object doc = parser.parse();
197 validateDocument(sb, validator, doc, filename, i, parser);
201 return sb.toString();
205 private void validateDocument(StringBuffer sb, Validator validator, Object doc, String filename, int i, YamlParser parser) {
207 Object[] args = { filename, new Integer(i) };
208 String msg = Messages.buildMessage("validation.empty", null, args);
209 sb.append(msg).append('\n');
212 List errors = validator.validate(doc);
213 Object[] args = { filename, new Integer(i) };
214 if (errors == null || errors.size() == 0) {
215 if (! _flag_silent) {
216 String msg = Messages.buildMessage("validation.valid", args);
217 sb.append(msg).append('\n');
220 String msg = Messages.buildMessage("validation.invalid", args);
221 sb.append(msg).append('\n');
223 assert parser != null;
224 parser.setErrorsLineNumber(errors);
225 Collections.sort(errors);
227 for (Iterator it = errors.iterator(); it.hasNext(); ) {
228 ValidationException error = (ValidationException)it.next();
230 assert _flag_linenum;
231 sb.append(filename).append(":").append(error.getLineNumber()).append(":");
232 } else if (_flag_linenum) {
233 sb.append(" - (line ").append(error.getLineNumber()).append(")");
237 sb.append(" [").append(error.getPath()).append("] ").append(error.getMessage()).append('\n');
243 private String metaValidate(String[] filenames) throws IOException, SyntaxException {
244 Validator meta_validator = MetaValidator.instance();
245 String s = validateFiles(meta_validator, filenames);
250 private String inspectSchemaFile(String schema_filename) throws IOException, SyntaxException {
251 String filename = schema_filename;
252 String content = filename != null ? Util.readFile(filename) : Util.readInputStream(System.in);
253 YamlParser parser = new YamlParser(content);
254 Object schema = parser.parse();
255 if (schema == null) {
258 Validator validator = new Validator(schema); // SchemaException is thrown when schema is wrong
259 String s = validator.getRule().inspect();
260 if (s.charAt(s.length() - 1) != '\n') {
267 private static CommandOptionException optionError(String error_symbol, char option) {
268 Object[] args = { Character.toString(option) };
269 String message = Messages.buildMessage(error_symbol, null, args);
270 return new CommandOptionException(message, option, error_symbol);
274 private String version() {
275 Matcher m = Util.matcher(REVISION, "[.\\d]+");
277 String version = m.group(0);
282 private String help() {
283 String help_msg = Messages.buildMessage("command.help", null, new Object[] { _command, _command });
284 //String help = HELP.replaceAll("%s", _command);
289 public static void main(String[] args) throws Exception {
293 main = new Main("kwalify-java");
294 String result = main.execute(args);
295 if (result != null) {
296 debugLogger.log(LogLevel.DEBUG, Main.class.getName(), result);
297 } } catch (Exception ex) {
298 if (main != null && main.isDebug()) {
301 if ( ex instanceof CommandOptionException
302 || ex instanceof SyntaxException
303 || ex instanceof IOException) {
304 errLogger.log(LogLevel.ERROR, Main.class.getName(), "ERROR: {}", ex.getMessage());