dynamicrefactoring.interfaz.wizard.RefactoringWizard.java Source code

Java tutorial

Introduction

Here is the source code for dynamicrefactoring.interfaz.wizard.RefactoringWizard.java

Source

/*<Dynamic Refactoring Plugin For Eclipse 2.0 - Plugin that allows to perform refactorings 
on Java code within Eclipse, as well as to dynamically create and manage new refactorings>
    
Copyright (C) 2009  Laura Fuente De La Fuente
    
This file is part of Foobar
    
Foobar 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.
    
This program 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 this program.  If not, see <http://www.gnu.org/licenses/>.*/

package dynamicrefactoring.interfaz.wizard;

import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.text.MessageFormat;

import org.apache.log4j.Logger;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.ui.INewWizard;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchWizard;

import dynamicrefactoring.RefactoringImages;
import dynamicrefactoring.domain.DynamicRefactoringDefinition;
import dynamicrefactoring.domain.RefactoringsCatalog;
import dynamicrefactoring.domain.metadata.interfaces.Category;
import dynamicrefactoring.domain.xml.XMLRefactoringsCatalog;
import dynamicrefactoring.interfaz.wizard.search.internal.SearchingFacade;

/**
 * Proporciona un asistente de Eclipse que permite crear una nueva
 * refactorizacin dinmica o modificar una ya existente.
 * 
 * @author <A HREF="mailto:lfd0002@alu.ubu.es">Laura Fuente de la Fuente</A>
 * @author <A HREF="mailto:sfd0009@alu.ubu.es">Sonia Fuente de la Fuente</A>
 * @author <A HREF="mailto:ehp0001@alu.ubu.es">Enrique Herrero Paredes</A>
 */
public class RefactoringWizard extends Wizard implements INewWizard {

    /**
     * Elemento de registro de errores y otros eventos de la clase.
     */
    private static final Logger logger = Logger.getLogger(RefactoringWizard.class);

    /**
     * Indica que el asistente debe crear una refactorizacin nueval al
     * terminar.
     */
    protected static final int CREATE = 0;

    /**
     * Indica que el asistente debe modificar una refactorizacin existente al
     * terminar.
     */
    private static final int EDIT = 1;

    /**
     * Refactorizacin configurada a travs del asistente y que debe ser
     * creada finalmente (si se trata de una nueva refactorizacin) o
     * modificada (si se est editando una ya existente).
     */
    private DynamicRefactoringDefinition refactoring = null;

    /**
     * Indica el tipo de operacin que debe realizar el asistente cuando el
     * usuario pulse el botn "Finalizar".
     * 
     * <p>
     * Deber ser una de {@value #CREATE} o {@value #EDIT}.
     * </p>
     */
    private int operation;

    /**
     * Nombre original de la refactorizacin que se edita.
     */
    private String originalName;

    /**
     * Primera pgina del asistente.
     */
    private RefactoringWizardPage1 pageA;

    /**
     * Segunda pgina del asistente.
     */
    private RefactoringWizardPage2 pageB;

    /**
     * Tercera pgina del asistente.
     */
    private RefactoringWizardPage3 pageC;

    /**
     * Cuarta pgina del asistente.
     */
    private RefactoringWizardPage4 pageD;

    /**
     * Quinta pgina del asistente.
     */
    private RefactoringWizardPage5 pageE;

    /**
     * Sexta pgina del asistente.
     */
    private RefactoringWizardPage6 pageF;

    /**
     * Sptima pgina del asistente.
     */
    private RefactoringWizardPage7 pageG;

    /**
     * Catlogo de refactorizaciones.
     */
    protected RefactoringsCatalog refactCatalog;

    /**
     * Categoria Scope que ha sido seleccionada en la primera pgina del asistente.
     */
    protected Category scope;

    /**
     * Constructor.
     * 
     * @param refactoring
     *            refactorizacin que se desea editar o <code>null
     * @param catalog catlogo de refactorizaciones
     * </code> si se desea crear una nueva.
     */
    public RefactoringWizard(DynamicRefactoringDefinition refactoring, RefactoringsCatalog catalog) {
        super();
        setNeedsProgressMonitor(true);

        setDefaultPageImageDescriptor(ImageDescriptor.createFromImage(RefactoringImages.getSIIcon()));

        setWindowTitle(Messages.RefactoringWizard_WizardTitle);

        this.refactCatalog = catalog;
        operation = (refactoring == null) ? CREATE : EDIT;
        this.refactoring = refactoring;
        this.originalName = (refactoring != null) ? refactoring.getName() : ""; //$NON-NLS-1$
        //generamos el indice para poder realizar bsquedas en tipos de elementos y acciones y predicados
        try {
            SearchingFacade.INSTANCE.generateAllIndexes();
        } catch (IOException e) {
            String message = Messages.RefactoringWizard_AllIndexesNotGenerated + ".\n" + e.getMessage(); //$NON-NLS-1$
            logger.error(message);
        }
    }

    /**
     * Constructor.
     * 
     * <p>
     * Crea un nuevo asistente para la creacin de una refactorizacin desde
     * cero. Necesario para la integracin del asistente en Eclipse y su
     * activacin asistente desde el men <i>New</i> de Eclipse.
     * </p>
     */
    public RefactoringWizard() {
        new RefactoringWizard(null, XMLRefactoringsCatalog.getInstance());
    }

    /**
     * Aade las pginas al asistente.
     */
    @Override
    public void addPages() {
        pageA = new RefactoringWizardPage1(refactoring);
        addPage(pageA);
        pageB = new RefactoringWizardPage2(refactoring);
        addPage(pageB);
        pageC = new RefactoringWizardPage3(refactoring);
        addPage(pageC);
        pageD = new RefactoringWizardPage4(refactoring);
        addPage(pageD);
        pageE = new RefactoringWizardPage5(refactoring);
        addPage(pageE);
        pageF = new RefactoringWizardPage6(refactoring);
        addPage(pageF);
        pageG = new RefactoringWizardPage7(pageA);
        addPage(pageG);
    }

    /**
     * Mtodo llamado cuando se pulsa el botn "Finish" en el asistente. Se
     * crear la operacin que se deba ejecutar, y se ejecutar utilizando
     * el propio asistente como contexto de ejecucin.
     * 
     * @return <code>true</code> para indicar que la solicitud de finalizacin
     *         ha sido aceptada; <code>false</code> para indicar que ha sido
     *         rechazada.
     */
    @Override
    public boolean performFinish() {
        IRunnableWithProgress operation = new IRunnableWithProgress() {
            public void run(IProgressMonitor monitor) throws InvocationTargetException {
                writeRefactoring(configureRefactoring());
            }
        };

        try {
            operation.run(new NullProgressMonitor());
        } catch (InterruptedException e) {
            String message = Messages.RefactoringWizard_CreationInterrupted + ".\n" + e.getMessage(); //$NON-NLS-1$
            logger.error(message);
            Logger.getRootLogger().error(message);
            return false;
        } catch (InvocationTargetException e) {
            Throwable realException = e.getTargetException();
            logger.error(realException.getMessage());
            MessageDialog.openError(getShell(), Messages.RefactoringWizard_Error, realException.getMessage());
            return false;
        }
        return true;
    }

    /**
     * Mtodo de inicializacin.
     * 
     * @see IWorkbenchWizard#init(IWorkbench, IStructuredSelection)
     * @param workbench workbench
     * @param selection seleccin
     */
    @Override
    public void init(IWorkbench workbench, IStructuredSelection selection) {
    }

    /**
     * Obtiene el tipo de operacin que est configurando el asistente.
     * 
     * @return el tipo de operacin que est configurando el asistente.
     */
    public final int getOperation() {
        return operation;
    }

    /**
     * Obtiene el nombre del tipo de operacin que est configurando el
     * asistente.
     * 
     * @return el nombre del tipo de operacin que est configurando el
     *         asistente.
     */
    public final String getOperationAsString() {
        return (operation == CREATE) ? Messages.RefactoringWizard_Creation : Messages.RefactoringWizard_Edition;
    }

    /**
     * Crea y configura la nueva refactorizacin personalizada a partir de los
     * datos introducidos por el usuario en las pginas del asistente.
     * @return builder
     */
    private DynamicRefactoringDefinition.Builder configureRefactoring() {
        DynamicRefactoringDefinition.Builder builder = new DynamicRefactoringDefinition.Builder(
                pageA.getNameText().getText());

        return builder.description(pageA.getDescriptionText().getText()).image(pageA.getRefactoringImage())
                .motivation(pageA.getMotivationText().getText()).inputs(pageB.getInputs())
                .preconditions(pageC.getPreconditions()).actions(pageD.getActions())
                .postconditions(pageE.getPostconditions()).categories(pageA.getCategories())
                .keywords(pageA.getKeywords()).examples(pageF.getExamples()).isEditable(true);

    }

    /**
     * Copia los ficheros asociados a una refactorizacin al directorio
     * seleccionado y escribe el fichero con la refactorizacin creada.
     * 
     * @param builder builder
     * 
     */
    private void writeRefactoring(DynamicRefactoringDefinition.Builder builder) {
        DynamicRefactoringDefinition resultingRefactoringDefinition = builder.build();

        if (operation == EDIT && refactCatalog.hasRefactoring(originalName)) {
            refactCatalog.updateRefactoring(originalName, resultingRefactoringDefinition);
            ;
        } else {
            // Se escribe la refactorizacin en el fichero XML.
            refactCatalog.addRefactoring(resultingRefactoringDefinition);
        }

        String action = (operation == CREATE) ? Messages.RefactoringWizard_CreatedLower
                : Messages.RefactoringWizard_ModifiedLower;

        Object[] messageArgs = { "\"" + resultingRefactoringDefinition.getName() + "\"", action }; //$NON-NLS-1$ //$NON-NLS-2$
        MessageFormat formatter = new MessageFormat(""); //$NON-NLS-1$
        formatter.applyPattern(Messages.RefactoringWizard_RefactoringSuccessfully);

        MessageDialog.openInformation(getShell(), Messages.RefactoringWizard_Completed,
                formatter.format(messageArgs) + "."); //$NON-NLS-1$
    }

}