Commits

Francisco Souza  committed a902eb9

Adição dos arquivos iniciais do projeto, começando praticamente do 0 :)

  • Participants

Comments (0)

Files changed (23)

+syntax: glob
+
+*.java~
+build
+bin
+.project
+.classpath

File src/br/edu/ifes/defensor/adapters/InterfaceAdapter.java

+package br.edu.ifes.defensor.adapters;
+
+import java.awt.Component;
+
+import br.edu.ifes.defensor.annotations.Component.InterfaceComponent;
+import br.edu.ifes.defensor.exception.DefensorException;
+
+/**
+ * Fornece métodos para um interface adapter (Swing, etc.)
+ * 
+ * @param <C>
+ *          Tipo de componente com o qual a interface trabalhará (JComponent, etc.)
+ * 
+ * @author Francisco Antônio da Silva Souza
+ * @version 1.0
+ *
+ */
+public interface InterfaceAdapter {
+    
+    /**
+     * Obtém o componente de acordo com o tipo especificado na enumeração <code>InterfaceComponent</code>
+     * 
+     * @param iComponent
+     *              Tipo do componente (enum <code>InterfaceComponent</code> dentro da anotação <code>Component</code> 
+     * @return Componente
+     * 
+     * @throws DefensorException
+     *              Encapsulamento de qualquer exceção ocorrida internamente.
+     */
+    public Component getComponentFor(InterfaceComponent iComponent) throws DefensorException;
+    
+    /**
+     * Obtém o valor de um componente informado.
+     * 
+     * @param component
+     *              Componente do qual deseja-se obter o valor.
+     * @return Valor do componente passado por parâmetro
+     * 
+     * @throws DefensorException
+     *              Encapsulamento de qualquer exceção ocorrida internamente.
+     */
+    public Object getValueOfComponent(Component component) throws DefensorException;
+    
+    /**
+     * Grava um valor em um determinado componente.
+     * 
+     * @param component
+     *              Componente no qual o valor será armazenado.
+     * @param value
+     *              Valor que será armazenado
+     * 
+     * @throws DefensorException
+     *              Encapsulamento de qualquer exceção ocorrida internamente.
+     */
+    public void setValueOfComponent(Component component, Object value) throws DefensorException;
+
+}

File src/br/edu/ifes/defensor/adapters/SwingAdapter.java

+package br.edu.ifes.defensor.adapters;
+
+import java.awt.Component;
+
+import javax.swing.JCheckBox;
+import javax.swing.JComboBox;
+import javax.swing.JTextField;
+
+import br.edu.ifes.defensor.annotations.Component.InterfaceComponent;
+import br.edu.ifes.defensor.exception.DefensorException;
+
+public class SwingAdapter implements InterfaceAdapter {
+   
+    @Override
+    public Component getComponentFor(InterfaceComponent iComponent) {
+        switch (iComponent) {
+            case TEXTFIELD:
+                return new JTextField();
+            case CHECKBOX:
+                return new JCheckBox();
+            case COMBOBOX:
+                return new JComboBox();
+        }
+        return null;
+    }
+
+    @Override
+    public Object getValueOfComponent(Component component) {
+        Object returnValue = null;
+        if (component.getClass().isAssignableFrom(JTextField.class)) {
+            returnValue = ((JTextField)component).getText();
+        } else if (component.getClass().isAssignableFrom(JComboBox.class)) {
+            returnValue = ((JComboBox)component).getSelectedItem();
+        } else if (component.getClass().isAssignableFrom(JCheckBox.class)) {
+            returnValue = ((JCheckBox)component).isSelected();
+        }
+        return returnValue;
+    }
+
+    @Override
+    public void setValueOfComponent(Component component, Object value) throws DefensorException {
+        if (component.getClass().isAssignableFrom(JTextField.class)) {
+            ((JTextField)component).setText(value.toString());
+        } else if (component.getClass().isAssignableFrom(JComboBox.class)) {
+            ((JComboBox)component).setSelectedItem(value);
+        } else if (component.getClass().isAssignableFrom(JCheckBox.class)) {
+            try {
+                Boolean bValue = (Boolean) value;
+                ((JCheckBox)component).setSelected(bValue);
+            } catch (ClassCastException e) {
+                throw new DefensorException("O valor para o componente JCheckBox não é booleano!", e);
+            }
+        }
+    }
+
+
+}

File src/br/edu/ifes/defensor/annotations/Component.java

+package br.edu.ifes.defensor.annotations;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * Define que o atributo será um componente da janela do objeto pai.
+ * 
+ * Esta anotação deve ser utilizada em atributos de uma classe mapeada pela anotação <code>DObject</code>
+ * 
+ * @author Francisco Antônio da Silva Souza
+ * @version 1.0
+ *
+ */
+@Documented
+@Retention(RetentionPolicy.RUNTIME)
+public @interface Component {
+    public enum InterfaceComponent { TEXTFIELD, COMBOBOX, CHECKBOX };
+    
+    /**
+     * Componente de interface que representará o atributo sendo mapeado na tela.
+     */
+    InterfaceComponent swingComponent();
+    
+    /**
+     * Label que será exibida à frente do componente (outro atributo)
+     * 
+     * Este valor também aparecerá no cabeçalho da tabela na tela de listagens.
+     */
+    String label();
+    
+    /**
+     * Argumentos extras.
+     * 
+     * Pode ser um vetor contendo as opções de um JComboBox, por exemplo.
+     */
+    String[] args();
+}

File src/br/edu/ifes/defensor/annotations/DObject.java

+package br.edu.ifes.defensor.annotations;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * Define que um POJO é gerenciado pelo framework.
+ *  
+ * @author Francisco Antônio da Silva Souza
+ * @version 1.0
+ *
+ */
+@Documented
+@Retention(RetentionPolicy.RUNTIME)
+public @interface DObject {
+    /**
+     * Atributo que indica qual será o título da janela de cadastrado simples.
+     * 
+     * Será o valor para título do JFrame relativo ao objeto.
+     */
+    String titleOfSingleWindow();
+    
+    /**
+     * Atributo que indica qual será o título da janela de listagem.
+     * 
+     * Será o valor para título do JFrame relativo à lista de objetos.
+     */
+    String titleOfListWindow();
+}

File src/br/edu/ifes/defensor/base/DComponent.java

+package br.edu.ifes.defensor.base;
+
+import java.awt.Component;
+import java.lang.reflect.Field;
+
+
+/**
+ * 
+ * Modela um componente de janela do framework.
+ * 
+ * Para o framework, um componente é composto por um rótulo (label) e um Component (da biblioteca java.awt)
+ * 
+ * @author Francisco Antônio da Silva Souza
+ * @version 1.0
+ * 
+ */
+public class DComponent {
+
+    private String label;
+    
+    private Component component;
+    
+    private Field dataField;
+
+    public DComponent(String label, Component component, Field dataField) {
+        super();
+        this.label = label;
+        this.component = component;
+        this.dataField = dataField;
+    }
+
+    /**
+     * 
+     * @return Rótulo do componente.
+     */
+    public String getLabel() {
+        return this.label;
+    }
+
+    /**
+     * 
+     * @return Objeto de interface (por exemplo, um componente Java Swing) do componente.
+     */
+    public Component getComponent() {
+        return this.component;
+    }
+
+    /**
+     * 
+     * @return Objeto que contém os dados.
+     */
+    public Field getDataField() {
+        return this.dataField;
+    }
+    
+}

File src/br/edu/ifes/defensor/base/WindowObject.java

+package br.edu.ifes.defensor.base;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.LinkedList;
+import java.util.List;
+
+import br.edu.ifes.defensor.adapters.InterfaceAdapter;
+import br.edu.ifes.defensor.adapters.SwingAdapter;
+import br.edu.ifes.defensor.annotations.Component;
+import br.edu.ifes.defensor.annotations.DObject;
+import br.edu.ifes.defensor.annotations.Component.InterfaceComponent;
+import br.edu.ifes.defensor.exception.DefensorException;
+import br.edu.ifes.defensor.exception.MethodNotFoundException;
+import br.edu.ifes.defensor.exception.NotAnnotedClassException;
+import br.edu.ifes.defensor.util.ClassesUtil;
+
+/**
+ * Classe que representa um objeto de janela, contendo um objeto de regra de
+ * negócio e uma lista de objetos do tipo DComponent.
+ * 
+ * @author Francisco Antônio da Silva Souza
+ * @version 1.0
+ */
+public class WindowObject {
+
+    private Object dObject;
+
+    public List<DComponent> components;
+
+    private Boolean fill;
+
+    private InterfaceAdapter adapter;
+
+    /**
+     * Método construtor que recebe apenas o objeto.
+     * 
+     * Gera a instância assumindo que o objeto não é novo e que será utilizado o adapter Swing
+     * 
+     * @param dObject
+     *          Objeto correspondente à janela atual
+     * @throws NotAnnotedClassException
+     *          Caso o objeto passado por parâmetro não esteja com a anotação
+     *          DObject.
+     * @throws MethodNotFoundException
+     * @throws DefensorException
+     */
+    public WindowObject(Object dObject) throws NotAnnotedClassException, MethodNotFoundException, DefensorException {
+        this(dObject, new SwingAdapter(), false);
+    }
+
+    /**
+     * Gera a instância assumindo que o objeto informado não é novo.
+     * 
+     * @param dObject
+     *            Objeto correspondente à janela atual
+     * @param adapter
+     *            Adapter da interface responsável por gerenciar os componentes.
+     * @throws NotAnnotedClassException
+     *             Caso o objeto passado por parâmetro não esteja com a anotação
+     *             DObject.
+     * @throws MethodNotFoundException
+     * @throws DefensorException
+     */
+    public WindowObject(Object dObject, InterfaceAdapter adapter) throws NotAnnotedClassException, MethodNotFoundException, DefensorException {
+        this(dObject, adapter, false);
+    }
+
+    /**
+     * 
+     * @param dObject
+     *            Objeto correspondente à janela atual
+     * @param adapter
+     *            Adapter da interface responsável por gerenciar os componentes.
+     * @param empty
+     *            Indica se o objeto está vazio
+     * @throws NotAnnotedClassException
+     *             Caso o objeto passado por parâmetro não esteja com a anotação
+     *             DObject.
+     * @throws MethodNotFoundException
+     * @throws DefensorException
+     */
+    public WindowObject(Object dObject, InterfaceAdapter adapter, Boolean empty) throws NotAnnotedClassException, MethodNotFoundException,
+            DefensorException {
+        super();
+        this.dObject = dObject;
+        this.adapter = adapter;
+        this.fill = !empty;
+        this.buildComponentsList();
+    }
+
+    /**
+     * Método que constrói a lista de componentes navegando pelo objeto.
+     * 
+     * @throws NotAnnotedClassException
+     * @throws MethodNotFoundException
+     * @throws DefensorException
+     */
+    private void buildComponentsList() throws NotAnnotedClassException, MethodNotFoundException, DefensorException {
+        this.components = new LinkedList<DComponent>();
+        Class<? extends Object> cls = this.dObject.getClass();
+        DObject dObjectAnnotation = cls.getAnnotation(DObject.class);
+        if (dObjectAnnotation == null) {
+            throw new NotAnnotedClassException("A classe " + cls.getClass().getName()
+                    + " não está anotada como um objeto gerenciado pelo framework Defensor Interface.");
+        }
+        Field[] fields = cls.getDeclaredFields();
+        for (Field field : fields) {
+            Component component = field.getAnnotation(Component.class);
+            if (component != null) {
+                this.components.add(this.buildComponent(component, field));
+            }
+        }
+    }
+
+    /**
+     * 
+     * @param componentAnnotation
+     *            Anotação do tipo Component da qual o componente será extraído.
+     * @param field
+     *            Atributo contendo a informação do componente.
+     * 
+     * @return Um DComponent montado.
+     * 
+     * @throws MethodNotFoundException
+     *             Caso algum field não possua um método getter.
+     * @throws DefensorException
+     *             Erros na invocação do método getter para obtenção do valor.
+     */
+    private DComponent buildComponent(Component componentAnnotation, Field field) throws MethodNotFoundException, DefensorException {
+        try {
+            Object[] emptyArray = {};
+
+            Method getMethod = null;
+            String label = componentAnnotation.label();
+            InterfaceComponent swingComponent = componentAnnotation.swingComponent();
+            java.awt.Component component = this.adapter.getComponentFor(swingComponent);
+            if (this.fill) {
+                Object returnedValue = null;
+                getMethod = ClassesUtil.getGetterMethodOfField(this.dObject.getClass(), field);
+                returnedValue = getMethod.invoke(this.dObject, emptyArray);
+                this.adapter.setValueOfComponent(component, returnedValue);
+            } else {
+                this.fill = Boolean.TRUE;
+            }
+            return new DComponent(label, component, field);
+        } catch (MethodNotFoundException e) {
+            throw new MethodNotFoundException("O atributo " + field.getName() + " não possui um método getter!", e);
+        } catch (InvocationTargetException e) {
+            throw new MethodNotFoundException(
+                    "Erro de acesso a um objeto: houve uma tentativa de invocação de um método dentro de um objeto, porém o método não existe dentro de tal objeto.",
+                    e);
+        } catch (Exception e) {
+            throw new DefensorException("Erro na geração de um componente.", e);
+        }
+    }
+
+}

File src/br/edu/ifes/defensor/exception/DComponentException.java

+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+package br.edu.ifes.defensor.exception;
+
+/**
+ * 
+ * @author Francisco Antônio da Silva Souza
+ * @version 1.0
+ * 
+ */
+public class DComponentException extends Exception {
+	public DComponentException() {
+
+	}
+
+	public DComponentException(String arg0) {
+		super(arg0);
+	}
+
+	public DComponentException(Throwable cause) {
+		super(cause);
+	}
+
+	public DComponentException(String arg0, Throwable arg1) {
+		super(arg0, arg1);
+	}
+}

File src/br/edu/ifes/defensor/exception/DInvalidTypeException.java

+package br.edu.ifes.defensor.exception;
+
+/**
+ * 
+ * @author Francisco Antônio da Silva Souza
+ * @version 1.0
+ * 
+ */
+public class DInvalidTypeException extends Exception {
+
+	public DInvalidTypeException() {
+	}
+
+	public DInvalidTypeException(String arg0) {
+		super(arg0);
+	}
+
+	public DInvalidTypeException(Throwable arg0) {
+		super(arg0);
+	}
+
+	public DInvalidTypeException(String arg0, Throwable arg1) {
+		super(arg0, arg1);
+	}
+}

File src/br/edu/ifes/defensor/exception/DMethodException.java

+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+package br.edu.ifes.defensor.exception;
+
+/**
+ * 
+ * @author Francisco Antônio da Silva Souza
+ * @version 1.0
+ * 
+ */
+public class DMethodException extends Exception {
+
+	public DMethodException() {
+	}
+
+	public DMethodException(String msg) {
+		super(msg);
+	}
+
+	public DMethodException(Throwable t) {
+		super(t);
+	}
+
+	public DMethodException(String msg, Throwable t) {
+		super(msg, t);
+	}
+}

File src/br/edu/ifes/defensor/exception/DefensorException.java

+package br.edu.ifes.defensor.exception;
+
+/**
+ * Lançada em erros genéricos, geralmente para encapsular outras exceções.
+ * 
+ * @author Francisco Antônio da Silva Souza
+ * @version 1.0
+ * 
+ */
+public class DefensorException extends Exception {
+
+	/**
+     * 
+     */
+    private static final long serialVersionUID = 1L;
+
+    public DefensorException() {
+	}
+
+	public DefensorException(String message) {
+		super(message);
+	}
+
+	public DefensorException(Throwable cause) {
+		super(cause);
+	}
+
+	public DefensorException(String message, Throwable cause) {
+		super(message, cause);
+	}
+
+}

File src/br/edu/ifes/defensor/exception/MethodNotFoundException.java

+package br.edu.ifes.defensor.exception;
+
+/**
+ * Disparada quando um método não é encontrado dentro de uma classe.
+ * 
+ * @author Francisco Antônio da Silva Souza
+ * @version 1.0
+ *
+ */
+public class MethodNotFoundException extends Exception {
+
+    /**
+     * 
+     */
+    private static final long serialVersionUID = 1L;
+
+    public MethodNotFoundException(String arg0) {
+        super(arg0);
+    }
+
+    public MethodNotFoundException(String arg0, Throwable arg1) {
+        super(arg0, arg1);
+    }
+
+}

File src/br/edu/ifes/defensor/exception/NotAnnotedClassException.java

+package br.edu.ifes.defensor.exception;
+
+/**
+ * 
+ * Ocorre quando é solicitado ao framework que trabalhe com um objeto não anotado com a anotação <code>DObject</code>.
+ * 
+ * @author Francisco Antônio da Silva Souza
+ * @version 1.0
+ *
+ */
+public class NotAnnotedClassException extends Exception {
+
+    private static final long serialVersionUID = 1L;
+
+    public NotAnnotedClassException(String message) {
+        super(message);
+    }
+
+}

File src/br/edu/ifes/defensor/graphic/DLayoutBuilder.java

+package br.edu.ifes.defensor.graphic;
+
+import java.awt.Component;
+import java.awt.LayoutManager;
+import java.awt.Rectangle;
+
+import javax.swing.JLabel;
+import javax.swing.JScrollPane;
+
+/**
+ * Esta classe gerencia o layout da janela de cadastro, sendo responsável pelo
+ * tamanho da janela, o tamanho e o posiccionamento dos componentes e dos
+ * labels.
+ * 
+ * @author Francisco Antônio da Silva Souza
+ * @version 1.0
+ * 
+ */
+public class DLayoutBuilder {
+	private int labelX, labelY, labelWidth, labelHeight;
+	private int componentX, componentY, componentWidth, componentHeight;
+	private final int increment = 30;
+
+	/**
+	 * Método que constrói o objeto do tipo <code>DLayoutBuilder</code>,
+	 * configurando todos os elementos encapsulados pelo objeto.
+	 */
+	public DLayoutBuilder() {
+		super();
+		this.labelX = 2;
+		this.labelY = 2;
+		this.labelWidth = 180;
+		this.labelHeight = 30;
+
+		this.componentX = 190;
+		this.componentY = 2;
+		this.componentWidth = 400;
+	}
+
+	/**
+	 * Calcula e retorna o tamanho e o posicionamento da próxima label a ser
+	 * adicionada na janela.
+	 * 
+	 * @param label
+	 *            Objeto do tipo <code>JLabel</code> utilizado no cálculo.
+	 * @return Objeto com informações de tamanho e posicionamento do próximo
+	 *         rótulo a ser adicionado na janela.
+	 */
+	public Rectangle getNextLabelBounds(JLabel label) {
+		int size = label.getText().length() * 6;
+		if (size > this.labelWidth) {
+			this.labelWidth = size;
+		}
+		Rectangle rectangle = new Rectangle(this.labelX, this.labelY, this.labelWidth, this.labelHeight);
+		this.labelY += this.increment;
+		return rectangle;
+	}
+
+	/**
+	 * Calcula e retorna o tamanho e o posicionamento do próximo componente a
+	 * ser adicionado na janela.
+	 * 
+	 * @param component
+	 *            Objeto do tipo <code>Component</code> utilizado para cálculos.
+	 * @return Objeto com informações de tamanho e posicionamento do próximo
+	 *         rótulo a ser adicionado na janela.
+	 */
+	public Rectangle getNextComponentBounds(Component component) {
+		if (component.getClass() == JScrollPane.class) {
+			this.componentHeight = 80;
+		} else {
+			this.componentHeight = component.getSize().height > this.increment ? component.getSize().height : this.increment;
+		}
+		this.labelY += this.componentHeight - this.increment;
+		Rectangle rectangle = new Rectangle(this.componentX, this.componentY, this.componentWidth, this.componentHeight);
+		this.componentY += this.componentHeight;
+		return rectangle;
+	}
+
+	/**
+	 * Método que informa o layout utilizado na janela.
+	 * 
+	 * @return Layout utilizado.
+	 */
+	public LayoutManager getLayout() {
+		return null;
+	}
+
+	/**
+	 * Método que informa a largura utilizada para os rótulos (labels).
+	 * 
+	 * @return Largura dos rótulos.
+	 */
+	public int getLabelWidth() {
+		return labelWidth;
+	}
+
+}

File src/br/edu/ifes/defensor/graphic/resource/editar.png

Added
New image

File src/br/edu/ifes/defensor/graphic/resource/new.png

Added
New image

File src/br/edu/ifes/defensor/graphic/resource/recycle.png

Added
New image

File src/br/edu/ifes/defensor/manager/DManager.java

+package br.edu.ifes.defensor.manager;
+
+import java.util.List;
+
+/**
+ * Classe que atua como controladora no Defensor Interface, gerenciando a geração das janelas e seus eventos.
+ * 
+ * @author Francisco Antônio da Silva Souza
+ * @version 1.0
+ *
+ */
+public class DManager {
+
+    /**
+     * Esta classe não deve ser instanciada externamente, por isso possui um construtor privado.
+     */
+    private DManager() {
+        
+    }
+    
+    /**
+     * Cria uma janela de cadastro de um objeto simples
+     * 
+     * @param object
+     *          Objeto para o qual a janela será gerada.
+     */
+    public static void createSingleObjectWindow(Object object) {
+        // TODO: Construir o método de criação da janela de cadastro de um objeto 
+    }
+    
+    /**
+     * Cria uma janela nova (vazia) de um objeto simples
+     * 
+     * @param cls
+     *          Classe que modela o objeto vazio para o qual a janela será gerada.
+     * @throws Exception
+     *          Caso ocorra problemas para instanciar um objeto vazio (InstantiationException ou IllegalAccessException)  
+     */
+    public static void createSingleObjectWindow(Class<? extends Object> cls) throws Exception {
+        try {
+            DManager.createSingleObjectWindow(cls.newInstance());
+        } catch (Exception e) {
+            throw new Exception("Exceção lançada ao tentar instanciar a classe " + cls.getName() + " no método de geração da janela de cadastro para um novo objeto.", e);
+        }
+    }
+    
+    /**
+     * Cria uma janela de listagem dos objetos através da lista passada como parâmetro.
+     * 
+     * @param objects
+     *          Lista de objetos presentes na janela.
+     */
+    public static void createListObjectWindow(List<Object> objects) {
+        // TODO Construir o método de criação da janela de listagem. 
+    }
+    
+}

File src/br/edu/ifes/defensor/util/ClassesUtil.java

+package br.edu.ifes.defensor.util;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+
+import br.edu.ifes.defensor.exception.MethodNotFoundException;
+
+/**
+ * Classe com utilitários para trabalhar com instâncias.
+ * 
+ * @author Francisco Antônio da Silva souza
+ * @version 1.0
+ * 
+ */
+public class ClassesUtil {
+
+	/**
+	 * Gera uma instância completa de uma classe, com valores padrões para
+	 * tipos.
+	 * 
+	 * Caso a classe esteja associada a outra classe, é ativada a recursividade,
+	 * que cria instâncias completas em todas as associações de todas as
+	 * classes.
+	 * 
+	 * Este método pode ser lento em modelos de classes complexos e com muitas
+	 * associações.
+	 * 
+	 * @param cls
+	 *            Classe que terá uma instância completa.
+	 * @return Objeto instanciado.
+	 * @throws Exception
+	 *             Problemas de instanciação ou argumentos inválidos.
+	 */
+	public static Object getCompleteInstance(Class<? extends Object> cls) throws Exception {
+		Method[] methods = cls.getDeclaredMethods();
+		Object obj = cls.newInstance();
+		for (Method method : methods) {
+			if (method.getName().substring(0, 3).equals("set")) {
+				Class<? extends Object> parameter = method.getParameterTypes()[0];
+				Object value = null;
+				if (parameter.equals(Integer.class)) {
+					value = 0;
+				} else if (parameter.equals(Double.class)) {
+					value = 0.0;
+				} else if (parameter.equals(Boolean.class)) {
+					value = false;
+				} else if (parameter.equals(String.class)) {
+					value = "";
+				} else {
+					try {
+						value = ClassesUtil.getCompleteInstance(parameter);
+					} catch (Exception e) {
+						value = null;
+					}
+				}
+				Object[] args = { value };
+				method.invoke(obj, args);
+			}
+		}
+		return obj;
+	}
+	
+	/**
+	 * Localiza um método pelo nome dentro da classe.
+	 * 
+	 * @param cls
+	 *         Classe na qual o método será buscado
+	 *         
+	 * @param methodName
+	 *         Nome do método que será buscado
+	 *         
+	 * @return Método encontrado
+	 * 
+	 * @throws MethodNotFoundException
+	 *             Caso não encontre o método dentro da classe 
+	 */
+	public static Method getMethodByName(Class<? extends Object> cls, String methodName) throws MethodNotFoundException {
+	    Method[] methods = cls.getDeclaredMethods();
+	    for (Method method : methods) {
+	        if (method.getName().equals(methodName)) {
+	            return method;
+	        }
+	    }
+	    throw new MethodNotFoundException("Método " + methodName + " não existe na classe " + cls.getName() + ".");
+	}
+	
+	/**
+	 * Retorna o método getter de um atributo informado.
+	 * 
+	 * @param cls
+	 *         Classe na qual o método deve ser buscado.
+	 * @param field
+	 *         Atributo do qual pretende-se obter o método getter.
+	 * 
+	 * @return Método getter do atributo informado
+	 * @throws MethodNotFoundException
+	 *         Caso o método não seja encontrado dentro da classe. Pode ocorrer caso o atributo não pertença à classe ou não possua um método getter padronizado.
+	 */
+	public static Method getGetterMethodOfField(Class<? extends Object> cls, Field field) throws MethodNotFoundException {
+	    return ClassesUtil.getMethodByName(cls, ClassesUtil.buildMethodName("get", field.getName()));
+	}
+	
+	/**
+     * Retorna o método setter de um atributo informado.
+	 * @param cls TODO
+	 * @param field
+     *         Atributo do qual pretende-se obter o método setter.
+     * 
+     * @return Método setter do atributo informado
+	 * @throws MethodNotFoundException
+	 *         Caso o método não seja encontrado dentro da classe. Pode ocorrer caso o atributo não pertença à classe ou não possua um método setter padronizado.
+     */
+	public static Method getSetterMethodOfField(Class<? extends Object> cls, Field field) throws MethodNotFoundException {
+	    return ClassesUtil.getMethodByName(cls, ClassesUtil.buildMethodName("set", field.getName()));
+	}
+	
+	/**
+	 * Constrói o nome de um método (getter ou setter, especificamente)
+	 * 
+	 * @param prefix
+	 *         Prefixo do nome do método (geralmente "get" ou "set")
+	 * @param fieldName
+	 *         Nome do atributo para o qual o método de acesso será criado
+	 * 
+	 * @return O nome do método
+	 */
+	private static String buildMethodName(String prefix, String fieldName) {
+	    String sufix = fieldName.substring(0, 1).toUpperCase();
+	    sufix += fieldName.substring(1);
+	    return prefix + sufix;
+	}
+}

File src/br/edu/ifes/defensor/util/RowSorter.java

+package br.edu.ifes.defensor.util;
+
+import java.util.Comparator;
+import java.util.Vector;
+
+/**
+ * Classe utilizada para informar o critério de ordenação em dados. Esta classe
+ * está preparada para trabalhar na ordenação de objetos do tipo
+ * <code>Vector</code>.
+ * 
+ * @author Francisco Antônio da Silva Souza
+ * @author Ameriana Gomes Santos
+ * @version 1.5
+ * 
+ */
+public class RowSorter implements Comparator<Vector> {
+
+	private boolean asc;
+	private int index;
+
+	/**
+	 * Constrói o objeto <code>RowSorter</code>.
+	 * 
+	 * @param index
+	 *            Indica o índice a ser utilizado como referência para a
+	 *            ordenação.
+	 * @param asc
+	 *            Indica se a ordenação é crescente ou decrescente.
+	 */
+	public RowSorter(int index, boolean asc) {
+		this.index = index;
+		this.asc = asc;
+	}
+
+	@Override
+	public int compare(Vector x, Vector y) {
+		Object o1 = x.get(this.index);
+		Object o2 = y.get(this.index);
+
+		if (o1 instanceof String && ((String) o1).length() == 0) {
+			o1 = null;
+		}
+		if (o2 instanceof String && ((String) o2).length() == 0) {
+			o2 = null;
+		}
+
+		double val1;
+		double val2;
+		try {
+			val1 = Double.parseDouble(o1.toString());
+			val2 = Double.parseDouble(o2.toString());
+			if (this.asc) {
+				if (val1 > val2) {
+					return 1;
+				} else if (val2 > val1) {
+					return -1;
+				} else {
+					return 0;
+				}
+			} else {
+				if (val1 > val2) {
+					return -1;
+				} else if (val2 > val1) {
+					return 1;
+				} else {
+					return 0;
+				}
+			}
+		} catch (NumberFormatException e) {
+			if (o1 == null && o2 == null) {
+				return 0;
+			} else if (o1 == null) {
+				return 1;
+			} else if (o2 == null) {
+				return -1;
+			} else if (o1 instanceof String && o2 instanceof String) {
+				if (this.asc) {
+					return o1.toString().compareToIgnoreCase(o2.toString());
+				} else {
+					return o2.toString().compareToIgnoreCase(o1.toString());
+				}
+			} else if (o1 instanceof Comparable) {
+				if (this.asc) {
+					return ((Comparable) o1).compareTo(o2);
+				} else {
+					return ((Comparable) o2).compareTo(o1);
+				}
+			} else {
+				if (this.asc) {
+					return o1.toString().compareToIgnoreCase(o2.toString());
+				} else {
+					return o2.toString().compareToIgnoreCase(o1.toString());
+				}
+			}
+		}
+	}
+
+}

File src/br/edu/ifes/defensor/window/ListObjectWindowModeler.java

+package br.edu.ifes.defensor.window;
+
+import java.util.List;
+
+import br.edu.ifes.defensor.base.WindowObject;
+
+public interface ListObjectWindowModeler {
+
+    public void showWindow(List<WindowObject> objects);
+    
+}

File src/br/edu/ifes/defensor/window/SingleObjectWindowModeler.java

+package br.edu.ifes.defensor.window;
+
+import br.edu.ifes.defensor.base.WindowObject;
+
+public interface SingleObjectWindowModeler {
+
+    public void showWindow(WindowObject object);
+    
+}

File src/daplicativo/Cliente.java

+package daplicativo;
+
+import javax.swing.JTextField;
+
+import br.edu.ifes.defensor.annotations.Component;
+import br.edu.ifes.defensor.annotations.DObject;
+import br.edu.ifes.defensor.annotations.Component.InterfaceComponent;
+import br.edu.ifes.defensor.base.DComponent;
+import br.edu.ifes.defensor.base.WindowObject;
+import br.edu.ifes.defensor.exception.DefensorException;
+import br.edu.ifes.defensor.exception.MethodNotFoundException;
+import br.edu.ifes.defensor.exception.NotAnnotedClassException;
+
+@DObject(titleOfListWindow = "Listagem de clientes", titleOfSingleWindow = "Cadastro de cliente")
+public class Cliente {
+
+    @Component(label = "Nome", swingComponent = InterfaceComponent.TEXTFIELD, args = "")
+    private String nome;
+
+    @Component(label = "Idade", swingComponent = InterfaceComponent.TEXTFIELD, args = "")
+    private Integer Idade;
+    
+    private String nomeDoPai;
+
+    public String getNomeDoPai() {
+        return nomeDoPai;
+    }
+
+    public void setNomeDoPai(String nomeDoPai) {
+        this.nomeDoPai = nomeDoPai;
+    }
+
+    public String getNome() {
+        return nome;
+    }
+
+    public void setNome(String nome) {
+        this.nome = nome;
+    }
+
+    public Integer getIdade() {
+        return Idade;
+    }
+
+    public void setIdade(Integer idade) {
+        Idade = idade;
+    }
+    
+    public static void main(String[] args) {
+        try {
+            Cliente cliente = new Cliente();
+            cliente.setNome("Francisco");
+            cliente.setIdade(20);
+            cliente.setNomeDoPai("Fernando");
+            
+            WindowObject w = new WindowObject(cliente);
+            for (DComponent dc : w.components) {
+                System.out.print(dc.getLabel() + ": ");
+                System.out.println(((JTextField)dc.getComponent()).getText());
+            }
+        } catch (NotAnnotedClassException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        } catch (MethodNotFoundException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        } catch (DefensorException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+    }
+
+}