Prototypical implementation of new AST modification strategy
diff --git a/org.eclipse.babel.tapiji.tools.java.ui/src/org/eclipse/babel/tapiji/tools/java/ui/util/ASTutilsUI.java b/org.eclipse.babel.tapiji.tools.java.ui/src/org/eclipse/babel/tapiji/tools/java/ui/util/ASTutilsUI.java
index e30a3f4..493d58f 100644
--- a/org.eclipse.babel.tapiji.tools.java.ui/src/org/eclipse/babel/tapiji/tools/java/ui/util/ASTutilsUI.java
+++ b/org.eclipse.babel.tapiji.tools.java.ui/src/org/eclipse/babel/tapiji/tools/java/ui/util/ASTutilsUI.java
@@ -38,14 +38,24 @@
 import org.eclipse.core.runtime.IPath;

 import org.eclipse.jdt.core.ICompilationUnit;

 import org.eclipse.jdt.core.IJavaElement;

+import org.eclipse.jdt.core.IOpenable;

 import org.eclipse.jdt.core.ITypeRoot;

 import org.eclipse.jdt.core.JavaCore;

+import org.eclipse.jdt.core.JavaModelException;

+import org.eclipse.jdt.core.dom.AST;

+import org.eclipse.jdt.core.dom.AnonymousClassDeclaration;

 import org.eclipse.jdt.core.dom.CompilationUnit;

+import org.eclipse.jdt.core.dom.ExpressionStatement;

 import org.eclipse.jdt.core.dom.ImportDeclaration;

+import org.eclipse.jdt.core.dom.TypeDeclaration;

+import org.eclipse.jdt.core.dom.rewrite.ASTRewrite;

+import org.eclipse.jdt.core.dom.rewrite.ListRewrite;

 import org.eclipse.jdt.ui.SharedASTProvider;

 import org.eclipse.jface.text.BadLocationException;

 import org.eclipse.jface.text.IDocument;

 import org.eclipse.swt.widgets.Display;

+import org.eclipse.text.edits.MalformedTreeException;

+import org.eclipse.text.edits.TextEdit;

 

 public class ASTutilsUI {

 

@@ -74,26 +84,23 @@
     public static String insertNewBundleRef(IDocument document,

             IResource resource, int startPos, int endPos,

             String resourceBundleId, String key) {

-        String newName = null;

+    	boolean createRBReference = false;

         String reference = "";

 

         CompilationUnit cu = getCompilationUnit(resource);

-

-        if (cu == null) {

-            return null;

-        }

+        AST ast = cu.getAST();

+        ASTRewrite rewriter = ASTRewrite.create(ast);

 

         String variableName = ASTutils.resolveRBReferenceVar(document,

                 resource, startPos, resourceBundleId, cu);

         if (variableName == null) {

-            newName = ASTutils.getNonExistingRBRefName(resourceBundleId,

-                    document, cu);

+        	variableName = ASTutils.getNonExistingRBRefName(resourceBundleId, cu);

+        	createRBReference = true;

         }

 

-        try {

+        //try {

             reference = ASTutils.createResourceReference(resourceBundleId, key,

-                    null, resource, startPos, variableName == null ? newName

-                            : variableName, document, cu);

+                    null, resource, startPos, variableName, ast, rewriter, cu);

 

             if (startPos > 0 && document.get().charAt(startPos - 1) == '\"') {

                 startPos--;

@@ -110,64 +117,86 @@
                 endPos--;

             }

 

-            document.replace(startPos, endPos, reference);

+            //document.replace(startPos, endPos, reference);

 

             // create non-internationalisation-comment

-            ASTutils.createReplaceNonInternationalisationComment(cu, document,

-                    startPos);

-        } catch (BadLocationException e) {

-            e.printStackTrace();

-        }

+            //ASTutils.createReplaceNonInternationalisationComment(cu, document,

+            //        startPos);

+        //} catch (BadLocationException e) {

+        //    e.printStackTrace();

+        //}

 

-        if (variableName == null) {

-            // refresh reference to the shared AST of the loaded CompilationUnit

-            cu = getCompilationUnit(resource);

-

+        if (createRBReference) {

             ASTutils.createResourceBundleReference(resource, startPos,

-                    document, resourceBundleId, null, true, newName, cu);

-            // createReplaceNonInternationalisationComment(cu, document, pos);

+                    document, resourceBundleId, null, true, variableName, cu, ast, rewriter);

         }

 

+        // computation of the text edits

+        TextEdit edits = rewriter.rewriteAST(document, null);

+

+        // computation of the new source code

+        try {

+			edits.apply(document);

+		} catch (MalformedTreeException e) {

+			Logger.logError(e);

+		} catch (BadLocationException e) {

+			Logger.logError(e);

+		}

+        

+        

         return reference;

     }

 

     public static String insertExistingBundleRef(IDocument document,

             IResource resource, int offset, int length,

             String resourceBundleId, String key, Locale locale) {

+        boolean createRBReference = false;

         String reference = "";

-        String newName = null;

 

         CompilationUnit cu = getCompilationUnit(resource);

+        AST ast = cu.getAST();

+        ASTRewrite rewriter = ASTRewrite.create(ast);

 

         String variableName = ASTutils.resolveRBReferenceVar(document,

                 resource, offset, resourceBundleId, cu);

         if (variableName == null) {

-            newName = ASTutils.getNonExistingRBRefName(resourceBundleId,

-                    document, cu);

+        	variableName = ASTutils.getNonExistingRBRefName(resourceBundleId, cu);

+        	createRBReference = true;

         }

 

-        try {

-            reference = ASTutils.createResourceReference(resourceBundleId, key,

-                    locale, resource, offset, variableName == null ? newName

-                            : variableName, document, cu);

+        reference = ASTutils.createResourceReference(resourceBundleId, key,

+                locale, resource, offset, variableName, ast, rewriter, cu);

 

-            document.replace(offset, length, reference);

-

-            // create non-internationalisation-comment

-            ASTutils.createReplaceNonInternationalisationComment(cu, document,

-                    offset);

-        } catch (BadLocationException e) {

-            e.printStackTrace();

-        }

+        //try {

+		//	document.replace(offset, length, reference);

+		//} catch (BadLocationException e) {

+		//	Logger.logError(e);

+		//	return null;

+		//}

+        // create non-internationalisation-comment

+        //ASTutils.createReplaceNonInternationalisationComment(cu, document,

+        //        offset);

 

         // TODO retrieve cu in the same way as in createResourceReference

         // the current version does not parse method bodies

 

-        if (variableName == null) {

+        if (createRBReference) {

             ASTutils.createResourceBundleReference(resource, offset, document,

-                    resourceBundleId, locale, true, newName, cu);

-            // createReplaceNonInternationalisationComment(cu, document, pos);

+                    resourceBundleId, locale, true, variableName, cu, ast, rewriter);

         }

+        

+        // computation of the text edits

+        TextEdit edits = rewriter.rewriteAST(document, null);

+

+        // computation of the new source code

+        try {

+			edits.apply(document);

+		} catch (MalformedTreeException e) {

+			Logger.logError(e);

+		} catch (BadLocationException e) {

+			Logger.logError(e);

+		}

+        

         return reference;

     }

 

diff --git a/org.eclipse.babel.tapiji.tools.java/src/org/eclipse/babel/tapiji/tools/java/util/ASTutils.java b/org.eclipse.babel.tapiji.tools.java/src/org/eclipse/babel/tapiji/tools/java/util/ASTutils.java
index 25479d2..4b53a01 100644
--- a/org.eclipse.babel.tapiji.tools.java/src/org/eclipse/babel/tapiji/tools/java/util/ASTutils.java
+++ b/org.eclipse.babel.tapiji.tools.java/src/org/eclipse/babel/tapiji/tools/java/util/ASTutils.java
@@ -21,6 +21,7 @@
 import org.eclipse.babel.tapiji.tools.core.Logger;
 import org.eclipse.babel.tapiji.tools.core.model.SLLocation;
 import org.eclipse.babel.tapiji.tools.java.visitor.MethodParameterDescriptor;
+import org.eclipse.core.internal.registry.OffsetTable;
 import org.eclipse.core.resources.IResource;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.jdt.core.ICompilationUnit;
@@ -58,1017 +59,985 @@
 
 public class ASTutils {
 
-    private static MethodParameterDescriptor rbDefinition;
-    private static MethodParameterDescriptor rbAccessor;
+	private static MethodParameterDescriptor rbDefinition;
+	private static MethodParameterDescriptor rbAccessor;
 
-    public static MethodParameterDescriptor getRBDefinitionDesc() {
-        if (rbDefinition == null) {
-            // Init descriptor for Resource-Bundle-Definition
-            List<String> definition = new ArrayList<String>();
-            definition.add("getBundle");
-            rbDefinition = new MethodParameterDescriptor(definition,
-                    "java.util.ResourceBundle", true, 0);
-        }
+	public static MethodParameterDescriptor getRBDefinitionDesc() {
+		if (rbDefinition == null) {
+			// Init descriptor for Resource-Bundle-Definition
+			List<String> definition = new ArrayList<String>();
+			definition.add("getBundle");
+			rbDefinition = new MethodParameterDescriptor(definition,
+					"java.util.ResourceBundle", true, 0);
+		}
 
-        return rbDefinition;
-    }
+		return rbDefinition;
+	}
 
-    public static MethodParameterDescriptor getRBAccessorDesc() {
-        if (rbAccessor == null) {
-            // Init descriptor for Resource-Bundle-Accessors
-            List<String> accessors = new ArrayList<String>();
-            accessors.add("getString");
-            accessors.add("getStringArray");
-            rbAccessor = new MethodParameterDescriptor(accessors,
-                    "java.util.ResourceBundle", true, 0);
-        }
+	public static MethodParameterDescriptor getRBAccessorDesc() {
+		if (rbAccessor == null) {
+			// Init descriptor for Resource-Bundle-Accessors
+			List<String> accessors = new ArrayList<String>();
+			accessors.add("getString");
+			accessors.add("getStringArray");
+			rbAccessor = new MethodParameterDescriptor(accessors,
+					"java.util.ResourceBundle", true, 0);
+		}
 
-        return rbAccessor;
-    }
+		return rbAccessor;
+	}
 
-    public static String resolveRBReferenceVar(IDocument document,
-            IResource resource, int pos, final String bundleId,
-            CompilationUnit cu) {
-        String bundleVar;
+	public static String resolveRBReferenceVar(IDocument document,
+			IResource resource, int pos, final String bundleId,
+			CompilationUnit cu) {
+		String bundleVar;
 
-        PositionalTypeFinder typeFinder = new PositionalTypeFinder(pos);
-        cu.accept(typeFinder);
-        AnonymousClassDeclaration atd = typeFinder.getEnclosingAnonymType();
-        TypeDeclaration td = typeFinder.getEnclosingType();
-        MethodDeclaration meth = typeFinder.getEnclosingMethod();
+		PositionalTypeFinder typeFinder = new PositionalTypeFinder(pos);
+		cu.accept(typeFinder);
+		AnonymousClassDeclaration atd = typeFinder.getEnclosingAnonymType();
+		TypeDeclaration td = typeFinder.getEnclosingType();
+		MethodDeclaration meth = typeFinder.getEnclosingMethod();
 
-        if (atd == null) {
-            BundleDeclarationFinder bdf = new BundleDeclarationFinder(
-                    bundleId,
-                    td,
-                    meth != null
-                            && (meth.getModifiers() & Modifier.STATIC) == Modifier.STATIC);
-            td.accept(bdf);
+		if (atd == null) {
+			BundleDeclarationFinder bdf = new BundleDeclarationFinder(
+					bundleId,
+					td,
+					meth != null
+							&& (meth.getModifiers() & Modifier.STATIC) == Modifier.STATIC);
+			td.accept(bdf);
 
-            bundleVar = bdf.getVariableName();
-        } else {
-            BundleDeclarationFinder bdf = new BundleDeclarationFinder(
-                    bundleId,
-                    atd,
-                    meth != null
-                            && (meth.getModifiers() & Modifier.STATIC) == Modifier.STATIC);
-            atd.accept(bdf);
+			bundleVar = bdf.getVariableName();
+		} else {
+			BundleDeclarationFinder bdf = new BundleDeclarationFinder(
+					bundleId,
+					atd,
+					meth != null
+							&& (meth.getModifiers() & Modifier.STATIC) == Modifier.STATIC);
+			atd.accept(bdf);
 
-            bundleVar = bdf.getVariableName();
-        }
+			bundleVar = bdf.getVariableName();
+		}
 
-        // Check also method body
-        if (meth != null) {
-            try {
-                InMethodBundleDeclFinder imbdf = new InMethodBundleDeclFinder(
-                        bundleId, pos);
-                typeFinder.getEnclosingMethod().accept(imbdf);
-                bundleVar = imbdf.getVariableName() != null ? imbdf
-                        .getVariableName() : bundleVar;
-            } catch (Exception e) {
-                // ignore
-            }
-        }
+		// Check also method body
+		if (meth != null) {
+			try {
+				InMethodBundleDeclFinder imbdf = new InMethodBundleDeclFinder(
+						bundleId, pos);
+				typeFinder.getEnclosingMethod().accept(imbdf);
+				bundleVar = imbdf.getVariableName() != null ? imbdf
+						.getVariableName() : bundleVar;
+			} catch (Exception e) {
+				// ignore
+			}
+		}
 
-        return bundleVar;
-    }
+		return bundleVar;
+	}
 
-    public static String getNonExistingRBRefName(String bundleId,
-            IDocument document, CompilationUnit cu) {
-        String referenceName = null;
-        int i = 0;
+	public static String getNonExistingRBRefName(String bundleId,
+			CompilationUnit cu) {
+		String referenceName = null;
+		int i = 0;
 
-        while (referenceName == null) {
-            String actRef = bundleId.substring(bundleId.lastIndexOf(".") + 1)
-                    + "Ref" + (i == 0 ? "" : i);
-            actRef = actRef.toLowerCase();
+		while (referenceName == null) {
+			String actRef = bundleId.substring(bundleId.lastIndexOf(".") + 1)
+					+ "Ref" + (i == 0 ? "" : i);
+			actRef = actRef.toLowerCase();
 
-            VariableFinder vf = new VariableFinder(actRef);
-            cu.accept(vf);
+			VariableFinder vf = new VariableFinder(actRef);
+			cu.accept(vf);
 
-            if (!vf.isVariableFound()) {
-                referenceName = actRef;
-                break;
-            }
+			if (!vf.isVariableFound()) {
+				referenceName = actRef;
+				break;
+			}
 
-            i++;
-        }
+			i++;
+		}
 
-        return referenceName;
-    }
+		return referenceName;
+	}
 
-    @Deprecated
-    public static String resolveResourceBundle(
-            MethodInvocation methodInvocation,
-            MethodParameterDescriptor rbDefinition,
-            Map<IVariableBinding, VariableDeclarationFragment> variableBindingManagers) {
-        String bundleName = null;
+	@Deprecated
+	public static String resolveResourceBundle(
+			MethodInvocation methodInvocation,
+			MethodParameterDescriptor rbDefinition,
+			Map<IVariableBinding, VariableDeclarationFragment> variableBindingManagers) {
+		String bundleName = null;
 
-        if (methodInvocation.getExpression() instanceof SimpleName) {
-            SimpleName vName = (SimpleName) methodInvocation.getExpression();
-            IVariableBinding vBinding = (IVariableBinding) vName
-                    .resolveBinding();
-            VariableDeclarationFragment dec = variableBindingManagers
-                    .get(vBinding);
+		if (methodInvocation.getExpression() instanceof SimpleName) {
+			SimpleName vName = (SimpleName) methodInvocation.getExpression();
+			IVariableBinding vBinding = (IVariableBinding) vName
+					.resolveBinding();
+			VariableDeclarationFragment dec = variableBindingManagers
+					.get(vBinding);
 
-            if (dec.getInitializer() instanceof MethodInvocation) {
-                MethodInvocation init = (MethodInvocation) dec.getInitializer();
+			if (dec.getInitializer() instanceof MethodInvocation) {
+				MethodInvocation init = (MethodInvocation) dec.getInitializer();
 
-                // Check declaring class
-                boolean isValidClass = false;
-                ITypeBinding type = init.resolveMethodBinding()
-                        .getDeclaringClass();
-                while (type != null) {
-                    if (type.getQualifiedName().equals(
-                            rbDefinition.getDeclaringClass())) {
-                        isValidClass = true;
-                        break;
-                    } else {
-                        if (rbDefinition.isConsiderSuperclass()) {
-                            type = type.getSuperclass();
-                        } else {
-                            type = null;
-                        }
-                    }
+				// Check declaring class
+				boolean isValidClass = false;
+				ITypeBinding type = init.resolveMethodBinding()
+						.getDeclaringClass();
+				while (type != null) {
+					if (type.getQualifiedName().equals(
+							rbDefinition.getDeclaringClass())) {
+						isValidClass = true;
+						break;
+					} else {
+						if (rbDefinition.isConsiderSuperclass()) {
+							type = type.getSuperclass();
+						} else {
+							type = null;
+						}
+					}
 
-                }
-                if (!isValidClass) {
-                    return null;
-                }
+				}
+				if (!isValidClass) {
+					return null;
+				}
 
-                boolean isValidMethod = false;
-                for (String mn : rbDefinition.getMethodName()) {
-                    if (init.getName().getFullyQualifiedName().equals(mn)) {
-                        isValidMethod = true;
-                        break;
-                    }
-                }
-                if (!isValidMethod) {
-                    return null;
-                }
+				boolean isValidMethod = false;
+				for (String mn : rbDefinition.getMethodName()) {
+					if (init.getName().getFullyQualifiedName().equals(mn)) {
+						isValidMethod = true;
+						break;
+					}
+				}
+				if (!isValidMethod) {
+					return null;
+				}
 
-                // retrieve bundlename
-                if (init.arguments().size() < rbDefinition.getPosition() + 1) {
-                    return null;
-                }
+				// retrieve bundlename
+				if (init.arguments().size() < rbDefinition.getPosition() + 1) {
+					return null;
+				}
 
-                bundleName = ((StringLiteral) init.arguments().get(
-                        rbDefinition.getPosition())).getLiteralValue();
-            }
-        }
+				bundleName = ((StringLiteral) init.arguments().get(
+						rbDefinition.getPosition())).getLiteralValue();
+			}
+		}
 
-        return bundleName;
-    }
+		return bundleName;
+	}
 
-    public static SLLocation resolveResourceBundleLocation(
-            MethodInvocation methodInvocation,
-            MethodParameterDescriptor rbDefinition,
-            Map<IVariableBinding, VariableDeclarationFragment> variableBindingManagers) {
-        SLLocation bundleDesc = null;
+	public static SLLocation resolveResourceBundleLocation(
+			MethodInvocation methodInvocation,
+			MethodParameterDescriptor rbDefinition,
+			Map<IVariableBinding, VariableDeclarationFragment> variableBindingManagers) {
+		SLLocation bundleDesc = null;
 
-        if (methodInvocation.getExpression() instanceof SimpleName) {
-            SimpleName vName = (SimpleName) methodInvocation.getExpression();
-            IVariableBinding vBinding = (IVariableBinding) vName
-                    .resolveBinding();
-            VariableDeclarationFragment dec = variableBindingManagers
-                    .get(vBinding);
+		if (methodInvocation.getExpression() instanceof SimpleName) {
+			SimpleName vName = (SimpleName) methodInvocation.getExpression();
+			IVariableBinding vBinding = (IVariableBinding) vName
+					.resolveBinding();
+			VariableDeclarationFragment dec = variableBindingManagers
+					.get(vBinding);
 
-            if (dec.getInitializer() instanceof MethodInvocation) {
-                MethodInvocation init = (MethodInvocation) dec.getInitializer();
+			if (dec.getInitializer() instanceof MethodInvocation) {
+				MethodInvocation init = (MethodInvocation) dec.getInitializer();
 
-                // Check declaring class
-                boolean isValidClass = false;
-                ITypeBinding type = init.resolveMethodBinding()
-                        .getDeclaringClass();
-                while (type != null) {
-                    if (type.getQualifiedName().equals(
-                            rbDefinition.getDeclaringClass())) {
-                        isValidClass = true;
-                        break;
-                    } else {
-                        if (rbDefinition.isConsiderSuperclass()) {
-                            type = type.getSuperclass();
-                        } else {
-                            type = null;
-                        }
-                    }
+				// Check declaring class
+				boolean isValidClass = false;
+				ITypeBinding type = init.resolveMethodBinding()
+						.getDeclaringClass();
+				while (type != null) {
+					if (type.getQualifiedName().equals(
+							rbDefinition.getDeclaringClass())) {
+						isValidClass = true;
+						break;
+					} else {
+						if (rbDefinition.isConsiderSuperclass()) {
+							type = type.getSuperclass();
+						} else {
+							type = null;
+						}
+					}
 
-                }
-                if (!isValidClass) {
-                    return null;
-                }
+				}
+				if (!isValidClass) {
+					return null;
+				}
 
-                boolean isValidMethod = false;
-                for (String mn : rbDefinition.getMethodName()) {
-                    if (init.getName().getFullyQualifiedName().equals(mn)) {
-                        isValidMethod = true;
-                        break;
-                    }
-                }
-                if (!isValidMethod) {
-                    return null;
-                }
+				boolean isValidMethod = false;
+				for (String mn : rbDefinition.getMethodName()) {
+					if (init.getName().getFullyQualifiedName().equals(mn)) {
+						isValidMethod = true;
+						break;
+					}
+				}
+				if (!isValidMethod) {
+					return null;
+				}
 
-                // retrieve bundlename
-                if (init.arguments().size() < rbDefinition.getPosition() + 1) {
-                    return null;
-                }
+				// retrieve bundlename
+				if (init.arguments().size() < rbDefinition.getPosition() + 1) {
+					return null;
+				}
 
-                StringLiteral bundleLiteral = ((StringLiteral) init.arguments()
-                        .get(rbDefinition.getPosition()));
-                bundleDesc = new SLLocation(null,
-                        bundleLiteral.getStartPosition(),
-                        bundleLiteral.getLength()
-                                + bundleLiteral.getStartPosition(),
-                        bundleLiteral.getLiteralValue());
-            }
-        }
+				StringLiteral bundleLiteral = ((StringLiteral) init.arguments()
+						.get(rbDefinition.getPosition()));
+				bundleDesc = new SLLocation(null,
+						bundleLiteral.getStartPosition(),
+						bundleLiteral.getLength()
+								+ bundleLiteral.getStartPosition(),
+						bundleLiteral.getLiteralValue());
+			}
+		}
 
-        return bundleDesc;
-    }
+		return bundleDesc;
+	}
 
-    private static boolean isMatchingMethodDescriptor(
-            MethodInvocation methodInvocation, MethodParameterDescriptor desc) {
-        boolean result = false;
+	private static boolean isMatchingMethodDescriptor(
+			MethodInvocation methodInvocation, MethodParameterDescriptor desc) {
+		boolean result = false;
 
-        if (methodInvocation.resolveMethodBinding() == null) {
-            return false;
-        }
+		if (methodInvocation.resolveMethodBinding() == null) {
+			return false;
+		}
 
-        String methodName = methodInvocation.resolveMethodBinding().getName();
+		String methodName = methodInvocation.resolveMethodBinding().getName();
 
-        // Check declaring class
-        ITypeBinding type = methodInvocation.resolveMethodBinding()
-                .getDeclaringClass();
-        while (type != null) {
-            if (type.getQualifiedName().equals(desc.getDeclaringClass())) {
-                result = true;
-                break;
-            } else {
-                if (desc.isConsiderSuperclass()) {
-                    type = type.getSuperclass();
-                } else {
-                    type = null;
-                }
-            }
+		// Check declaring class
+		ITypeBinding type = methodInvocation.resolveMethodBinding()
+				.getDeclaringClass();
+		while (type != null) {
+			if (type.getQualifiedName().equals(desc.getDeclaringClass())) {
+				result = true;
+				break;
+			} else {
+				if (desc.isConsiderSuperclass()) {
+					type = type.getSuperclass();
+				} else {
+					type = null;
+				}
+			}
 
-        }
+		}
 
-        if (!result) {
-            return false;
-        }
+		if (!result) {
+			return false;
+		}
 
-        result = !result;
+		result = !result;
 
-        // Check method name
-        for (String method : desc.getMethodName()) {
-            if (method.equals(methodName)) {
-                result = true;
-                break;
-            }
-        }
+		// Check method name
+		for (String method : desc.getMethodName()) {
+			if (method.equals(methodName)) {
+				result = true;
+				break;
+			}
+		}
 
-        return result;
-    }
+		return result;
+	}
 
-    public static boolean isMatchingMethodParamDesc(
-            MethodInvocation methodInvocation, String literal,
-            MethodParameterDescriptor desc) {
-        boolean result = isMatchingMethodDescriptor(methodInvocation, desc);
+	public static boolean isMatchingMethodParamDesc(
+			MethodInvocation methodInvocation, String literal,
+			MethodParameterDescriptor desc) {
+		boolean result = isMatchingMethodDescriptor(methodInvocation, desc);
 
-        if (!result) {
-            return false;
-        } else {
-            result = false;
-        }
+		if (!result) {
+			return false;
+		} else {
+			result = false;
+		}
 
-        if (methodInvocation.arguments().size() > desc.getPosition()) {
-            if (methodInvocation.arguments().get(desc.getPosition()) instanceof StringLiteral) {
-                StringLiteral sl = (StringLiteral) methodInvocation.arguments()
-                        .get(desc.getPosition());
-                if (sl.getLiteralValue().trim().toLowerCase()
-                        .equals(literal.toLowerCase())) {
-                    result = true;
-                }
-            }
-        }
+		if (methodInvocation.arguments().size() > desc.getPosition()) {
+			if (methodInvocation.arguments().get(desc.getPosition()) instanceof StringLiteral) {
+				StringLiteral sl = (StringLiteral) methodInvocation.arguments()
+						.get(desc.getPosition());
+				if (sl.getLiteralValue().trim().toLowerCase()
+						.equals(literal.toLowerCase())) {
+					result = true;
+				}
+			}
+		}
 
-        return result;
-    }
+		return result;
+	}
 
-    public static boolean isMatchingMethodParamDesc(
-            MethodInvocation methodInvocation, StringLiteral literal,
-            MethodParameterDescriptor desc) {
-        int keyParameter = desc.getPosition();
-        boolean result = isMatchingMethodDescriptor(methodInvocation, desc);
+	public static boolean isMatchingMethodParamDesc(
+			MethodInvocation methodInvocation, StringLiteral literal,
+			MethodParameterDescriptor desc) {
+		int keyParameter = desc.getPosition();
+		boolean result = isMatchingMethodDescriptor(methodInvocation, desc);
 
-        if (!result) {
-            return false;
-        }
+		if (!result) {
+			return false;
+		}
 
-        // Check position within method call
-        StructuralPropertyDescriptor spd = literal.getLocationInParent();
-        if (spd.isChildListProperty()) {
-            @SuppressWarnings("unchecked")
-            List<ASTNode> arguments = (List<ASTNode>) methodInvocation
-                    .getStructuralProperty(spd);
-            result = (arguments.size() > keyParameter && arguments
-                    .get(keyParameter) == literal);
-        }
+		// Check position within method call
+		StructuralPropertyDescriptor spd = literal.getLocationInParent();
+		if (spd.isChildListProperty()) {
+			@SuppressWarnings("unchecked")
+			List<ASTNode> arguments = (List<ASTNode>) methodInvocation
+					.getStructuralProperty(spd);
+			result = (arguments.size() > keyParameter && arguments
+					.get(keyParameter) == literal);
+		}
 
-        return result;
-    }
+		return result;
+	}
 
-    public static ICompilationUnit createCompilationUnit(IResource resource) {
-        // Instantiate a new AST parser
-        ASTParser parser = ASTParser.newParser(AST.JLS3);
-        parser.setResolveBindings(true);
+	public static ICompilationUnit createCompilationUnit(IResource resource) {
+		// Instantiate a new AST parser
+		ASTParser parser = ASTParser.newParser(AST.JLS3);
+		parser.setResolveBindings(true);
 
-        ICompilationUnit cu = JavaCore.createCompilationUnitFrom(resource
-                .getProject().getFile(resource.getRawLocation()));
+		ICompilationUnit cu = JavaCore.createCompilationUnitFrom(resource
+				.getProject().getFile(resource.getRawLocation()));
 
-        return cu;
-    }
+		return cu;
+	}
 
-    public static CompilationUnit createCompilationUnit(IDocument document) {
-        // Instantiate a new AST parser
-        ASTParser parser = ASTParser.newParser(AST.JLS3);
-        parser.setResolveBindings(true);
+	public static CompilationUnit createCompilationUnit(IDocument document) {
+		// Instantiate a new AST parser
+		ASTParser parser = ASTParser.newParser(AST.JLS3);
+		parser.setResolveBindings(true);
 
-        parser.setSource(document.get().toCharArray());
-        return (CompilationUnit) parser.createAST(null);
-    }
+		parser.setSource(document.get().toCharArray());
+		return (CompilationUnit) parser.createAST(null);
+	}
 
-    public static void createImport(IDocument doc, IResource resource,
-            CompilationUnit cu, AST ast, ASTRewrite rewriter,
-            String qualifiedClassName) throws CoreException,
-            BadLocationException {
+	public static void createImport(IDocument doc, IResource resource,
+			CompilationUnit cu, AST ast, ASTRewrite rewriter,
+			String qualifiedClassName) throws CoreException,
+			BadLocationException {
 
-        ImportFinder impFinder = new ImportFinder(qualifiedClassName);
+		ImportFinder impFinder = new ImportFinder(qualifiedClassName);
 
-        cu.accept(impFinder);
+		cu.accept(impFinder);
 
-        if (!impFinder.isImportFound()) {
-            // ITextFileBufferManager bufferManager =
-            // FileBuffers.getTextFileBufferManager();
-            // IPath path = resource.getFullPath();
-            //
-            // bufferManager.connect(path, LocationKind.IFILE, null);
-            // ITextFileBuffer textFileBuffer =
-            // bufferManager.getTextFileBuffer(doc);
+		if (!impFinder.isImportFound()) {
+			ImportDeclaration id = ast.newImportDeclaration();
+			id.setName(ast.newName(qualifiedClassName.split("\\.")));
+			id.setStatic(false);
 
-            // TODO create new import
-            ImportDeclaration id = ast.newImportDeclaration();
-            id.setName(ast.newName(qualifiedClassName.split("\\.")));
-            id.setStatic(false);
+			ListRewrite lrw = rewriter.getListRewrite(cu,
+					CompilationUnit.IMPORTS_PROPERTY);
+			lrw.insertFirst(id, null);
+		}
 
-            ListRewrite lrw = rewriter.getListRewrite(cu,
-                    CompilationUnit.IMPORTS_PROPERTY);
-            lrw.insertFirst(id, null);
+	}
 
-            // TextEdit te = rewriter.rewriteAST(doc, null);
-            // te.apply(doc);
-            //
-            // if (textFileBuffer != null)
-            // textFileBuffer.commit(null, false);
-            // else
-            // FileUtils.saveTextFile(resource.getProject().getFile(resource.getProjectRelativePath()),
-            // doc.get());
-            // bufferManager.disconnect(path, LocationKind.IFILE, null);
-        }
+	public static void createReplaceNonInternationalisationComment(
+			CompilationUnit cu, IDocument doc, int position) {
+		int i = findNonInternationalisationPosition(cu, doc, position);
 
-    }
+		IRegion reg;
+		try {
+			reg = doc.getLineInformationOfOffset(position);
+			doc.replace(reg.getOffset() + reg.getLength(), 0, " //$NON-NLS-"
+					+ i + "$");
+		} catch (BadLocationException e) {
+			Logger.logError(e);
+		}
+	}
 
-    public static void createReplaceNonInternationalisationComment(
-            CompilationUnit cu, IDocument doc, int position) {
-        int i = findNonInternationalisationPosition(cu, doc, position);
+	// TODO export initializer specification into a methodinvocationdefinition
+	@SuppressWarnings("unchecked")
+	public static void createResourceBundleReference(IResource resource,
+			int typePos, IDocument doc, String bundleId, Locale locale,
+			boolean globalReference, String variableName, CompilationUnit cu, AST ast, ASTRewrite rewriter) {
 
-        IRegion reg;
-        try {
-            reg = doc.getLineInformationOfOffset(position);
-            doc.replace(reg.getOffset() + reg.getLength(), 0, " //$NON-NLS-"
-                    + i + "$");
-        } catch (BadLocationException e) {
-            Logger.logError(e);
-        }
-    }
+		try {
 
-    // TODO export initializer specification into a methodinvocationdefinition
-    @SuppressWarnings("unchecked")
-    public static void createResourceBundleReference(IResource resource,
-            int typePos, IDocument doc, String bundleId, Locale locale,
-            boolean globalReference, String variableName, CompilationUnit cu) {
+			if (globalReference) {
 
-        try {
+				// retrieve compilation unit from document
+				PositionalTypeFinder typeFinder = new PositionalTypeFinder(
+						typePos);
+				cu.accept(typeFinder);
+				ASTNode node = typeFinder.getEnclosingType();
+				ASTNode anonymNode = typeFinder.getEnclosingAnonymType();
+				if (anonymNode != null) {
+					node = anonymNode;
+				}
 
-            if (globalReference) {
+				MethodDeclaration meth = typeFinder.getEnclosingMethod();
 
-                // retrieve compilation unit from document
-                PositionalTypeFinder typeFinder = new PositionalTypeFinder(
-                        typePos);
-                cu.accept(typeFinder);
-                ASTNode node = typeFinder.getEnclosingType();
-                ASTNode anonymNode = typeFinder.getEnclosingAnonymType();
-                if (anonymNode != null) {
-                    node = anonymNode;
-                }
+				VariableDeclarationFragment vdf = ast
+						.newVariableDeclarationFragment();
+				vdf.setName(ast.newSimpleName(variableName));
 
-                MethodDeclaration meth = typeFinder.getEnclosingMethod();
-                AST ast = node.getAST();
+				// set initializer
+				vdf.setInitializer(createResourceBundleGetter(ast, bundleId,
+						locale));
 
-                VariableDeclarationFragment vdf = ast
-                        .newVariableDeclarationFragment();
-                vdf.setName(ast.newSimpleName(variableName));
+				FieldDeclaration fd = ast.newFieldDeclaration(vdf);
+				fd.setType(ast.newSimpleType(ast
+						.newName(new String[] { "ResourceBundle" })));
 
-                // set initializer
-                vdf.setInitializer(createResourceBundleGetter(ast, bundleId,
-                        locale));
+				if (meth != null
+						&& (meth.getModifiers() & Modifier.STATIC) == Modifier.STATIC) {
+					fd.modifiers().addAll(ast.newModifiers(Modifier.STATIC));
+				}
 
-                FieldDeclaration fd = ast.newFieldDeclaration(vdf);
-                fd.setType(ast.newSimpleType(ast
-                        .newName(new String[] { "ResourceBundle" })));
+				// rewrite AST
+				ListRewrite lrw = rewriter
+						.getListRewrite(
+								node,
+								node instanceof TypeDeclaration ? TypeDeclaration.BODY_DECLARATIONS_PROPERTY
+										: AnonymousClassDeclaration.BODY_DECLARATIONS_PROPERTY);
+				lrw.insertAt(fd, 0, null);
 
-                if (meth != null
-                        && (meth.getModifiers() & Modifier.STATIC) == Modifier.STATIC) {
-                    fd.modifiers().addAll(ast.newModifiers(Modifier.STATIC));
-                }
+				// create import if required
+				createImport(doc, resource, cu, ast, rewriter,
+						getRBDefinitionDesc().getDeclaringClass());
+			} else {
 
-                // rewrite AST
-                ASTRewrite rewriter = ASTRewrite.create(ast);
-                ListRewrite lrw = rewriter
-                        .getListRewrite(
-                                node,
-                                node instanceof TypeDeclaration ? TypeDeclaration.BODY_DECLARATIONS_PROPERTY
-                                        : AnonymousClassDeclaration.BODY_DECLARATIONS_PROPERTY);
-                lrw.insertAt(fd, /*
-                                  * findIndexOfLastField(node.bodyDeclarations())
-                                  * +1
-                                  */
-                        0, null);
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
 
-                // create import if required
-                createImport(doc, resource, cu, ast, rewriter,
-                        getRBDefinitionDesc().getDeclaringClass());
+	@SuppressWarnings("unchecked")
+	protected static MethodInvocation createResourceBundleGetter(AST ast,
+			String bundleId, Locale locale) {
+		MethodInvocation mi = ast.newMethodInvocation();
 
-                TextEdit te = rewriter.rewriteAST(doc, null);
-                te.apply(doc);
-            } else {
+		mi.setName(ast.newSimpleName("getBundle"));
+		mi.setExpression(ast.newName(new String[] { "ResourceBundle" }));
 
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
+		// Add bundle argument
+		StringLiteral sl = ast.newStringLiteral();
+		sl.setLiteralValue(bundleId);
+		mi.arguments().add(sl);
 
-    @SuppressWarnings("unchecked")
-    protected static MethodInvocation createResourceBundleGetter(AST ast,
-            String bundleId, Locale locale) {
-        MethodInvocation mi = ast.newMethodInvocation();
+		// TODO Add Locale argument
 
-        mi.setName(ast.newSimpleName("getBundle"));
-        mi.setExpression(ast.newName(new String[] { "ResourceBundle" }));
+		return mi;
+	}
 
-        // Add bundle argument
-        StringLiteral sl = ast.newStringLiteral();
-        sl.setLiteralValue(bundleId);
-        mi.arguments().add(sl);
+	public static ASTNode getEnclosingType(CompilationUnit cu, int pos) {
+		PositionalTypeFinder typeFinder = new PositionalTypeFinder(pos);
+		cu.accept(typeFinder);
+		return (typeFinder.getEnclosingAnonymType() != null) ? typeFinder
+				.getEnclosingAnonymType() : typeFinder.getEnclosingType();
+	}
 
-        // TODO Add Locale argument
+	public static ASTNode getEnclosingType(ASTNode cu, int pos) {
+		PositionalTypeFinder typeFinder = new PositionalTypeFinder(pos);
+		cu.accept(typeFinder);
+		return (typeFinder.getEnclosingAnonymType() != null) ? typeFinder
+				.getEnclosingAnonymType() : typeFinder.getEnclosingType();
+	}
 
-        return mi;
-    }
+	@SuppressWarnings("unchecked")
+	protected static MethodInvocation referenceResource(AST ast,
+			String accessorName, String key, Locale locale) {
+		MethodParameterDescriptor accessorDesc = getRBAccessorDesc();
+		MethodInvocation mi = ast.newMethodInvocation();
 
-    public static ASTNode getEnclosingType(CompilationUnit cu, int pos) {
-        PositionalTypeFinder typeFinder = new PositionalTypeFinder(pos);
-        cu.accept(typeFinder);
-        return (typeFinder.getEnclosingAnonymType() != null) ? typeFinder
-                .getEnclosingAnonymType() : typeFinder.getEnclosingType();
-    }
+		mi.setName(ast.newSimpleName(accessorDesc.getMethodName().get(0)));
 
-    public static ASTNode getEnclosingType(ASTNode cu, int pos) {
-        PositionalTypeFinder typeFinder = new PositionalTypeFinder(pos);
-        cu.accept(typeFinder);
-        return (typeFinder.getEnclosingAnonymType() != null) ? typeFinder
-                .getEnclosingAnonymType() : typeFinder.getEnclosingType();
-    }
+		// Declare expression
+		StringLiteral sl = ast.newStringLiteral();
+		sl.setLiteralValue(key);
 
-    @SuppressWarnings("unchecked")
-    protected static MethodInvocation referenceResource(AST ast,
-            String accessorName, String key, Locale locale) {
-        MethodParameterDescriptor accessorDesc = getRBAccessorDesc();
-        MethodInvocation mi = ast.newMethodInvocation();
+		// TODO define locale expression
+		if (mi.arguments().size() == accessorDesc.getPosition()) {
+			mi.arguments().add(sl);
+		}
 
-        mi.setName(ast.newSimpleName(accessorDesc.getMethodName().get(0)));
+		SimpleName name = ast.newSimpleName(accessorName);
+		mi.setExpression(name);
 
-        // Declare expression
-        StringLiteral sl = ast.newStringLiteral();
-        sl.setLiteralValue(key);
+		return mi;
+	}
 
-        // TODO define locale expression
-        if (mi.arguments().size() == accessorDesc.getPosition()) {
-            mi.arguments().add(sl);
-        }
+	public static String createResourceReference(String bundleId, String key,
+			Locale locale, IResource resource, int typePos,
+			String accessorName, AST ast, ASTRewrite astRewrite, CompilationUnit cu) {
+		
+		final StringLiteralFinder literalFinder = new StringLiteralFinder(typePos);
+		cu.accept(literalFinder);
+		final StringLiteral literal = literalFinder.getStringLiteral();
 
-        SimpleName name = ast.newSimpleName(accessorName);
-        mi.setExpression(name);
-
-        return mi;
-    }
-
-    public static String createResourceReference(String bundleId, String key,
-            Locale locale, IResource resource, int typePos,
-            String accessorName, IDocument doc, CompilationUnit cu) {
-
-        PositionalTypeFinder typeFinder = new PositionalTypeFinder(typePos);
-        cu.accept(typeFinder);
-        AnonymousClassDeclaration atd = typeFinder.getEnclosingAnonymType();
-        TypeDeclaration td = typeFinder.getEnclosingType();
-
-        // retrieve compilation unit from document
-        ASTNode node = atd == null ? td : atd;
-        AST ast = node.getAST();
-
-        ExpressionStatement expressionStatement = ast
-                .newExpressionStatement(referenceResource(ast, accessorName,
-                        key, locale));
+		final MethodInvocation methodInvocation = referenceResource(ast, accessorName,
+				key, locale);
 
-        String exp = expressionStatement.toString();
+		astRewrite.replace(literal, methodInvocation, null);
+		
+		String exp = methodInvocation.toString();
 
-        // remove semicolon and line break at the end of this expression
-        // statement
-        if (exp.endsWith(";\n")) {
-            exp = exp.substring(0, exp.length() - 2);
-        }
+		// remove semicolon and line break at the end of this expression
+		// statement
+		if (exp.endsWith(";\n")) {
+		    exp = exp.substring(0, exp.length() - 2);
+		}
 
-        return exp;
-    }
+		return exp;
+	}
 
-    private static int findNonInternationalisationPosition(CompilationUnit cu,
-            IDocument doc, int offset) {
-        LinePreStringsFinder lsfinder = null;
-        try {
-            lsfinder = new LinePreStringsFinder(offset, doc);
-            cu.accept(lsfinder);
-        } catch (BadLocationException e) {
-            Logger.logError(e);
-        }
-        if (lsfinder == null) {
-            return 1;
-        }
+	private static int findNonInternationalisationPosition(CompilationUnit cu,
+			IDocument doc, int offset) {
+		LinePreStringsFinder lsfinder = null;
+		try {
+			lsfinder = new LinePreStringsFinder(offset, doc);
+			cu.accept(lsfinder);
+		} catch (BadLocationException e) {
+			Logger.logError(e);
+		}
+		if (lsfinder == null) {
+			return 1;
+		}
 
-        List<StringLiteral> strings = lsfinder.getStrings();
+		List<StringLiteral> strings = lsfinder.getStrings();
 
-        return strings.size() + 1;
-    }
+		return strings.size() + 1;
+	}
 
-    public static boolean existsNonInternationalisationComment(
-            StringLiteral literal) throws BadLocationException {
-        CompilationUnit cu = (CompilationUnit) literal.getRoot();
-        ICompilationUnit icu = (ICompilationUnit) cu.getJavaElement();
+	public static boolean existsNonInternationalisationComment(
+			StringLiteral literal) throws BadLocationException {
+		CompilationUnit cu = (CompilationUnit) literal.getRoot();
+		ICompilationUnit icu = (ICompilationUnit) cu.getJavaElement();
 
-        IDocument doc = null;
-        try {
-            doc = new Document(icu.getSource());
-        } catch (JavaModelException e) {
-            Logger.logError(e);
-        }
+		IDocument doc = null;
+		try {
+			doc = new Document(icu.getSource());
+		} catch (JavaModelException e) {
+			Logger.logError(e);
+		}
 
-        // get whole line in which string literal
-        int lineNo = doc.getLineOfOffset(literal.getStartPosition());
-        int lineOffset = doc.getLineOffset(lineNo);
-        int lineLength = doc.getLineLength(lineNo);
-        String lineOfString = doc.get(lineOffset, lineLength);
+		// get whole line in which string literal
+		int lineNo = doc.getLineOfOffset(literal.getStartPosition());
+		int lineOffset = doc.getLineOffset(lineNo);
+		int lineLength = doc.getLineLength(lineNo);
+		String lineOfString = doc.get(lineOffset, lineLength);
 
-        // search for a line comment in this line
-        int indexComment = lineOfString.indexOf("//");
+		// search for a line comment in this line
+		int indexComment = lineOfString.indexOf("//");
 
-        if (indexComment == -1) {
-            return false;
-        }
+		if (indexComment == -1) {
+			return false;
+		}
 
-        String comment = lineOfString.substring(indexComment);
+		String comment = lineOfString.substring(indexComment);
 
-        // remove first "//" of line comment
-        comment = comment.substring(2).toLowerCase();
+		// remove first "//" of line comment
+		comment = comment.substring(2).toLowerCase();
 
-        // split line comments, necessary if more NON-NLS comments exist in one line, eg.: $NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3
-        String[] comments = comment.split("//");
+		// split line comments, necessary if more NON-NLS comments exist in one line, eg.: $NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3
+		String[] comments = comment.split("//");
 
-        for (String commentFrag : comments) {
-            commentFrag = commentFrag.trim();
+		for (String commentFrag : comments) {
+			commentFrag = commentFrag.trim();
 
-            // if comment match format: "$non-nls$" then ignore whole line
-            if (commentFrag.matches("^\\$non-nls\\$$")) {
-                return true;
+			// if comment match format: "$non-nls$" then ignore whole line
+			if (commentFrag.matches("^\\$non-nls\\$$")) {
+				return true;
 
-                // if comment match format: "$non-nls-{number}$" then only
-                // ignore string which is on given position
-            } else if (commentFrag.matches("^\\$non-nls-\\d+\\$$")) {
-                int iString = findNonInternationalisationPosition(cu, doc,
-                        literal.getStartPosition());
-                int iComment = new Integer(commentFrag.substring(9, 10));
-                if (iString == iComment) {
-                    return true;
-                }
-            }
-        }
-        return false;
-    }
+				// if comment match format: "$non-nls-{number}$" then only
+				// ignore string which is on given position
+			} else if (commentFrag.matches("^\\$non-nls-\\d+\\$$")) {
+				int iString = findNonInternationalisationPosition(cu, doc,
+						literal.getStartPosition());
+				int iComment = new Integer(commentFrag.substring(9, 10));
+				if (iString == iComment) {
+					return true;
+				}
+			}
+		}
+		return false;
+	}
 
-    public static StringLiteral getStringLiteralAtPos(CompilationUnit cu,
-            int position) {
-        StringLiteralFinder strFinder = new StringLiteralFinder(position);
-        cu.accept(strFinder);
-        return strFinder.getStringLiteral();
-    }
+	public static StringLiteral getStringLiteralAtPos(CompilationUnit cu,
+			int position) {
+		StringLiteralFinder strFinder = new StringLiteralFinder(position);
+		cu.accept(strFinder);
+		return strFinder.getStringLiteral();
+	}
 
-    static class PositionalTypeFinder extends ASTVisitor {
+	static class PositionalTypeFinder extends ASTVisitor {
 
-        private int position;
-        private TypeDeclaration enclosingType;
-        private AnonymousClassDeclaration enclosingAnonymType;
-        private MethodDeclaration enclosingMethod;
+		private int position;
+		private TypeDeclaration enclosingType;
+		private AnonymousClassDeclaration enclosingAnonymType;
+		private MethodDeclaration enclosingMethod;
 
-        public PositionalTypeFinder(int pos) {
-            position = pos;
-        }
+		public PositionalTypeFinder(int pos) {
+			position = pos;
+		}
 
-        public TypeDeclaration getEnclosingType() {
-            return enclosingType;
-        }
+		public TypeDeclaration getEnclosingType() {
+			return enclosingType;
+		}
 
-        public AnonymousClassDeclaration getEnclosingAnonymType() {
-            return enclosingAnonymType;
-        }
+		public AnonymousClassDeclaration getEnclosingAnonymType() {
+			return enclosingAnonymType;
+		}
 
-        public MethodDeclaration getEnclosingMethod() {
-            return enclosingMethod;
-        }
+		public MethodDeclaration getEnclosingMethod() {
+			return enclosingMethod;
+		}
 
-        @Override
-        public boolean visit(MethodDeclaration node) {
-            if (position >= node.getStartPosition()
-                    && position <= (node.getStartPosition() + node.getLength())) {
-                enclosingMethod = node;
-                return true;
-            } else {
-                return false;
-            }
-        }
+		@Override
+		public boolean visit(MethodDeclaration node) {
+			if (position >= node.getStartPosition()
+					&& position <= (node.getStartPosition() + node.getLength())) {
+				enclosingMethod = node;
+				return true;
+			} else {
+				return false;
+			}
+		}
 
-        @Override
-        public boolean visit(TypeDeclaration node) {
-            if (position >= node.getStartPosition()
-                    && position <= (node.getStartPosition() + node.getLength())) {
-                enclosingType = node;
-                return true;
-            } else {
-                return false;
-            }
-        }
+		@Override
+		public boolean visit(TypeDeclaration node) {
+			if (position >= node.getStartPosition()
+					&& position <= (node.getStartPosition() + node.getLength())) {
+				enclosingType = node;
+				return true;
+			} else {
+				return false;
+			}
+		}
 
-        @Override
-        public boolean visit(AnonymousClassDeclaration node) {
-            if (position >= node.getStartPosition()
-                    && position <= (node.getStartPosition() + node.getLength())) {
-                enclosingAnonymType = node;
-                return true;
-            } else {
-                return false;
-            }
-        }
-    }
+		@Override
+		public boolean visit(AnonymousClassDeclaration node) {
+			if (position >= node.getStartPosition()
+					&& position <= (node.getStartPosition() + node.getLength())) {
+				enclosingAnonymType = node;
+				return true;
+			} else {
+				return false;
+			}
+		}
+	}
 
-    static class ImportFinder extends ASTVisitor {
+	static class ImportFinder extends ASTVisitor {
 
-        String qName;
-        boolean importFound = false;
+		String qName;
+		boolean importFound = false;
 
-        public ImportFinder(String qName) {
-            this.qName = qName;
-        }
+		public ImportFinder(String qName) {
+			this.qName = qName;
+		}
 
-        public boolean isImportFound() {
-            return importFound;
-        }
+		public boolean isImportFound() {
+			return importFound;
+		}
 
-        @Override
-        public boolean visit(ImportDeclaration id) {
-            if (id.getName().getFullyQualifiedName().equals(qName)) {
-                importFound = true;
-            }
+		@Override
+		public boolean visit(ImportDeclaration id) {
+			if (id.getName().getFullyQualifiedName().equals(qName)) {
+				importFound = true;
+			}
 
-            return true;
-        }
-    }
+			return true;
+		}
+	}
 
-    static class VariableFinder extends ASTVisitor {
+	static class VariableFinder extends ASTVisitor {
 
-        boolean found = false;
-        String variableName;
+		boolean found = false;
+		String variableName;
 
-        public boolean isVariableFound() {
-            return found;
-        }
+		public boolean isVariableFound() {
+			return found;
+		}
 
-        public VariableFinder(String variableName) {
-            this.variableName = variableName;
-        }
+		public VariableFinder(String variableName) {
+			this.variableName = variableName;
+		}
 
-        @Override
-        public boolean visit(VariableDeclarationFragment vdf) {
-            if (vdf.getName().getFullyQualifiedName().equals(variableName)) {
-                found = true;
-                return false;
-            }
+		@Override
+		public boolean visit(VariableDeclarationFragment vdf) {
+			if (vdf.getName().getFullyQualifiedName().equals(variableName)) {
+				found = true;
+				return false;
+			}
 
-            return true;
-        }
-    }
+			return true;
+		}
+	}
 
-    static class InMethodBundleDeclFinder extends ASTVisitor {
-        String varName;
-        String bundleId;
-        int pos;
+	static class InMethodBundleDeclFinder extends ASTVisitor {
+		String varName;
+		String bundleId;
+		int pos;
 
-        public InMethodBundleDeclFinder(String bundleId, int pos) {
-            this.bundleId = bundleId;
-            this.pos = pos;
-        }
+		public InMethodBundleDeclFinder(String bundleId, int pos) {
+			this.bundleId = bundleId;
+			this.pos = pos;
+		}
 
-        public String getVariableName() {
-            return varName;
-        }
+		public String getVariableName() {
+			return varName;
+		}
 
-        @Override
-        public boolean visit(VariableDeclarationFragment fdvd) {
-            if (fdvd.getStartPosition() > pos) {
-                return false;
-            }
+		@Override
+		public boolean visit(VariableDeclarationFragment fdvd) {
+			if (fdvd.getStartPosition() > pos) {
+				return false;
+			}
 
-            // boolean bStatic = (fdvd.resolveBinding().getModifiers() &
-            // Modifier.STATIC) == Modifier.STATIC;
-            // if (!bStatic && isStatic)
-            // return true;
+			// boolean bStatic = (fdvd.resolveBinding().getModifiers() &
+			// Modifier.STATIC) == Modifier.STATIC;
+			// if (!bStatic && isStatic)
+			// return true;
 
-            String tmpVarName = fdvd.getName().getFullyQualifiedName();
+			String tmpVarName = fdvd.getName().getFullyQualifiedName();
 
-            if (fdvd.getInitializer() instanceof MethodInvocation) {
-                MethodInvocation fdi = (MethodInvocation) fdvd.getInitializer();
-                if (isMatchingMethodParamDesc(fdi, bundleId,
-                        getRBDefinitionDesc())) {
-                    varName = tmpVarName;
-                }
-            }
-            return true;
-        }
-    }
+			if (fdvd.getInitializer() instanceof MethodInvocation) {
+				MethodInvocation fdi = (MethodInvocation) fdvd.getInitializer();
+				if (isMatchingMethodParamDesc(fdi, bundleId,
+						getRBDefinitionDesc())) {
+					varName = tmpVarName;
+				}
+			}
+			return true;
+		}
+	}
 
-    static class BundleDeclarationFinder extends ASTVisitor {
+	static class BundleDeclarationFinder extends ASTVisitor {
 
-        String varName;
-        String bundleId;
-        ASTNode typeDef;
-        boolean isStatic;
+		String varName;
+		String bundleId;
+		ASTNode typeDef;
+		boolean isStatic;
 
-        public BundleDeclarationFinder(String bundleId, ASTNode td,
-                boolean isStatic) {
-            this.bundleId = bundleId;
-            this.typeDef = td;
-            this.isStatic = isStatic;
-        }
+		public BundleDeclarationFinder(String bundleId, ASTNode td,
+				boolean isStatic) {
+			this.bundleId = bundleId;
+			this.typeDef = td;
+			this.isStatic = isStatic;
+		}
 
-        public String getVariableName() {
-            return varName;
-        }
+		public String getVariableName() {
+			return varName;
+		}
 
-        @Override
-        public boolean visit(MethodDeclaration md) {
-            return true;
-        }
+		@Override
+		public boolean visit(MethodDeclaration md) {
+			return true;
+		}
 
-        @Override
-        public boolean visit(FieldDeclaration fd) {
-            if (getEnclosingType(typeDef, fd.getStartPosition()) != typeDef) {
-                return false;
-            }
+		@Override
+		public boolean visit(FieldDeclaration fd) {
+			if (getEnclosingType(typeDef, fd.getStartPosition()) != typeDef) {
+				return false;
+			}
 
-            boolean bStatic = (fd.getModifiers() & Modifier.STATIC) == Modifier.STATIC;
-            if (!bStatic && isStatic) {
-                return true;
-            }
+			boolean bStatic = (fd.getModifiers() & Modifier.STATIC) == Modifier.STATIC;
+			if (!bStatic && isStatic) {
+				return true;
+			}
 
-            if (fd.getType() instanceof SimpleType) {
-                SimpleType fdType = (SimpleType) fd.getType();
-                String typeName = fdType.getName().getFullyQualifiedName();
-                String referenceName = getRBDefinitionDesc()
-                        .getDeclaringClass();
-                if (typeName.equals(referenceName)
-                        || (referenceName.lastIndexOf(".") >= 0 && typeName
-                                .equals(referenceName.substring(referenceName
-                                        .lastIndexOf(".") + 1)))) {
-                    // Check VariableDeclarationFragment
-                    if (fd.fragments().size() == 1) {
-                        if (fd.fragments().get(0) instanceof VariableDeclarationFragment) {
-                            VariableDeclarationFragment fdvd = (VariableDeclarationFragment) fd
-                                    .fragments().get(0);
-                            String tmpVarName = fdvd.getName()
-                                    .getFullyQualifiedName();
+			if (fd.getType() instanceof SimpleType) {
+				SimpleType fdType = (SimpleType) fd.getType();
+				String typeName = fdType.getName().getFullyQualifiedName();
+				String referenceName = getRBDefinitionDesc()
+						.getDeclaringClass();
+				if (typeName.equals(referenceName)
+						|| (referenceName.lastIndexOf(".") >= 0 && typeName
+								.equals(referenceName.substring(referenceName
+										.lastIndexOf(".") + 1)))) {
+					// Check VariableDeclarationFragment
+					if (fd.fragments().size() == 1) {
+						if (fd.fragments().get(0) instanceof VariableDeclarationFragment) {
+							VariableDeclarationFragment fdvd = (VariableDeclarationFragment) fd
+									.fragments().get(0);
+							String tmpVarName = fdvd.getName()
+									.getFullyQualifiedName();
 
-                            if (fdvd.getInitializer() instanceof MethodInvocation) {
-                                MethodInvocation fdi = (MethodInvocation) fdvd
-                                        .getInitializer();
-                                if (isMatchingMethodParamDesc(fdi, bundleId,
-                                        getRBDefinitionDesc())) {
-                                    varName = tmpVarName;
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-            return false;
-        }
+							if (fdvd.getInitializer() instanceof MethodInvocation) {
+								MethodInvocation fdi = (MethodInvocation) fdvd
+										.getInitializer();
+								if (isMatchingMethodParamDesc(fdi, bundleId,
+										getRBDefinitionDesc())) {
+									varName = tmpVarName;
+								}
+							}
+						}
+					}
+				}
+			}
+			return false;
+		}
 
-    }
+	}
 
-    static class LinePreStringsFinder extends ASTVisitor {
-        private int position;
-        private int line;
-        private List<StringLiteral> strings;
-        private IDocument document;
+	static class LinePreStringsFinder extends ASTVisitor {
+		private int position;
+		private int line;
+		private List<StringLiteral> strings;
+		private IDocument document;
 
-        public LinePreStringsFinder(int position, IDocument document)
-                throws BadLocationException {
-            this.document = document;
-            this.position = position;
-            line = document.getLineOfOffset(position);
-            strings = new ArrayList<StringLiteral>();
-        }
+		public LinePreStringsFinder(int position, IDocument document)
+				throws BadLocationException {
+			this.document = document;
+			this.position = position;
+			line = document.getLineOfOffset(position);
+			strings = new ArrayList<StringLiteral>();
+		}
 
-        public List<StringLiteral> getStrings() {
-            return strings;
-        }
+		public List<StringLiteral> getStrings() {
+			return strings;
+		}
 
-        @Override
-        public boolean visit(StringLiteral node) {
-            try {
-                if (line == document.getLineOfOffset(node.getStartPosition())
-                        && node.getStartPosition() < position) {
-                    strings.add(node);
-                    return true;
-                }
-            } catch (BadLocationException e) {
-            }
-            return true;
-        }
-    }
+		@Override
+		public boolean visit(StringLiteral node) {
+			try {
+				if (line == document.getLineOfOffset(node.getStartPosition())
+						&& node.getStartPosition() < position) {
+					strings.add(node);
+					return true;
+				}
+			} catch (BadLocationException e) {
+			}
+			return true;
+		}
+	}
 
-    static class StringLiteralFinder extends ASTVisitor {
-        private int position;
-        private StringLiteral string;
+	static class StringLiteralFinder extends ASTVisitor {
+		private int position;
+		private StringLiteral string;
 
-        public StringLiteralFinder(int position) {
-            this.position = position;
-        }
+		public StringLiteralFinder(int position) {
+			this.position = position;
+		}
 
-        public StringLiteral getStringLiteral() {
-            return string;
-        }
+		public StringLiteral getStringLiteral() {
+			return string;
+		}
 
-        @Override
-        public boolean visit(StringLiteral node) {
-            if (position > node.getStartPosition()
-                    && position < (node.getStartPosition() + node.getLength())) {
-                string = node;
-            }
-            return true;
-        }
-    }
+		@Override
+		public boolean visit(StringLiteral node) {
+			if (position > node.getStartPosition()
+					&& position < (node.getStartPosition() + node.getLength())) {
+				string = node;
+			}
+			return true;
+		}
+	}
 
-    /**
-     * Decides if an enumeration can be refactored or not. In other words, gives
-     * the OK for the Proposal to display.
-     * 
-     * @author Alexej Strelzow
-     */
-    static class Cal10nEnumLiteralFinder extends ASTVisitor {
-        private int position;
-        private String projectName;
+	/**
+	 * Decides if an enumeration can be refactored or not. In other words, gives
+	 * the OK for the Proposal to display.
+	 * 
+	 * @author Alexej Strelzow
+	 */
+	static class Cal10nEnumLiteralFinder extends ASTVisitor {
+		private int position;
+		private String projectName;
 
-        private String[] metaData;
+		private String[] metaData;
 
-        // [0] resourceBunldeId
-        // [1] key value
-        // [2] relative path (to the project) of the enum file
+		// [0] resourceBunldeId
+		// [1] key value
+		// [2] relative path (to the project) of the enum file
 
-        /**
-         * Constructor.
-         * 
-         * @param position
-         *            The position of the CTRL + Shift + Space operation
-         */
-        public Cal10nEnumLiteralFinder(String projectName, int position) {
-            this.position = position;
-            this.projectName = projectName;
-        }
+		/**
+		 * Constructor.
+		 * 
+		 * @param position
+		 *            The position of the CTRL + Shift + Space operation
+		 */
+		public Cal10nEnumLiteralFinder(String projectName, int position) {
+			this.position = position;
+			this.projectName = projectName;
+		}
 
-        /**
-         * Following constraints must be fulfilled to make an enum
-         * "refactorable":<br>
-         * <ol>
-         * <li>It must be known by the system (stored in a resource bundle file)
-         * </li>
-         * <li>It must be used by the class ch.qos.cal10n.IMessageConveyor
-         * (Cal10n framework)</li>
-         * </ol>
-         * 
-         * {@inheritDoc}
-         */
-        @Override
-        public boolean visit(MethodInvocation node) {
+		/**
+		 * Following constraints must be fulfilled to make an enum
+		 * "refactorable":<br>
+		 * <ol>
+		 * <li>It must be known by the system (stored in a resource bundle file)
+		 * </li>
+		 * <li>It must be used by the class ch.qos.cal10n.IMessageConveyor
+		 * (Cal10n framework)</li>
+		 * </ol>
+		 * 
+		 * {@inheritDoc}
+		 */
+		@Override
+		public boolean visit(MethodInvocation node) {
 
-            boolean isCal10nCall = "ch.qos.cal10n.IMessageConveyor".equals(node
-                    .resolveMethodBinding().getDeclaringClass()
-                    .getQualifiedName());
+			boolean isCal10nCall = "ch.qos.cal10n.IMessageConveyor".equals(node
+					.resolveMethodBinding().getDeclaringClass()
+					.getQualifiedName());
 
-            if (!isCal10nCall) {
-                if (node.arguments().size() == 0) {
-                    return false;
-                } else {
-                    return true; // because the Cal10n call may be an argument!
-                }
-            } else {
-                int startPosition = node.getStartPosition();
-                int length = startPosition + node.getLength();
-                if (startPosition < this.position && length > position
-                        && !node.arguments().isEmpty()
-                        && node.arguments().get(0) instanceof QualifiedName) {
-                    QualifiedName qName = (QualifiedName) node.arguments().get(
-                            0);
-                    startPosition = qName.getStartPosition();
-                    length = startPosition + qName.getLength();
+			if (!isCal10nCall) {
+				if (node.arguments().size() == 0) {
+					return false;
+				} else {
+					return true; // because the Cal10n call may be an argument!
+				}
+			} else {
+				int startPosition = node.getStartPosition();
+				int length = startPosition + node.getLength();
+				if (startPosition < this.position && length > position
+						&& !node.arguments().isEmpty()
+						&& node.arguments().get(0) instanceof QualifiedName) {
+					QualifiedName qName = (QualifiedName) node.arguments().get(
+							0);
+					startPosition = qName.getStartPosition();
+					length = startPosition + qName.getLength();
 
-                    if (startPosition < this.position && length > position) {
-                        String resourceBundleId = getResourceBundleId(qName);
-                        String keyName = qName.getName().toString();
+					if (startPosition < this.position && length > position) {
+						String resourceBundleId = getResourceBundleId(qName);
+						String keyName = qName.getName().toString();
 
-                        if (isKnownBySystem(resourceBundleId, keyName)) {
-                            String path = qName.resolveTypeBinding()
-                                    .getJavaElement().getResource()
-                                    .getFullPath().toPortableString();
-                            this.metaData = new String[3];
-                            this.metaData[0] = resourceBundleId;
-                            this.metaData[1] = keyName;
-                            this.metaData[2] = path;
-                        }
-                    }
-                }
-            }
+						if (isKnownBySystem(resourceBundleId, keyName)) {
+							String path = qName.resolveTypeBinding()
+									.getJavaElement().getResource()
+									.getFullPath().toPortableString();
+							this.metaData = new String[3];
+							this.metaData[0] = resourceBundleId;
+							this.metaData[1] = keyName;
+							this.metaData[2] = path;
+						}
+					}
+				}
+			}
 
-            return false;
-        }
+			return false;
+		}
 
-        private boolean isKnownBySystem(String resourceBundleId, String keyName) {
-            IMessagesBundleGroup messagesBundleGroup = RBManager.getInstance(
-                    this.projectName).getMessagesBundleGroup(resourceBundleId);
-            return messagesBundleGroup.containsKey(keyName);
-        }
+		private boolean isKnownBySystem(String resourceBundleId, String keyName) {
+			IMessagesBundleGroup messagesBundleGroup = RBManager.getInstance(
+					this.projectName).getMessagesBundleGroup(resourceBundleId);
+			return messagesBundleGroup.containsKey(keyName);
+		}
 
-        private String getResourceBundleId(QualifiedName qName) {
-            IAnnotationBinding[] annotations = qName.resolveTypeBinding()
-                    .getAnnotations();
-            for (IAnnotationBinding annotation : annotations) {
-                if ("BaseName".equals(annotation.getName())) {
-                    return (String) annotation.getAllMemberValuePairs()[0]
-                            .getValue();
-                }
-            }
+		private String getResourceBundleId(QualifiedName qName) {
+			IAnnotationBinding[] annotations = qName.resolveTypeBinding()
+					.getAnnotations();
+			for (IAnnotationBinding annotation : annotations) {
+				if ("BaseName".equals(annotation.getName())) {
+					return (String) annotation.getAllMemberValuePairs()[0]
+							.getValue();
+				}
+			}
 
-            return null;
-        }
+			return null;
+		}
 
-        public String[] getMetaData() {
-            return metaData;
-        }
-    }
+		public String[] getMetaData() {
+			return metaData;
+		}
+	}
 
-    /**
-     * Returns whether a refactoring proposal will be shown or not.
-     * 
-     * @param projectName
-     *            The name of the project the cu is in
-     * @param cu
-     *            The {@link CompilationUnit} to analyze
-     * @param i
-     *            The starting point to begin the analysis
-     * @return Meta data of the enum key to refactor or null
-     */
-    public static String[] getCal10nEnumLiteralDataAtPos(String projectName,
-            CompilationUnit cu, int i) {
-        Cal10nEnumLiteralFinder enumFinder = new Cal10nEnumLiteralFinder(
-                projectName, i);
-        cu.accept(enumFinder);
-        return enumFinder.getMetaData();
-    }
+	/**
+	 * Returns whether a refactoring proposal will be shown or not.
+	 * 
+	 * @param projectName
+	 *            The name of the project the cu is in
+	 * @param cu
+	 *            The {@link CompilationUnit} to analyze
+	 * @param i
+	 *            The starting point to begin the analysis
+	 * @return Meta data of the enum key to refactor or null
+	 */
+	public static String[] getCal10nEnumLiteralDataAtPos(String projectName,
+			CompilationUnit cu, int i) {
+		Cal10nEnumLiteralFinder enumFinder = new Cal10nEnumLiteralFinder(
+				projectName, i);
+		cu.accept(enumFinder);
+		return enumFinder.getMetaData();
+	}
 }