1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 package org.millscript.millscript.loaders;
22
23 import org.millscript.commons.xml.api.Name;
24 import org.millscript.commons.xml.tokenizer.NoNamespacesName;
25 import org.millscript.millscript.alert.Alerts;
26 import org.millscript.millscript.expr.ConstantExpr;
27 import org.millscript.millscript.expr.IndexExpr;
28 import org.millscript.millscript.expr.NameExpr;
29
30 /**
31 * This class compiles an arg element in a MillScript XHTML template. An arg
32 * element is called <code>arg</code> and has a single attribute called
33 * <code>n</code>.
34 */
35 public class ArgName implements SpecialTemplateName {
36
37 /**
38 * This name is used to obtain the value of the n attribute of the arg
39 * element.
40 */
41 private static final Name ARG_NUMBER_ARG = new NoNamespacesName( "n" );
42
43 /**
44 * The loader we will insert our expressions into.
45 */
46 private final BasicTemplateLoader basicTemplateLoader;
47
48 /**
49 * Constructs a new arg element handler, to insert expressions for the
50 * current element into the specified loader.
51 *
52 * @param btl the loader to insert expressions into
53 */
54 public ArgName( final BasicTemplateLoader btl ) {
55 this.basicTemplateLoader = btl;
56 }
57
58 /**
59 * @see org.millscript.millscript.loaders.SpecialTemplateName#handle()
60 */
61 public void handle() {
62 final String val = this.basicTemplateLoader.tokenVisitor.startTagToken.getAttributes().get( ARG_NUMBER_ARG );
63 try {
64 final int n = Integer.parseInt( val );
65 if ( n <= 0 ) {
66 throw new NumberFormatException();
67 } else {
68
69
70 this.basicTemplateLoader.tokenVisitor.parentTokenVisitor.pushChildElement(
71 IndexExpr.make(
72 new NameExpr( "arg" ),
73 new ConstantExpr( new Integer( n ) )
74 )
75 );
76 }
77 } catch ( NumberFormatException ex ) {
78 throw(
79 Alerts.template(
80 "Attribute 'n' is not a positive integer",
81 "The 'n' attribute of the 'item' element must be a small int"
82 ).culprit( "n", val ).mishap()
83 );
84 }
85 }
86
87 }