package org.apache.commons.digester3.annotations.processor;

/*
 * 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 java.util.Collection;

import com.sun.mirror.apt.AnnotationProcessor;
import com.sun.mirror.apt.AnnotationProcessorEnvironment;
import com.sun.mirror.apt.Messager;
import com.sun.mirror.declaration.TypeDeclaration;
import com.sun.mirror.util.DeclarationVisitor;

/**
 * {@code org.apache.commons.digester3.annotations.rules.*} annotations processor.
 *
 * @since 3.3
 */
@SuppressWarnings( "restriction" )
final class DigesterAnnotationProcessor
    implements AnnotationProcessor
{

    private final AnnotationProcessorEnvironment environment;

    DigesterAnnotationProcessor( AnnotationProcessorEnvironment environment )
    {
        this.environment = environment;
    }

    /**
     * {@inheritDoc}
     */
    public void process()
    {
        Messager messager = environment.getMessager();
        messager.printNotice( "Processing Digester annotations..." );

        DeclarationVisitor visitor = new DigesterDeclarationVisitor( messager );

        Collection<TypeDeclaration> declarations = environment.getTypeDeclarations();
        for ( TypeDeclaration declaration : declarations )
        {
            messager.printNotice( "+---------------------------------------------------------------------------+" );

            declaration.accept( visitor );
        }

        messager.printNotice( "Digester annotations processing terminated." );
    }

}
