2010년 3월 1일 월요일

JDT를 이용하여 java 파일에 필드 및 getter/setter 추가하기

요구사항:
Wizard에서 필드 타입, 필드명, getter/setter 생성 여부, 주석등을 입력받아서 해당 java 파일에 관련 소스 코드를 생성한다.

필드 추가는
org.eclipse.jdt.core.IType
IField createField(String contents, IJavaElement sibling, boolean force, IProgressMonitor monitor) throws JavaModelException; 메서드를 이용하여 생성하였다.
getter / setter 메소드는 이클립스에서 제공하는 org.eclipse.jdt.internal.corext.codemanipulation.AddGetterSetterOperation 를 이용하였다.


public static void addProperty(IProgressMonitor monitor, ICompilationUnit unit, IType type, String propertyType, String propertyName, boolean generateGetter, boolean generateSetter, String comment) throws JavaModelException, CoreException{
IField field = type.getField(propertyName);
if(field.exists() == false) {
StringBuffer sb = new StringBuffer();

if(comment == null || comment.trim().length() == 0) {
comment = propertyName;
}
sb.append(buildFieldComment(comment));
String contents = "private " + propertyType + " " + propertyName + ";";

sb.append(contents);

field = type.createField(sb.toString(), null, true, monitor);
}

IField[] getterFields = new IField[0];
IField[] setterFields = new IField[0];
IField[] accessors = new IField[0];

if(generateGetter) {
getterFields = new IField[1];
getterFields[0] = field;
}
if(generateSetter) {
setterFields = new IField[1];
setterFields[0] = field;
}


CodeGenerationSettings settings= JavaPreferencesSettings.getCodeGenerationSettings(unit.getJavaProject());
// getter/setter의 주석을 추가시킨다.
settings.createComments = true;
AddGetterSetterOperation op = new AddGetterSetterOperation(type, getterFields, setterFields, accessors, new RefactoringASTParser(AST.JLS3).parse(type.getCompilationUnit(), true), null, null, settings, true, false);

op.run(monitor);
}

public static String buildFieldComment(String comment) {
StringBuffer sb = new StringBuffer();
sb.append("/**").append(lineDelimiter);
if(comment == null || comment.trim().length() == 0) {
sb.append(" *");
} else {
for(String aLine : comment.split(lineDelimiter)) {
sb.append(" * ").append(aLine).append(lineDelimiter);
}
}
sb.append(" */");
sb.append(lineDelimiter);
return sb.toString();
}


IType.getField() 메소드는 필드가 존재하지 않는 경우에도 값이 리턴이 되므로
if(field == null) 이렇게 비교하면 안된다.

getterFields, setterFields, accessors는 null로 전달하면 NullPointerException이 발생하므로 주의해야 한다.
getter, setter 메소드를 생성하기 전에 반드시 field먼저 추가해야 에러가 발생하지 않는다.

댓글 없음:

댓글 쓰기