/*******************************************************************************
 * Copyright (c) 2009 Shane Clarke.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    Shane Clarke - initial API and implementation
 *******************************************************************************/
package org.eclipse.jst.ws.annotations.core.processor;

import java.util.Collection;

import org.eclipse.jdt.apt.core.util.EclipseMessager;

import com.sun.mirror.apt.AnnotationProcessor;
import com.sun.mirror.apt.AnnotationProcessorEnvironment;
import com.sun.mirror.declaration.AnnotationMirror;
import com.sun.mirror.declaration.AnnotationTypeDeclaration;
import com.sun.mirror.declaration.MethodDeclaration;
import com.sun.mirror.util.SourcePosition;

/**
 * Abstract base class for processors contributed to the
 * <code>org.eclipse.jst.ws.annotations.core.annotationProcessor</code> extension point.
 *
 * <p>
 * <strong>Provisional API:</strong> This class/interface is part of an interim API that is still under
 * development and expected to change significantly before reaching stability. It is being made available at
 * this early stage to solicit feedback from pioneering adopters on the understanding that any code that uses
 * this API will almost certainly be broken (repeatedly) as the API evolves.
 * </p>
 *
 */
public abstract class AbstractAnnotationProcessor implements AnnotationProcessor {
    protected AnnotationProcessorEnvironment environment;

    /**
     * Set the {@link AnnotationProcessorEnvironment} environment to use during processing.
     * @param environment the annotation processor environment.
     */
    public void setAnnotationProcessorEnvironment(AnnotationProcessorEnvironment environment) {
        this.environment = environment;
    }

    /**
     * Process all program elements supported by this annotation processor.
     * @see com.sun.mirror.apt.AnnotationProcessor
     */
     public abstract void process();

    protected void printError(AnnotationTypeDeclaration annotationDeclaration ,
            MethodDeclaration methodDeclaration, String errorMessage) {

        Collection<AnnotationMirror> annotationMirrors = methodDeclaration.getAnnotationMirrors();
        for (AnnotationMirror mirror : annotationMirrors) {
            if (mirror.getAnnotationType().toString().equals(annotationDeclaration.getQualifiedName())) {
                environment.getMessager().printError(mirror.getPosition(), errorMessage);
            }
        }
    }

    protected void printError(SourcePosition position, String message) {
        environment.getMessager().printError(position, message);
    }

    protected void printError(String message) {
        environment.getMessager().printError(message);
    }

    protected void printWarning(SourcePosition position, String message) {
        environment.getMessager().printWarning(position, message);
    }

    protected void printWarning(String message) {
        environment.getMessager().printWarning(message);
    }

    protected void printNotice(SourcePosition position, String message) {
        environment.getMessager().printNotice(position, message);
    }

    protected void printNotice(String message) {
        environment.getMessager().printNotice(message);
    }

    protected void printFixableError(SourcePosition position, String message) {
        EclipseMessager messager = (EclipseMessager) environment.getMessager();
        messager.printFixableError(position, message, "", message);
    }

    protected void printFixableError(SourcePosition position, String message, String pluginId, String errorId) {
        EclipseMessager messager = (EclipseMessager) environment.getMessager();
        messager.printFixableError(position, message, pluginId, errorId);
    }

    protected void printFixableError(String message, String pluginId, String errorId) {
        EclipseMessager messager = (EclipseMessager) environment.getMessager();
        messager.printFixableError(message, pluginId, errorId);
    }

    protected void printFixableWarning(SourcePosition position, String message, String pluginId,
            String errorId) {
        EclipseMessager messager = (EclipseMessager) environment.getMessager();
        messager.printFixableWarning(position, message, pluginId, errorId);
    }

    protected void printFixableWarning(String message, String pluginId, String errorId) {
        EclipseMessager messager = (EclipseMessager) environment.getMessager();
        messager.printFixableWarning(message, pluginId, errorId);
    }


    protected void printFixableNotice(SourcePosition position, String message, String pluginId, String errorId) {
        EclipseMessager messager = (EclipseMessager) environment.getMessager();
        messager.printFixableNotice(position, message, pluginId, errorId);
    }

    protected void printFixableNotice(String message, String pluginId, String errorId) {
        EclipseMessager messager = (EclipseMessager) environment.getMessager();
        messager.printFixableNotice(message, pluginId, errorId);
    }

}
