org.limy.eclipse.code.accessor.AccessorUtils.java Source code

Java tutorial

Introduction

Here is the source code for org.limy.eclipse.code.accessor.AccessorUtils.java

Source

/*
 * Created 2005/09/13
 * Copyright (C) 2003-2009  Naoki Iwami (naoki@limy.org)
 *
 * This file is part of Limy Eclipse Plugin.
 *
 * Limy Eclipse Plugin is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * Limy Eclipse Plugin is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with Limy Eclipse Plugin.  If not, see <http://www.gnu.org/licenses/>.
 */
package org.limy.eclipse.code.accessor;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jdt.core.Flags;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IField;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IMethod;
import org.eclipse.jdt.core.IParent;
import org.eclipse.jdt.core.ISourceRange;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.internal.corext.codemanipulation.GetterSetterUtil;
import org.eclipse.text.edits.ReplaceEdit;
import org.eclipse.text.edits.TextEdit;
import org.limy.eclipse.code.LimyCodeConstants;
import org.limy.eclipse.code.common.LimyFieldObject;
import org.limy.eclipse.common.LimyEclipseConstants;

/**
 * ANZbT?iGetter/Setter?j?\bhA?[eBeBNX?B
 * @depend - - - LimyClassObject
 * @depend - - - LimyFieldObject
 * @depend - - - AccessorCreater
 * @author Naoki Iwami
 */
public final class AccessorUtils {

    /**
     * private constructor
     */
    private AccessorUtils() {
    }

    /**
     * ANZbT?\bhJavadoc?X?V?B
     * @param element JavaNX
     * @param monitor Jj^
     * @param edits 
     * @throws JavaModelException JavafO
     */
    public static void modifyAccessorJavadoc(IType element, IProgressMonitor monitor,
            Map<ICompilationUnit, Collection<TextEdit>> edits) throws JavaModelException {

        for (IField javaField : element.getFields()) {
            LimyFieldObject field = new LimyFieldObject(javaField);
            modifyGetterMethod(element, field, monitor, edits);
            modifySetterMethod(element, field, monitor, edits);
        }
    }

    /**
     * wNXpublic?Getter/Setter?\bhS???B
     * @param element JavaNX
     * @param monitor Jj^
     * @throws JavaModelException JavafO
     */
    public static void createAllPublicMethods(IType element, IProgressMonitor monitor) throws JavaModelException {

        List<LimyFieldObject> fields = createLimyClass(element).getFields();

        for (int idx = 0; idx < fields.size(); idx++) {
            LimyFieldObject field = fields.get(idx);

            if (Flags.isStatic(field.getField().getFlags())) {
                continue;
            }

            // Getter/Setter?\bhu
            IJavaElement sibling = decideSibling(fields, idx);

            // Getter/Setter?\bh
            appendGetterMethod(element, field, sibling, monitor);

            if (!Flags.isFinal(field.getField().getFlags())) {
                appendSetterMethod(element, field, sibling, monitor);
            }

        }

    }

    /**
     * wtB?[hpublic?Getter/Setter?\bhS???B
     * @param javaField JavatB?[h
     * @param sibling ???
     * @param monitor Jj^
     * @throws JavaModelException JavafO
     */
    public static void createPublicAccessor(IField javaField, IProgressMonitor monitor) throws JavaModelException {

        List<LimyFieldObject> fields = createLimyClass(javaField.getDeclaringType()).getFields();

        LimyFieldObject field = new LimyFieldObject(javaField);
        IType javaClass = (IType) javaField.getParent();

        if (Flags.isStatic(field.getField().getFlags())) {
            return;
        }

        // Getter/Setter?\bh
        for (int i = 0; i < fields.size(); i++) {
            LimyFieldObject nowField = fields.get(i);
            if (nowField.getField().equals(javaField)) {
                IJavaElement sibling = decideSibling(fields, i);
                appendGetterMethod(javaClass, field, sibling, monitor);
                if (!Flags.isFinal(field.getField().getFlags())) {
                    appendSetterMethod(javaClass, field, sibling, monitor);
                }
                continue;
            }
        }

    }

    /**
     * wtB?[hpublic?Setter?\bhS???B
     * @param javaField JavatB?[h
     * @param monitor Jj^
     * @throws JavaModelException JavafO
     */
    public static void createPublicSetter(IField javaField, IProgressMonitor monitor) throws JavaModelException {

        List<LimyFieldObject> fields = createLimyClass(javaField.getDeclaringType()).getFields();

        IType javaClass = (IType) javaField.getParent();

        for (int i = 0; i < fields.size(); i++) {
            LimyFieldObject nowField = fields.get(i);
            if (nowField.getField().equals(javaField)) {
                IJavaElement sibling = decideSibling(fields, i);
                appendSetterMethod(javaClass, nowField, sibling, monitor);
            }
        }

    }

    /**
     * wtB?[hpublic?Getter?\bhS???B
     * @param javaField JavatB?[h
     * @param monitor Jj^
     * @throws JavaModelException JavafO
     */
    public static void createPublicGetter(IField javaField, IProgressMonitor monitor) throws JavaModelException {

        List<LimyFieldObject> fields = createLimyClass(javaField.getDeclaringType()).getFields();

        IType javaClass = (IType) javaField.getParent();

        for (int i = 0; i < fields.size(); i++) {
            LimyFieldObject nowField = fields.get(i);
            if (nowField.getField().equals(javaField)) {
                IJavaElement sibling = decideSibling(fields, i);
                appendGetterMethod(javaClass, nowField, sibling, monitor);
            }
        }

    }

    /**
     * tOlANZXq?B
     * @param flags tOl
     * @return ANZXq
     */
    public static String getFlagString(int flags) {
        String r = LimyEclipseConstants.EMPTY_STR;
        if ((flags & Flags.AccPrivate) != 0) {
            r = "private";
        }
        if ((flags & Flags.AccProtected) != 0) {
            r = "protected";
        }
        if ((flags & Flags.AccPublic) != 0) {
            r = LimyCodeConstants.FLAGSTR_PUBLIC;
        }
        return r;
    }

    /**
     * JavaNXLimyClassObject???B
     * @param element JavaNX
     * @return ??LimyClassObject
     * @throws JavaModelException JavafO
     */
    public static LimyClassObject createLimyClass(IType element) throws JavaModelException {

        LimyClassObject limyClass = new LimyClassObject();
        IField[] fields = element.getFields();
        for (IField field : fields) {
            limyClass.addField(new LimyFieldObject(field));
        }
        return limyClass;
    }

    // ------------------------ Private Methods

    /**
     * Getter?\bh?C??B
     * @param javaElement JavaNX
     * @param field tB?[h
     * @param monitor Jj^
     * @throws JavaModelException JavafO
     */
    private static void modifyGetterMethod(IType javaElement, LimyFieldObject field, IProgressMonitor monitor,
            Map<ICompilationUnit, Collection<TextEdit>> edits) throws JavaModelException {

        // Getter?\bh
        IMethod getterMethod = GetterSetterUtil.getGetter(field.getField());
        if (getterMethod != null) {
            // ?Getter?\bh???iANZXq??j
            String getterContents = AccessorCreater.createGetterContents(field.getField(), field.getComment(),
                    field.getAnnotationHint(), AccessorUtils.getFlagString(getterMethod.getFlags()), getterMethod);

            // ?\bh`????\bh`?A????\bh`u
            String getterSource = getterMethod.getSource();
            if (!generalizeStr(getterContents).equals(generalizeStr(getterSource))) {

                Collection<TextEdit> changes = edits.get(javaElement.getCompilationUnit());
                if (changes == null) {
                    changes = new ArrayList<TextEdit>();
                    edits.put(javaElement.getCompilationUnit(), changes);
                }
                ISourceRange range = getterMethod.getSourceRange();
                changes.add(new ReplaceEdit(range.getOffset(), range.getLength(), getterContents));

                javaElement.createMethod(getterContents, getNextSibling(getterMethod), true, monitor);
                getterMethod.delete(true, monitor);
            }
        }
    }

    /**
     * Setter?\bh?C??B
     * @param javaElement JavaNX
     * @param field tB?[h
     * @param monitor Jj^
     * @throws JavaModelException JavafO
     */
    private static void modifySetterMethod(IType javaElement, LimyFieldObject field, IProgressMonitor monitor,
            Map<ICompilationUnit, Collection<TextEdit>> edits) throws JavaModelException {

        // Setter?\bh
        IMethod setterMethod = GetterSetterUtil.getSetter(field.getField());
        if (setterMethod != null) {
            // ?Setter?\bh???iANZXq??j
            String setterContents = AccessorCreater.createSetterContents(field.getField(), field.getComment(),
                    AccessorUtils.getFlagString(setterMethod.getFlags()), setterMethod);

            // ?\bh`????\bh`?A????\bh`u
            String setterSource = setterMethod.getSource();
            if (!generalizeStr(setterContents).equals(generalizeStr(setterSource))) {

                Collection<TextEdit> changes = edits.get(javaElement.getCompilationUnit());
                if (changes == null) {
                    changes = new ArrayList<TextEdit>();
                    edits.put(javaElement.getCompilationUnit(), changes);
                }
                ISourceRange range = setterMethod.getSourceRange();
                changes.add(new ReplaceEdit(range.getOffset(), range.getLength(), setterContents));

                javaElement.createMethod(setterContents, getNextSibling(setterMethod), true, monitor);
                setterMethod.delete(true, monitor);
            }
        }
    }

    /**
     * Getter?\bhNX?B
     * @param javaElement JavaNX
     * @param field tB?[h
     * @param sibling ?\bh}??
     * @param monitor Jj^
     * @throws JavaModelException JavafO
     */
    private static void appendGetterMethod(IType javaElement, LimyFieldObject field, IJavaElement sibling,
            IProgressMonitor monitor) throws JavaModelException {

        // Getter?\bh
        IMethod getterMethod = GetterSetterUtil.getGetter(field.getField());

        // ?Getter?\bh??
        String getterContents = AccessorCreater.createGetterContents(field.getField(), field.getComment(),
                field.getAnnotationHint(), LimyCodeConstants.FLAGSTR_PUBLIC, getterMethod);

        // ?\bh`????\bh`?A????\bh`u
        String getterSource = (getterMethod != null) ? getterMethod.getSource() : null;
        if (!generalizeStr(getterContents).equals(generalizeStr(getterSource))) {
            javaElement.createMethod(getterContents, sibling, true, monitor);
            if (getterMethod != null) {
                getterMethod.delete(true, monitor);
            }
        }
    }

    /**
     * Setter?\bhNX?B
     * @param javaElement JavaNX
     * @param field tB?[h
     * @param sibling ?\bh}??
     * @param monitor Jj^
     * @throws JavaModelException JavafO
     */
    private static void appendSetterMethod(IType javaElement, LimyFieldObject field, IJavaElement sibling,
            IProgressMonitor monitor) throws JavaModelException {

        // Setter?\bh
        IMethod setterMethod = GetterSetterUtil.getSetter(field.getField());

        // ?Setter?\bh??
        String setterContents = AccessorCreater.createSetterContents(field.getField(), field.getComment(),
                LimyCodeConstants.FLAGSTR_PUBLIC, setterMethod);

        // ?\bh`????\bh`?A????\bh`u
        String setterSource = (setterMethod != null) ? setterMethod.getSource() : null;
        if (!generalizeStr(setterContents).equals(generalizeStr(setterSource))) {
            javaElement.createMethod(setterContents, sibling, true, monitor);
            if (setterMethod != null) {
                setterMethod.delete(true, monitor);
            }
        }
    }

    /**
     * wtB?[hGetterSetter?\bh?B
     * <p>
     * ?\bh???A`GetterSetter?\bh?B
     * </p>
     * @param fields tB?[h
     * @param idx ?tB?[hXgCfbNX
     * @return
     * @throws JavaModelException JavafO
     */
    private static IJavaElement decideSibling(List<LimyFieldObject> fields, int idx) throws JavaModelException {

        IJavaElement sibling = null;

        // fields[(idx + 1) ... last]?[v
        for (int insIdx = idx + 1; insIdx < fields.size(); insIdx++) {
            LimyFieldObject field = fields.get(insIdx);

            // tB?[hGetter
            IMethod getterMethod = GetterSetterUtil.getGetter(field.getField());
            if (getterMethod != null && getterMethod.exists()) {
                sibling = getterMethod;
                break;
            }

            // tB?[hSetter
            IMethod setterMethod = GetterSetterUtil.getSetter(field.getField());
            if (setterMethod != null && setterMethod.exists()) {
                sibling = setterMethod;
                break;
            }
        }
        return sibling;
    }

    /**
     * wG?gG?g?B
     * @param element G?g
     * @return G?g?iwG?g????Anull?j
     * @throws JavaModelException JavafO
     */
    private static IJavaElement getNextSibling(IJavaElement element) throws JavaModelException {
        IJavaElement parent = element.getParent();
        if (parent instanceof IParent) {
            IJavaElement[] children = ((IParent) parent).getChildren();
            for (int i = 0; i < children.length; i++) {
                if (children[i] == element) {
                    if (i < children.length - 1) {
                        return children[i + 1];
                    }
                    return null;
                }
            }
        }
        return null;
    }

    /**
     * ?B
     * @param contents Rec
     * @return 
     */
    private static String generalizeStr(String contents) {
        if (contents == null) {
            return null;
        }

        String r = contents;
        r = r.replaceAll("//.*", LimyEclipseConstants.EMPTY_STR);
        r = r.trim().replaceAll("\r\n", "\n").replaceAll("\\t", "    ");
        return r;
    }

}