/* * This file is part of the URI Template library. * * For licensing information please see the file license.txt included in the release. * A copy of this licence can also be found at * http://www.opensource.org/licenses/artistic-license-2.0.php */ package org.weborganic.furi; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.List; import org.weborganic.furi.URIResolver.MatchRule; /** * Convenience class to invoke this library on the command-line. * * @author Christophe Lauret * @version 13 February 2009 */ public final class Main { /** * Prevents creation of instances. */ private Main() {} /** * Invokes this tool on the command-line. * * @param args The command-line parameters. */ public static void main(String[] args) throws IOException { // parse a template if (args.length == 2 && "-parse".equals(args[0])) { main_parse(args[1]); // resolve a URI from a list of patterns } else if (args.length == 3 && "-resolve".equals(args[0])) { main_resolve(args[1], args[2]); // all other cases } else { usage(null); } } /** * Displays the usage of this class on System.err. * * @param message Any message (optional) */ public static void usage(String message) { if (message != null) { System.err.println(message); } System.err.println("URI Template"); System.err.println("Usage: java " + Main.class.getName() + " [options]"); System.err.println("where options include:"); System.err.println(" -parse <template> Parse the given URI template"); System.err.println(" -resolve <file> <uri> Resolve the given URI from the patterns in file"); } // private helpers // -------------------------------------------------------------------------- /** * Parses the template. * * Explanations on System.out. * * @param exp The template to parse. */ private static void main_parse(String exp) throws IOException { try { URITemplate template = new URITemplate(exp); for (Token t : template.tokens()) { System.err.println(t.getClass().getSimpleName() + "\t" + t.expression()); } } catch (URITemplateSyntaxException ex) { System.err.println("Not a valid URI template."); } } /** * Matches and resolves the given URI with the list of patterns. * * Results on System.out. * * @param filename The name of the file containing the list of patterns. * @param uri The URI to match and resolve. */ private static void main_resolve(String filename, String uri) throws IOException { // load the URI Patterns from the file File f = new File(filename); if (!f.exists()) { usage("Could not find file " + f.getName()); return; } List<URIPattern> patterns = toPatterns(f); if (patterns.size() == 0) { usage("No pattern in file " + f.getName()); return; } // find the best matching pattern URIResolver resolver = new URIResolver(uri); Collection<URIPattern> matches = resolver.findAll(patterns); // no pattern matching if (matches.size() == 0) { System.err.println("No matching patterns for URI."); } else { System.out.println(matches.size() + " matching patterns for URI:"); for (URIPattern p : matches) { boolean best = (p == resolver.find(patterns, MatchRule.BEST_MATCH)); boolean first = (p == resolver.find(patterns, MatchRule.FIRST_MATCH)); System.out.println(p + (best ? " [BEST]" : "") + (first ? " [FIRST]" : "")); // resolve variables ResolvedVariables result = resolver.resolve(p); System.out.println("with"); for (String name : result.names()) { System.out.println("\t" + name + "=" + result.get(name)); } } } } /** * Returns the contents of the specified file as a list of URI patterns. * * @param file The file containing the URI patterns. * * @return The list of URI patterns. */ private static final List<URIPattern> toPatterns(File file) throws IOException { BufferedReader reader = new BufferedReader(new FileReader(file)); String line = null; // read the file ArrayList<URIPattern> patterns = new ArrayList<URIPattern>(); while ((line = reader.readLine()) != null) { try { patterns.add(new URIPattern(line)); } catch (URITemplateSyntaxException ex) { System.err.println("Could not parse '" + line + "' as pattern - ignored"); } } reader.close(); return patterns; } }