/**
* Axelor Business Solutions
*
* Copyright (C) 2016 Axelor (<http://axelor.com>).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License, version 3,
* as published by the Free Software Foundation.
*
* 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.axelor.apps.tool;
import java.lang.reflect.Field;
import java.lang.reflect.Member;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;
import org.joda.time.LocalDate;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import com.axelor.apps.tool.db.Contact;
public class InvokationTest {
protected static final Member INVALID_MEMBER;
static {
Member invalidMember;
try {
invalidMember = InvokationTest.class.getDeclaredField("INVALID_MEMBER");
} catch (NoSuchFieldException ex) {
invalidMember = null;
} catch (SecurityException ex) {
invalidMember = null;
}
INVALID_MEMBER = invalidMember;
}
/** Cache exact attribute class and property reflection Member object */
protected static final Map<Class<?>, Map<String, Member>> membersCache =
new HashMap<Class<?>, Map<String, Member>>();
public Contact contact;
@Before
public void prepareTest() {
contact = new Contact("Durand","Pierre");
contact.setEmail("@test.com");
contact.setFullName(contact.getFullName());
contact.setDateOfBirth(new LocalDate());
contact.setPayeurQuality(new BigDecimal("2.2569"));
contact.setLanguage("fr");
}
@Test
public void test() {
for (int i = 0; i < 100000; i++) {
ThreadTest thread = new ThreadTest();
thread.run();
}
}
class ThreadTest extends Thread {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
Object valueEmail = getProperty(contact, "email");
Assert.assertEquals(contact.getEmail(), valueEmail);
Object valueFullName = getProperty(contact, "fullName");
Assert.assertEquals(contact.getFullName(), valueFullName);
Object valueFisrtName = getProperty(contact, "firstName");
Assert.assertEquals(contact.getFirstName(), valueFisrtName);
Object valueLastName = getProperty(contact, "lastName");
Assert.assertEquals(contact.getLastName(), valueLastName);
Object valueDateOfBirth = getProperty(contact, "dateOfBirth");
Assert.assertEquals(contact.getDateOfBirth(), valueDateOfBirth);
Object valuePayeurQuality = getProperty(contact, "payeurQuality");
Assert.assertEquals(contact.getPayeurQuality(), valuePayeurQuality);
Object valueLanguage = getProperty(contact, "language");
Assert.assertEquals("fr", valueLanguage);
}
}
}
public synchronized Object getProperty(Object o, String property) {
if (o == null) {
throw new NullPointerException("o");
}
Class<?> c = o.getClass();
if ( property==null ) {
return null;
}
Member member = findMember(c, property);
if ( member!=null ) {
try {
if (member instanceof Method) {
return ((Method)member).invoke(o);
}
else if (member instanceof Field) {
return ((Field)member).get(o);
}
}
catch (Exception e) {
}
}
return null;
}
public static Member findMember(Class<?> clazz, String memberName) {
if (clazz == null) {
throw new NullPointerException("clazz");
}
if (memberName == null) {
throw new NullPointerException("memberName");
}
synchronized (membersCache) {
Map<String, Member> members = membersCache.get(clazz);
Member member = null;
if (members != null) {
member = members.get(memberName);
if (member != null) {
return member != INVALID_MEMBER ? member : null;
}
}
else {
members = new HashMap<String, Member>();
membersCache.put(clazz, members);
}
// try getXXX and isXXX properties, look up using reflection
String methodSuffix = Character.toUpperCase(memberName.charAt(0)) +
memberName.substring(1, memberName.length());
member = tryGetMethod(clazz, "get" + methodSuffix);
if (member == null) {
member = tryGetMethod(clazz, "is" + methodSuffix);
if (member == null) {
member = tryGetMethod(clazz, "has" + methodSuffix);
}
}
if (member == null) {
// try for a visible field
member = tryGetField(clazz, memberName);
}
members.put(memberName, member != null ? member : INVALID_MEMBER);
return member;
}
}
protected static Method tryGetMethod(Class<?> clazz, String methodName) {
try {
Method method = clazz.getMethod(methodName);
if (method != null) {
method.setAccessible(true);
}
return method;
} catch (NoSuchMethodException ex) {
} catch (SecurityException ex) {
}
return null;
}
protected static Field tryGetField(Class<?> clazz, String fieldName) {
try {
Field field = clazz.getField(fieldName);
if (field != null) {
field.setAccessible(true);
}
return field;
} catch (NoSuchFieldException ex) {
} catch (SecurityException ex) {
}
return null;
}
}