KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > objectweb > celtix > tools > common > toolspec > parser > CommandLineParser


1 package org.objectweb.celtix.tools.common.toolspec.parser;
2
3 import java.io.ByteArrayOutputStream JavaDoc;
4 import java.io.InputStream JavaDoc;
5 import java.io.PrintStream JavaDoc;
6 import java.util.ArrayList JavaDoc;
7 import java.util.List JavaDoc;
8 import java.util.StringTokenizer JavaDoc;
9 import java.util.logging.Level JavaDoc;
10 import java.util.logging.Logger JavaDoc;
11
12 import javax.xml.parsers.DocumentBuilderFactory JavaDoc;
13 import javax.xml.transform.Transformer JavaDoc;
14 import javax.xml.transform.TransformerException JavaDoc;
15 import javax.xml.transform.TransformerFactory JavaDoc;
16 import javax.xml.transform.dom.DOMSource JavaDoc;
17 import javax.xml.transform.stream.StreamResult JavaDoc;
18 import javax.xml.transform.stream.StreamSource JavaDoc;
19
20 import org.w3c.dom.Document JavaDoc;
21 import org.w3c.dom.Element JavaDoc;
22 import org.w3c.dom.NodeList JavaDoc;
23
24 import org.objectweb.celtix.common.logging.LogUtils;
25 import org.objectweb.celtix.tools.common.toolspec.Tool;
26 import org.objectweb.celtix.tools.common.toolspec.ToolSpec;
27
28
29 public class CommandLineParser {
30
31     private static final Logger JavaDoc LOG = LogUtils.getL7dLogger(CommandLineParser.class);
32     private ToolSpec toolspec;
33
34     public CommandLineParser(ToolSpec ts) {
35         this.toolspec = ts;
36     }
37
38     public void setToolSpec(ToolSpec ts) {
39         this.toolspec = ts;
40     }
41
42     public static String JavaDoc[] getArgsFromString(String JavaDoc s) {
43         StringTokenizer JavaDoc toker = new StringTokenizer JavaDoc(s);
44         List JavaDoc<Object JavaDoc> res = new ArrayList JavaDoc<Object JavaDoc>();
45
46         while (toker.hasMoreTokens()) {
47             res.add(toker.nextToken());
48         }
49         return res.toArray(new String JavaDoc[res.size()]);
50     }
51
52     public CommandDocument parseArguments(String JavaDoc args) throws BadUsageException {
53         return parseArguments(getArgsFromString(args));
54     }
55
56     public CommandDocument parseArguments(String JavaDoc[] args) throws BadUsageException {
57
58         if (LOG.isLoggable(Level.INFO)) {
59             StringBuffer JavaDoc debugMsg = new StringBuffer JavaDoc("Parsing arguments: ");
60
61             for (int i = 0; i < args.length; i++) {
62                 debugMsg.append(args[i]).append(" ");
63             }
64             LOG.info(debugMsg.toString());
65         }
66
67         if (toolspec == null) {
68             throw new IllegalStateException JavaDoc("No schema known- call to acceptSc"
69                                             + "hema() must be made and must succeed");
70         }
71
72         // Create a result document
73

74         Document JavaDoc resultDoc = null;
75
76         try {
77             resultDoc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
78         } catch (Exception JavaDoc ex) {
79             LOG.log(Level.SEVERE, "FAIL_CREATE_DOM_MSG");
80         }
81         Element JavaDoc commandEl = resultDoc.createElementNS("http://www.xsume.com/Xutil/Command", "command");
82
83         // resultDoc.createAttributeNS("http://www.w3.org/2001/XMLSchema-instance","schemaLocation");
84
commandEl.setAttributeNS("http://www.w3.org/2001/XMLSchema-instance", "xsi:schemaLocation",
85                                  "http://www.xsume.com/Xutil/Command http://www.xsume.com/schema/xutil/c"
86                                      + "ommand.xsd");
87         commandEl.setAttribute("xmlns", "http://www.xsume.com/Xutil/Command");
88         commandEl.setAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
89         resultDoc.appendChild(commandEl);
90
91         TokenInputStream tokens = new TokenInputStream(args);
92
93         // for all form elements...
94
Element JavaDoc usage = toolspec.getUsage();
95
96         NodeList JavaDoc usageForms = toolspec.getUsageForms();
97         if (LOG.isLoggable(Level.INFO)) {
98             LOG
99                 .info("Found " + usageForms.getLength()
100                       + " alternative forms of usage, will use default form");
101         }
102         if (usageForms.getLength() > 0) {
103             ErrorVisitor errors = new ErrorVisitor();
104
105             for (int i = 0; i < usageForms.getLength(); i++) {
106                 Form form = new Form((Element JavaDoc)usageForms.item(i));
107
108                 int pos = tokens.getPosition();
109
110                 if (form.accept(tokens, commandEl, errors)) {
111                     commandEl.setAttribute("form", form.getName());
112                     break;
113                 } else {
114                     // if no more left then return null;
115
tokens.setPosition(pos);
116                     if (i == usageForms.getLength() - 1) {
117                         if (LOG.isLoggable(Level.INFO)) {
118                             LOG.info("No more forms left to try, returning null");
119                         }
120                         throwUsage(errors);
121                     }
122                 }
123             }
124         } else {
125             ErrorVisitor errors = new ErrorVisitor();
126             Form form = new Form(usage);
127
128             if (!form.accept(tokens, commandEl, errors)) {
129                 throwUsage(errors);
130             }
131         }
132
133         // output the result document
134
if (LOG.isLoggable(Level.FINE)) {
135             try {
136                 Transformer JavaDoc serializer = TransformerFactory.newInstance()
137                     .newTransformer(
138                                     new StreamSource JavaDoc(Tool.class
139                                         .getResourceAsStream("indent-no-xml-declaration.xsl")));
140
141                 serializer.transform(new DOMSource JavaDoc(resultDoc), new StreamResult JavaDoc(new PrintStream JavaDoc(System.out)));
142             } catch (Exception JavaDoc ex) {
143                 LOG.log(Level.SEVERE, "ERROR_SERIALIZE_COMMAND_MSG", ex);
144             }
145         }
146
147         return new CommandDocument(toolspec, resultDoc);
148     }
149
150     public void throwUsage(ErrorVisitor errors) throws BadUsageException {
151         try {
152             throw new BadUsageException(getUsage(), errors);
153         } catch (TransformerException JavaDoc ex) {
154             LOG.log(Level.SEVERE, "CANNOT_GET_USAGE_MSG", ex);
155             throw new BadUsageException(errors);
156         }
157     }
158
159     public String JavaDoc getUsage() throws TransformerException JavaDoc {
160         // REVISIT: style usage document into a form more readily output as a
161
// usage message
162
ByteArrayOutputStream JavaDoc baos = new ByteArrayOutputStream JavaDoc();
163         InputStream JavaDoc in = getClass().getResourceAsStream("usage.xsl");
164
165         toolspec.transform(in, baos);
166         return baos.toString();
167     }
168
169     public String JavaDoc getDetailedUsage() throws TransformerException JavaDoc {
170         // REVISIT: style usage document into a form more readily output as a
171
// usage message
172
ByteArrayOutputStream JavaDoc baos = new ByteArrayOutputStream JavaDoc();
173
174         toolspec.transform(getClass().getResourceAsStream("detailedUsage.xsl"), baos);
175         return baos.toString();
176     }
177
178     public String JavaDoc getDetailedUsage(String JavaDoc id) {
179         String JavaDoc result = null;
180         Element JavaDoc element = toolspec.getElementById(id);
181         NodeList JavaDoc annotations = element.getElementsByTagNameNS(Tool.TOOL_SPEC_PUBLIC_ID, "annotation");
182         if ((annotations != null) && (annotations.getLength() > 0)) {
183             result = annotations.item(0).getFirstChild().getNodeValue();
184         }
185         return result;
186     }
187
188     public String JavaDoc getToolUsage() {
189         return toolspec.getAnnotation();
190     }
191
192 }
193
Popular Tags