<?xml version="1.0" encoding="UTF-8"?>
<!--
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 xmlns="http://maven.apache.org/XDOC/2.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/XDOC/2.0 http://maven.apache.org/xsd/xdoc-2.0.xsd">
  <properties>
    <title>Apache Commons Digester | Guide | Constructor rule</title>
    <author email="dev@commons.apache.org">Commons Documentation Team</author>
  </properties>
  <body>
    <section name="Constructor based rule">
      <p>One of the missing features of the old Digester releases is that the
      <a href="../apidocs/org/apache/commons/digester3/ObjectCreateRule.html">ObjectCreateRule</a> works just with
      the default empty constructor.</p>
      <p>One limit that cannot be exceeded is the fact that constructor arguments cannot be extracted from inner
      XML elements; that's because the <code>ObjectCreateRule</code> creates the object when the related XML
      element <code>begins</code>, otherwise properties could not be set when parsing nested elements.</p>
      <p>That is no longer true :) Constructor arguments can be extracted from <i>attributes</i> and
      <i>nested elements</i>of the matching XML element for whom the <code>ObjectCreateRule</code> is triggered.</p>
      <p><b>NOTE</b> this feature is available since release 3.2.</p>

      <subsection name="Using plain old Digester APIs">
        <p><code>ObjectCreateRule</code> has new APIs to configure the constructor arguments types; given for example
        the XML snippet below:</p>
        <source>&lt;root&gt;
  &lt;bean super="true"&gt;
    &lt;rate&gt;9.99&lt;rate/&gt;
  &lt;/bean&gt;
&lt;/root&gt;</source>
        <p>That has to be mapped to the bean:</p>
        <source>class MyBean
{

    public MyBean( Double rate, Boolean super )
    {
        ...
    }

}</source>
        <p>Then the <code>Digester</code> instance can be configured as below:</p>
        <source>ObjectCreateRule createRule = new ObjectCreateRule( MyBean.class );
createRule.setConstructorArgumentTypes( boolean.class, double.class );

Digester digester = new Digester();
digester.addRule( "root/bean", createRule );
digester.addCallParam( "root/bean", 1, "super" );
digester.addCallParam( "root/bean/rate", 0 );</source>
      </subsection>

      <subsection name="Using the RulesBinder APIs">
        <p>The Binder APIs just allow expressing the same rule in a fluent way:</p>
        <source>DigesterLoader loader = ( new AbstractRulesModule()
{

    @Override
    protected void configure()
    {
        forPattern( "root/bean" )
            .createObject().ofType( MyBean.class ).usingConstructor( boolean.class, double.class )
            .then()
            .callParam().fromAttribute( "super" ).ofIndex( 1 );
        forPattern( "root/bean/rate" ).callParam().ofIndex( 0 );
    }

} );</source>
      </subsection>

      <subsection name="Using the annotations">
        <p>Since 3.2, <a href="../apidocs/org/apache/commons/digester3/annotations/rules/ObjectCreate.html">ObjectCreate</a>
        can be used to annotate constructors as well; with the introduction of
        <a href="../apidocs/org/apache/commons/digester3/annotations/rules/Attribute.html">Attribute</a> annotation,
        constructor based rules can be expressed like:</p>
        <source>class MyBean
{

    @ObjectCreate( pattern = "root/bean" )
    public MyBean( @CallParam( pattern = "root/bean/rate" ) Double rate,
                   @CallParam( pattern = "root/bean", attributeName = "super" ) Boolean super )
    {
        ...
    }

}</source>
      </subsection>

      <subsection name="Using the XML meta-descriptor">
        <p>The XML ruleset supports as well the new constructor rule, <code>&lt;object-create-rule&gt;</code> supports
        a new inner element <code>&lt;constructor-argument&gt;</code>:</p>
        <source>&lt;digester-rules&gt;
  &lt;pattern value="root/bean"&gt;
    &lt;object-create-rule classname="MyBean
          paramtypes="java.lang.Double,java.lang.Boolean"&gt;
      &lt;constructor-argument attrname="rate" type="java.lang.Double" /&gt;
      &lt;call-param-rule paramnumber="0" pattern="rate" /&gt;
      &lt;call-param-rule paramnumber="1" attrname="super" /&gt;
    &lt;/object-create-rule&gt;
  &lt;/pattern&gt;
&lt;/digester-rules&gt;</source>
      </subsection>
    </section>

    <section name="Default constructor arguments">
      <p>In order to provide that feature, Digester relies on <code>CGLIB</code> that needs to proxy the class of the
      target object, to avoid constructors issues users can use the
      <code>ObjectCreateRule#setDefaultConstructorArguments(Object...)</code> method to give safe construction
      params to the constructor when creating the proxy; that method could be useful also when one parameter needs to
      take a static value while the other is handled with a <code>CallParam</code> rule. If these are not specified,
      the super constructor is called with nulls for Objects and default values for primitives.</p>
    </section>
  </body>
</document>
