org.jboss.tools.seam.ui.marker.AddSetterMarkerResolution.java Source code

Java tutorial

Introduction

Here is the source code for org.jboss.tools.seam.ui.marker.AddSetterMarkerResolution.java

Source

/*******************************************************************************
 * Copyright (c) 2010 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:
 *     Red Hat, Inc. - initial API and implementation
 ******************************************************************************/
package org.jboss.tools.seam.ui.marker;

import java.text.MessageFormat;
import java.util.Hashtable;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.jdt.core.Flags;
import org.eclipse.jdt.core.IBuffer;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IField;
import org.eclipse.jdt.core.IMethod;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.internal.corext.codemanipulation.GetterSetterUtil;
import org.eclipse.swt.graphics.Image;
import org.eclipse.ui.IMarkerResolution2;
import org.jboss.tools.common.EclipseUtil;
import org.jboss.tools.common.java.generation.JavaPropertyGenerator;
import org.jboss.tools.seam.core.ISeamJavaComponentDeclaration;
import org.jboss.tools.seam.core.ISeamProperty;
import org.jboss.tools.seam.core.SeamCoreMessages;
import org.jboss.tools.seam.ui.SeamGuiPlugin;

/**
 * @author Daniel Azarov
 */
public class AddSetterMarkerResolution implements IMarkerResolution2 {
    private ISeamProperty property;
    private ISeamJavaComponentDeclaration javaDeclaration;

    private String label;

    public AddSetterMarkerResolution(ISeamProperty property, ISeamJavaComponentDeclaration javaDeclaration) {
        this.property = property;
        this.javaDeclaration = javaDeclaration;
        this.label = MessageFormat.format(SeamCoreMessages.ADD_SETTER_MARKER_RESOLUTION_TITLE,
                new Object[] { property.getName(), javaDeclaration.getClassName() });
    }

    public String getLabel() {
        return label;
    }

    public void run(IMarker marker) {
        IFile file = (IFile) javaDeclaration.getResource();
        try {
            ICompilationUnit original = EclipseUtil.getCompilationUnit(file);
            if (original == null) {
                return;
            }
            ICompilationUnit compilationUnit = original.getWorkingCopy(new NullProgressMonitor());

            String lineDelim = JavaPropertyGenerator.getLineDelimiterUsed(compilationUnit);

            Hashtable<String, String> options = JavaCore.getOptions();

            int tabSize = new Integer(options.get("org.eclipse.jdt.core.formatter.tabulation.size"));

            StringBuffer tabBuf = new StringBuffer();

            for (int i = 0; i < tabSize; i++)
                tabBuf.append(" ");

            String tab = tabBuf.toString();

            IType type = compilationUnit.findPrimaryType();

            IField field = type.getField(property.getName());

            String propertyType = "";
            if (field != null && field.exists()) {
                propertyType = field.getTypeSignature();
            } else {
                propertyType = "String"; //$NON-NLS-1$

                StringBuffer buf = new StringBuffer();

                buf.append(tab + "private " + propertyType + " " + property.getName() + ";"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
                buf.append(lineDelim);

                field = type.createField(buf.toString(), null, false, new NullProgressMonitor());
                if (field != null) {
                    IBuffer buffer = compilationUnit.getBuffer();

                    buffer.replace(field.getSourceRange().getOffset(), field.getSourceRange().getLength(),
                            buf.toString());
                    synchronized (compilationUnit) {
                        compilationUnit.reconcile(ICompilationUnit.NO_AST, true, null, null);
                    }
                }
            }

            IMethod oldMethod = GetterSetterUtil.getSetter(field);
            if (oldMethod == null || !oldMethod.exists()) {
                String setterName = GetterSetterUtil.getSetterName(field, null);
                //JavaPropertyGenerator.createSetter(compilationUnit, type, "public", field.getTypeSignature(), setterName, lineDelim);

                String stub = GetterSetterUtil.getSetterStub(field, setterName, true, Flags.AccPublic);
                IMethod newMethod = type.createMethod(stub, null, false, new NullProgressMonitor());
                if (newMethod != null) {
                    IBuffer buffer = compilationUnit.getBuffer();
                    // format
                    StringBuffer buf = new StringBuffer();

                    buf.append(lineDelim);
                    buf.append(tab + "public void " + setterName + "(" + propertyType + " " + property.getName() //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
                            + "){");
                    buf.append(lineDelim);
                    buf.append(tab + tab + "this." + property.getName() + " = " + property.getName() + ";");
                    buf.append(lineDelim);
                    buf.append(tab + "}");
                    buf.append(lineDelim);

                    buffer.replace(newMethod.getSourceRange().getOffset(), newMethod.getSourceRange().getLength(),
                            buf.toString());
                }
            }

            compilationUnit.commitWorkingCopy(false, new NullProgressMonitor());
            compilationUnit.discardWorkingCopy();

        } catch (CoreException ex) {
            SeamGuiPlugin.getPluginLog().logError(ex);
        }
    }

    public String getDescription() {
        return label;
    }

    public Image getImage() {
        return null;
    }

}