001: /* $Id: AbstractRulesImpl.java 471661 2006-11-06 08:09:25Z skitching $
002: *
003: * Licensed to the Apache Software Foundation (ASF) under one or more
004: * contributor license agreements. See the NOTICE file distributed with
005: * this work for additional information regarding copyright ownership.
006: * The ASF licenses this file to You under the Apache License, Version 2.0
007: * (the "License"); you may not use this file except in compliance with
008: * the License. You may obtain a copy of the License at
009: *
010: * http://www.apache.org/licenses/LICENSE-2.0
011: *
012: * Unless required by applicable law or agreed to in writing, software
013: * distributed under the License is distributed on an "AS IS" BASIS,
014: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015: * See the License for the specific language governing permissions and
016: * limitations under the License.
017: */
018:
019: package org.apache.commons.digester;
020:
021: import java.util.List;
022:
023: /**
024: * <p><code>AbstractRuleImpl</code> provides basic services for <code>Rules</code> implementations.
025: * Extending this class should make it easier to create a <code>Rules</code> implementation.</p>
026: *
027: * <p><code>AbstractRuleImpl</code> manages the <code>Digester</code>
028: * and <code>namespaceUri</code> properties.
029: * If the subclass overrides {@link #registerRule} (rather than {@link #add}),
030: * then the <code>Digester</code> and <code>namespaceURI</code> of the <code>Rule</code>
031: * will be set correctly before it is passed to <code>registerRule</code>.
032: * The subclass can then perform whatever it needs to do to register the rule.</p>
033: *
034: * @since 1.5
035: */
036:
037: abstract public class AbstractRulesImpl implements Rules {
038:
039: // ------------------------------------------------------------- Fields
040:
041: /** Digester using this <code>Rules</code> implementation */
042: private Digester digester;
043: /** Namespace uri to assoicate with subsequent <code>Rule</code>'s */
044: private String namespaceURI;
045:
046: // ------------------------------------------------------------- Properties
047:
048: /**
049: * Return the Digester instance with which this Rules instance is
050: * associated.
051: */
052: public Digester getDigester() {
053: return digester;
054: }
055:
056: /**
057: * Set the Digester instance with which this Rules instance is associated.
058: *
059: * @param digester The newly associated Digester instance
060: */
061: public void setDigester(Digester digester) {
062: this .digester = digester;
063: }
064:
065: /**
066: * Return the namespace URI that will be applied to all subsequently
067: * added <code>Rule</code> objects.
068: */
069: public String getNamespaceURI() {
070: return namespaceURI;
071: }
072:
073: /**
074: * Set the namespace URI that will be applied to all subsequently
075: * added <code>Rule</code> objects.
076: *
077: * @param namespaceURI Namespace URI that must match on all
078: * subsequently added rules, or <code>null</code> for matching
079: * regardless of the current namespace URI
080: */
081: public void setNamespaceURI(String namespaceURI) {
082: this .namespaceURI = namespaceURI;
083: }
084:
085: // --------------------------------------------------------- Public Methods
086:
087: /**
088: * Registers a new Rule instance matching the specified pattern.
089: * This implementation sets the <code>Digester</code> and the
090: * <code>namespaceURI</code> on the <code>Rule</code> before calling {@link #registerRule}.
091: *
092: * @param pattern Nesting pattern to be matched for this Rule
093: * @param rule Rule instance to be registered
094: */
095: public void add(String pattern, Rule rule) {
096: // set up rule
097: if (this .digester != null) {
098: rule.setDigester(this .digester);
099: }
100:
101: if (this .namespaceURI != null) {
102: rule.setNamespaceURI(this .namespaceURI);
103: }
104:
105: registerRule(pattern, rule);
106:
107: }
108:
109: /**
110: * Register rule at given pattern.
111: * The the Digester and namespaceURI properties of the given <code>Rule</code>
112: * can be assumed to have been set properly before this method is called.
113: *
114: * @param pattern Nesting pattern to be matched for this Rule
115: * @param rule Rule instance to be registered
116: */
117: abstract protected void registerRule(String pattern, Rule rule);
118:
119: /**
120: * Clear all existing Rule instance registrations.
121: */
122: abstract public void clear();
123:
124: /**
125: * Return a List of all registered Rule instances that match the specified
126: * nesting pattern, or a zero-length List if there are no matches. If more
127: * than one Rule instance matches, they <strong>must</strong> be returned
128: * in the order originally registered through the <code>add()</code>
129: * method.
130: *
131: * @param pattern Nesting pattern to be matched
132: *
133: * @deprecated Call match(namespaceURI,pattern) instead.
134: */
135: public List match(String pattern) {
136: return match(namespaceURI, pattern);
137: }
138:
139: /**
140: * Return a List of all registered Rule instances that match the specified
141: * nesting pattern, or a zero-length List if there are no matches. If more
142: * than one Rule instance matches, they <strong>must</strong> be returned
143: * in the order originally registered through the <code>add()</code>
144: * method.
145: *
146: * @param namespaceURI Namespace URI for which to select matching rules,
147: * or <code>null</code> to match regardless of namespace URI
148: * @param pattern Nesting pattern to be matched
149: */
150: abstract public List match(String namespaceURI, String pattern);
151:
152: /**
153: * Return a List of all registered Rule instances, or a zero-length List
154: * if there are no registered Rule instances. If more than one Rule
155: * instance has been registered, they <strong>must</strong> be returned
156: * in the order originally registered through the <code>add()</code>
157: * method.
158: */
159: abstract public List rules();
160:
161: }
|