View Javadoc

1   package org.apache.commons.digester3.examples.xmlrules.addressbook;
2   
3   /*
4    * Licensed to the Apache Software Foundation (ASF) under one or more
5    * contributor license agreements.  See the NOTICE file distributed with
6    * this work for additional information regarding copyright ownership.
7    * The ASF licenses this file to You under the Apache License, Version 2.0
8    * (the "License"); you may not use this file except in compliance with
9    * the License.  You may obtain a copy of the License at
10   * 
11   *      http://www.apache.org/licenses/LICENSE-2.0
12   * 
13   * Unless required by applicable law or agreed to in writing, software
14   * distributed under the License is distributed on an "AS IS" BASIS,
15   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16   * See the License for the specific language governing permissions and
17   * limitations under the License.
18   */ 
19  
20  import static org.apache.commons.digester3.binder.DigesterLoader.newLoader;
21  
22  import java.io.File;
23  import java.io.IOException;
24  
25  import org.apache.commons.digester3.Digester;
26  import org.apache.commons.digester3.xmlrules.FromXmlRulesModule;
27  import org.xml.sax.SAXException;
28  
29  /**
30   * A simple program to demonstrate the basic functionality of the
31   * Commons Digester module with the xmlrules extension.
32   * <p>
33   * This code will parse the provided "example.xml" file to build a tree
34   * of java objects, then cause those objects to print out their values
35   * to demonstrate that the input file has been processed correctly.
36   * <p>
37   * Unlike the "addressbook" example in the "api" section, this implementation
38   * has no parsing rules hard-wired into the code in this class. Instead, the
39   * parsing rules are loaded from an external file at runtime. This allows
40   * the parsing rules to be modified without compiling the code, and 
41   * potentially makes it somewhat easier to review the parsing rules.
42   * <p>
43   * Note, however, that there is tyically quite a tight coupling between
44   * the parsing rules and the <i>purpose</i> of the application which means
45   * that it may not be all that common for parsing rules to be altered
46   * without the application code also being altered, so only in some cases
47   * will this prove of benefit. As with all software, it must be determined
48   * whether this feature provides a true benefit in the context of the 
49   * application it is being applied to.
50   * <p>
51   * Usage: java Main xmlrules.xml example.xml
52   */
53  public class Main
54  {
55  
56      /**
57       * Main method : entry point for running this example program.
58       * <p>
59       * Usage: java Example example.xml
60       */
61      public static void main( String[] args )
62          throws Exception
63      {
64          if ( args.length != 2 )
65          {
66              usage();
67              System.exit( -1 );
68          }
69  
70          final String rulesfileName = args[0];
71          String datafileName = args[1];
72  
73          // Create a Digester instance which has been initialised with
74          // rules loaded from the specified file.
75          Digester d = newLoader( new FromXmlRulesModule()
76          {
77  
78              @Override
79              protected void loadRules()
80              {
81                  loadXMLRules( rulesfileName );
82              }
83  
84          } ).newDigester();
85  
86          // Prime the digester stack with an object for rules to
87          // operate on. Note that it is quite common for "this"
88          // to be the object pushed.
89          AddressBook book = new AddressBook();
90          d.push( book );
91  
92          // Process the input file.
93          try
94          {
95              File srcfile = new java.io.File( datafileName );
96              d.parse( srcfile );
97          }
98          catch ( IOException ioe )
99          {
100             System.out.println( "Error reading input file:" + ioe.getMessage() );
101             System.exit( -1 );
102         }
103         catch ( SAXException se )
104         {
105             System.out.println( "Error parsing input file:" + se.getMessage() );
106             System.exit( -1 );
107         }
108 
109         // Print out all the contents of the address book, as loaded from
110         // the input file.
111         book.print();
112     }
113 
114     private static void usage()
115     {
116         System.out.println( "Usage: java Main xmlrules.xml example.xml" );
117     }
118 
119 }