[lambico.archetypes] 2 new revisions pushed by lucio.be...@gmail.com on 2013-10-01 16:35 GMT

2 views
Skip to first unread message

lam...@googlecode.com

unread,
Oct 1, 2013, 12:36:05 PM10/1/13
to lambico...@googlegroups.com
2 new revisions:

Revision: 11aa166f8ebd
Branch: default
Author: lucio.benfante <lucio.b...@gmail.com>
Date: Sun Sep 29 10:12:15 2013 UTC
Log: Added configuration for deploying the archetype to the Sonatype
reposi...
http://code.google.com/p/lambico/source/detail?r=11aa166f8ebd&repo=archetypes

Revision: e967cd7a35e2
Branch: default
Author: lucio.benfante <lucio.b...@gmail.com>
Date: Tue Oct 1 16:35:10 2013 UTC
Log: Added generic crud rest service....
http://code.google.com/p/lambico/source/detail?r=e967cd7a35e2&repo=archetypes

==============================================================================
Revision: 11aa166f8ebd
Branch: default
Author: lucio.benfante <lucio.b...@gmail.com>
Date: Sun Sep 29 10:12:15 2013 UTC
Log: Added configuration for deploying the archetype to the Sonatype
repository.
http://code.google.com/p/lambico/source/detail?r=11aa166f8ebd&repo=archetypes

Modified:
/lambico-ws-archetype/pom.xml

=======================================
--- /lambico-ws-archetype/pom.xml Sat Sep 28 13:29:19 2013 UTC
+++ /lambico-ws-archetype/pom.xml Sun Sep 29 10:12:15 2013 UTC
@@ -1,32 +1,150 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0</modelVersion>
+ <modelVersion>4.0.0</modelVersion>

- <groupId>org.lambico</groupId>
- <artifactId>lambico-ws-archetype</artifactId>
- <version>1.0-SNAPSHOT</version>
- <packaging>maven-archetype</packaging>
+ <groupId>org.lambico</groupId>
+ <artifactId>lambico-ws-archetype</artifactId>
+ <version>1.0-SNAPSHOT</version>
+ <packaging>maven-archetype</packaging>

- <name>lambico-ws-archetype</name>
+ <name>lambico-ws-archetype</name>

- <build>
- <extensions>
- <extension>
- <groupId>org.apache.maven.archetype</groupId>
- <artifactId>archetype-packaging</artifactId>
- <version>2.2</version>
- </extension>
- </extensions>
+ <build>
+ <extensions>
+ <extension>
+ <groupId>org.apache.maven.archetype</groupId>
+ <artifactId>archetype-packaging</artifactId>
+ <version>2.2</version>
+ </extension>
+ </extensions>

- <pluginManagement>
- <plugins>
- <plugin>
- <artifactId>maven-archetype-plugin</artifactId>
- <version>2.2</version>
- </plugin>
- </plugins>
- </pluginManagement>
- </build>
+ <pluginManagement>
+ <plugins>
+ <plugin>
+ <artifactId>maven-archetype-plugin</artifactId>
+ <version>2.2</version>
+ </plugin>
+ </plugins>
+ </pluginManagement>
+
+ <plugins>
+ <plugin>
+ <artifactId>maven-source-plugin</artifactId>
+ <version>2.2.1</version>
+ <executions>
+ <execution>
+ <id>attach-sources</id>
+ <phase>deploy</phase>
+ <goals>
+ <goal>jar-no-fork</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <artifactId>maven-javadoc-plugin</artifactId>
+ <version>2.9</version>
+ <executions>
+ <execution>
+ <id>attach-javadocs</id>
+ <phase>deploy</phase>
+ <goals>
+ <goal>jar</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <!-- explicitly define maven-deploy-plugin after other to
force exec order -->
+ <artifactId>maven-deploy-plugin</artifactId>
+ <version>2.7</version>
+ <executions>
+ <execution>
+ <id>deploy</id>
+ <phase>deploy</phase>
+ <goals>
+ <goal>deploy</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>

- <url>http://www.lambico.org</url>
+ <url>http://www.lambico.org</url>
+
+ <distributionManagement>
+ <snapshotRepository>
+ <id>sonatype-nexus-snapshots</id>
+ <name>Sonatype Nexus Snapshots</name>
+
<url>http://oss.sonatype.org/content/repositories/snapshots</url>
+ </snapshotRepository>
+ <repository>
+ <id>sonatype-nexus-staging</id>
+ <name>Nexus Release Repository</name>
+
<url>http://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
+ </repository>
+ </distributionManagement>
+ <scm>
+
<connection>scm:hg:https://code.google.com/p/lambico.archetypes/</connection>
+
<developerConnection>scm:hg:https://code.google.com/p/lambico.archetypes/</developerConnection>
+ <url>https://code.google.com/p/lambico.archetypes/</url>
+ </scm>
+ <issueManagement>
+ <system>Google Code Issues</system>
+ <url>http://code.google.com/p/lambico/issues/list</url>
+ </issueManagement>
+ <licenses>
+ <license>
+ <name>Apache 2</name>
+ <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+ <distribution>repo</distribution>
+ <comments>A business-friendly OSS license</comments>
+ </license>
+ </licenses>
+ <organization>
+ <name>Lambico Team</name>
+ <url>http://code.google.com/p/lambico/people/list</url>
+ </organization>
+ <mailingLists>
+ <mailingList>
+ <name>Developers</name>
+ <subscribe>lambico-de...@googlegroups.com</subscribe>
+
<unsubscribe>lambico-dev...@googlegroups.com</unsubscribe>
+ <post>lambi...@googlegroups.com</post>
+ <archive>http://groups.google.com/group/lambico-dev</archive>
+ </mailingList>
+ <mailingList>
+ <name>Users</name>
+ <subscribe>lambico-use...@googlegroups.com</subscribe>
+
<unsubscribe>lambico-user...@googlegroups.com</unsubscribe>
+ <post>lambic...@googlegroups.com</post>
+ <archive>http://groups.google.com/group/lambico-users</archive>
+ </mailingList>
+ <mailingList>
+ <name>Commits</name>
+
<subscribe>lambico-comm...@googlegroups.com</subscribe>
+
<unsubscribe>lambico-commi...@googlegroups.com</unsubscribe>
+ <post>lambico...@googlegroups.com</post>
+
<archive>http://groups.google.com/group/lambico-commits</archive>
+ </mailingList>
+ </mailingLists>
+ <developers>
+ <developer>
+ <id>benfante</id>
+ <name>Lucio Benfante</name>
+ <email>lucio.b...@jugpadova.it</email>
+ <url>http://benfante.blogspot.com</url>
+ <organization>Lucio Benfante Consulting</organization>
+ <organizationUrl>http://www.benfante.com</organizationUrl>
+ <roles>
+ <role>developer</role>
+ </roles>
+ <timezone>+1</timezone>
+ <properties>
+
<picUrl>http://farm1.static.flickr.com/35/70560671_64adac2288_o.png</picUrl>
+ </properties>
+ </developer>
+ </developers>
+
</project>

==============================================================================
Revision: e967cd7a35e2
Branch: default
Author: lucio.benfante <lucio.b...@gmail.com>
Date: Tue Oct 1 16:35:10 2013 UTC
Log: Added generic crud rest service.
Fixed json tests.
Removed sample dependencies from support classes.
http://code.google.com/p/lambico/source/detail?r=e967cd7a35e2&repo=archetypes

Added:

/lambico-ws-archetype/src/main/resources/archetype-resources/core/src/main/java/core/bean/ItemResult.java

/lambico-ws-archetype/src/main/resources/archetype-resources/core/src/main/java/core/rest/AbstractCrudRestService.java

/lambico-ws-archetype/src/main/resources/archetype-resources/core/src/main/java/core/rest/CrudRestService.java

/lambico-ws-archetype/src/main/resources/archetype-resources/core/src/main/java/core/rest/PersonService.java

/lambico-ws-archetype/src/main/resources/archetype-resources/core/src/test/java/core/rest/PersonServiceTest.java

/lambico-ws-archetype/src/test/resources/projects/basic/reference/core/src/main/java/org/lambico/ws/archetype/template/core/bean/ItemResult.java

/lambico-ws-archetype/src/test/resources/projects/basic/reference/core/src/main/java/org/lambico/ws/archetype/template/core/rest/AbstractCrudRestService.java

/lambico-ws-archetype/src/test/resources/projects/basic/reference/core/src/main/java/org/lambico/ws/archetype/template/core/rest/CrudRestService.java

/lambico-ws-archetype/src/test/resources/projects/basic/reference/core/src/main/java/org/lambico/ws/archetype/template/core/rest/PersonService.java

/lambico-ws-archetype/src/test/resources/projects/basic/reference/core/src/test/java/org/lambico/ws/archetype/template/core/rest/PersonServiceTest.java
Modified:

/lambico-ws-archetype/src/main/resources/archetype-resources/core/src/main/java/core/bean/PaginatedResult.java

/lambico-ws-archetype/src/main/resources/archetype-resources/core/src/test/java/core/rest/SampleServiceTest.java

/lambico-ws-archetype/src/main/resources/archetype-resources/core/src/test/java/core/test/BaseRSTest.java

/lambico-ws-archetype/src/main/resources/archetype-resources/core/src/test/resources/__packageInPathFormat__/core/rest/client-beans-test.xml

/lambico-ws-archetype/src/main/resources/archetype-resources/server/src/main/webapp/WEB-INF/beans.xml

/lambico-ws-archetype/src/test/resources/projects/basic/reference/core/src/main/java/org/lambico/ws/archetype/template/core/bean/PaginatedResult.java

/lambico-ws-archetype/src/test/resources/projects/basic/reference/core/src/test/java/org/lambico/ws/archetype/template/core/rest/SampleServiceTest.java

/lambico-ws-archetype/src/test/resources/projects/basic/reference/core/src/test/java/org/lambico/ws/archetype/template/core/test/BaseRSTest.java

/lambico-ws-archetype/src/test/resources/projects/basic/reference/core/src/test/resources/org/lambico/ws/archetype/template/core/rest/client-beans-test.xml

/lambico-ws-archetype/src/test/resources/projects/basic/reference/server/src/main/webapp/WEB-INF/beans.xml

=======================================
--- /dev/null
+++
/lambico-ws-archetype/src/main/resources/archetype-resources/core/src/main/java/core/bean/ItemResult.java
Tue Oct 1 16:35:10 2013 UTC
@@ -0,0 +1,41 @@
+#set( $symbol_pound = '#' )
+#set( $symbol_dollar = '$' )
+#set( $symbol_escape = '\' )
+/**
+ * Copyright (C) 2013 Lambico Team <in...@lambico.org>
+ *
+ * This file is part of Lambico WS Archetype Template - Core.
+ */
+package ${package}.core.bean;
+
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlSeeAlso;
+import ${package}.core.po.Person;
+
+/**
+ * A bean for returning a single item.
+ *
+ * @author Lucio Benfante <lu...@benfante.com>
+ */
+@XmlRootElement(name = "result")
+@XmlSeeAlso(Person.class)
+public class ItemResult<T> {
+
+ private T item;
+
+ public ItemResult() {
+ }
+
+ public ItemResult(T item) {
+ this.item = item;
+ }
+
+ public T getItem() {
+ return item;
+ }
+
+ public void setItem(T item) {
+ this.item = item;
+ }
+
+}
=======================================
--- /dev/null
+++
/lambico-ws-archetype/src/main/resources/archetype-resources/core/src/main/java/core/rest/AbstractCrudRestService.java
Tue Oct 1 16:35:10 2013 UTC
@@ -0,0 +1,192 @@
+#set( $symbol_pound = '#' )
+#set( $symbol_dollar = '$' )
+#set( $symbol_escape = '\' )
+/**
+ * Copyright (C) 2013 Lambico Team <in...@lambico.org>
+ *
+ * This file is part of Lambico WS Archetype Template - Core.
+ */
+package ${package}.core.rest;
+
+import java.io.Serializable;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Method;
+import java.util.List;
+import ${package}.core.bean.StringResult;
+import javax.annotation.Resource;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.ResponseBuilder;
+import javax.ws.rs.core.Response.Status;
+import org.hibernate.criterion.DetachedCriteria;
+import org.lambico.dao.generic.GenericDao;
+import org.lambico.dao.generic.Page;
+import org.lambico.dao.generic.PageDefaultImpl;
+import org.lambico.dao.spring.hibernate.HibernateGenericDao;
+import ${package}.core.bean.ItemResult;
+import ${package}.core.bean.PaginatedResult;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.core.GenericTypeResolver;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * Some sample REST services.
+ *
+ * @author Lucio Benfante <lu...@benfante.com>
+ */
+@Path("/abstractRestService") // Override this!
+@Produces({"application/json", "application/xml"})
+@Consumes({"application/json", "application/xml"})
+public class AbstractCrudRestService<ENTITY, PK extends Serializable, DAO
extends GenericDao<ENTITY, PK>> implements CrudRestService<ENTITY> {
+
+ private static final Logger log =
LoggerFactory.getLogger(AbstractCrudRestService.class);
+ @Resource
+ private DAO dao;
+
+ @GET
+ @Path(value = "/")
+ @Produces({"application/json", "application/xml"})
+ @Consumes({"application/json", "application/xml"})
+ @Override
+ public PaginatedResult<ENTITY> getItems(@QueryParam("page") Integer
page, @QueryParam("pageSize") Integer pageSize) {
+ log.debug("Calling getItems.");
+ PaginatedResult<ENTITY> result = new PaginatedResult<ENTITY>();
+ try {
+ Page<ENTITY> persons = (Page<ENTITY>)
doRetrievePaginatedItems(page, pageSize);
+ result.setItems(persons.getList());
+ result.setPage(persons.getPage());
+ result.setRowCount(persons.getRowCount());
+ result.setLastPage(persons.getLastPage());
+ result.setNextPage(persons.isNextPage());
+ result.setPreviousPage(persons.isPreviousPage());
+ } catch (Exception ex) {
+ throw new WebApplicationException(ex,
Status.INTERNAL_SERVER_ERROR);
+ }
+ return result;
+ }
+
+ @GET
+ @Path(value = "/{id}")
+ @Override
+ public ItemResult<ENTITY> getItem(@PathParam("id") String id) {
+ log.debug("Calling getItem with {}.", id);
+ PK idVal = fromStringToPk(id);
+ ENTITY item = (ENTITY) dao.get(idVal);
+ if (item == null) {
+ ResponseBuilder builder =
+ Response.status(Status.BAD_REQUEST);
+ builder.entity(new StringResult("Item Not Found"));
+ throw new WebApplicationException(builder.build());
+ } else {
+ return new ItemResult<ENTITY>(item);
+ }
+ }
+
+ /**
+ * Delete an item.
+ *
+ * @param id The identifier of the item.
+ * @return
+ */
+ @DELETE
+ @Path(value = "/{id}")
+ @Override
+ public Response deleteItem(@PathParam("id") String id) {
+ log.debug("Calling deleteItem with {}.", id);
+ PK idVal = fromStringToPk(id);
+ ENTITY item = dao.get(idVal);
+ if (item == null) {
+ ResponseBuilder builder =
+ Response.status(Status.BAD_REQUEST);
+ builder.entity(new StringResult("Item Not Found"));
+ throw new WebApplicationException(builder.build());
+ } else {
+ dao.delete(item);
+ }
+ return Response.ok().build();
+ }
+
+ /**
+ * Add an item.
+ *
+ * @param item The item data.
+ * @return
+ */
+ @POST
+ @Path(value = "/")
+ @Override
+ public Response addItem(ENTITY item) {
+ log.info("Calling addItem for {}.", item);
+ dao.store(item);
+ return Response.ok().build();
+ }
+
+ /**
+ * Update an item.
+ *
+ * @param item The item data.
+ * @return
+ */
+ @PUT
+ @Path(value = "/")
+ @Override
+ public Response updateItem(ENTITY item) {
+ log.debug("Calling updateItem for {}.", item);
+ dao.store(item);
+ return Response.ok().build();
+ }
+
+ @Transactional(readOnly = true)
+ protected Page<ENTITY> doRetrievePaginatedItems(Integer page, Integer
pageSize) {
+ log.debug("Executing doRetrievePaginatedItems.");
+ DetachedCriteria crit = DetachedCriteria.forClass(dao.getType());
+ Page<ENTITY> result;
+ if (pageSize != null) {
+ if (page == null) {
+ page = new Integer(1);
+ }
+ result = ((HibernateGenericDao)
dao).searchPaginatedByCriteria(page, pageSize, crit);
+ } else {
+ List items = ((HibernateGenericDao)
dao).searchByCriteria(crit);
+ result = new PageDefaultImpl<ENTITY>(items, new Integer(1),
items.size(), items.size());
+ }
+ log.debug("Retrieved {} items.", result.getList().size());
+ return result;
+ }
+
+ protected PK fromStringToPk(String id) {
+ PK idVal = null;
+ Class[] typeArguments =
GenericTypeResolver.resolveTypeArguments(getClass(),
AbstractCrudRestService.class);
+ Class pkArg = typeArguments[1];
+ try {
+ try {
+ Constructor constructor =
pkArg.getConstructor(String.class);
+ idVal = (PK) constructor.newInstance(id);
+ } catch (NoSuchMethodException ex) {
+ try {
+ Method valueOfMethod = pkArg.getMethod("valueOf",
String.class);
+ idVal = (PK) valueOfMethod.invoke(null, id);
+ } catch (NoSuchMethodException ex1) {
+ Method fromStringMethod =
pkArg.getMethod("fromString", String.class);
+ idVal = (PK) fromStringMethod.invoke(null, id);
+ }
+ }
+ } catch (Exception exception) {
+ ResponseBuilder builder =
+ Response.status(Status.BAD_REQUEST);
+ builder.entity(new StringResult("Can't convert id parameter.
Parameter class " + pkArg.getName() + " has no constructor, valueOf or
fromString methods accepting a String parameter."));
+ throw new WebApplicationException(exception, builder.build());
+ }
+ return idVal;
+ }
+}
=======================================
--- /dev/null
+++
/lambico-ws-archetype/src/main/resources/archetype-resources/core/src/main/java/core/rest/CrudRestService.java
Tue Oct 1 16:35:10 2013 UTC
@@ -0,0 +1,52 @@
+#set( $symbol_pound = '#' )
+#set( $symbol_dollar = '$' )
+#set( $symbol_escape = '\' )
+/**
+ * Copyright (C) 2013 Lambico Team <in...@lambico.org>
+ *
+ * This file is part of Lambico WS Archetype Template - Core.
+ */
+package ${package}.core.rest;
+
+import javax.ws.rs.PathParam;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.Response;
+import ${package}.core.bean.ItemResult;
+import ${package}.core.bean.PaginatedResult;
+
+/**
+ * The interface for crud services.
+ *
+ * @author Lucio Benfante <lu...@benfante.com>
+ */
+public interface CrudRestService<ENTITY> {
+
+ /**
+ * Add an item.
+ *
+ * @param item The item data.
+ * @return
+ */
+ Response addItem(ENTITY item);
+
+ /**
+ * Delete an item.
+ *
+ * @param id The identifier of the item.
+ * @return
+ */
+ Response deleteItem(@PathParam(value = "id") String id);
+
+ ItemResult<ENTITY> getItem(@PathParam(value = "id") String id);
+
+ PaginatedResult<ENTITY> getItems(@QueryParam(value = "page") Integer
page, @QueryParam(value = "pageSize") Integer pageSize);
+
+ /**
+ * Update an item.
+ *
+ * @param item The item data.
+ * @return
+ */
+ Response updateItem(ENTITY item);
+
+}
=======================================
--- /dev/null
+++
/lambico-ws-archetype/src/main/resources/archetype-resources/core/src/main/java/core/rest/PersonService.java
Tue Oct 1 16:35:10 2013 UTC
@@ -0,0 +1,22 @@
+#set( $symbol_pound = '#' )
+#set( $symbol_dollar = '$' )
+#set( $symbol_escape = '\' )
+/**
+ * Copyright (C) 2013 Lambico Team <in...@lambico.org>
+ *
+ * This file is part of Lambico WS Archetype Template - Core.
+ */
+package ${package}.core.rest;
+
+import javax.ws.rs.Path;
+import ${package}.core.dao.PersonDao;
+import ${package}.core.po.Person;
+
+/**
+ *
+ * @author Lucio Benfante <lu...@benfante.com>
+ */
+@Path("/persons")
+public class PersonService extends AbstractCrudRestService<Person, Long,
PersonDao>{
+
+}
=======================================
--- /dev/null
+++
/lambico-ws-archetype/src/main/resources/archetype-resources/core/src/test/java/core/rest/PersonServiceTest.java
Tue Oct 1 16:35:10 2013 UTC
@@ -0,0 +1,171 @@
+#set( $symbol_pound = '#' )
+#set( $symbol_dollar = '$' )
+#set( $symbol_escape = '\' )
+/**
+ * Copyright (C) 2013 Lambico Team <in...@lambico.org>
+ *
+ * This file is part of Lambico WS Archetype Template - Core.
+ */
+package ${package}.core.rest;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import java.io.IOException;
+import java.util.LinkedList;
+import java.util.List;
+import javax.annotation.Resource;
+import javax.ws.rs.BadRequestException;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import org.apache.cxf.jaxrs.client.WebClient;
+import org.apache.cxf.jaxrs.lifecycle.ResourceProvider;
+import org.apache.cxf.jaxrs.lifecycle.SingletonResourceProvider;
+import org.junit.Test;
+import ${package}.core.bean.PaginatedResult;
+import ${package}.core.po.Person;
+import ${package}.core.test.BaseRSTest;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.equalTo;
+import static org.hamcrest.Matchers.nullValue;
+import static org.hamcrest.Matchers.not;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.collection.IsCollectionWithSize.hasSize;
+import org.lambico.test.spring.hibernate.junit4.FixtureSet;
+import ${package}.core.bean.ItemResult;
+
+/**
+ * Test the REST PersonService.
+ *
+ * @author Lucio Benfante <lu...@benfante.com>
+ */
+@FixtureSet(modelClasses = {Person.class})
+public class PersonServiceTest extends BaseRSTest {
+
+ public static final String ENDPOINT_ADDRESS
= "local://RestPersonService";
+ public static final String DEFAULT_USERNAME = "username";
+ public static final String DEFAULT_PASSWORD = "password";
+ @Resource
+ private PersonService personService;
+
+ @Override
+ protected String getServerEndpointAddress() {
+ return ENDPOINT_ADDRESS;
+ }
+
+ @Override
+ protected List<Class<?>> getServerResourceClasses() {
+ List<Class<?>> result = new LinkedList<Class<?>>();
+ result.add(PersonService.class);
+ return result;
+ }
+
+ @Override
+ protected List<ResourceProvider> getServerResourceProviders() {
+ List<ResourceProvider> result = new LinkedList<ResourceProvider>();
+ result.add(new SingletonResourceProvider(personService, true));
+ return result;
+ }
+
+ /**
+ * Test of getItems method, of class PersonService.
+ */
+ @Test
+ public void testGetItems() {
+ PersonService client = createProxyClient(PersonService.class,
ENDPOINT_ADDRESS, DEFAULT_USERNAME, DEFAULT_PASSWORD, null);
+ PaginatedResult<Person> persons = client.getItems(null, null);
+ assertThat(persons.getItems(), hasSize(7));
+ }
+
+ /**
+ * Test of getItems method, of class PersonService.
+ */
+ @Test
+ public void testJsonGetItems() throws IOException {
+ WebClient client = createWebClient(ENDPOINT_ADDRESS,
DEFAULT_USERNAME, DEFAULT_PASSWORD, MediaType.APPLICATION_JSON);
+ client.path("/persons");
+ String result = client.get().readEntity(String.class);
+ ObjectMapper mapper = new ObjectMapper();
+ PaginatedResult<Person> persons = mapper.readValue(result, new
TypeReference<PaginatedResult<Person>>() {
+ });
+ assertThat(persons.getItems(), hasSize(7));
+ }
+
+ /**
+ * Test of getItem method, of class PersonService.
+ */
+ @Test
+ public void testGetItem() {
+ PersonService client = createProxyClient(PersonService.class,
ENDPOINT_ADDRESS, DEFAULT_USERNAME, DEFAULT_PASSWORD, null);
+ PaginatedResult<Person> persons = client.getItems(null, null);
+ Person person1 = persons.getItems().get(0);
+ Person person2 =
client.getItem(person1.getId().toString()).getItem();
+ assertThat(person2, is(not(nullValue())));
+ assertThat(person2.getId(), equalTo(person1.getId()));
+ }
+
+ /**
+ * Test of getItem method, of class PersonService.
+ */
+ @Test
+ public void testJsonGetItem() throws IOException {
+ WebClient client = createWebClient(ENDPOINT_ADDRESS,
DEFAULT_USERNAME, DEFAULT_PASSWORD, MediaType.APPLICATION_JSON);
+ client.path("/persons");
+ String result = client.get().readEntity(String.class);
+ ObjectMapper mapper = new ObjectMapper();
+ PaginatedResult<Person> persons = mapper.readValue(result, new
TypeReference<PaginatedResult<Person>>() {
+ });
+ Person person1 = persons.getItems().get(0);
+ client.back(true).path("/persons/{id}", person1.getId());
+ result = client.get().readEntity(String.class);
+ ItemResult<Person> irPerson2 = mapper.readValue(result, new
TypeReference<ItemResult<Person>>() {
+ });
+ Person person2 = irPerson2.getItem();
+ assertThat(person2, is(not(nullValue())));
+ assertThat(person2.getId(), equalTo(person1.getId()));
+ }
+
+ /**
+ * Test of deleteItem method, of class PersonService.
+ */
+ @Test
+ public void testDeleteItem() {
+ PersonService client = createProxyClient(PersonService.class,
ENDPOINT_ADDRESS, DEFAULT_USERNAME, DEFAULT_PASSWORD, null);
+ PaginatedResult<Person> persons = client.getItems(null, null);
+ Person person = persons.getItems().get(0);
+ Response response = client.deleteItem(person.getId().toString());
+ assertThat(response.getStatus(),
equalTo(Response.Status.OK.getStatusCode()));
+ try {
+ Person deletedPerson =
client.getItem(person.getId().toString()).getItem();
+ } catch (BadRequestException e) {
+ assertThat(e.getResponse().getStatus(),
equalTo(Response.Status.BAD_REQUEST.getStatusCode()));
+ }
+ }
+
+ /**
+ * Test of addItem method, of class PersonService.
+ */
+ @Test
+ public void testAddItem() {
+ PersonService client = createProxyClient(PersonService.class,
ENDPOINT_ADDRESS, DEFAULT_USERNAME, DEFAULT_PASSWORD, null);
+ Person newPerson = new Person();
+ newPerson.setFirstName("New");
+ newPerson.setLastName("Person");
+ client.addItem(newPerson);
+ PaginatedResult<Person> persons = client.getItems(null, null);
+ assertThat(persons.getItems(), hasSize(8));
+ }
+
+ /**
+ * Test of updateItem method, of class PersonService.
+ */
+ @Test
+ public void testUpdateItem() {
+ PersonService client = createProxyClient(PersonService.class,
ENDPOINT_ADDRESS, DEFAULT_USERNAME, DEFAULT_PASSWORD, null);
+ PaginatedResult<Person> persons = client.getItems(null, null);
+ Person person = persons.getItems().get(0);
+ person.setFirstName("Updated");
+ client.updateItem(person);
+ Person updatedPerson =
client.getItem(person.getId().toString()).getItem();
+ assertThat(updatedPerson.getFirstName(), equalTo("Updated"));
+ }
+}
=======================================
--- /dev/null
+++
/lambico-ws-archetype/src/test/resources/projects/basic/reference/core/src/main/java/org/lambico/ws/archetype/template/core/bean/ItemResult.java
Tue Oct 1 16:35:10 2013 UTC
@@ -0,0 +1,38 @@
+/**
+ * Copyright (C) 2013 Lambico Team <in...@lambico.org>
+ *
+ * This file is part of Lambico WS Archetype Template - Core.
+ */
+package org.lambico.ws.archetype.template.core.bean;
+
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlSeeAlso;
+import org.lambico.ws.archetype.template.core.po.Person;
+
+/**
+ * A bean for returning a single item.
+ *
+ * @author Lucio Benfante <lu...@benfante.com>
+ */
+@XmlRootElement(name = "result")
+@XmlSeeAlso(Person.class)
+public class ItemResult<T> {
+
+ private T item;
+
+ public ItemResult() {
+ }
+
+ public ItemResult(T item) {
+ this.item = item;
+ }
+
+ public T getItem() {
+ return item;
+ }
+
+ public void setItem(T item) {
+ this.item = item;
+ }
+
+}
=======================================
--- /dev/null
+++
/lambico-ws-archetype/src/test/resources/projects/basic/reference/core/src/main/java/org/lambico/ws/archetype/template/core/rest/AbstractCrudRestService.java
Tue Oct 1 16:35:10 2013 UTC
@@ -0,0 +1,189 @@
+/**
+ * Copyright (C) 2013 Lambico Team <in...@lambico.org>
+ *
+ * This file is part of Lambico WS Archetype Template - Core.
+ */
+package org.lambico.ws.archetype.template.core.rest;
+
+import java.io.Serializable;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Method;
+import java.util.List;
+import org.lambico.ws.archetype.template.core.bean.StringResult;
+import javax.annotation.Resource;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.ResponseBuilder;
+import javax.ws.rs.core.Response.Status;
+import org.hibernate.criterion.DetachedCriteria;
+import org.lambico.dao.generic.GenericDao;
+import org.lambico.dao.generic.Page;
+import org.lambico.dao.generic.PageDefaultImpl;
+import org.lambico.dao.spring.hibernate.HibernateGenericDao;
+import org.lambico.ws.archetype.template.core.bean.ItemResult;
+import org.lambico.ws.archetype.template.core.bean.PaginatedResult;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.core.GenericTypeResolver;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * Some sample REST services.
+ *
+ * @author Lucio Benfante <lu...@benfante.com>
+ */
+@Path("/abstractRestService") // Override this!
+@Produces({"application/json", "application/xml"})
+@Consumes({"application/json", "application/xml"})
+public class AbstractCrudRestService<ENTITY, PK extends Serializable, DAO
extends GenericDao<ENTITY, PK>> implements CrudRestService<ENTITY> {
+
+ private static final Logger log =
LoggerFactory.getLogger(AbstractCrudRestService.class);
+ @Resource
+ private DAO dao;
+
+ @GET
+ @Path(value = "/")
+ @Produces({"application/json", "application/xml"})
+ @Consumes({"application/json", "application/xml"})
+ @Override
+ public PaginatedResult<ENTITY> getItems(@QueryParam("page") Integer
page, @QueryParam("pageSize") Integer pageSize) {
+ log.debug("Calling getItems.");
+ PaginatedResult<ENTITY> result = new PaginatedResult<ENTITY>();
+ try {
+ Page<ENTITY> persons = (Page<ENTITY>)
doRetrievePaginatedItems(page, pageSize);
+ result.setItems(persons.getList());
+ result.setPage(persons.getPage());
+ result.setRowCount(persons.getRowCount());
+ result.setLastPage(persons.getLastPage());
+ result.setNextPage(persons.isNextPage());
+ result.setPreviousPage(persons.isPreviousPage());
+ } catch (Exception ex) {
+ throw new WebApplicationException(ex,
Status.INTERNAL_SERVER_ERROR);
+ }
+ return result;
+ }
+
+ @GET
+ @Path(value = "/{id}")
+ @Override
+ public ItemResult<ENTITY> getItem(@PathParam("id") String id) {
+ log.debug("Calling getItem with {}.", id);
+ PK idVal = fromStringToPk(id);
+ ENTITY item = (ENTITY) dao.get(idVal);
+ if (item == null) {
+ ResponseBuilder builder =
+ Response.status(Status.BAD_REQUEST);
+ builder.entity(new StringResult("Item Not Found"));
+ throw new WebApplicationException(builder.build());
+ } else {
+ return new ItemResult<ENTITY>(item);
+ }
+ }
+
+ /**
+ * Delete an item.
+ *
+ * @param id The identifier of the item.
+ * @return
+ */
+ @DELETE
+ @Path(value = "/{id}")
+ @Override
+ public Response deleteItem(@PathParam("id") String id) {
+ log.debug("Calling deleteItem with {}.", id);
+ PK idVal = fromStringToPk(id);
+ ENTITY item = dao.get(idVal);
+ if (item == null) {
+ ResponseBuilder builder =
+ Response.status(Status.BAD_REQUEST);
+ builder.entity(new StringResult("Item Not Found"));
+ throw new WebApplicationException(builder.build());
+ } else {
+ dao.delete(item);
+ }
+ return Response.ok().build();
+ }
+
+ /**
+ * Add an item.
+ *
+ * @param item The item data.
+ * @return
+ */
+ @POST
+ @Path(value = "/")
+ @Override
+ public Response addItem(ENTITY item) {
+ log.info("Calling addItem for {}.", item);
+ dao.store(item);
+ return Response.ok().build();
+ }
+
+ /**
+ * Update an item.
+ *
+ * @param item The item data.
+ * @return
+ */
+ @PUT
+ @Path(value = "/")
+ @Override
+ public Response updateItem(ENTITY item) {
+ log.debug("Calling updateItem for {}.", item);
+ dao.store(item);
+ return Response.ok().build();
+ }
+
+ @Transactional(readOnly = true)
+ protected Page<ENTITY> doRetrievePaginatedItems(Integer page, Integer
pageSize) {
+ log.debug("Executing doRetrievePaginatedItems.");
+ DetachedCriteria crit = DetachedCriteria.forClass(dao.getType());
+ Page<ENTITY> result;
+ if (pageSize != null) {
+ if (page == null) {
+ page = new Integer(1);
+ }
+ result = ((HibernateGenericDao)
dao).searchPaginatedByCriteria(page, pageSize, crit);
+ } else {
+ List items = ((HibernateGenericDao)
dao).searchByCriteria(crit);
+ result = new PageDefaultImpl<ENTITY>(items, new Integer(1),
items.size(), items.size());
+ }
+ log.debug("Retrieved {} items.", result.getList().size());
+ return result;
+ }
+
+ protected PK fromStringToPk(String id) {
+ PK idVal = null;
+ Class[] typeArguments =
GenericTypeResolver.resolveTypeArguments(getClass(),
AbstractCrudRestService.class);
+ Class pkArg = typeArguments[1];
+ try {
+ try {
+ Constructor constructor =
pkArg.getConstructor(String.class);
+ idVal = (PK) constructor.newInstance(id);
+ } catch (NoSuchMethodException ex) {
+ try {
+ Method valueOfMethod = pkArg.getMethod("valueOf",
String.class);
+ idVal = (PK) valueOfMethod.invoke(null, id);
+ } catch (NoSuchMethodException ex1) {
+ Method fromStringMethod =
pkArg.getMethod("fromString", String.class);
+ idVal = (PK) fromStringMethod.invoke(null, id);
+ }
+ }
+ } catch (Exception exception) {
+ ResponseBuilder builder =
+ Response.status(Status.BAD_REQUEST);
+ builder.entity(new StringResult("Can't convert id parameter.
Parameter class " + pkArg.getName() + " has no constructor, valueOf or
fromString methods accepting a String parameter."));
+ throw new WebApplicationException(exception, builder.build());
+ }
+ return idVal;
+ }
+}
=======================================
--- /dev/null
+++
/lambico-ws-archetype/src/test/resources/projects/basic/reference/core/src/main/java/org/lambico/ws/archetype/template/core/rest/CrudRestService.java
Tue Oct 1 16:35:10 2013 UTC
@@ -0,0 +1,49 @@
+/**
+ * Copyright (C) 2013 Lambico Team <in...@lambico.org>
+ *
+ * This file is part of Lambico WS Archetype Template - Core.
+ */
+package org.lambico.ws.archetype.template.core.rest;
+
+import javax.ws.rs.PathParam;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.Response;
+import org.lambico.ws.archetype.template.core.bean.ItemResult;
+import org.lambico.ws.archetype.template.core.bean.PaginatedResult;
+
+/**
+ * The interface for crud services.
+ *
+ * @author Lucio Benfante <lu...@benfante.com>
+ */
+public interface CrudRestService<ENTITY> {
+
+ /**
+ * Add an item.
+ *
+ * @param item The item data.
+ * @return
+ */
+ Response addItem(ENTITY item);
+
+ /**
+ * Delete an item.
+ *
+ * @param id The identifier of the item.
+ * @return
+ */
+ Response deleteItem(@PathParam(value = "id") String id);
+
+ ItemResult<ENTITY> getItem(@PathParam(value = "id") String id);
+
+ PaginatedResult<ENTITY> getItems(@QueryParam(value = "page") Integer
page, @QueryParam(value = "pageSize") Integer pageSize);
+
+ /**
+ * Update an item.
+ *
+ * @param item The item data.
+ * @return
+ */
+ Response updateItem(ENTITY item);
+
+}
=======================================
--- /dev/null
+++
/lambico-ws-archetype/src/test/resources/projects/basic/reference/core/src/main/java/org/lambico/ws/archetype/template/core/rest/PersonService.java
Tue Oct 1 16:35:10 2013 UTC
@@ -0,0 +1,19 @@
+/**
+ * Copyright (C) 2013 Lambico Team <in...@lambico.org>
+ *
+ * This file is part of Lambico WS Archetype Template - Core.
+ */
+package org.lambico.ws.archetype.template.core.rest;
+
+import javax.ws.rs.Path;
+import org.lambico.ws.archetype.template.core.dao.PersonDao;
+import org.lambico.ws.archetype.template.core.po.Person;
+
+/**
+ *
+ * @author Lucio Benfante <lu...@benfante.com>
+ */
+@Path("/persons")
+public class PersonService extends AbstractCrudRestService<Person, Long,
PersonDao>{
+
+}
=======================================
--- /dev/null
+++
/lambico-ws-archetype/src/test/resources/projects/basic/reference/core/src/test/java/org/lambico/ws/archetype/template/core/rest/PersonServiceTest.java
Tue Oct 1 16:35:10 2013 UTC
@@ -0,0 +1,168 @@
+/**
+ * Copyright (C) 2013 Lambico Team <in...@lambico.org>
+ *
+ * This file is part of Lambico WS Archetype Template - Core.
+ */
+package org.lambico.ws.archetype.template.core.rest;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import java.io.IOException;
+import java.util.LinkedList;
+import java.util.List;
+import javax.annotation.Resource;
+import javax.ws.rs.BadRequestException;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import org.apache.cxf.jaxrs.client.WebClient;
+import org.apache.cxf.jaxrs.lifecycle.ResourceProvider;
+import org.apache.cxf.jaxrs.lifecycle.SingletonResourceProvider;
+import org.junit.Test;
+import org.lambico.ws.archetype.template.core.bean.PaginatedResult;
+import org.lambico.ws.archetype.template.core.po.Person;
+import org.lambico.ws.archetype.template.core.test.BaseRSTest;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.equalTo;
+import static org.hamcrest.Matchers.nullValue;
+import static org.hamcrest.Matchers.not;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.collection.IsCollectionWithSize.hasSize;
+import org.lambico.test.spring.hibernate.junit4.FixtureSet;
+import org.lambico.ws.archetype.template.core.bean.ItemResult;
+
+/**
+ * Test the REST PersonService.
+ *
+ * @author Lucio Benfante <lu...@benfante.com>
+ */
+@FixtureSet(modelClasses = {Person.class})
+public class PersonServiceTest extends BaseRSTest {
+
+ public static final String ENDPOINT_ADDRESS
= "local://RestPersonService";
+ public static final String DEFAULT_USERNAME = "username";
+ public static final String DEFAULT_PASSWORD = "password";
+ @Resource
+ private PersonService personService;
+
+ @Override
+ protected String getServerEndpointAddress() {
+ return ENDPOINT_ADDRESS;
+ }
+
+ @Override
+ protected List<Class<?>> getServerResourceClasses() {
+ List<Class<?>> result = new LinkedList<Class<?>>();
+ result.add(PersonService.class);
+ return result;
+ }
+
+ @Override
+ protected List<ResourceProvider> getServerResourceProviders() {
+ List<ResourceProvider> result = new LinkedList<ResourceProvider>();
+ result.add(new SingletonResourceProvider(personService, true));
+ return result;
+ }
+
+ /**
+ * Test of getItems method, of class PersonService.
+ */
+ @Test
+ public void testGetItems() {
+ PersonService client = createProxyClient(PersonService.class,
ENDPOINT_ADDRESS, DEFAULT_USERNAME, DEFAULT_PASSWORD, null);
+ PaginatedResult<Person> persons = client.getItems(null, null);
+ assertThat(persons.getItems(), hasSize(7));
+ }
+
+ /**
+ * Test of getItems method, of class PersonService.
+ */
+ @Test
+ public void testJsonGetItems() throws IOException {
+ WebClient client = createWebClient(ENDPOINT_ADDRESS,
DEFAULT_USERNAME, DEFAULT_PASSWORD, MediaType.APPLICATION_JSON);
+ client.path("/persons");
+ String result = client.get().readEntity(String.class);
+ ObjectMapper mapper = new ObjectMapper();
+ PaginatedResult<Person> persons = mapper.readValue(result, new
TypeReference<PaginatedResult<Person>>() {
+ });
+ assertThat(persons.getItems(), hasSize(7));
+ }
+
+ /**
+ * Test of getItem method, of class PersonService.
+ */
+ @Test
+ public void testGetItem() {
+ PersonService client = createProxyClient(PersonService.class,
ENDPOINT_ADDRESS, DEFAULT_USERNAME, DEFAULT_PASSWORD, null);
+ PaginatedResult<Person> persons = client.getItems(null, null);
+ Person person1 = persons.getItems().get(0);
+ Person person2 =
client.getItem(person1.getId().toString()).getItem();
+ assertThat(person2, is(not(nullValue())));
+ assertThat(person2.getId(), equalTo(person1.getId()));
+ }
+
+ /**
+ * Test of getItem method, of class PersonService.
+ */
+ @Test
+ public void testJsonGetItem() throws IOException {
+ WebClient client = createWebClient(ENDPOINT_ADDRESS,
DEFAULT_USERNAME, DEFAULT_PASSWORD, MediaType.APPLICATION_JSON);
+ client.path("/persons");
+ String result = client.get().readEntity(String.class);
+ ObjectMapper mapper = new ObjectMapper();
+ PaginatedResult<Person> persons = mapper.readValue(result, new
TypeReference<PaginatedResult<Person>>() {
+ });
+ Person person1 = persons.getItems().get(0);
+ client.back(true).path("/persons/{id}", person1.getId());
+ result = client.get().readEntity(String.class);
+ ItemResult<Person> irPerson2 = mapper.readValue(result, new
TypeReference<ItemResult<Person>>() {
+ });
+ Person person2 = irPerson2.getItem();
+ assertThat(person2, is(not(nullValue())));
+ assertThat(person2.getId(), equalTo(person1.getId()));
+ }
+
+ /**
+ * Test of deleteItem method, of class PersonService.
+ */
+ @Test
+ public void testDeleteItem() {
+ PersonService client = createProxyClient(PersonService.class,
ENDPOINT_ADDRESS, DEFAULT_USERNAME, DEFAULT_PASSWORD, null);
+ PaginatedResult<Person> persons = client.getItems(null, null);
+ Person person = persons.getItems().get(0);
+ Response response = client.deleteItem(person.getId().toString());
+ assertThat(response.getStatus(),
equalTo(Response.Status.OK.getStatusCode()));
+ try {
+ Person deletedPerson =
client.getItem(person.getId().toString()).getItem();
+ } catch (BadRequestException e) {
+ assertThat(e.getResponse().getStatus(),
equalTo(Response.Status.BAD_REQUEST.getStatusCode()));
+ }
+ }
+
+ /**
+ * Test of addItem method, of class PersonService.
+ */
+ @Test
+ public void testAddItem() {
+ PersonService client = createProxyClient(PersonService.class,
ENDPOINT_ADDRESS, DEFAULT_USERNAME, DEFAULT_PASSWORD, null);
+ Person newPerson = new Person();
+ newPerson.setFirstName("New");
+ newPerson.setLastName("Person");
+ client.addItem(newPerson);
+ PaginatedResult<Person> persons = client.getItems(null, null);
+ assertThat(persons.getItems(), hasSize(8));
+ }
+
+ /**
+ * Test of updateItem method, of class PersonService.
+ */
+ @Test
+ public void testUpdateItem() {
+ PersonService client = createProxyClient(PersonService.class,
ENDPOINT_ADDRESS, DEFAULT_USERNAME, DEFAULT_PASSWORD, null);
+ PaginatedResult<Person> persons = client.getItems(null, null);
+ Person person = persons.getItems().get(0);
+ person.setFirstName("Updated");
+ client.updateItem(person);
+ Person updatedPerson =
client.getItem(person.getId().toString()).getItem();
+ assertThat(updatedPerson.getFirstName(), equalTo("Updated"));
+ }
+}
=======================================
---
/lambico-ws-archetype/src/main/resources/archetype-resources/core/src/main/java/core/bean/PaginatedResult.java
Sat Sep 28 13:29:19 2013 UTC
+++
/lambico-ws-archetype/src/main/resources/archetype-resources/core/src/main/java/core/bean/PaginatedResult.java
Tue Oct 1 16:35:10 2013 UTC
@@ -8,6 +8,7 @@
*/
package ${package}.core.bean;

+import com.fasterxml.jackson.annotation.JsonProperty;
import java.util.List;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
@@ -34,6 +35,7 @@

@XmlElement(name = "item")
@XmlElementWrapper(name = "items")
+ @JsonProperty("item")
public List<T> getItems() {
return items;
}
=======================================
---
/lambico-ws-archetype/src/main/resources/archetype-resources/core/src/test/java/core/rest/SampleServiceTest.java
Sat Sep 28 13:29:19 2013 UTC
+++
/lambico-ws-archetype/src/main/resources/archetype-resources/core/src/test/java/core/rest/SampleServiceTest.java
Tue Oct 1 16:35:10 2013 UTC
@@ -8,6 +8,9 @@
*/
package ${package}.core.rest;

+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import java.io.IOException;
import java.util.LinkedList;
import java.util.List;
import javax.annotation.Resource;
@@ -18,7 +21,6 @@
import org.apache.cxf.jaxrs.lifecycle.ResourceProvider;
import org.apache.cxf.jaxrs.lifecycle.SingletonResourceProvider;
import org.junit.Test;
-import org.junit.Ignore;
import ${package}.core.bean.PaginatedResult;
import ${package}.core.bean.StringResult;
import ${package}.core.po.Person;
@@ -29,12 +31,14 @@
import static org.hamcrest.Matchers.not;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.collection.IsCollectionWithSize.hasSize;
+import org.lambico.test.spring.hibernate.junit4.FixtureSet;

/**
* Test the REST SampleService.
*
* @author Lucio Benfante <lu...@benfante.com>
*/
+@FixtureSet(modelClasses = {Person.class})
public class SampleServiceTest extends BaseRSTest {

public static final String ENDPOINT_ADDRESS
= "local://RestSampleService";
@@ -79,7 +83,7 @@
*/
@Test
public void testGetPersons() {
- SampleService client = createProxyClient(ENDPOINT_ADDRESS,
DEFAULT_USERNAME, DEFAULT_PASSWORD, null);
+ SampleService client = createProxyClient(SampleService.class,
ENDPOINT_ADDRESS, DEFAULT_USERNAME, DEFAULT_PASSWORD, null);
PaginatedResult<Person> persons = client.getPersons(null, null);
assertThat(persons.getItems(), hasSize(7));
}
@@ -88,10 +92,12 @@
* Test of getPersons method, of class SampleService.
*/
@Test
- @Ignore
- public void testJsonGetPersons() {
- SampleService client = createProxyClient(ENDPOINT_ADDRESS,
DEFAULT_USERNAME, DEFAULT_PASSWORD, MediaType.APPLICATION_JSON);
- PaginatedResult<Person> persons = client.getPersons(null, null);
+ public void testJsonGetPersons() throws IOException {
+ WebClient client = createWebClient(ENDPOINT_ADDRESS,
DEFAULT_USERNAME, DEFAULT_PASSWORD, MediaType.APPLICATION_JSON);
+ client.path("/sample/persons");
+ String result = client.get().readEntity(String.class);
+ ObjectMapper mapper = new ObjectMapper();
+ PaginatedResult<Person> persons = mapper.readValue(result, new
TypeReference<PaginatedResult<Person>>(){});
assertThat(persons.getItems(), hasSize(7));
}

@@ -100,7 +106,7 @@
*/
@Test
public void testGetPerson() {
- SampleService client = createProxyClient(ENDPOINT_ADDRESS,
DEFAULT_USERNAME, DEFAULT_PASSWORD, null);
+ SampleService client = createProxyClient(SampleService.class,
ENDPOINT_ADDRESS, DEFAULT_USERNAME, DEFAULT_PASSWORD, null);
PaginatedResult<Person> persons = client.getPersons(null, null);
Person person1 = persons.getItems().get(0);
Person person2 = client.getPerson(person1.getId());
@@ -108,12 +114,30 @@
assertThat(person2.getId(), equalTo(person1.getId()));
}

+ /**
+ * Test of getPerson method, of class SampleService.
+ */
+ @Test
+ public void testJsonGetPerson() throws IOException {
+ WebClient client = createWebClient(ENDPOINT_ADDRESS,
DEFAULT_USERNAME, DEFAULT_PASSWORD, MediaType.APPLICATION_JSON);
+ client.path("/sample/persons");
+ String result = client.get().readEntity(String.class);
+ ObjectMapper mapper = new ObjectMapper();
+ PaginatedResult<Person> persons = mapper.readValue(result, new
TypeReference<PaginatedResult<Person>>(){});
+ Person person1 = persons.getItems().get(0);
+ client.back(true).path("/sample/persons/{id}", person1.getId());
+ result = client.get().readEntity(String.class);
+ Person person2 = mapper.readValue(result, Person.class);
+ assertThat(person2, is(not(nullValue())));
+ assertThat(person2.getId(), equalTo(person1.getId()));
+ }
+
/**
* Test of deletePerson method, of class SampleService.
*/
@Test
public void testDeletePerson() {
- SampleService client = createProxyClient(ENDPOINT_ADDRESS,
DEFAULT_USERNAME, DEFAULT_PASSWORD, null);
+ SampleService client = createProxyClient(SampleService.class,
ENDPOINT_ADDRESS, DEFAULT_USERNAME, DEFAULT_PASSWORD, null);
PaginatedResult<Person> persons = client.getPersons(null, null);
Person person = persons.getItems().get(0);
Response response = client.deletePerson(person.getId());
@@ -130,7 +154,7 @@
*/
@Test
public void testAddPerson() {
- SampleService client = createProxyClient(ENDPOINT_ADDRESS,
DEFAULT_USERNAME, DEFAULT_PASSWORD, null);
+ SampleService client = createProxyClient(SampleService.class,
ENDPOINT_ADDRESS, DEFAULT_USERNAME, DEFAULT_PASSWORD, null);
Person newPerson = new Person();
newPerson.setFirstName("New");
newPerson.setLastName("Person");
@@ -144,7 +168,7 @@
*/
@Test
public void testUpdatePerson() {
- SampleService client = createProxyClient(ENDPOINT_ADDRESS,
DEFAULT_USERNAME, DEFAULT_PASSWORD, null);
+ SampleService client = createProxyClient(SampleService.class,
ENDPOINT_ADDRESS, DEFAULT_USERNAME, DEFAULT_PASSWORD, null);
PaginatedResult<Person> persons = client.getPersons(null, null);
Person person = persons.getItems().get(0);
person.setFirstName("Updated");
=======================================
---
/lambico-ws-archetype/src/main/resources/archetype-resources/core/src/test/java/core/test/BaseRSTest.java
Sun Sep 29 04:43:24 2013 UTC
+++
/lambico-ws-archetype/src/main/resources/archetype-resources/core/src/test/java/core/test/BaseRSTest.java
Tue Oct 1 16:35:10 2013 UTC
@@ -24,9 +24,6 @@
import org.junit.After;
import org.junit.Before;
import org.lambico.test.spring.hibernate.junit4.AbstractBaseTest;
-import org.lambico.test.spring.hibernate.junit4.FixtureSet;
-import ${package}.core.po.Person;
-import ${package}.core.rest.SampleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.test.context.ContextConfiguration;
@@ -37,7 +34,6 @@
* @author Lucio Benfante <lu...@benfante.com>
*/
@ContextConfiguration(locations =
{"/${packageInPathFormat}/core/rest/client-beans-test.xml"})
-@FixtureSet(modelClasses = {Person.class})
public abstract class BaseRSTest extends AbstractBaseTest {

public static final String DEFAULT_ACCEPT_TYPE = "application/xml";
@@ -96,10 +92,10 @@
return client;
}

- protected SampleService createProxyClient(String endpointAddress,
String username, String password, String acceptType) {
+ protected <T> T createProxyClient(Class<T> resourceClass, String
endpointAddress, String username, String password, String acceptType) {
List<Object> providers = new ArrayList<Object>();
providers.add(new JacksonJaxbJsonProvider());
- SampleService proxy = JAXRSClientFactory.create(endpointAddress,
SampleService.class, providers);
+ T proxy = JAXRSClientFactory.create(endpointAddress,
resourceClass, providers);
Client client = WebClient.client(proxy);
configureClient(client, username, password, acceptType);
return proxy;
=======================================
---
/lambico-ws-archetype/src/main/resources/archetype-resources/core/src/test/resources/__packageInPathFormat__/core/rest/client-beans-test.xml
Sun Sep 29 04:43:24 2013 UTC
+++
/lambico-ws-archetype/src/main/resources/archetype-resources/core/src/test/resources/__packageInPathFormat__/core/rest/client-beans-test.xml
Tue Oct 1 16:35:10 2013 UTC
@@ -21,7 +21,9 @@
http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd">

<bean id="sampleRestService"
class="${package}.core.rest.SampleService"/>
-
+
+ <bean id="personRestService"
class="${package}.core.rest.PersonService"/>
+
<bean id="securityFilter"
class="${package}.core.security.SecurityCXFJAXRSFilter">
<property name="users">
<map>
=======================================
---
/lambico-ws-archetype/src/main/resources/archetype-resources/server/src/main/webapp/WEB-INF/beans.xml
Sat Sep 28 13:29:19 2013 UTC
+++
/lambico-ws-archetype/src/main/resources/archetype-resources/server/src/main/webapp/WEB-INF/beans.xml
Tue Oct 1 16:35:10 2013 UTC
@@ -36,11 +36,14 @@
</jaxrs:providers>
<jaxrs:serviceBeans>
<ref bean="sampleRestService" />
+ <ref bean="personRestService" />
</jaxrs:serviceBeans>
</jaxrs:server>

<bean id="sampleRestService"
class="${package}.core.rest.SampleService"/>
-
+
+ <bean id="personRestService"
class="org.lambico.ws.archetype.template.core.rest.PersonService"/>
+
<security:global-method-security secured-annotations="enabled">
<security:protect-pointcut expression="execution(*
${package}.core.rest.SampleService.*(..))" access="ROLE_DEFAULT"/>
<!--
=======================================
---
/lambico-ws-archetype/src/test/resources/projects/basic/reference/core/src/main/java/org/lambico/ws/archetype/template/core/bean/PaginatedResult.java
Sat Sep 28 13:29:19 2013 UTC
+++
/lambico-ws-archetype/src/test/resources/projects/basic/reference/core/src/main/java/org/lambico/ws/archetype/template/core/bean/PaginatedResult.java
Tue Oct 1 16:35:10 2013 UTC
@@ -5,6 +5,7 @@
*/
package org.lambico.ws.archetype.template.core.bean;

+import com.fasterxml.jackson.annotation.JsonProperty;
import java.util.List;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
@@ -31,6 +32,7 @@

@XmlElement(name = "item")
@XmlElementWrapper(name = "items")
+ @JsonProperty("item")
public List<T> getItems() {
return items;
}
=======================================
---
/lambico-ws-archetype/src/test/resources/projects/basic/reference/core/src/test/java/org/lambico/ws/archetype/template/core/rest/SampleServiceTest.java
Sat Sep 28 13:29:19 2013 UTC
+++
/lambico-ws-archetype/src/test/resources/projects/basic/reference/core/src/test/java/org/lambico/ws/archetype/template/core/rest/SampleServiceTest.java
Tue Oct 1 16:35:10 2013 UTC
@@ -5,6 +5,9 @@
*/
package org.lambico.ws.archetype.template.core.rest;

+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import java.io.IOException;
import java.util.LinkedList;
import java.util.List;
import javax.annotation.Resource;
@@ -15,7 +18,6 @@
import org.apache.cxf.jaxrs.lifecycle.ResourceProvider;
import org.apache.cxf.jaxrs.lifecycle.SingletonResourceProvider;
import org.junit.Test;
-import org.junit.Ignore;
import org.lambico.ws.archetype.template.core.bean.PaginatedResult;
import org.lambico.ws.archetype.template.core.bean.StringResult;
import org.lambico.ws.archetype.template.core.po.Person;
@@ -26,12 +28,14 @@
import static org.hamcrest.Matchers.not;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.collection.IsCollectionWithSize.hasSize;
+import org.lambico.test.spring.hibernate.junit4.FixtureSet;

/**
* Test the REST SampleService.
*
* @author Lucio Benfante <lu...@benfante.com>
*/
+@FixtureSet(modelClasses = {Person.class})
public class SampleServiceTest extends BaseRSTest {

public static final String ENDPOINT_ADDRESS
= "local://RestSampleService";
@@ -76,7 +80,7 @@
*/
@Test
public void testGetPersons() {
- SampleService client = createProxyClient(ENDPOINT_ADDRESS,
DEFAULT_USERNAME, DEFAULT_PASSWORD, null);
+ SampleService client = createProxyClient(SampleService.class,
ENDPOINT_ADDRESS, DEFAULT_USERNAME, DEFAULT_PASSWORD, null);
PaginatedResult<Person> persons = client.getPersons(null, null);
assertThat(persons.getItems(), hasSize(7));
}
@@ -85,10 +89,12 @@
* Test of getPersons method, of class SampleService.
*/
@Test
- @Ignore
- public void testJsonGetPersons() {
- SampleService client = createProxyClient(ENDPOINT_ADDRESS,
DEFAULT_USERNAME, DEFAULT_PASSWORD, MediaType.APPLICATION_JSON);
- PaginatedResult<Person> persons = client.getPersons(null, null);
+ public void testJsonGetPersons() throws IOException {
+ WebClient client = createWebClient(ENDPOINT_ADDRESS,
DEFAULT_USERNAME, DEFAULT_PASSWORD, MediaType.APPLICATION_JSON);
+ client.path("/sample/persons");
+ String result = client.get().readEntity(String.class);
+ ObjectMapper mapper = new ObjectMapper();
+ PaginatedResult<Person> persons = mapper.readValue(result, new
TypeReference<PaginatedResult<Person>>(){});
assertThat(persons.getItems(), hasSize(7));
}

@@ -97,7 +103,7 @@
*/
@Test
public void testGetPerson() {
- SampleService client = createProxyClient(ENDPOINT_ADDRESS,
DEFAULT_USERNAME, DEFAULT_PASSWORD, null);
+ SampleService client = createProxyClient(SampleService.class,
ENDPOINT_ADDRESS, DEFAULT_USERNAME, DEFAULT_PASSWORD, null);
PaginatedResult<Person> persons = client.getPersons(null, null);
Person person1 = persons.getItems().get(0);
Person person2 = client.getPerson(person1.getId());
@@ -105,12 +111,30 @@
assertThat(person2.getId(), equalTo(person1.getId()));
}

+ /**
+ * Test of getPerson method, of class SampleService.
+ */
+ @Test
+ public void testJsonGetPerson() throws IOException {
+ WebClient client = createWebClient(ENDPOINT_ADDRESS,
DEFAULT_USERNAME, DEFAULT_PASSWORD, MediaType.APPLICATION_JSON);
+ client.path("/sample/persons");
+ String result = client.get().readEntity(String.class);
+ ObjectMapper mapper = new ObjectMapper();
+ PaginatedResult<Person> persons = mapper.readValue(result, new
TypeReference<PaginatedResult<Person>>(){});
+ Person person1 = persons.getItems().get(0);
+ client.back(true).path("/sample/persons/{id}", person1.getId());
+ result = client.get().readEntity(String.class);
+ Person person2 = mapper.readValue(result, Person.class);
+ assertThat(person2, is(not(nullValue())));
+ assertThat(person2.getId(), equalTo(person1.getId()));
+ }
+
/**
* Test of deletePerson method, of class SampleService.
*/
@Test
public void testDeletePerson() {
- SampleService client = createProxyClient(ENDPOINT_ADDRESS,
DEFAULT_USERNAME, DEFAULT_PASSWORD, null);
+ SampleService client = createProxyClient(SampleService.class,
ENDPOINT_ADDRESS, DEFAULT_USERNAME, DEFAULT_PASSWORD, null);
PaginatedResult<Person> persons = client.getPersons(null, null);
Person person = persons.getItems().get(0);
Response response = client.deletePerson(person.getId());
@@ -127,7 +151,7 @@
*/
@Test
public void testAddPerson() {
- SampleService client = createProxyClient(ENDPOINT_ADDRESS,
DEFAULT_USERNAME, DEFAULT_PASSWORD, null);
+ SampleService client = createProxyClient(SampleService.class,
ENDPOINT_ADDRESS, DEFAULT_USERNAME, DEFAULT_PASSWORD, null);
Person newPerson = new Person();
newPerson.setFirstName("New");
newPerson.setLastName("Person");
@@ -141,7 +165,7 @@
*/
@Test
public void testUpdatePerson() {
- SampleService client = createProxyClient(ENDPOINT_ADDRESS,
DEFAULT_USERNAME, DEFAULT_PASSWORD, null);
+ SampleService client = createProxyClient(SampleService.class,
ENDPOINT_ADDRESS, DEFAULT_USERNAME, DEFAULT_PASSWORD, null);
PaginatedResult<Person> persons = client.getPersons(null, null);
Person person = persons.getItems().get(0);
person.setFirstName("Updated");
=======================================
---
/lambico-ws-archetype/src/test/resources/projects/basic/reference/core/src/test/java/org/lambico/ws/archetype/template/core/test/BaseRSTest.java
Sun Sep 29 04:43:24 2013 UTC
+++
/lambico-ws-archetype/src/test/resources/projects/basic/reference/core/src/test/java/org/lambico/ws/archetype/template/core/test/BaseRSTest.java
Tue Oct 1 16:35:10 2013 UTC
@@ -21,9 +21,6 @@
import org.junit.After;
import org.junit.Before;
import org.lambico.test.spring.hibernate.junit4.AbstractBaseTest;
-import org.lambico.test.spring.hibernate.junit4.FixtureSet;
-import org.lambico.ws.archetype.template.core.po.Person;
-import org.lambico.ws.archetype.template.core.rest.SampleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.test.context.ContextConfiguration;
@@ -34,7 +31,6 @@
* @author Lucio Benfante <lu...@benfante.com>
*/
@ContextConfiguration(locations =
{"/org/lambico/ws/archetype/template/core/rest/client-beans-test.xml"})
-@FixtureSet(modelClasses = {Person.class})
public abstract class BaseRSTest extends AbstractBaseTest {

public static final String DEFAULT_ACCEPT_TYPE = "application/xml";
@@ -93,10 +89,10 @@
return client;
}

- protected SampleService createProxyClient(String endpointAddress,
String username, String password, String acceptType) {
+ protected <T> T createProxyClient(Class<T> resourceClass, String
endpointAddress, String username, String password, String acceptType) {
List<Object> providers = new ArrayList<Object>();
providers.add(new JacksonJaxbJsonProvider());
- SampleService proxy = JAXRSClientFactory.create(endpointAddress,
SampleService.class, providers);
+ T proxy = JAXRSClientFactory.create(endpointAddress,
resourceClass, providers);
Client client = WebClient.client(proxy);
configureClient(client, username, password, acceptType);
return proxy;
=======================================
---
/lambico-ws-archetype/src/test/resources/projects/basic/reference/core/src/test/resources/org/lambico/ws/archetype/template/core/rest/client-beans-test.xml
Sat Sep 28 13:29:19 2013 UTC
+++
/lambico-ws-archetype/src/test/resources/projects/basic/reference/core/src/test/resources/org/lambico/ws/archetype/template/core/rest/client-beans-test.xml
Tue Oct 1 16:35:10 2013 UTC
@@ -18,7 +18,9 @@
http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd">

<bean id="sampleRestService"
class="org.lambico.ws.archetype.template.core.rest.SampleService"/>
-
+
+ <bean id="personRestService"
class="org.lambico.ws.archetype.template.core.rest.PersonService"/>
+
<bean id="securityFilter"
class="org.lambico.ws.archetype.template.core.security.SecurityCXFJAXRSFilter">
<property name="users">
<map>
=======================================
---
/lambico-ws-archetype/src/test/resources/projects/basic/reference/server/src/main/webapp/WEB-INF/beans.xml
Sat Sep 28 13:29:19 2013 UTC
+++
/lambico-ws-archetype/src/test/resources/projects/basic/reference/server/src/main/webapp/WEB-INF/beans.xml
Tue Oct 1 16:35:10 2013 UTC
@@ -33,11 +33,14 @@
</jaxrs:providers>
<jaxrs:serviceBeans>
<ref bean="sampleRestService" />
+ <ref bean="personRestService" />
</jaxrs:serviceBeans>
</jaxrs:server>

<bean id="sampleRestService"
class="org.lambico.ws.archetype.template.core.rest.SampleService"/>
-
+
+ <bean id="personRestService"
class="org.lambico.ws.archetype.template.core.rest.PersonService"/>
+
<security:global-method-security secured-annotations="enabled">
<security:protect-pointcut expression="execution(*
org.lambico.ws.archetype.template.core.rest.SampleService.*(..))"
access="ROLE_DEFAULT"/>
<!--
Reply all
Reply to author
Forward
0 new messages