/*
* This code is distributed under The GNU Lesser General Public License (LGPLv3)
* Please visit GNU site for LGPLv3 http://www.gnu.org/copyleft/lesser.html
*
* Copyright Denis Pavlov 2009
* Web: http://www.genericdtoassembler.org
* SVN: https://svn.code.sf.net/p/geda-genericdto/code/trunk/
* SVN (mirror): http://geda-genericdto.googlecode.com/svn/trunk/
*/
package com.inspiresoftware.lib.dto.geda.assembler;
import com.inspiresoftware.lib.dto.geda.adapter.BeanFactory;
import com.inspiresoftware.lib.dto.geda.adapter.EntityRetriever;
import com.inspiresoftware.lib.dto.geda.assembler.examples.parent.*;
import com.inspiresoftware.lib.dto.geda.exception.GeDAException;
import com.inspiresoftware.lib.dto.geda.utils.ParameterizedSynthesizer;
import com.inspiresoftware.lib.dto.geda.utils.ParameterizedSynthesizer.Parameters;
import org.junit.Test;
import org.junit.runner.RunWith;
import java.util.*;
import static org.junit.Assert.*;
/**
* DTOAssembler test.
*
* @author Denis Pavlov
* @since 1.0.0
*
*/
@RunWith(value = ParameterizedSynthesizer.class)
public class DTOAssemblerDtoParentTest {
private static final long L_3 = 3L;
private String synthesizer;
/**
* @param synthesizer parameter
*/
public DTOAssemblerDtoParentTest(final String synthesizer) {
super();
this.synthesizer = synthesizer;
}
/**
* @return synthesizers keys
*/
@Parameters
public static Collection<String[]> data() {
final List<String[]> params = new ArrayList<String[]>();
for (final String param : MethodSynthesizerProxy.getAvailableSynthesizers()) {
params.add(new String[] { param });
}
return params;
}
/**
* Test that when dto field is additionally annotated with dto parent when writing
* back data from dto to entity the assembler does not copy the values but uses
* {@link com.inspiresoftware.lib.dto.geda.adapter.EntityRetriever} to delegate the setting of value.
*
* @throws GeDAException exception
*/
@Test
public void testDtoParentAnnotation() throws GeDAException {
final TestEntity11ParentInterface parentEntity = new TestEntity11ParentClass();
final String parentName = "parent with id 3";
parentEntity.setEntityId(L_3);
parentEntity.setName(parentName);
final TestEntity11ChildInterface childEntity = new TestEntity11ChildClass();
final String childName = "child of parent with id 3";
childEntity.setParent(parentEntity);
childEntity.setName(childName);
final TestDto11ChildInterface childDto = new TestDto11ChildClass();
final Assembler assembler =
DTOAssembler.newCustomAssembler(childDto.getClass(), childEntity.getClass(), synthesizer);
assembler.assembleDto(childDto, childEntity, null, createDtoBeanFactory());
assertEquals(childName, childDto.getName());
assertNotNull(childDto.getParent());
assertEquals(parentName, childDto.getParent().getName());
assertEquals(Long.valueOf(L_3), Long.valueOf(childDto.getParent().getEntityId()));
final TestEntity11ParentInterface parentEntity2 = new TestEntity11ParentClass();
final String parentName2 = "parent with id 0";
parentEntity2.setEntityId(0);
parentEntity2.setName(parentName2);
// change dto parent.
childDto.getParent().setEntityId(0L);
childDto.setName("child with changed parent");
final Map<String, Object> conv = createMapWithEntityRetriever(parentEntity2, Long.valueOf(0));
assembler.assembleEntity(childDto, childEntity, conv, createEntityBeanFactory());
assertNotNull(childEntity.getParent());
assertSame(parentEntity2, childEntity.getParent());
assertEquals("child with changed parent", childEntity.getName());
}
private BeanFactory createEntityBeanFactory() {
return new BeanFactory() {
public Class getClazz(final String entityBeanKey) {
return null;
}
public Object get(final String entityBeanKey) {
if (entityBeanKey.equals("com.inspiresoftware.lib.dto.geda.assembler.TestEntity11ParentClass")) {
return new TestEntity11ParentClass();
}
return null;
}
};
}
private BeanFactory createDtoBeanFactory() {
return new BeanFactory() {
public Class getClazz(final String entityBeanKey) {
return null;
}
public Object get(final String entityBeanKey) {
if (entityBeanKey.equals("com.inspiresoftware.lib.dto.geda.assembler.TestDto11ParentClass")) {
return new TestDto11ParentClass();
}
return null;
}
};
}
private Map<String, Object> createMapWithEntityRetriever(final TestEntity11ParentInterface parentEntity2, final Object idExpectations) {
final EntityRetriever retriever = new EntityRetriever() {
@SuppressWarnings("unchecked")
public Object retrieveByPrimaryKey(final Class entityInterface, final Class entityClass, final Object primaryKey) {
assertEquals(idExpectations, primaryKey);
assertTrue(entityInterface.equals(TestEntity11ParentInterface.class));
assertTrue(entityClass.equals(TestEntity11ParentClass.class));
return parentEntity2;
}
};
final Map<String, Object> conv = new HashMap<String, Object>();
conv.put("retriever", retriever);
return conv;
}
/**
* Test to make sure that if dto parent field is null it is set to null in entity.
*
* @throws GeDAException exception
*/
@Test
public void testDtoParentIsSetToNullIfDtoDataIsNull() throws GeDAException {
final TestEntity11ParentInterface parentEntity = new TestEntity11ParentClass();
final String parentName = "parent with id 3";
parentEntity.setEntityId(L_3);
parentEntity.setName(parentName);
final TestEntity11ChildInterface childEntity = new TestEntity11ChildClass();
final String childName = "child of parent with id 3";
childEntity.setParent(parentEntity);
childEntity.setName(childName);
final TestDto11ChildInterface childDto = new TestDto11ChildClass();
final Assembler assembler =
DTOAssembler.newCustomAssembler(childDto.getClass(), childEntity.getClass(), synthesizer);
assembler.assembleEntity(childDto, childEntity, null, null);
assertNotNull(childEntity);
assertNull(childEntity.getParent());
}
}