SourceForge.net Logo

Comparator Reflector

Uma Implementação dinâmica da Interface java.util.Comparator

A Dynamic implementation of java.util.Comparator Interface

Brazil Flag UK Flag

Objetivo

Goal

Através desta implementação da interface Comparator, o usuário passa uma classe (beanClass) e uma lista de nomes (attributes) de atributos (attributesBean) desta classe. Desta forma, é possível: Through this Comparator interface implementation, the user uses a class (beanClass) and a attribute (attributeBean) name (attributeName) from this class. Thus, it is possible:
1. Criar lista ordenadas a partir de uma Coleção formada por instâncias de objectBean. A ordem desta lista é dada de acordo com attributesBean. Funcionaria como incluir uma cláusula ORDER BY numa consulta SQL. Seria algo como: SELECT * FROM beanClass ORDER BY attribute1 ASC, attribute2 ASC, ..., onde attributeX, seriam os atributos passados. Repare que é ordem sempre ascendente. 1. Create sorted list from a beanClass instances Collection. This list order is given by attributeBean. It will work like add a ORDER BY in a SQL query. like SELECT * FROM beanClass ORDER BY attribute1 ASC, attribute2 ASC, ..., where attributeX, would be attributes used in comparsion. Perceive that order is ever ascending.
2. Dada uma Coleção de ObjectBeans, acha o objeto que contem o valor máximo ou mínimo de acordo com attributesBean. Equivalente a uma query como SELECT * FROM beanClass WHERE attribute = (SELECT MAX(attribute) FROM beanClass). 2. Given a objectBean Collection, it finds the objectBean that contains maximum or minimum value according attributesBean. Like to query SELECT * FROM beanClass WHERE attribute = (SELECT MAX(attribute) FROM beanClass).
3. Dado um objectBean obj, procura por um objectBean em uma coleção que tenha o mesmo valor dos attributeBeans de obj. Equivalente a query SELECT b.* FROM beanClass b, obj WHERE b.attribute1 = obj.attribute1 AND b.attribute2 = obj.attribute2 AND ..., onde attributeX, seriam os atributos passados. 3. Given a objectBean obj, it finds for a objectBean in a Collection that has the same obj attributeBeans values. Like query SELECT b.* FROM beanClass b, obj WHERE b.attribute1 = obj.attribute1 AND b.attribute2 = obj.attribute2 AND ... , where attributeX would be attributes used in comparsion.
4. Dado um objeto obj da mesma classe de um determinado attributeBean, procura por um objectBean em uma coleção que possua attributeBean solicitado igual a obj. Equivalente a query SELECT * FROM beanClass WHERE attribute1 = ??? AND b.attribute2 = ??? AND ..., onde attributeX, seriam os atributos passados. 4. Given a object obj of same class of attributeBean, it finds a objectBean in a Collection whose attributeBean be equals than obj. Like query SELECT * FROM beanClass WHERE attribute1 = ??? AND b.attribute2 = ??? AND ..., where attributeX would be attributes used in comparsion.

Composição

O projeto consiste basicamente de duas classes:

Composition

Project consists basically of two classes

Origem

Esta classe foi desenvlvida originalmente para cobrir a falta da cláusula ORDER BY na EJB-QL da especificação EJB 2.0.

Origin

This class was originally made to cover ausence of ORDER BY clause in EJB-QL from EJB 2.0.

Requisito

Esta biblioteca funciona em ambiente Java 1.4.x ou superior.

Requirement

This library works in 1.4.x Java environment or later.

Como Funciona

A classe ComparatorReflector faz uso pesada da API de Reflection; mais exatamente das classes java.lang.Class e java.lang.reflect.Method para descobrir os métodos getters de beanClass relacionado a attributes. Por exemplo: Para os atributos chamados name e date, busca-se pelos métodos chamados getName e getDate. Se algum destes método não existirem, ou não forem públicos, ou não retornarem uma prmitiva ou instancia de java.lang.Comparable é disparada uma ComparatorReflectorException. Este métodos getters são adicionados a um array de java.lang.reflect.Method, de acordo com a ordem dos atributos

No método compare() as duas instancias de beanClass são comparadas para cada método getter dos atributos selecionados. Os valores destes métodos são convertidos para instâncias da interface java.lang.Comparable. Daí é usado o método compareTo() desta. Se o valor obtido for diferente de zero, é retornado este valor. Se for zero é sinal de que os valores destes atributos são iguais para ambos os objetos, e portanto passa-se para o próximo método getter.

Com a classe java.util.Collections são feitas as buscas e ordenações. Todas as Cheked Exceptions são capturadas para dispararem uma ComparatorReflectorException com uma mensagem explicando o que disparou tal exceção.

How It Works

ComparatorReflector class uses heavly Reflection API, more exactly from java.lang.Class and java.lang.reflect.Method classes to find beanClass getters methods related to attributes. For example: To find a attributes called name and date, it finds for methods called getName and getDate. If any of these methods do not exist, or they are not public or they do no return a primitive or a java.lang.Comparable instance, it is thrown a ComparatorReflectorException. These getters methods are added to a java.lang.reflect.Method array, according order of attributes.

In compare() method, both instance of beanClass are compared according selected attributes getter methods. Values from these methods are convert to java.lang.Comparable instances. So it use compareTo() from Comparable. If value got was zero, it return this value. If this value was zero, it means that attribute value are equals in both objects, so it go to next getter method.

All searches and ordinations are done with java.util.Collections class. All Cheked Exceptions are caught to trhow a ComparatorReflectorException. with a message explaining what threw this exception.

Modo de Usar

Nos exemplos a seguir, o beanClass chama-se myClass (original, não?? ;-)) e o attributesName chama-se names (trata-se de um array de String). comparator é o nome da instancia de ComparatorReflector usada.

Usage

In following examples, beanClass is called myClass (original, is not it? ;-)) and attributesName is called names (it is a String array). comparator is instance ComparatorReflector name.

Criar um ComparatorReflector

Create a ComparatorReflector

        ComparatorReflector comparator = new ComparatorReflector(myClass, names);
                        
ou
        ComparatorReflector comparator = new ComparatorReflector(myClass);
        comparator.setAttributes(names);
                        
ou
        ComparatorReflector comparator = new ComparatorReflector();
        comparator.setBeanClass(myClass);
        comparator.setAttributeName(names);
                        

Criar Lista ordenada

Create a sorted List

        List lista = comparator.getSortedList(collection);
                        

Achar máximo (ou mínimo) em uma Coleção

Find maximum (or minimum) in a Collection

        Object objMax = comparator.getMax(collection);
        Object objMin = comparator.getMin(collection);
                        

Achar por um ou vários objectBeans de uma Coleção que tenha o mesmo attributeBean de um outro objectBean

Find for one or more objectBeans from a Collection that had same attributeBean of another objectBean

        Object myObj = new MyClass();
        myObj.setName("myName");
        Collection searchedObjects = comparator.search(collection, myObj);
                        

Achar por um ou mais objectBeans de uma Coleção que tenha o mesmo attributeBean de um outro objectBean

Find for one or more objetcBeans from a Collection that has same attributeBean like another objectBean

        Collections searchedObjects = comparator.searchByAttribute(collection, myObj);
                        

Downloads

O Arquivo ComparatorReflector.zip contém as classes principais, as classes de teste (pacote comparatorreflctortest), o build.xml (buildfile do Ant), e a API do projeto. Atualmente está na versão 0.9.2. ComparatorReflector.zip contains the principal classes, tests classes (comparatorreflctortest package), build.xml (buildfile Ant) and project API. Currently it is in 0.9.2 version.

API

Apresenta o javadoc das duas classes do projeto, incluindo os métodos e atributos privados. It shows project classes javadoc, including private methods and attributes.

Contato

Contact

rafael-afonso@sourceforge.net

Agradecimentos

Ao pessoal do JavaFree e do GUJ pelo apoio às minhas dúvidas e à Embralog onde desenvolvi esta classe pela primeira vez.

Thanks

To people from JavaFree and GUJ by help to my doubts end Embralog where I developed this class at first time.

Contribuições

Como este é uma biblioteca Open Source, não faz sentido contribuições em dinheiro (mesmo por que são apenas duas pequenas classes). Mas se de alguma forma o programa te agradadou e pretende retibuir de alguma forma, mande-me um mapa de sua cidade ou estado/provincia ou de seu país para este endereço:

Contribuitions

How it is a Open Source library, it does not make sense contribuitions in money (anyway this project is only constitued for two small classes). But if you are enjoyned with this program and want retribuite anyway, please send me a map from your city, state/province or your country to this address:
R. Aúrea, 149, ap. 73 - Vila Mariana
CEP 04015-070
Sao Paulo, SP, Brazil

Copyrigth

Java™ is a trademark or registered trademark of Sun Microsystems, Inc. in the United States and other countries.