/******************************************************************************* * Copyright (c) 2007 Exadel, Inc. and Red Hat, Inc. * Distributed under license by Red Hat, Inc. All rights reserved. * This program is made available under the terms of the * Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Exadel, Inc. and Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.common.java.generation; import org.eclipse.core.runtime.CoreException; import org.eclipse.jdt.core.*; import org.eclipse.jdt.core.formatter.CodeFormatter; import org.eclipse.jdt.ui.*; import org.eclipse.swt.SWT; import org.jboss.tools.common.model.plugin.ModelPlugin; public class JavaPropertyGenerator { IType owner; public void setOwner(IType owner) { this.owner = owner; } public void generate(String name, String javatype, String access, boolean field, boolean getter, boolean setter) throws CoreException { if("default".equals(access)) access = ""; else access += " "; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ String fa = (getter && setter) ? "private " : access; //$NON-NLS-1$ ICompilationUnit parentCU = owner.getCompilationUnit(); String lineDelimiter = getLineDelimiterUsed(parentCU); ICompilationUnit createdWorkingCopy = (ICompilationUnit) parentCU.getWorkingCopy(null); IType createdType = createdWorkingCopy.getType(owner.getElementName()); boolean isInterface = createdType.isInterface(); ICompilationUnit cu = createdType.getCompilationUnit(); synchronized(cu) { cu.reconcile(ICompilationUnit.NO_AST, true, null, null); } if(field && !isInterface && (createdType.getField(name) == null || !createdType.getField(name).exists()) ) { String fieldContents = "\t" + fa + javatype + " " + name + ";" + lineDelimiter; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ createdType.createField(fieldContents, null, true, null); synchronized(cu) { cu.reconcile(ICompilationUnit.NO_AST, true, null, null); } } // String namePart = name.substring(0, 1).toUpperCase() + name.substring(1); if(getter) { createGetter(cu, createdType, access, javatype, name, lineDelimiter); } if(setter) { createSetter(cu, createdType, access, javatype, name, lineDelimiter); } cu.commitWorkingCopy(true, null); } public static void createGetter(ICompilationUnit cu, IType type, String access, String javatype, String name, String lineDelimiter) throws CoreException { String methodName = getAccessorName("get", name); //$NON-NLS-1$ if(findGetter(type, methodName) != null) return; String methodHeader = access + javatype + " " + methodName + "()"; //$NON-NLS-1$ //$NON-NLS-2$ String stub = null; if(!type.isInterface()) { methodHeader += " {" + lineDelimiter; //$NON-NLS-1$ stub = methodHeader + "}" + lineDelimiter; //$NON-NLS-1$ } else { methodHeader += ";" + lineDelimiter; //$NON-NLS-1$ stub = methodHeader; } IMethod m = type.createMethod(stub, null, true, null); String methodComment = CodeGeneration.getGetterComment(cu, type.getElementName(), m.getElementName(), name, javatype, name, lineDelimiter); String methodContent = (type.isInterface()) ? null : CodeGeneration.getGetterMethodBodyContent(cu, cu.getElementName(), m.getElementName(), name, lineDelimiter); editMethod(cu, m, methodHeader, methodComment, methodContent, lineDelimiter); } static IMethod findGetter(IType type, String methodName) { if(type == null || methodName == null) return null; try { IMethod[] ms = type.getMethods(); for (int i = 0; i < ms.length; i++) { if(ms[i].getElementName().equals(methodName) && ms[i].getParameterNames().length == 0) return ms[i]; } } catch (JavaModelException e) { return null; } return null; } public static void createSetter(ICompilationUnit cu, IType type, String access, String javatype, String name, String lineDelimiter) throws CoreException { String methodName = getAccessorName("set", name); //$NON-NLS-1$ String methodHeader = access + "void " + methodName + "(" + javatype + " " + name + ")"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ String stub = null; if(!type.isInterface()) { methodHeader += " {" + lineDelimiter; //$NON-NLS-1$ stub = methodHeader + "}" + lineDelimiter; //$NON-NLS-1$ } else { methodHeader += ";" + lineDelimiter; //$NON-NLS-1$ stub = methodHeader; } IMethod m = type.createMethod(stub, null, true, null); String methodComment = CodeGeneration.getSetterComment(cu, type.getElementName(), m.getElementName(), name, javatype, name, name, lineDelimiter); String methodContent = (type.isInterface()) ? null : CodeGeneration.getSetterMethodBodyContent(cu, cu.getElementName(), m.getElementName(), "this." + name, name, lineDelimiter); //$NON-NLS-1$ editMethod(cu, m, methodHeader, methodComment, methodContent, lineDelimiter); } static void editMethod(ICompilationUnit cu, IMethod m, String methodHeader, String methodComment, String methodContent, String lineDelimiter) throws CoreException { synchronized(cu) { cu.reconcile(ICompilationUnit.NO_AST, true, null, null); } ISourceRange range = m.getSourceRange(); IBuffer buf = cu.getBuffer(); StringBuffer sb = new StringBuffer(lineDelimiter); if(PreferenceConstants.getPreferenceStore().getBoolean(PreferenceConstants.CODEGEN_ADD_COMMENTS)) { sb.append(methodComment); } sb.append(methodHeader); if(methodContent != null) { sb.append(methodContent).append("}").append(lineDelimiter); //$NON-NLS-1$ } String formattedContent = JavaBeanGenerator.codeFormat2(CodeFormatter.K_CLASS_BODY_DECLARATIONS, sb.toString(), 1, lineDelimiter, cu.getJavaProject()); if(formattedContent != null && formattedContent.startsWith("\t")) { //$NON-NLS-1$ formattedContent = formattedContent.substring(1); } buf.replace(range.getOffset(), range.getLength(), formattedContent); } static String getAccessorName(String prefix, String name) { String namePart = name.substring(0, 1).toUpperCase() + name.substring(1); return prefix + namePart; } public static String getLineDelimiterUsed(ICompilationUnit cu) { if (cu == null || !cu.exists()) { return System.getProperty("line.separator", "\n"); //$NON-NLS-1$ //$NON-NLS-2$ } IBuffer buf = null; try { buf = cu.getBuffer(); } catch (JavaModelException e) { ModelPlugin.getPluginLog().logError(e); } if (buf == null) { return System.getProperty("line.separator", "\n"); //$NON-NLS-1$ //$NON-NLS-2$ } int length = buf.getLength(); for (int i = 0; i < length; i++) { char ch = buf.getChar(i); if (ch == SWT.CR) { if (i + 1 < length) { if (buf.getChar(i + 1) == SWT.LF) { return "\r\n"; //$NON-NLS-1$ } } return "\r"; //$NON-NLS-1$ } else if (ch == SWT.LF) { return "\n"; //$NON-NLS-1$ } } return System.getProperty("line.separator", "\n"); //$NON-NLS-1$ //$NON-NLS-2$ } }