<?xml version="1.0"?>
<!--
 Licensed to the Apache Software Foundation (ASF) under one
 or more contributor license agreements.  See the NOTICE file
 distributed with this work for additional information
 regarding copyright ownership.  The ASF licenses this file
 to you under the Apache License, Version 2.0 (the
 "License"); you may not use this file except in compliance
 with the License.  You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

 Unless required by applicable law or agreed to in writing,
 software distributed under the License is distributed on an
 "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 KIND, either express or implied.  See the License for the
 specific language governing permissions and limitations
 under the License.
-->

<document>

  <properties>
    <title>Parser Component</title>
    <author email="epugh@opensourceconnections.com">Eric Pugh</author>
  </properties>

  <body>

  <section name="Overview">
    <p>
      This Service functions as a repository for Parser components.
    </p>

    <p>
      It is written
      for use in Turbine but it can be used in any container compatible
      with Avalon's ECM container.
    </p>
    
  </section>

<section name="Configuration">
    <subsection name="Role Configuration">
      <source><![CDATA[
<role
    name="org.apache.fulcrum.parser.ParserService"
    shorthand="parser"
    default-class="org.apache.fulcrum.parser.DefaultParserService"/>
]]></source>
    </subsection>
    
    <subsection name="Component Configuration">
      <table>
        <tr>
          <th>Item</th>
          <th>Datatype</th>
          <th>Cardinality</th>
          <th>Description</th>
        </tr>
        <tr>
          <td>urlCaseFolding</td>
          <td>String</td>
          <td>[0|1]</td>
          <td>
            This setting controls how parameter names are to be folded during
            processing. Valid values are <code>none</code> (no folding), 
            <code>upper</code> (all names upper case) and <code>lower</code>
            (all names lower case). The default is <code>none</code>.
          </td>
        </tr>
        <tr>
          <td>parameterEncoding</td>
          <td>String</td>
          <td>[0|1]</td>
          <td>
            The parameter encoding to use when converting strings to bytes or
            vice versa. This encoding is used when no explicit encoding is specified.
            This must be a valid encoding string for the JVM in use. The default is
            <code>iso-8859-1</code>.
          </td>
        </tr>
        <tr>
          <td>automaticUpload</td>
          <td>boolean</td>
          <td>[0|1]</td>
          <td>
            If set to <code>true</code>, parsing the multipart request for attachments
            will be performed automatically. Otherwise, the request may be parsed manually
            by calling <code>parseUpload(HttpServletRequest)</code>. The default value is
            <code>false</code>. When set to true, the component must have the 
            <a href="http://turbine.apache.org/fulcrum/fulcrum-upload/">Fulcrum Upload Service</a>
            available to parse the request.
          </td>
        </tr>
        <tr>
          <td>pool2</td>
          <td>list</td>
          <td>*</td>
          <td>
            Wrapper for commons pool2 parameters (child components) <code>maxTotal</code>, 
            <code>blockWhenExhausted</code>, <code>maxWaitMillis</code>, <code>testOnBorrow</code>, <code>testOnCreate</code>, <code>testOnReturn</code>,<code>maxIdle</code> and <code>minIdle</code>. The parameter values are the same as for commons.pool2, compare the defaults (upper case and underscore-separated) <a href="https://commons.apache.org/proper/commons-pool/apidocs/constant-values.html">here</a> for org.apache.commons.pool2.impl.BaseObjectPoolConfig and GenericKeyedObjectPoolConfig.
          </td>
        </tr>
      </table>
    </subsection>

    <subsection name="Component Configuration Example">
      <source><![CDATA[
<parser>
    <urlCaseFolding>lower</urlCaseFolding>
    <parameterEncoding>utf-8</parameterEncoding>
    <automaticUpload>true</automaticUpload>
    <pool2>
         <maxTotal>2048</maxTotal><!--  default 8 -->
         <blockWhenExhausted>true</blockWhenExhausted><!--  default is true -->
         <maxWaitMillis>350</maxWaitMillis><!--  default is -1L -->
    </pool2>
</parser>
]]></source>
    </subsection>
    
  </section>

  <section name="Usage">
    <p>
    You get a parser from the service like this:
    </p>

    <source><![CDATA[
ValueParser parser;

try
{
    // Get a ValueParser instance
    parser = parserService.getParser(BaseValueParser.class);

    parser.add(...);
    Double d = parser.getDoubleObject(...);
}
finally
{
    // Return the instance to the service
    if (parser != null)
    {
        parserService.putParser(parser);
    }
}
]]></source>


    <p>
    Parsers are pooled inside the service. You can use this service to manage any types of
    parsers, you just need to provide the class you want to manage. If the parser class 
    implements LogEnabled it will get an (Avalon) logger injected. If the parser class 
    implements ParserServiceSupport it will get an instance of this service injected. 
    </p>

  </section>

</body>
</document>
