Preloader image

Help us document this example! Click the blue pencil icon in the upper right to edit this page.

User

package org.superbiz.rest;

import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;
import jakarta.persistence.NamedQueries;
import jakarta.persistence.NamedQuery;
import jakarta.xml.bind.annotation.XmlRootElement;

@Entity
@NamedQueries({
        @NamedQuery(name = "user.list", query = "select u from User u")
}

UserService

package org.superbiz.rest;

import jakarta.ejb.Lock;
import jakarta.ejb.LockType;
import jakarta.ejb.Singleton;
import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
import jakarta.ws.rs.DELETE;
import jakarta.ws.rs.DefaultValue;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.POST;
import jakarta.ws.rs.PUT;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.PathParam;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.QueryParam;
import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.core.Response;
import java.util.ArrayList;
import java.util.List;

/**
 * Outputs are copied because of the enhancement of OpenJPA.
 *
 */
@Singleton
@Lock(LockType.WRITE)
@Path("/user")
@Produces(MediaType.APPLICATION_XML)
public class UserService {
    @PersistenceContext
    private EntityManager em;

    @Path("/create")
    @PUT
    public User create(@QueryParam("name") String name,
                       @QueryParam("pwd") String pwd,
                       @QueryParam("mail") String mail) {
        User user = new User();
        user.setFullname(name);
        user.setPassword(pwd);
        user.setEmail(mail);
        em.persist(user);
        return user;
    }

    @Path("/list")
    @GET
    public List<User> list(@QueryParam("first") @DefaultValue("0") int first,
                           @QueryParam("max") @DefaultValue("20") int max) {
        List<User> users = new ArrayList<User>();
        List<User> found = em.createNamedQuery("user.list", User.class).setFirstResult(first).setMaxResults(max).getResultList();
        for (User u : found) {
            users.add(u.copy());
        }
        return users;
    }

    @Path("/show/{id}")
    @GET
    public User find(@PathParam("id") long id) {
        User user = em.find(User.class, id);
        if (user == null) {
            return null;
        }
        return user.copy();
    }

    @Path("/delete/{id}")
    @DELETE
    public void delete(@PathParam("id") long id) {
        User user = em.find(User.class, id);
        if (user != null) {
            em.remove(user);
        }
    }

    @Path("/update/{id}")
    @POST
    public Response update(@PathParam("id") long id,
                           @QueryParam("name") String name,
                           @QueryParam("pwd") String pwd,
                           @QueryParam("mail") String mail) {
        User user = em.find(User.class, id);
        if (user == null) {
            throw new IllegalArgumentException("user id " + id + " not found");
        }

        user.setFullname(name);
        user.setPassword(pwd);
        user.setEmail(mail);
        em.merge(user);

        return Response.ok(user.copy()).build();
    }
}

persistence.xml

<persistence version="2.0"
             xmlns="http://java.sun.com/xml/ns/persistence"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
                       http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
  <persistence-unit name="user">
    <jta-data-source>My DataSource</jta-data-source>
    <non-jta-data-source>My Unmanaged DataSource</non-jta-data-source>
    <class>org.superbiz.rest.User</class>
    <properties>
      <property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema(ForeignKeys=true)"/>
    </properties>
  </persistence-unit>
</persistence>

UserServiceTest

package org.superbiz.rest;

import org.apache.cxf.jaxrs.client.WebClient;
import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.arquillian.junit.Arquillian;
import org.jboss.arquillian.test.api.ArquillianResource;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.asset.ClassLoaderAsset;
import org.jboss.shrinkwrap.api.spec.WebArchive;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;

import jakarta.ejb.EJB;
import jakarta.ws.rs.core.Response;
import jakarta.xml.bind.JAXBContext;
import jakarta.xml.bind.Unmarshaller;
import java.io.InputStream;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.fail;

@RunWith(Arquillian.class)
public class UserServiceTest {

    private static List<User> users = new ArrayList<>();

    @ArquillianResource
    private URL base;

    @EJB
    private UserService service;

    @Deployment
    public static WebArchive app() {
        return ShrinkWrap.create(WebArchive.class)
                .addClasses(User.class, UserService.class)
                .addAsResource(new ClassLoaderAsset("META-INF/persistence.xml"), "META-INF/persistence.xml");
    }

    @Before
    public void createSomeRecords() {
        if (users.isEmpty()) { // the test runs inside TomEE, the records are created once for all tests
            users.add(service.create("foo", "foopwd", "foo@foo.com"));
            users.add(service.create("bar", "barpwd", "bar@bar.com"));
        }
    }

    @Test
    public void create() {
        WebClient.create(base.toExternalForm())
                .path("/user/create")
                .query("name", "dummy")
                .query("pwd", "unbreakable")
                .query("mail", "foo@bar.fr")
                .put("{}");
        List<User> list = service.list(0, 100);
        for (User u : list) {
            if (!users.contains(u)) {
                service.delete(u.getId());
                return;
            }
        }
        fail("user was not added");
    }

    @Test
    public void delete() throws Exception {
        User user = service.create("todelete", "dontforget", "delete@me.com");

        WebClient.create(base.toExternalForm()).path("/user/delete/" + user.getId()).delete();

        user = service.find(user.getId());
        assertNull(user);
    }

    @Test
    public void show() {
        User user = WebClient.create(base.toExternalForm())
                .path("/user/show/" + users.iterator().next().getId())
                .get(User.class);
        assertEquals("foo", user.getFullname());
        assertEquals("foopwd", user.getPassword());
        assertEquals("foo@foo.com", user.getEmail());
    }

    @Test
    public void list() throws Exception {
        String users = WebClient.create(base.toExternalForm())
                .path("/user/list")
                .get(String.class);
        assertEquals(users,
                inline("<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
                        "<users>" +
                        "  <user>" +
                        "    <email>bar@bar.com</email>" +
                        "    <fullname>bar</fullname>" +
                        "    <id>2</id>" +
                        "    <password>barpwd</password>" +
                        "  </user>" +
                        "  <user>" +
                        "    <email>foo@foo.com</email>" +
                        "    <fullname>foo</fullname>" +
                        "    <id>1</id>" +
                        "    <password>foopwd</password>" +
                        "  </user>" +
                        "</users>"), inline(users)
        );
    }

    private static String inline(String s) {
        return s.replace(System.getProperty("line.separator"), "").replace("\n", "")
                .replace(" ", "").replace("\t", "");
    }

    @Test
    public void update() throws Exception {
        User created = service.create("name", "pwd", "mail");
        Response response = WebClient.create(base.toExternalForm())
                .path("/user/update/" + created.getId())
                .query("name", "corrected")
                .query("pwd", "userpwd")
                .query("mail", "it@is.ok")
                .post(null);

        JAXBContext ctx = JAXBContext.newInstance(User.class);
        Unmarshaller unmarshaller = ctx.createUnmarshaller();
        User modified = (User) unmarshaller.unmarshal(InputStream.class.cast(response.getEntity()));

        assertEquals("corrected", modified.getFullname());
        assertEquals("userpwd", modified.getPassword());
        assertEquals("it@is.ok", modified.getEmail());
        service.delete(created.getId());
    }
}

Running

Running org.superbiz.rest.UserServiceTest
INFO: Starting TomEE from: /tmp/arquillian-apache-tomee-23442
INFO: Starting Servlet engine: [Apache Tomcat/11.0.25]
INFO: Starting ProtocolHandler ["http-nio-52948"]
INFO: Configuring enterprise application: /path/to/tomee/examples/rest-on-ejb/target/tomee-embedded/0/83a03b24-3a21-4e2c-a0c7-4f869195c85e
INFO: Configuring PersistenceUnit(name=user)
INFO: Auto-creating a Resource with id 'Default JDBC Database' of type 'DataSource' for 'user'.
INFO: Auto-creating a Resource with id 'Default Unmanaged JDBC Database' of type 'DataSource' for 'user'.
INFO: Enterprise application "/path/to/tomee/examples/rest-on-ejb/target/tomee-embedded/0/83a03b24-3a21-4e2c-a0c7-4f869195c85e" loaded.
INFO: PersistenceUnit(name=user, provider=org.apache.openjpa.persistence.PersistenceProviderImpl) - provider time 15ms
INFO: Deployed Application(path=/path/to/tomee/examples/rest-on-ejb/target/tomee-embedded/0/83a03b24-3a21-4e2c-a0c7-4f869195c85e)
INFO: REST Application: http://localhost:52948/83a03b24-3a21-4e2c-a0c7-4f869195c85e/                 -> org.apache.openejb.server.rest.InternalApplication
INFO:      Service URI: http://localhost:52948/83a03b24-3a21-4e2c-a0c7-4f869195c85e/user             ->  EJB org.superbiz.rest.UserService
INFO:            DELETE http://localhost:52948/83a03b24-3a21-4e2c-a0c7-4f869195c85e/user/delete/{id} ->      void delete(long)
INFO:               GET http://localhost:52948/83a03b24-3a21-4e2c-a0c7-4f869195c85e/user/list        ->      List<User> list(int, int)
INFO:               GET http://localhost:52948/83a03b24-3a21-4e2c-a0c7-4f869195c85e/user/show/{id}   ->      User find(long)
INFO:              POST http://localhost:52948/83a03b24-3a21-4e2c-a0c7-4f869195c85e/user/update/{id} ->      Response update(long, String, String, String)
INFO:               PUT http://localhost:52948/83a03b24-3a21-4e2c-a0c7-4f869195c85e/user/create      ->      User create(String, String, String)
INFO: Undeploying app: /path/to/tomee/examples/rest-on-ejb/target/tomee-embedded/0/83a03b24-3a21-4e2c-a0c7-4f869195c85e
Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 2.351 s -- in org.superbiz.rest.UserServiceTest
Results:

Tests run: 5, Failures: 0, Errors: 0, Skipped: 0