From 92abd44598504bb3cc80f585ea81e27384365048 Mon Sep 17 00:00:00 2001 From: Justin Albano Date: Tue, 19 Sep 2017 23:27:56 -0400 Subject: [PATCH] Made refactorings and added more explicit annotations to OrderController --- .../rest/controller/OrderController.java | 4 +-- .../example/rest/repository/IdGenerator.java | 9 +++-- .../rest/repository/InMemoryRepository.java | 3 +- .../rest/repository/OrderRepository.java | 2 -- .../rest/resource/OrderResourceAssembler.java | 7 +++- .../rest/resource/ResourceAssembler.java | 33 ++++++++----------- .../test/unit/repository/IdGeneratorTest.java | 33 +++++++++++++++++++ .../{ => repository}/OrderRepositoryTest.java | 8 ++--- 8 files changed, 67 insertions(+), 32 deletions(-) create mode 100644 src/test/java/com/dzone/albanoj2/example/rest/test/unit/repository/IdGeneratorTest.java rename src/test/java/com/dzone/albanoj2/example/rest/test/unit/{ => repository}/OrderRepositoryTest.java (95%) diff --git a/src/main/java/com/dzone/albanoj2/example/rest/controller/OrderController.java b/src/main/java/com/dzone/albanoj2/example/rest/controller/OrderController.java index 13a49b2..5b01ed8 100644 --- a/src/main/java/com/dzone/albanoj2/example/rest/controller/OrderController.java +++ b/src/main/java/com/dzone/albanoj2/example/rest/controller/OrderController.java @@ -36,7 +36,7 @@ public ResponseEntity> findAllOrders() { return new ResponseEntity<>(assembler.toResourceCollection(orders), HttpStatus.OK); } - @RequestMapping(method = RequestMethod.POST) + @RequestMapping(method = RequestMethod.POST, consumes = "application/json") public ResponseEntity createOrder(@RequestBody Order order) { Order createdOrder = repository.create(order); return new ResponseEntity<>(assembler.toResource(createdOrder), HttpStatus.CREATED); @@ -61,7 +61,7 @@ public ResponseEntity deleteOrder(@PathVariable Long id) { return new ResponseEntity<>(responseStatus); } - @RequestMapping(value = "/{id}", method = RequestMethod.PUT) + @RequestMapping(value = "/{id}", method = RequestMethod.PUT, consumes = "application/json") public ResponseEntity updateOrder(@PathVariable Long id, @RequestBody Order updatedOrder) { boolean wasUpdated = repository.update(id, updatedOrder); diff --git a/src/main/java/com/dzone/albanoj2/example/rest/repository/IdGenerator.java b/src/main/java/com/dzone/albanoj2/example/rest/repository/IdGenerator.java index 4dd05a1..869493a 100644 --- a/src/main/java/com/dzone/albanoj2/example/rest/repository/IdGenerator.java +++ b/src/main/java/com/dzone/albanoj2/example/rest/repository/IdGenerator.java @@ -1,13 +1,18 @@ package com.dzone.albanoj2.example.rest.repository; +import java.util.concurrent.atomic.AtomicLong; + +import org.springframework.beans.factory.config.BeanDefinition; +import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @Component +@Scope(BeanDefinition.SCOPE_PROTOTYPE) public class IdGenerator { - private long nextId = 1; + private AtomicLong nextId = new AtomicLong(1); public long getNextId() { - return nextId++; + return nextId.getAndIncrement(); } } diff --git a/src/main/java/com/dzone/albanoj2/example/rest/repository/InMemoryRepository.java b/src/main/java/com/dzone/albanoj2/example/rest/repository/InMemoryRepository.java index 7f3f207..60496e1 100644 --- a/src/main/java/com/dzone/albanoj2/example/rest/repository/InMemoryRepository.java +++ b/src/main/java/com/dzone/albanoj2/example/rest/repository/InMemoryRepository.java @@ -1,6 +1,7 @@ package com.dzone.albanoj2.example.rest.repository; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Optional; @@ -14,7 +15,7 @@ public abstract class InMemoryRepository { @Autowired private IdGenerator idGenerator; - private List elements = new ArrayList<>(); + private List elements = Collections.synchronizedList(new ArrayList<>()); public T create(T element) { elements.add(element); diff --git a/src/main/java/com/dzone/albanoj2/example/rest/repository/OrderRepository.java b/src/main/java/com/dzone/albanoj2/example/rest/repository/OrderRepository.java index 6931ebd..4b70e67 100644 --- a/src/main/java/com/dzone/albanoj2/example/rest/repository/OrderRepository.java +++ b/src/main/java/com/dzone/albanoj2/example/rest/repository/OrderRepository.java @@ -1,12 +1,10 @@ package com.dzone.albanoj2.example.rest.repository; -import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Repository; import com.dzone.albanoj2.example.rest.domain.Order; @Repository -@Scope("singleton") public class OrderRepository extends InMemoryRepository { protected void updateIfExists(Order original, Order updated) { diff --git a/src/main/java/com/dzone/albanoj2/example/rest/resource/OrderResourceAssembler.java b/src/main/java/com/dzone/albanoj2/example/rest/resource/OrderResourceAssembler.java index 162a3b8..3a135a6 100644 --- a/src/main/java/com/dzone/albanoj2/example/rest/resource/OrderResourceAssembler.java +++ b/src/main/java/com/dzone/albanoj2/example/rest/resource/OrderResourceAssembler.java @@ -1,5 +1,7 @@ package com.dzone.albanoj2.example.rest.resource; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.hateoas.EntityLinks; import org.springframework.hateoas.Link; import org.springframework.stereotype.Component; @@ -7,6 +9,9 @@ @Component public class OrderResourceAssembler extends ResourceAssembler { + + @Autowired + protected EntityLinks entityLinks; private static final String UPDATE_REL = "update"; private static final String DELETE_REL = "delete"; @@ -16,7 +21,7 @@ public OrderResource toResource(Order order) { OrderResource resource = new OrderResource(order); - final Link selfLink = entityLinks.linkToSingleResource(Order.class, order.getId()); + final Link selfLink = entityLinks.linkToSingleResource(order); resource.add(selfLink.withSelfRel()); resource.add(selfLink.withRel(UPDATE_REL)); diff --git a/src/main/java/com/dzone/albanoj2/example/rest/resource/ResourceAssembler.java b/src/main/java/com/dzone/albanoj2/example/rest/resource/ResourceAssembler.java index 9d271f0..4f9dc94 100644 --- a/src/main/java/com/dzone/albanoj2/example/rest/resource/ResourceAssembler.java +++ b/src/main/java/com/dzone/albanoj2/example/rest/resource/ResourceAssembler.java @@ -1,20 +1,13 @@ -package com.dzone.albanoj2.example.rest.resource; - -import java.util.Collection; -import java.util.stream.Collectors; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.hateoas.EntityLinks; - -public abstract class ResourceAssembler { - - @Autowired - protected EntityLinks entityLinks; - - public abstract ResourceType toResource(DomainType domainObject); - - public Collection toResourceCollection(Collection domainObjects) { - return domainObjects.stream().map(o -> toResource(o)).collect(Collectors.toList()); - } - -} +package com.dzone.albanoj2.example.rest.resource; + +import java.util.Collection; +import java.util.stream.Collectors; + +public abstract class ResourceAssembler { + + public abstract ResourceType toResource(DomainType domainObject); + + public Collection toResourceCollection(Collection domainObjects) { + return domainObjects.stream().map(o -> toResource(o)).collect(Collectors.toList()); + } +} diff --git a/src/test/java/com/dzone/albanoj2/example/rest/test/unit/repository/IdGeneratorTest.java b/src/test/java/com/dzone/albanoj2/example/rest/test/unit/repository/IdGeneratorTest.java new file mode 100644 index 0000000..53d08f3 --- /dev/null +++ b/src/test/java/com/dzone/albanoj2/example/rest/test/unit/repository/IdGeneratorTest.java @@ -0,0 +1,33 @@ +package com.dzone.albanoj2.example.rest.test.unit.repository; + +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.annotation.DirtiesContext.ClassMode; +import org.springframework.test.context.junit4.SpringRunner; + +import com.dzone.albanoj2.example.rest.repository.IdGenerator; + + +@RunWith(SpringRunner.class) +@SpringBootTest +@DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD) +public class IdGeneratorTest { + + @Autowired + private IdGenerator generator1; + + @Autowired + private IdGenerator generator2; + + @Test + public void testMultipleGeneratorsEnsureGeneratorsDoNotInterfere() throws Exception { + Assert.assertEquals(1, generator1.getNextId()); + Assert.assertEquals(2, generator1.getNextId()); + Assert.assertEquals(1, generator2.getNextId()); + Assert.assertEquals(2, generator2.getNextId()); + } +} diff --git a/src/test/java/com/dzone/albanoj2/example/rest/test/unit/OrderRepositoryTest.java b/src/test/java/com/dzone/albanoj2/example/rest/test/unit/repository/OrderRepositoryTest.java similarity index 95% rename from src/test/java/com/dzone/albanoj2/example/rest/test/unit/OrderRepositoryTest.java rename to src/test/java/com/dzone/albanoj2/example/rest/test/unit/repository/OrderRepositoryTest.java index 344ebf9..0c0caac 100644 --- a/src/test/java/com/dzone/albanoj2/example/rest/test/unit/OrderRepositoryTest.java +++ b/src/test/java/com/dzone/albanoj2/example/rest/test/unit/repository/OrderRepositoryTest.java @@ -1,4 +1,4 @@ -package com.dzone.albanoj2.example.rest.test.unit; +package com.dzone.albanoj2.example.rest.test.unit.repository; import static com.dzone.albanoj2.example.rest.test.util.OrderTestUtils.*; @@ -22,14 +22,14 @@ public class OrderRepositoryTest { private static final long NONEXISTENT_ID = 1000; + + @Autowired + private OrderRepository repository; @Before public void setUp() { repository.clear(); } - - @Autowired - private OrderRepository repository; @Test public void testFindNonexistentOrderEnsureOptionalIsNotPresent() throws Exception {