package gcom.util;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
* @author Marcelo Garcia
*/
public class MergeProperties {
/**
* Realiza o merge dos valores do objeto origem para o objeto destino.
*
* Os metodos que sao capturados pelo algoritmo sao metodos GET e que nao
* possuem parametro.
*
* Os valores sao capturados a partir dos metodos GET existentes na classe
* origem. Isso quer dizer que caso o destino seja uma subclasse de origem,
* os seus metodos nao serao reconhecidos.
*
* Somente valores nao nulos sao passados de origem para destino. Campos
* string vazios e numericos zerados sao permitidos.
*
* @param <c>
* @param destino : Recebera os valores de origem
* @param origem : Objeto cujas propriedades serao transferidas para o destino
* @return o objeto modificado
*/
public static <C> C mergeProperties(C destino, C origem) {
Method[] metodos = origem.getClass().getMethods();
String nomeMetodo;
String nomeMetodoSemGet = "";
for (Method metodo : metodos) {
try {
nomeMetodo = metodo.getName();
nomeMetodoSemGet = nomeMetodo.substring(3, nomeMetodo.length());
// Testa se � um m�todo get
if (!nomeMetodo.substring(0, 3).equals("get"))
continue;
if (metodo.getParameterTypes().length != 0)
continue;
// Captura o metodo SET de acordo com o tipo de retorno do metodo GET
Method metodoSET = destino.getClass().getMethod("set" + nomeMetodoSemGet, metodo.getReturnType());
if (metodo != null){
Object valor = metodo.invoke(origem);
metodoSET.invoke(destino, valor);
}
} catch (NoSuchMethodException e) {
} catch (InvocationTargetException e) {
System.out.println("Chamada de metodo incorreta." + nomeMetodoSemGet);
} catch (IllegalAccessException e) {
System.out.println("Metodo inacessivel." + nomeMetodoSemGet);
} catch (IllegalArgumentException e) {
System.out.println("Argumentos incorretos." + nomeMetodoSemGet);
}
}
return destino;
}
@SuppressWarnings("rawtypes")
public static <C> C mergeInterfaceProperties(C destino, C origem) {
Class[] interfaces = origem.getClass().getInterfaces();
for (Class interfaceClass : interfaces) {
Method[] metodos = interfaceClass.getMethods();
String nomeMetodo;
String nomeMetodoSemGet;
for (Method metodo : metodos) {
try {
nomeMetodo = metodo.getName();
nomeMetodoSemGet = nomeMetodo.substring(3, nomeMetodo.length());
// Testa se � um m�todo get
if (!nomeMetodo.substring(0, 3).equals("get"))
continue;
if (metodo.getParameterTypes().length != 0)
continue;
Object valor = metodo.invoke(origem);
if (valor == null)
continue;
// Captura o metodo SET de acordo com o tipo de retorno do metodo GET
Method metodoSET = destino.getClass().getMethod("set" + nomeMetodoSemGet, metodo.getReturnType());
if (metodo != null)
metodoSET.invoke(destino, valor);
} catch (NoSuchMethodException e) {
System.out.println("Metodo nao encontrado.");
} catch (InvocationTargetException e) {
System.out.println("Chamada de metodo incorreta.");
} catch (IllegalAccessException e) {
System.out.println("Metodo inacessivel.");
} catch (IllegalArgumentException e) {
System.out.println("Argumentos incorretos.");
}
}
}
return destino;
}
}