alvinalexander.com | career | drupal | java | mac | mysql | perl | scala | uml | unix  

What this is

This file is included in the DevDaily.com "Java Source Code Warehouse" project. The intent of this project is to help you "Learn Java by Example" TM.

Other links

The source code

package org.netbeans.modules.tasklist.javadoc;

import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.util.List;
import org.openide.cookies.OpenCookie;
import org.openide.src.ClassElement;
import org.openide.src.ElementFormat;
import org.openide.src.JavaDoc;
import org.openide.src.JavaDocTag;
import org.openide.src.MemberElement;
import org.openide.src.SourceElement;
import org.openide.src.SourceException;
import org.openide.util.NbBundle;
import org.openide.util.WeakListener;
import org.netbeans.modules.tasklist.javadoc.ext.JavaTagNames;

/** 
 * Holds the element and the informations about comment errors 
 */
public abstract class AutoCommenterElement {
    protected ArrayList errorList;
    protected List resolutionList = null;

    MemberElement srcElement = null;
    int srcError = AutoCommenter.JDC_OK;

    public AutoCommenterElement( MemberElement srcElement ) {
        this.srcElement = srcElement;
        PropertyChangeListener pp = new PropertyChangeListener(){
            public void propertyChange(PropertyChangeEvent evt){
                //System.err.println(evt.getPropertyName());
                /* Instead check e.g. instanceof DataObject && getPrimaryFile().hasExt("java")
                if( evt.getSource() instanceof org.netbeans.modules.java.JavaDataObject ) //ignore
                    return;
                */
                //System.err.println("change 2");
                //AutoCommenter.this.fireAutocommentChangeEvent();            
            }
        };
        //System.err.println("adding listeners");
        srcElement.addPropertyChangeListener(WeakListener.propertyChange(pp, srcElement));
        checkError();
    }

    String getName() {
        return getNameFormat().format( srcElement );
    }

    MemberElement getSrcElement() {
        return srcElement;
    }

    int getModifiers() {
        return srcElement.getModifiers();
    }

    int getErrorNumber() {
        return srcError;
    }

    void viewSource() {
        OpenCookie oc = ((OpenCookie)srcElement.getCookie( OpenCookie.class ));
        oc.open();
    }

    ArrayList getErrorList() {
        return errorList;
    }

    List getResolutionList() {
        return resolutionList;
    }

    /** Returns the source for this particular element. Used for locking purposes.
    */
    SourceElement findSource() {
        ClassElement decl = srcElement.getDeclaringClass();
        if (decl == null && (srcElement instanceof ClassElement)) {
            decl = (ClassElement)srcElement;
        }
        if (decl == null) return null;
        return decl.getSource();
    }

    abstract String[] getNotPermittedTags();

    abstract boolean elementTagsOk();

    abstract void autoCorrect() throws SourceException;

    abstract JavaDoc getJavaDoc();

    abstract ElementFormat getNameFormat();

    abstract String typeToString();

    static boolean isPermittedTag( JavaDocTag tag, String[] notPermittedTags ) {
        String tagName = tag.name();

        for ( int i = 0; i < notPermittedTags.length; i++ ) {
            if ( tagName.equals( notPermittedTags[i] ) )
                return false;
        }

        return true;
    }

    void modifyJavaDoc(Runnable mutator) throws SourceException {
        SourceElement src = findSource();
        if (src == null) {
            mutator.run();
        } else {
            src.runAtomicAsUser(mutator);
        }
    }

    private static boolean isEmptyString( String string ) {
        return string == null || string.trim().length() <= 0;
    }

    /** Checks syntax of the tags
     */

    boolean isOkTag( JavaDocTag tag ) {
        if ( isEmptyString( tag.text() ) ) {
            errorList.add(NbBundle.getMessage(AutoCommenterElement.class, "ERR_EmptyTag", tag.name()));
            // Can't fix this one - can I?
            //resolutionList.add(NbBundle.getMessage(AutoCommenter.class, ...
            return false;
        }

        if ( tag instanceof JavaDocTag.See ) {
            int len;
            String text;
            JavaDocTag.See seetag = (JavaDocTag.See) tag;

            if ((seetag.referencedClassName() != null) || (seetag.referencedMemberName() != null)) 
                return true;
            text=tag.text();
            len = text.length();
            if (len >= 2) {
                char first=text.charAt(0);
                char last=text.charAt(len-1);

                if (first=='"' && last==first)
                    return true;
                if (first=='<' && last=='>')
                    return true;
            }
            errorList.add(NbBundle.getMessage(AutoCommenterElement.class, "ERR_InvalidTag", seetag)); // NOI18N
            resolutionList.add(NbBundle.getMessage(AutoCommenterElement.class, "FIX_InvalidTag", seetag)); // NOI18N
            return false;
        }
        else if ( tag instanceof JavaDocTag.Param ) {
            if ( isEmptyString( ((JavaDocTag.Param)tag).parameterName() ) ) {
                errorList.add( NbBundle.getMessage(AutoCommenterElement.class, "ERR_ParamNoName", tag.name()));
                return false;
            }
            if ( isEmptyString( ((JavaDocTag.Param)tag).parameterComment() ) ) {
                errorList.add( NbBundle.getMessage(AutoCommenterElement.class, "ERR_ParamNoDescr", tag.name(), ((JavaDocTag.Param)tag).parameterName()));
                return false;
            }
        }
        else if ( tag instanceof JavaDocTag.Throws ) {
            if ( isEmptyString( ((JavaDocTag.Throws)tag).exceptionName() ) ) {
                errorList.add( NbBundle.getMessage(AutoCommenterElement.class, "ERR_ThrowsNoName", tag.name()));
                return false;
            }
            if ( isEmptyString( ((JavaDocTag.Throws)tag).exceptionComment() ) ) {
                errorList.add(NbBundle.getMessage(AutoCommenterElement.class, "ERR_ThrowsNoDescr", tag.name(), ((JavaDocTag.Throws)tag).exceptionName()));
                return false;
            }
        }
        else if ( tag instanceof JavaDocTag.SerialField ) {
            if ( isEmptyString( ((JavaDocTag.SerialField)tag).fieldName() ) ) {
                errorList.add(NbBundle.getMessage(AutoCommenterElement.class, "ERR_SerialFieldNoName", tag.name()));
                return false;
            }
            if ( isEmptyString( ((JavaDocTag.SerialField)tag).fieldType() ) ) {
                errorList.add(NbBundle.getMessage(AutoCommenterElement.class, "ERR_SerialFieldNoType", tag.name(), ((JavaDocTag.SerialField)tag).fieldName()));
                return false;
            }

            if ( isEmptyString( ((JavaDocTag.SerialField)tag).description() ) ) {
                errorList.add(NbBundle.getMessage(AutoCommenter.class, "ERR_SerialFieldNoDescr", tag.name(), ((JavaDocTag.SerialField)tag).fieldName()));
                return false;
            }
        }
        return true;
    }

    boolean isMultipleTags(String tag) {
        // Check for multiple tags
        boolean error = false;
        JavaDocTag[] tags = getJavaDoc().getTags(tag);
        if ( tags.length > 1) {
            errorList.add( NbBundle.getMessage(AutoCommenterElement.class, "ERR_DuplicatedTag", tags[0].name()));
            resolutionList.add(NbBundle.getMessage(AutoCommenterElement.class, "FIX_DuplicatedTag", tags[0].name()));
            error = true;
        }
        return error;
    }

    void checkError() {

        errorList = new ArrayList();
        resolutionList = new ArrayList();

        JavaDoc jdoc = getJavaDoc();

        if ( jdoc.isEmpty() ) {
            srcError = AutoCommenter.JDC_MISSING;
            errorList.add( NbBundle.getMessage(AutoCommenterElement.class, "ERR_JavadocMissing")); //NOI18N
// XXX Can I add something here?
            return;
        }

        JavaDocTag[] tags = jdoc.getTags();
        boolean error = false;

        if ( jdoc.getText() == null || jdoc.getText().trim().length() <= 0 ) {
            errorList.add(NbBundle.getMessage(AutoCommenterElement.class, "ERR_EmptyText"));  //NOI18N
            error = true;
        }

        for ( int i = 0; i < tags.length; i ++ ) {
            if ( !AutoCommenterElement.isPermittedTag( tags[i], getNotPermittedTags() ) ) {
                errorList.add(NbBundle.getMessage(AutoCommenterElement.class, "ERR_BadTag", tags[i].name(), typeToString()));
                resolutionList.add(NbBundle.getMessage(AutoCommenterElement.class, "FIX_BadTag", tags[i].name(), typeToString()));

                error = true;
                continue;
            }

            if ( !isOkTag( tags[i] ) ) {
                error = true;
                continue;
            }
        }

        if (isMultipleTags(JavaTagNames.TAG_SINCE)) {
            error = true;
        }

        if (isMultipleTags(JavaTagNames.TAG_DEPRECATED)) {
            error = true;
        }

        if ( !elementTagsOk( ) ) {
            error = true;
        }

        if ( !error ) {
            errorList.add(NbBundle.getMessage(AutoCommenterElement.class, "ERR_JavadocOK"));  //NOI18N
        }

        srcError = error ? AutoCommenter.JDC_ERROR : AutoCommenter.JDC_OK;

    }

    boolean isCorrectable() {

        JavaDocTag[] tags = getJavaDoc().getTags();

        for ( int i = 0; i < tags.length; i ++ ) {
            if ( !AutoCommenterElement.isPermittedTag( tags[i], getNotPermittedTags() ) ) {
                return true;
            }
        }

        return false;
    }

    void autoCorrect( JavaDoc jdoc ) throws SourceException {
        JavaDocTag[] tags = jdoc.getTags();
        ArrayList correctedTags = new ArrayList( tags.length );
        String correctedText;

        correctedText = jdoc.getText();

        if ( correctedText == null ) {
            correctedText = ""; // NOI18N
        }

        for ( int i = 0; i < tags.length; i ++ ) {
            if ( !AutoCommenterElement.isPermittedTag( tags[i], getNotPermittedTags() ) ) {
                continue;
            }
            correctedTags.add( tags[i] );
        }

        //jdoc.setRawText( generateRawText( correctedText, (Collection)correctedTags ) );
        jdoc.changeTags( (JavaDocTag[])correctedTags.toArray( new JavaDocTag[ correctedTags.size() ] ), JavaDoc.SET  );
    }
}
... this post is sponsored by my books ...

#1 New Release!

FP Best Seller

 

new blog posts

 

Copyright 1998-2021 Alvin Alexander, alvinalexander.com
All Rights Reserved.

A percentage of advertising revenue from
pages under the /java/jwarehouse URI on this website is
paid back to open source projects.