Java tutorial
/* * 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; } }