JavadocPackageCheck.java :  » IntelliJ » checkstyle-idea » org » infernus » idea » checkstyle » checks » Java Open Source

Java Open Source » IntelliJ » checkstyle idea 
checkstyle idea » org » infernus » idea » checkstyle » checks » JavadocPackageCheck.java
package org.infernus.idea.checkstyle.checks;

import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.puppycrawl.tools.checkstyle.api.AuditEvent;
import com.puppycrawl.tools.checkstyle.api.CheckstyleException;
import com.puppycrawl.tools.checkstyle.api.Configuration;
import org.jetbrains.annotations.NotNull;

/**
 * Extra logic for the JavadocPackageCheck check.
 */
public final class JavadocPackageCheck implements Check {

    private static final String CHECK_PACKAGE_INFO = "com.puppycrawl.tools.checkstyle.checks.javadoc.JavadocPackageCheck";
    private static final String MODULE_NAME = "JavadocPackage";
    private static final String PACKAGE_HTML_FILE = "package.html";
    private static final String PACKAGE_INFO_FILE = "package-info.java";

    private boolean usingLegacyPackage;

    /**
     * {@inheritDoc}
     * <p/>
     * Retrieve the allowLegacy flag for handling javadoc package info from a CheckStyle configuration.
     */
    public void configure(@NotNull final Configuration config) {
        final String stringValue = parsePackageInfoLegacy(config);
        usingLegacyPackage = null != stringValue && Boolean.parseBoolean(stringValue);
    }

    public boolean process(@NotNull final PsiFile file, @NotNull final AuditEvent event) {
        if (!CHECK_PACKAGE_INFO.equals(event.getSourceName())) {
            return true;
        }

        PsiElement currentSibling = findFirstSibling(file);

        while (currentSibling != null) {
            if (currentSibling.isPhysical() && currentSibling.isValid()
                    && currentSibling instanceof PsiFile) {
                final String siblingName = ((PsiFile) currentSibling).getName();
                if (PACKAGE_INFO_FILE.equals(siblingName)
                        || (usingLegacyPackage && PACKAGE_HTML_FILE.equals(siblingName))) {
                    return false;
                }
            }

            currentSibling = currentSibling.getNextSibling();
        }

        return true;
    }


    private PsiElement findFirstSibling(@NotNull final PsiFile psiFile) {
        PsiElement currentSibling = psiFile;
        while (currentSibling.getPrevSibling() != null) {
            currentSibling = currentSibling.getPrevSibling();
        }
        return currentSibling;
    }

    /**
     * Retrieve the allowLegacy flag as a String for handling javadoc package info from a CheckStyle configuration.
     *
     * @param config the checkstyle configuration.
     * @return the allowLegacy flag in String form.
     */
    private String parsePackageInfoLegacy(final Configuration config) {
        if (config == null || config.getName() == null) {
            return null;
        }

        String value;
        try {
            if (MODULE_NAME.equals(config.getName()) || CHECK_PACKAGE_INFO.equals(config.getName())) {
                value = config.getAttribute("allowLegacy");

            } else {
                Configuration[] children = config.getChildren();
                int index = 0;
                value = null;
                while (index < children.length && null == value) {
                    value = parsePackageInfoLegacy(children[index]);
                    index++;
                }
            }
        } catch (CheckstyleException ce) {
            // bummer, don't have it... return null
            value = null;
        }

        return value;
    }
}
java2s.com  | Contact Us | Privacy Policy
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.