View Javadoc

1   package org.apache.commons.digester3.xmlrules;
2   
3   /*
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   *
12   *   http://www.apache.org/licenses/LICENSE-2.0
13   *
14   * Unless required by applicable law or agreed to in writing,
15   * software distributed under the License is distributed on an
16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17   * KIND, either express or implied.  See the License for the
18   * specific language governing permissions and limitations
19   * under the License.
20   */
21  
22  import java.util.Set;
23  
24  import org.apache.commons.digester3.binder.LinkedRuleBuilder;
25  import org.apache.commons.digester3.binder.RulesBinder;
26  import org.apache.commons.digester3.binder.RulesModule;
27  
28  /**
29   *
30   */
31  final class XmlRulesModule
32      implements RulesModule
33  {
34  
35      private final NameSpaceURIRulesBinder targetRulesBinder;
36  
37      private final Set<String> rootSystemIds;
38  
39      private final String rootPath;
40  
41      private WithMemoryRulesBinder memoryRulesBinder;
42  
43      public XmlRulesModule( final NameSpaceURIRulesBinder targetRulesBinder, Set<String> rootSystemIds,
44      /* @Nullable */String rootPath )
45      {
46          this.targetRulesBinder = targetRulesBinder;
47          this.rootSystemIds = rootSystemIds;
48          this.rootPath = rootPath;
49      }
50  
51      /**
52       * {@inheritDoc}
53       */
54      public void configure( RulesBinder rulesBinder )
55      {
56          if ( rulesBinder instanceof WithMemoryRulesBinder )
57          {
58              memoryRulesBinder = (WithMemoryRulesBinder) rulesBinder;
59          }
60          else
61          {
62              memoryRulesBinder = new WithMemoryRulesBinder( rulesBinder );
63              if ( !rootSystemIds.isEmpty() )
64              {
65                  memoryRulesBinder.getIncludedFiles().addAll( rootSystemIds );
66              }
67          }
68  
69          PatternStack patternStack = memoryRulesBinder.getPatternStack();
70  
71          if ( rootPath != null )
72          {
73              patternStack.push( rootPath );
74          }
75  
76          try
77          {
78              forPattern( "digester-rules" ).addRule( new SetNamespaceURIRule( targetRulesBinder ) );
79  
80              forPattern( "*/pattern" ).addRule( new PatternRule( patternStack ) );
81              forPattern( "*/include" ).addRule( new IncludeRule( memoryRulesBinder, targetRulesBinder ) );
82  
83              forPattern( "*/bean-property-setter-rule" ).addRule( new BeanPropertySetterRule( targetRulesBinder,
84                                                                                               patternStack ) );
85  
86              forPattern( "*/call-method-rule" ).addRule( new CallMethodRule( targetRulesBinder, patternStack ) );
87              forPattern( "*/call-param-rule" ).addRule( new CallParamRule( targetRulesBinder, patternStack ) );
88  
89              forPattern( "*/factory-create-rule" ).addRule( new FactoryCreateRule( targetRulesBinder, patternStack ) );
90              forPattern( "*/node-create-rule" ).addRule( new NodeCreateRule( targetRulesBinder, patternStack ) );
91              forPattern( "*/object-create-rule" ).addRule( new ObjectCreateRule( targetRulesBinder, patternStack ) );
92              forPattern( "*/object-param-rule" ).addRule( new ObjectParamRule( targetRulesBinder, patternStack ) );
93  
94              forPattern( "*/set-properties-rule" ).addRule( new SetPropertiesRule( targetRulesBinder, patternStack ) );
95              forPattern( "*/set-properties-rule/alias" )
96                  .addRule( new SetPropertiesAliasRule() );
97              forPattern( "*/set-properties-rule/ignore" )
98                  .addRule( new SetPropertiesIgnoreRule() );
99  
100             forPattern( "*/set-property-rule" ).addRule( new SetPropertyRule( targetRulesBinder, patternStack ) );
101 
102             forPattern( "*/set-nested-properties-rule" )
103                 .addRule( new SetNestedPropertiesRule( targetRulesBinder, patternStack ) );
104             forPattern( "*/set-nested-properties-rule/alias" )
105                 .addRule( new SetNestedPropertiesAliasRule() );
106             forPattern( "*/set-nested-properties-rule/ignore" )
107                 .addRule( new SetNestedPropertiesIgnoreRule() );
108 
109             forPattern( "*/set-top-rule" ).addRule( new SetTopRule( targetRulesBinder, patternStack ) );
110             forPattern( "*/set-next-rule" ).addRule( new SetNextRule( targetRulesBinder, patternStack ) );
111             forPattern( "*/set-root-rule" ).addRule( new SetRootRule( targetRulesBinder, patternStack ) );
112         }
113         finally
114         {
115             memoryRulesBinder = null;
116         }
117     }
118 
119     /**
120      * @param pattern
121      * @return
122      */
123     protected LinkedRuleBuilder forPattern( String pattern )
124     {
125         return memoryRulesBinder.forPattern( pattern );
126     }
127 
128 }