// $HeadURL$ // $Id$ // // Copyright © 2006, 2010, 2011, 2012 by the President and Fellows of Harvard College. // // Screensaver is an open-source project developed by the ICCB-L and NSRB labs // at Harvard Medical School. This software is distributed under the terms of // the GNU General Public License. package edu.harvard.med.screensaver.model.entitytesters; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.lang.reflect.Type; import javax.persistence.EntityManagerFactory; import javax.persistence.metamodel.IdentifiableType; import javax.persistence.metamodel.ManagedType; import javax.persistence.metamodel.SingularAttribute; import org.apache.log4j.Logger; import edu.harvard.med.screensaver.model.AbstractEntity; import edu.harvard.med.screensaver.test.model.meta.ModelIntrospectionUtil; /** * Tests that the identifier getter method is public, the identifier getter method is private, * both are instance, and the arg/return types match. */ public class IdentifierAccessorModifiersTester<E extends AbstractEntity> extends AbstractEntityTester<E> { private static Logger log = Logger.getLogger(IdentifierAccessorModifiersTester.class); public IdentifierAccessorModifiersTester(Class<E> entityClass, EntityManagerFactory sessionFactory) { super(entityClass, sessionFactory); } @Override public void testEntity() { testIdentifierAccessorModifiers(); } /** * Test that the identifier getter method is public, the identifier getter method is private, * both are instance, and the arg/return types match. */ private void testIdentifierAccessorModifiers() { if (ModelIntrospectionUtil.isEntitySubclass(_entityClass)) { // entity subclasses depend on their superclass for identifier methods, // which will be tested when that superclass is tested return; } String identifierPropertyName; ManagedType<? extends AbstractEntity> type = _entityManagerFactory.getMetamodel().managedType(_entityClass); Class idType = ((IdentifiableType) type).getIdType().getJavaType(); SingularAttribute id = ((IdentifiableType) type).getId(idType); identifierPropertyName = id.getName(); Method identifierGetter = ModelIntrospectionUtil.getGetterMethodForPropertyName(_entityClass, identifierPropertyName); assertTrue("public entity ID getter for " + _entityClass, Modifier.isPublic(identifierGetter.getModifiers())); assertFalse("instance entity ID getter for " + _entityClass, Modifier.isStatic(identifierGetter.getModifiers())); Type identifierType = identifierGetter.getGenericReturnType(); assertNotNull("identifier getter returns type", identifierType); Method identifierSetter = ModelIntrospectionUtil.getSetterMethodForPropertyName(_entityClass, identifierPropertyName, (Class) identifierType); assertTrue("private entity ID setter for " + _entityClass, Modifier.isPrivate(identifierSetter.getModifiers())); assertFalse("instance entity ID setter for " + _entityClass, Modifier.isStatic(identifierSetter.getModifiers())); } }