dynamicrefactoring.util.selection.SelectionInfo.java Source code

Java tutorial

Introduction

Here is the source code for dynamicrefactoring.util.selection.SelectionInfo.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.util.selection;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jface.text.TextSelection;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.TreeSelection;
import org.eclipse.ui.IWorkbenchWindow;

import dynamicrefactoring.domain.Scope;
import dynamicrefactoring.util.io.JavaFileManager;

/**
 * Proporciona funciones capaces de determinar el tipo de elemento que se
 * encuentra seleccionado en una ventana y otra informacin adicional relativa
 * al mismo.
 * 
 * @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 abstract class SelectionInfo {

    /**
     * Constante que representa una declaracin de argumento formal.
     * 
     * @see IJavaElement#LOCAL_VARIABLE
     */
    public static final int FORMAL_ARGUMENT = -1;

    /**
     * Constante que representa una declaracin de variable local.
     * 
     * @see IJavaElement#LOCAL_VARIABLE
     */
    public static final int LOCAL_VARIABLE = -2;

    /**
     * Seleccin genrica cuya informacin se desea consultar.
     */
    private ISelection selection;

    /**
     * Ventana del espacio de trabajo sobre la que se ha hecho la seleccin.
     */
    protected IWorkbenchWindow window;

    /**
     * Nombre completamente cualificado del tipo de seleccin.
     */
    protected String selectionName;

    /**
     * Nombre completamente cualificado del elemento "Tipo" o "Clase".
     */
    protected final static String TYPE_NAME = "org.eclipse.jdt.internal.core.SourceType"; //$NON-NLS-1$

    /**
     * Nombre completamente cualificado del elemento "Mtodo" o "Funcin".
     */
    protected final static String METHOD_NAME = "org.eclipse.jdt.internal.core.SourceMethod"; //$NON-NLS-1$

    /**
     * Nombre completamente cualificado del elemento "Atributo de instancia".
     */
    protected final static String FIELD_NAME = "org.eclipse.jdt.internal.core.SourceField"; //$NON-NLS-1$

    /**
     * Nombre completamente cualificado del elemento "Parmetro formal".
     */
    protected final static String PARAMETER_NAME = "org.eclipse.jdt.internal.core.TypeParameter"; //$NON-NLS-1$

    /**
     * Nombre completamente cualificado del elemento "Argumento formal".
     */
    protected final static String FORMAL_ARGUMENT_NAME = "dynamicrefactoring.SourceFormalArgument"; //$NON-NLS-1$

    /**
     * Constructor.
     * 
     * @param selection
     *            la seleccin sobre la que se desea obtener informacin.
     * @param window
     *            la ventana sobre la que se ha efectuado la seleccin.
     */
    public SelectionInfo(ISelection selection, IWorkbenchWindow window) {

        this.selection = selection;
        this.selectionName = null;
        this.window = window;
    }

    /**
     * Determina el tipo de elemento seleccionado en una ventana. Solo tiene en
     * consideracin los tipos indicados por {@link #TYPE_NAME},
     * {@link #METHOD_NAME}, {@link #FIELD_NAME}, {@link #PARAMETER_NAME} y
     * {@link #FORMAL_ARGUMENT_NAME}.
     * 
     * @return el nombre completamente cualificado del tipo de elemento
     *         seleccionado, o <code>null</code> si no es ninguno de los
     *         admitidos.
     */
    public abstract String getSelectionType();

    /**
     * Comprueba si el nombre completamente cualificado de tipo de seleccin se
     * corresponde con alguno de los tipos de seleccin vlidos como entrada
     * para la herramienta de refactorizacin.
     * 
     * @return <code>true</code> si es uno de los tipos contemplados como
     *         vlidos; <code>false</code> en caso contrario.
     */
    public boolean isValidSelectionType() {
        ArrayList<String> validTypes = new ArrayList<String>();

        validTypes.add(TYPE_NAME);
        validTypes.add(FIELD_NAME);
        validTypes.add(METHOD_NAME);
        validTypes.add(PARAMETER_NAME);
        validTypes.add(FORMAL_ARGUMENT_NAME);

        return validTypes.contains(getSelectionType())
                || (isTextSelection() && ((TextSelection) selection).getLength() > 0);
    }

    /**
     * Comprueba si el nombre completamente cualificado del tipo de la seleccin
     * corresponde a un atributo seleccionado.
     * 
     * @return <code>true</code> si se trata de un atributo seleccionado;
     *         <code>false</code> en caso contrario.
     */
    public boolean isFieldSelection() {
        return (getSelectionType().equals(FIELD_NAME));
    }

    /**
     * Comprueba si un nombre completamente cualificado del tipo de la seleccin
     * corresponde a un mtodo seleccionado.
     * 
     * @return <code>true</code> si se trata de un mtodo seleccionado;
     *         <code>false</code> en caso contrario.
     */
    public boolean isMethodSelection() {
        return (getSelectionType().equals(METHOD_NAME));
    }

    /**
     * Comprueba si un nombre completamente cualificado del tipo de la seleccin
     * corresponde a una clase seleccionada.
     * 
     * @return <code>true</code> si se trata de una clase seleccionada;
     *         <code>false</code> en caso contrario.
     */
    public boolean isClassSelection() {
        return (getSelectionType().equals(TYPE_NAME));
    }

    /**
     * Comprueba si un nombre completamente cualificado del tipo de la seleccin
     * corresponde a un argumento formal de un mtodo seleccionado.
     * 
     * @return <code>true</code> si se trata de un argumento formal de un
     *         mtodo; <code>false</code> en caso contrario.
     */
    public boolean isFormalArgumentSelection() {
        return (getSelectionType().equals(FORMAL_ARGUMENT_NAME));
    }

    /**
     * Comprueba si un nombre completamente cualificado del tipo de la seleccin
     * corresponde a un parmetro formal.
     * 
     * @return <code>true</code> si se trata de un parmetro formal;
     *         <code>false</code> en caso contrario.
     */
    public boolean isFormalParameterSelection() {
        return (getSelectionType().equals(PARAMETER_NAME));
    }

    /**
     * Comprueba si la seleccin es parte de una representacin en rbol.
     * 
     * @return <code>true</code> si se trata de una seleccin en un rbol;
     *         <code>false</code> en caso contrario.
     */
    public boolean isTreeSelection() {
        return (selection instanceof TreeSelection);
    }

    /**
     * Comprueba si la seleccin es parte de una representacin textual.
     * 
     * @return <code>true</code> si se trata de una seleccin de texto;
     *         <code>false</code> en caso contrario.
     */
    public boolean isTextSelection() {
        return (selection instanceof TextSelection);
    }

    /**
     * Obtiene el nombre completamente cualificado de los tipos de elemento 
     * descritos por la interfaz <code>IJavaElement</code>.
     * 
     * @param type el valor codificado por IJavaElement para el tipo de elemento Java.
     * 
     * @return el nombre completamente cualificado del tipo equivalente.
     */
    protected String decodeElementType(int type) {
        switch (type) {
        case IJavaElement.TYPE:
            return TYPE_NAME;
        case IJavaElement.FIELD:
            return FIELD_NAME;
        case IJavaElement.METHOD:
            return METHOD_NAME;
        case IJavaElement.TYPE_PARAMETER:
            return PARAMETER_NAME;
        case FORMAL_ARGUMENT:
            return FORMAL_ARGUMENT_NAME;
        default:
            return ""; //$NON-NLS-1$
        }
    }

    /**
     * Obtiene el proyecto al que pertenece el elemento seleccionado.
     * 
     * @return el proyecto al que pertenece el elemento seleccionado.
     */
    public abstract IProject getProjectForSelection();

    /**
     * Obtiene la lista de directorios de fuentes del proyecto al que pertenece
     * el elemento seleccionado.
     * 
     * Mtodo plantilla (patrn de diseo Mtodo Plantilla).
     * 
     * @return la lista de directorios de fuentes del proyecto al que pertenece
     *         el elemento seleccionado.
     */
    public List<String> getSourceDirsForSelection() {
        IJavaProject project = getJavaProjectForSelection();

        return JavaFileManager.getSourceDirsForProject(project);
    }

    /**
     * Obtiene el proyecto del espacio de trabajo con el nombre especificado.
     * 
     * @param name el nombre del proyecto que se quiere recuperar.
     * 
     * @return el proyecto del espacio de trabajo con el nombre especificado por #name.
     */
    protected IProject getJavaProjectForName(String name) {
        IWorkspaceRoot wsroot = ResourcesPlugin.getWorkspace().getRoot();

        IProject myProject = wsroot.getProject(name);
        return myProject;
    }

    /**
     * Obtiene el proyecto al que pertenece la seleccin actual como un <code>
     * IJavaElement</code>, de manera que se pueda manejar aprovechando las
     * posibilidades de Eclipse para el manejo de elementos Java.
     * 
     * Operacin primitiva (patrn de diseo Mtodo Plantilla).
     * 
     * @return el proyecto al que pertenece la seleccin actual como un <code>
     * IJavaElement</code>.
     */
    public abstract IJavaProject getJavaProjectForSelection();

    /**
     * Obtiene la seleccin asociada al procesador de informacin.
     * 
     * @return la seleccin asociada al procesador de informacin.
     */
    public ISelection getSelection() {
        return selection;
    }

    /**
     * Devuelve si existe un ambito de aplicacion para la seleccion.
     * 
     * @return si existe o no un
     */
    public boolean existsScopeForSelection() {
        return getSelectionScope() != null;
    }

    /**
     * Obtiene el ambito asociado a la seleccion.
     * 
     * @return ambito de la seleccion o null si la seleccion no pertenece a
     *         ningun ambito (! existsScopeForSelection())
     */
    public Scope getSelectionScope() {
        if (isClassSelection())
            return Scope.CLASS;
        else if (isMethodSelection())
            return Scope.METHOD;
        else if (isFieldSelection())
            return Scope.ATTRIBUTE;
        else if (isFormalArgumentSelection())
            return Scope.FORMAL_ARG;
        else if (isFormalParameterSelection())
            return Scope.FORMAL_PAR;
        else if (isTextSelection())
            return Scope.CODE_FRAGMENT;

        return null;
    }
}