/*
* 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.examples.usecases.dsl;
import com.inspiresoftware.lib.dto.geda.adapter.BeanFactory;
import com.inspiresoftware.lib.dto.geda.adapter.EntityRetriever;
import com.inspiresoftware.lib.dto.geda.adapter.ExtensibleBeanFactory;
import com.inspiresoftware.lib.dto.geda.adapter.ValueConverter;
import com.inspiresoftware.lib.dto.geda.assembler.DTOAssembler;
import com.inspiresoftware.lib.dto.geda.dsl.Registries;
import com.inspiresoftware.lib.dto.geda.examples.usecases.SimpleMapExtensibleBeanFactory;
import java.util.HashMap;
import java.util.Map;
import static org.junit.Assert.*;
/**
* User: denispavlov
* Date: 13-04-22
* Time: 5:59 PM
*/
public class RunDSLReuseMapping {
/**
* Example of how mapping from one DTO-Entity context can be copied to
* another DTO-Entity context to reduce code duplication.
*/
public void reuseMapping() {
final ExtensibleBeanFactory bf = new SimpleMapExtensibleBeanFactory();
final com.inspiresoftware.lib.dto.geda.dsl.Registry registry = Registries.registry(bf);
bf.registerDto("myDto", MyDtoClass.class.getCanonicalName());
bf.registerDto("myDtoField3Dto", MyDtoField3Class.class.getCanonicalName());
bf.registerEntity("myEntityField3Entity", MyEntityField3Class.class.getCanonicalName(), MyEntityField3Class.class.getCanonicalName());
bf.registerDto("field4ParentDto", MyDtoField4Class.class.getCanonicalName());
bf.registerEntity("field4ParentEntity", MyEntityField4Class.class.getCanonicalName(), MyEntityField4Class.class.getCanonicalName());
registry
// main mapping
.dto("myDto").forEntity(MyEntity.class)
// field 1
.withField("field1").forField("field1")
.readOnly()
.converter("field1Converter")
// field 2
.and()
.withField("field2").forField("field2.subField1").entityBeanKeys("field2")
// field 5
.and()
.withField("field5virtual").forVirtual()
.converter("field5VirtualConverter")
;
registry.dto("myDto").useContextFor(
registry
// main mapping
.dto("myDto").forEntity(MyEntity.class),
Map.class
);
final Map<String, Object> conv = new HashMap<String, Object>();
conv.put("field1Converter", new ValueConverter() {
public Object convertToDto(final Object object, final BeanFactory beanFactory) {
final MyEntity.Field1 field1 = (MyEntity.Field1) object;
return Boolean.valueOf(field1 == MyEntity.Field1.YES);
}
public Object convertToEntity(final Object object, final Object oldEntity, final BeanFactory beanFactory) {
if ((Boolean) object) {
return MyEntity.Field1.YES;
}
return MyEntity.Field1.NO;
}
});
conv.put("field5VirtualConverter", new ValueConverter() {
public Object convertToDto(final Object object, final BeanFactory beanFactory) {
return String.valueOf(object.hashCode());
}
public Object convertToEntity(final Object object, final Object oldEntity, final BeanFactory beanFactory) {
((Map) oldEntity).put("virtual5", object);
return null;
}
});
conv.put("parentFieldEntityById", new EntityRetriever() {
public Object retrieveByPrimaryKey(final Class entityInterface, final Class entityClass, final Object primaryKey) {
final MyEntityField4Class parent = new MyEntityField4Class();
parent.setId(99L);
parent.setSubField1("Parent 99");
return parent;
}
});
// create asm for interface
DTOAssembler.newAssembler(MyDtoClass.class, Map.class, registry);
final Map<String, Object> entity = new HashMap<String, Object>();
entity.put("field1", MyEntity.Field1.YES);
entity.put("field2", "my sub data 1");
entity.put("field5virtual", "virtual");
final MyDtoClass dto = new MyDtoClass();
// create asm for class and make sure it picks up on interface
DTOAssembler.newAssembler(MyDtoClass.class, entity.getClass(), registry).assembleDto(dto, entity, conv, bf);
assertTrue(dto.getField1());
assertEquals(dto.getField2(), "my sub data 1");
assertEquals(dto.getField5virtual(), String.valueOf(entity.hashCode()));
final Map<String, Object> toEntity = new HashMap<String, Object>();
// create asm for class and make sure it picks up on interface
DTOAssembler.newAssembler(MyDtoClass.class, entity.getClass(), registry).assembleEntity(dto, toEntity, conv, bf);
assertNull(toEntity.get("field1")); // it is read only
assertEquals(toEntity.get("field2"), "my sub data 1");
assertEquals(toEntity.get("virtual5"), dto.getField5virtual());
}
public static void main(String[] args) {
new RunDSLReuseMapping().reuseMapping();
}
}