Skip to content

Commit

Permalink
Complete assembler DSL use cases
Browse files Browse the repository at this point in the history
Add use cases with lists for dto, aggregate and tuple.
Delete the AssemblerContext which was passed between
DSL elements. This last change also fixed some bugs.
  • Loading branch information
pith committed Apr 24, 2015
1 parent 5c094fe commit 6a76d17
Show file tree
Hide file tree
Showing 38 changed files with 1,050 additions and 487 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ public class AssemblerDslWithTupleIT {
public void testAssembleFromFactory() {
Recipe recipe = new Recipe("customer1", "luke", "order1", "light saber");

Pair<Order, Customer> orderCustomerPair = fluently.assemble().dto(recipe).<Pair<Order, Customer>>to(Order.class, Customer.class).fromFactory();
Pair<Order, Customer> orderCustomerPair = fluently.assemble().dto(recipe).to(Order.class, Customer.class).fromFactory();

Assertions.assertThat(orderCustomerPair.getValue0()).isNotNull();
Assertions.assertThat(orderCustomerPair.getValue0().getEntityId()).isEqualTo("order1");
Expand All @@ -71,7 +71,7 @@ public void testAssembleFromRepository() {

Pair<Order, Customer> orderCustomerPair = null;
try {
orderCustomerPair = fluently.assemble().dto(recipe).<Pair<Order, Customer>>to(Order.class, Customer.class).fromRepository().orFail();
orderCustomerPair = fluently.assemble().dto(recipe).to(Order.class, Customer.class).fromRepository().orFail();
} catch (AggregateNotFoundException e) {
fail();
}
Expand All @@ -86,8 +86,9 @@ public void testAssembleFromRepository() {
@Test
@Ignore
public void testAssembleFromRepositoryOrFail() {
Recipe recipe = new Recipe("customer1", "luke", "order1", "light saber");
try {
fluently.assemble().dto(new OrderDto("1", "light saber")).to(Order.class).fromRepository().orFail();
fluently.assemble().dto(recipe).to(Order.class, Customer.class).fromRepository().orFail();
fail();
} catch (AggregateNotFoundException e) {
Assertions.assertThat(e).isNotNull();
Expand All @@ -97,15 +98,16 @@ public void testAssembleFromRepositoryOrFail() {
@Test
@Ignore
public void testAssembleFromRepositoryOrFactory() {
OrderDto dto = new OrderDto("1", "light saber", PRICE);
Recipe recipe = new Recipe("customer1", "luke", "order1", "light saber");

Order aggregateRoot = fluently.assemble().dto(dto).to(Order.class).fromRepository().thenFromFactory();
Pair<Order, Customer> orderCustomerPair = fluently.assemble().dto(recipe).to(Order.class, Customer.class).fromRepository().thenFromFactory();

Assertions.assertThat(aggregateRoot).isNotNull();
Assertions.assertThat(aggregateRoot.getEntityId()).isEqualTo("1");
Assertions.assertThat(aggregateRoot.getProduct()).isEqualTo("light saber");
// the customer name is not part of the factory parameters, but so it should be set by the assembler
Assertions.assertThat(aggregateRoot.getPrice()).isEqualTo(PRICE);
Assertions.assertThat(orderCustomerPair.getValue0()).isNotNull();
Assertions.assertThat(orderCustomerPair.getValue0().getEntityId()).isEqualTo("order1");
Assertions.assertThat(orderCustomerPair.getValue0().getProduct()).isEqualTo("light saber");
// the customer name is not part of the factory parameters, so it is set by the assembler
Assertions.assertThat(orderCustomerPair.getValue1().getEntityId()).isEqualTo("customer1");
Assertions.assertThat(orderCustomerPair.getValue1().getName()).isEqualTo("luke");
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
*/
package org.seedstack.business.assembler.dsl;

import com.google.common.collect.Lists;
import org.assertj.core.api.Assertions;
import org.junit.Test;
import org.junit.runner.RunWith;
Expand All @@ -23,9 +24,12 @@
import org.seedstack.business.core.interfaces.DefaultAssembler;
import org.seedstack.business.core.interfaces.assembler.dsl.InternalRegistry;
import org.seedstack.business.core.interfaces.assembler.dsl.fixture.AutoAssembler;
import org.seedstack.business.core.interfaces.assembler.dsl.fixture.Customer;
import org.seedstack.business.core.interfaces.assembler.dsl.fixture.Recipe;
import org.seedstack.seed.it.SeedITRunner;

import javax.inject.Inject;
import java.util.List;

/**
* Tests the DSL internal registry.
Expand Down Expand Up @@ -74,6 +78,13 @@ public void testAssemblerOfWithDefaultAssembler() {
Assertions.assertThat(assembler.getClass()).isEqualTo(expectedAutomaticAssembler.getClass());
}

@Test
public void testAssemblerOfTuple() {
List<?> aggregateRootTuple = Lists.newArrayList(org.seedstack.business.core.interfaces.assembler.dsl.fixture.Order.class, Customer.class);
Assembler<?, ?> assembler = registry.tupleAssemblerOf((List<Class<? extends AggregateRoot<?>>>) aggregateRootTuple, Recipe.class);
Assertions.assertThat(assembler).isNotNull();
}

@Test
public void testAssemblerOfWithAutomaticAssembler() {
Assembler<?, ?> assembler = registry.assemblerOf(org.seedstack.business.core.interfaces.assembler.dsl.fixture.Order.class
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ protected A doLoad(K id) {
return null;
}


@Override
protected void doDelete(K id) {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@
*/
public abstract class AutomaticAssembler<A extends AggregateRoot<?>, D> extends AbstractBaseAssembler<A, D> {

protected Class<A> aggregateClass;
protected Class<D> dtoClass;
private ModelMapper assembleModelMapper;
private ModelMapper mergeModelMapper;
Expand All @@ -37,16 +36,14 @@ public AutomaticAssembler() {
// TODO <pith> : check modelmappers are not null

Class<? extends BaseAssembler> class1 = (Class<? extends BaseAssembler>) SeedReflectionUtils.cleanProxy(getClass());
aggregateClass = (Class<A>) TypeResolver.resolveRawArguments(class1.getGenericSuperclass(), class1)[0];
dtoClass = (Class<D>) TypeResolver.resolveRawArguments(class1.getGenericSuperclass(), class1)[1];
}

public AutomaticAssembler(Class<A> aggregateClass, Class<D> dtoClass) {
public AutomaticAssembler(Class<D> dtoClass) {
assembleModelMapper = configureAssembly();
mergeModelMapper = configureMerge();
// TODO <pith> : check modelmappers are not null

this.aggregateClass = aggregateClass;
this.dtoClass = dtoClass;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,8 @@
import org.modelmapper.ModelMapper;
import org.seedstack.business.api.interfaces.assembler.AbstractBaseAssembler;
import org.seedstack.business.api.interfaces.assembler.BaseTupleAssembler;
import org.seedstack.business.api.Tuples;
import org.seedstack.seed.core.utils.SeedReflectionUtils;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

/**
* This assembler automatically assembles aggregates in DTO and vice versa.
*
Expand All @@ -30,7 +26,6 @@
*/
public abstract class AutomaticTupleAssembler<T extends Tuple, D> extends AbstractBaseAssembler<T, D> {

protected ParameterizedType aggregateClasses;
protected Class<D> dtoClass;
private ModelMapper assembleModelMapper;
private ModelMapper mergeModelMapper;
Expand All @@ -42,25 +37,10 @@ public AutomaticTupleAssembler() {
// TODO <pith> : check modelmappers are not null

Class<? extends BaseTupleAssembler> class1 = (Class<? extends BaseTupleAssembler>) SeedReflectionUtils.cleanProxy(getClass());
ParameterizedType p1 = (ParameterizedType) class1.getGenericSuperclass();
// descendant of tuple.
ParameterizedType tupleType = (ParameterizedType) p1.getActualTypeArguments()[0];

Type rawTupleType = tupleType.getRawType();
Class<? extends Tuple> tupleClass = (Class<? extends Tuple>) rawTupleType;
Type[] actualTypeArguments = tupleType.getActualTypeArguments();
int length = actualTypeArguments.length;
Class[] aggregateClassesArray = new Class[length];

System.arraycopy(actualTypeArguments, 0, aggregateClassesArray, 0, length);

aggregateClasses = Tuples.typeOfTuple(aggregateClassesArray);

dtoClass = (Class<D>) TypeResolver.resolveRawArguments(class1.getGenericSuperclass(), class1)[1];
}

public AutomaticTupleAssembler(ParameterizedType aggregateClasses, Class<D> dtoClass) {
this.aggregateClasses = aggregateClasses;
public AutomaticTupleAssembler(Class<D> dtoClass) {
this.dtoClass = dtoClass;

assembleModelMapper = configureAssembly();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ public class DefaultAssembler<A extends AggregateRoot<?>,D> extends AutomaticAss
@SuppressWarnings("unchecked")
@Inject
public DefaultAssembler(@Assisted Object[] genericClasses) {
super((Class) genericClasses.clone()[0], (Class) genericClasses.clone()[1]);
super((Class) genericClasses.clone()[1]);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@
import org.modelmapper.ModelMapper;

import javax.inject.Inject;
import java.lang.reflect.ParameterizedType;

/**
* This class is a default tuple assembler based on ModelMapper.
Expand All @@ -32,7 +31,8 @@ public class DefaultTupleAssembler<T extends Tuple, D> extends AutomaticTupleAss
@SuppressWarnings("unchecked")
@Inject
public DefaultTupleAssembler(@Assisted Object[] genericClasses) {
super((ParameterizedType) genericClasses.clone()[0], (Class) genericClasses.clone()[1]);
// TODO the first parameter is useless remove it
super((Class) genericClasses.clone()[1]);
}

@Override
Expand Down
Loading

0 comments on commit 6a76d17

Please sign in to comment.