package org.apache.commons.digester3.edsl.atom;

/*
 * 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.
 */

import org.apache.commons.digester3.binder.AbstractRulesModule;

public final class AtomRulesModule
    extends AbstractRulesModule
{

    @Override
    protected void configure()
    {
        forPattern( "feed" ).createObject().ofType( Feed.class );
        forPattern( "feed/title" ).setBeanProperty();
        forPattern( "feed/link" ).setProperties().addAlias( "href", "link" );
        forPattern( "feed/updated" ).setBeanProperty();
        forPattern( "feed/author/name" ).callMethod( "addAuthor" ).usingElementBodyAsArgument();
        forPattern( "feed/id" ).setBeanProperty();

        forPattern( "feed/entry" ).createObject().ofType( Entry.class )
            .then()
            .setNext( "addEntry" );
        forPattern( "feed/entry/title" ).setBeanProperty();
        forPattern( "feed/entry/link" ).setProperties().addAlias( "href", "link" );
        forPattern( "feed/entry/updated" ).setBeanProperty();
        forPattern( "feed/entry/id" ).setBeanProperty();
        forPattern( "feed/entry/content" ).setBeanProperty();
    }

}
