You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@forrest.apache.org by un...@apache.org on 2004/02/25 16:59:00 UTC
cvs commit: xml-forrest/src/java/org/apache/cocoon/components/modules/input LocationMapModule.java
unico 2004/02/25 07:59:00
Modified: src/java/org/apache/cocoon/components/modules/input/lm
AbstractNode.java SelectNode.java LocationMap.java
LocatorNode.java MatchNode.java LocationNode.java
src/java/org/apache/cocoon/components/modules/input
LocationMapModule.java
Log:
some minor improvements to robustness, documentation enhancements and better logging
Revision Changes Path
1.3 +1 -1 xml-forrest/src/java/org/apache/cocoon/components/modules/input/lm/AbstractNode.java
Index: AbstractNode.java
===================================================================
RCS file: /home/cvs/xml-forrest/src/java/org/apache/cocoon/components/modules/input/lm/AbstractNode.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- AbstractNode.java 22 Oct 2003 16:56:05 -0000 1.2
+++ AbstractNode.java 25 Feb 2004 15:58:59 -0000 1.3
@@ -94,7 +94,7 @@
* <code>null</code> if the configuration contained no parameters.
* @throws ConfigurationException
*/
- protected final Map getParameters(final Configuration configuration)
+ private final Map getParameters(final Configuration configuration)
throws ConfigurationException {
final Configuration[] children = configuration.getChildren("parameter");
1.2 +1 -2 xml-forrest/src/java/org/apache/cocoon/components/modules/input/lm/SelectNode.java
Index: SelectNode.java
===================================================================
RCS file: /home/cvs/xml-forrest/src/java/org/apache/cocoon/components/modules/input/lm/SelectNode.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- SelectNode.java 21 Oct 2003 08:33:36 -0000 1.1
+++ SelectNode.java 25 Feb 2004 15:59:00 -0000 1.2
@@ -65,7 +65,7 @@
/**
- * LocationMap node representing a Selector.
+ * Locationmap select statement.
*
* @author <a href="mailto:unico@hippo.nl">Unico Hommes</a>
*/
@@ -131,7 +131,6 @@
}
m_nodes = (AbstractNode[]) nodes.toArray(new AbstractNode[nodes.size()]);
}
-
public String locate(Map om, InvokeContext context) throws Exception {
1.4 +71 -36 xml-forrest/src/java/org/apache/cocoon/components/modules/input/lm/LocationMap.java
Index: LocationMap.java
===================================================================
RCS file: /home/cvs/xml-forrest/src/java/org/apache/cocoon/components/modules/input/lm/LocationMap.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- LocationMap.java 22 Oct 2003 17:41:12 -0000 1.3
+++ LocationMap.java 25 Feb 2004 15:59:00 -0000 1.4
@@ -94,9 +94,9 @@
/**
* The locationmap namespace:
- * <code>http://apache.org/cocoon/locationmap/1.0</code>
+ * <code>http://apache.org/forrest/locationmap/1.0</code>
*/
- public static final String URI = "http://apache.org/cocoon/locationmap/1.0";
+ public static final String URI = "http://apache.org/forrest/locationmap/1.0";
/**
* Name of the special anchor map passed into the VariableContext.
@@ -106,7 +106,7 @@
* inside the locationmap definition.
* </p>
* <p>
- * Special locationmap parameters are available thru this anchor map.
+ * Special locationmap parameters are available through this anchor map.
* For instance the hint parameter defined below can be accessed in
* the locationmap definition as follows: <code>{#lm:hint}</code>
* </p>
@@ -130,7 +130,8 @@
*/
public static final String HINT_PARAM = "#" + ANCHOR_NAME + ":" + HINT_KEY;
-
+ // Component manager containing the locationmap components
+ // as declared in the components section.
private LocationMapComponentManager m_manager;
// default matcher as configured in the components section
@@ -142,49 +143,58 @@
// the list of LocatorNodes
private LocatorNode[] m_locatorNodes;
+
public LocationMap(ComponentManager manager) {
m_manager = new LocationMapComponentManager(manager);
}
+ /**
+ * Build the LocationMap by creating the components and recursively building
+ * the LocatorNodes.
+ */
public void build(final Configuration configuration) throws ConfigurationException {
// components
final Configuration components = configuration.getChild("components");
// matchers
- final DefaultComponentSelector matcherSelector = new DefaultComponentSelector();
- Configuration child = components.getChild("matchers",true);
- m_defaultMatcher = child.getAttribute("default");
- final Configuration[] matchers = child.getChildren("matcher");
- for (int i = 0; i < matchers.length; i++) {
- String name = matchers[i].getAttribute("name");
- String src = matchers[i].getAttribute("src");
- Matcher matcher = (Matcher) createComponent(src,matchers[i]);
- matcherSelector.put(name,matcher);
- }
- matcherSelector.makeReadOnly();
- if (!matcherSelector.hasComponent(m_defaultMatcher)) {
- throw new ConfigurationException("Default matcher is not defined.");
+ Configuration child = components.getChild("matchers",false);
+ if (child != null) {
+ final DefaultComponentSelector matcherSelector = new DefaultComponentSelector();
+ m_defaultMatcher = child.getAttribute("default");
+ final Configuration[] matchers = child.getChildren("matcher");
+ for (int i = 0; i < matchers.length; i++) {
+ String name = matchers[i].getAttribute("name");
+ String src = matchers[i].getAttribute("src");
+ Matcher matcher = (Matcher) createComponent(src,matchers[i]);
+ matcherSelector.put(name,matcher);
+ }
+ matcherSelector.makeReadOnly();
+ if (!matcherSelector.hasComponent(m_defaultMatcher)) {
+ throw new ConfigurationException("Default matcher is not defined.");
+ }
+ m_manager.put(Matcher.ROLE+"Selector",matcherSelector);
}
- m_manager.put(Matcher.ROLE+"Selector",matcherSelector);
// selectors
- final DefaultComponentSelector selectorSelector = new DefaultComponentSelector();
- child = components.getChild("selectors");
- m_defaultSelector = child.getAttribute("default");
- final Configuration[] selectors = child.getChildren("selector");
- for (int i = 0; i < selectors.length; i++) {
- String name = selectors[i].getAttribute("name");
- String src = selectors[i].getAttribute("src");
- Selector selector = (Selector) createComponent(src,selectors[i]);
- selectorSelector.put(name,selector);
- }
- selectorSelector.makeReadOnly();
- if (!selectorSelector.hasComponent(m_defaultSelector)) {
- throw new ConfigurationException("Default selector is not defined.");
+ child = components.getChild("selectors",false);
+ if (child != null) {
+ final DefaultComponentSelector selectorSelector = new DefaultComponentSelector();
+ m_defaultSelector = child.getAttribute("default");
+ final Configuration[] selectors = child.getChildren("selector");
+ for (int i = 0; i < selectors.length; i++) {
+ String name = selectors[i].getAttribute("name");
+ String src = selectors[i].getAttribute("src");
+ Selector selector = (Selector) createComponent(src,selectors[i]);
+ selectorSelector.put(name,selector);
+ }
+ selectorSelector.makeReadOnly();
+ if (!selectorSelector.hasComponent(m_defaultSelector)) {
+ throw new ConfigurationException("Default selector is not defined.");
+ }
+ m_manager.put(Selector.ROLE+"Selector",selectorSelector);
+ m_manager.makeReadOnly();
}
- m_manager.put(Selector.ROLE+"Selector",selectorSelector);
- m_manager.makeReadOnly();
// locators
final Configuration[] children = configuration.getChildren("locator");
@@ -196,6 +206,15 @@
}
}
+ /**
+ * Creates a LocationMap component.
+ * <p>
+ * supported component creation lifecycles that are:
+ * - LogEnabled
+ * - Configurable
+ * - Initializable
+ * </p>
+ */
private Object createComponent(String src, Configuration config) throws ConfigurationException {
Object component = null;
try {
@@ -221,6 +240,11 @@
m_locatorNodes = null;
}
+ /**
+ * Loop through the list of locator nodes invoking
+ * the <code>locate()</code> method on each and return
+ * the first non-null result.
+ */
public String locate(String hint, Map om) throws Exception {
String location = null;
@@ -241,21 +265,33 @@
}
}
- //context.popMap();
- //context.reset();
context.dispose();
+ if (getLogger().isDebugEnabled() && location == null) {
+ getLogger().debug("No location matched request with hint " + hint);
+ }
+
return location;
}
+ /**
+ * Expose the default Matcher to LocatorNodes
+ */
String getDefaultMatcher() {
return m_defaultMatcher;
}
+ /**
+ * Expose the default Selector to LocatorNodes
+ */
String getDefaultSelector() {
return m_defaultSelector;
}
+ /**
+ * Overide DefaultComponentManager to access the list of all
+ * components.
+ */
private static class LocationMapComponentManager extends DefaultComponentManager {
LocationMapComponentManager(ComponentManager parent) {
@@ -265,6 +301,5 @@
Iterator getComponents() {
return super.getComponentMap().values().iterator();
}
-
}
}
1.4 +17 -2 xml-forrest/src/java/org/apache/cocoon/components/modules/input/lm/LocatorNode.java
Index: LocatorNode.java
===================================================================
RCS file: /home/cvs/xml-forrest/src/java/org/apache/cocoon/components/modules/input/lm/LocatorNode.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- LocatorNode.java 11 Dec 2003 05:14:51 -0000 1.3
+++ LocatorNode.java 25 Feb 2004 15:59:00 -0000 1.4
@@ -65,7 +65,17 @@
/**
- * LocationMap node for containing a set <code>MatchNode</code>s.
+ * Top level locate statement containing
+ * <code>MatchNode</code>s and <code>SelectNode</code>s.
+ *
+ * <p>
+ * A locator defines a common location context for its
+ * contained location statements. Location strings resolved within
+ * the context of a given locator will be prefixed with the
+ * locator's base location. This base location is specified
+ * using the <code>base</code> attribute on the <code><locator></code>
+ * element and defaults to <code>.</code>.
+ * </p>
*
* @author <a href="mailto:unico@hippo.nl">Unico Hommes</a>
*/
@@ -77,7 +87,7 @@
// location base resolver
private VariableResolver m_baseLocation;
- // the contained MatchNodes
+ // the contained Match- and SelectNodes
private AbstractNode[] m_nodes;
public LocatorNode(final LocationMap lm, final ComponentManager manager) {
@@ -115,6 +125,11 @@
m_nodes = (AbstractNode[]) nodes.toArray(new AbstractNode[nodes.size()]);
}
+ /**
+ * Loop over the list of match and select nodes and call their
+ * respective <code>locate()</code> methods returning the first
+ * non-null result.
+ */
public String locate(Map om, InvokeContext context) throws Exception {
// resolve the base location and put it in the anchor map
1.2 +17 -2 xml-forrest/src/java/org/apache/cocoon/components/modules/input/lm/MatchNode.java
Index: MatchNode.java
===================================================================
RCS file: /home/cvs/xml-forrest/src/java/org/apache/cocoon/components/modules/input/lm/MatchNode.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- MatchNode.java 21 Oct 2003 08:33:36 -0000 1.1
+++ MatchNode.java 25 Feb 2004 15:59:00 -0000 1.2
@@ -64,7 +64,22 @@
import org.apache.cocoon.matching.Matcher;
/**
- * LocationMap node representing a Matcher.
+ * Locationmap match statement.
+ *
+ * <p>
+ * The <match> element has one required <code>pattern</code> attribute
+ * which identifies the pattern the associated Matcher should match
+ * against and one optional <code>type</code> attribute that identifies
+ * the Matcher that is to do the matching.
+ * </p>
+ *
+ * Match statements can contain <code><match></code>,
+ * <code><select></code> and <code><location></code>
+ * child statements.
+ *
+ * <p>
+ * Match nodes can be parametrized using <code><parameter></code> child elements.
+ * </p>
*
* @author <a href="mailto:unico@hippo.nl">Unico Hommes</a>
*/
@@ -143,7 +158,7 @@
Map substitutions = m_matcher.match(m_pattern,om,parameters);
if (substitutions != null) {
if (getLogger().isDebugEnabled()) {
- getLogger().debug("matched " + m_pattern);
+ getLogger().debug("matched: " + m_pattern);
}
context.pushMap(null,substitutions);
for (int i = 0; i < m_nodes.length; i++) {
1.4 +10 -2 xml-forrest/src/java/org/apache/cocoon/components/modules/input/lm/LocationNode.java
Index: LocationNode.java
===================================================================
RCS file: /home/cvs/xml-forrest/src/java/org/apache/cocoon/components/modules/input/lm/LocationNode.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- LocationNode.java 11 Dec 2003 05:14:51 -0000 1.3
+++ LocationNode.java 25 Feb 2004 15:59:00 -0000 1.4
@@ -62,7 +62,13 @@
import org.apache.excalibur.source.SourceUtil;
/**
- * LocationMap node representing a location.
+ * locationmap leaf statement identifying a location.
+ *
+ * <p>
+ * The <code><location></code> element has one
+ * required attribute <code>src</code> that contains the
+ * location string.
+ * </p>
*
* @author <a href="mailto:unico@hippo.nl">Unico Hommes</a>
*/
@@ -89,6 +95,9 @@
}
+ /**
+ * Resolve the location string against the InvokeContext.
+ */
public String locate(Map om, InvokeContext context) throws Exception {
String src = m_src.resolve(context,om);
@@ -104,7 +113,6 @@
}
return src;
-
}
}
1.3 +12 -1 xml-forrest/src/java/org/apache/cocoon/components/modules/input/LocationMapModule.java
Index: LocationMapModule.java
===================================================================
RCS file: /home/cvs/xml-forrest/src/java/org/apache/cocoon/components/modules/input/LocationMapModule.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- LocationMapModule.java 22 Oct 2003 16:52:34 -0000 1.2
+++ LocationMapModule.java 25 Feb 2004 15:59:00 -0000 1.3
@@ -90,6 +90,11 @@
private SourceValidity m_srcVal;
private LocationMap m_lm;
+ // ---------------------------------------------------- lifecycle
+
+ public LocationMapModule() {
+ }
+
public void compose(ComponentManager manager) throws ComponentException {
m_manager = manager;
m_resolver = (SourceResolver) manager.lookup(SourceResolver.ROLE);
@@ -173,6 +178,12 @@
return configuration;
}
+ // ---------------------------------------------------- Module implementation
+
+ /**
+ * Execute the current request against the locationmap returning the
+ * resulting string.
+ */
public Object getAttribute(
final String name,
final Configuration modeConf,
@@ -193,7 +204,7 @@
/**
* The possibilities are endless. No way to enumerate them all.
- * Therefore returns an empty Iterator.
+ * Therefore returns null.
*/
public Iterator getAttributeNames(Configuration modeConf, Map objectModel)
throws ConfigurationException {