<!DOCTYPE html>
<html lang="en">

<head>
	<meta charset="UTF-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
	<meta name="viewport" content="width=device-width, initial-scale=1">
	<title>Apache TomEE</title>
	<meta name="description"
		  content="Apache TomEE is a lightweight, yet powerful, JavaEE Application server with feature rich tooling." />
	<meta name="keywords" content="tomee,asf,apache,javaee,jee,shade,embedded,test,junit,applicationcomposer,maven,arquillian" />
	<meta name="author" content="Luka Cvetinovic for Codrops" />
	<link rel="icon" href="../../favicon.ico">
	<link rel="icon"  type="image/png" href="../../favicon.png">
	<meta name="msapplication-TileColor" content="#80287a">
	<meta name="theme-color" content="#80287a">
	<link rel="stylesheet" type="text/css" href="../../css/normalize.css">
	<link rel="stylesheet" type="text/css" href="../../css/bootstrap.css">
	<link rel="stylesheet" type="text/css" href="../../css/owl.css">
	<link rel="stylesheet" type="text/css" href="../../css/animate.css">
	<link rel="stylesheet" type="text/css" href="../../fonts/font-awesome-4.1.0/css/font-awesome.min.css">
	<link rel="stylesheet" type="text/css" href="../../fonts/eleganticons/et-icons.css">
	<link rel="stylesheet" type="text/css" href="../../css/jqtree.css">
	<link rel="stylesheet" type="text/css" href="../../css/idea.css">
	<link rel="stylesheet" type="text/css" href="../../css/cardio.css">

	<script type="text/javascript">

      var _gaq = _gaq || [];
      _gaq.push(['_setAccount', 'UA-2717626-1']);
      _gaq.push(['_setDomainName', 'apache.org']);
      _gaq.push(['_trackPageview']);

      (function() {
        var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
        ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
        var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
      })();

    </script>
</head>

<body>
    <div class="preloader">
		<img src="../../img/loader.gif" alt="Preloader image">
	</div>
	    <nav class="navbar">
		<div class="container">
		  <div class="row">          <div class="col-md-12">

			<!-- Brand and toggle get grouped for better mobile display -->
			<div class="navbar-header">
				<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
					<span class="sr-only">Toggle navigation</span>
					<span class="icon-bar"></span>
					<span class="icon-bar"></span>
					<span class="icon-bar"></span>
				</button>
				<a class="navbar-brand" href="/">
				    <span>

				    
                        <img src="../../img/logo-active.png">
                    

                    </span>
				    Apache TomEE
                </a>
			</div>
			<!-- Collect the nav links, forms, and other content for toggling -->
			<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
				<ul class="nav navbar-nav navbar-right main-nav">
					<li><a href="../../docs.html">Documentation</a></li>
					<li><a href="../../community/index.html">Community</a></li>
					<li><a href="../../security/security.html">Security</a></li>
					<li><a href="../../download-ng.html">Downloads</a></li>
				</ul>
			</div>
			<!-- /.navbar-collapse -->
		   </div></div>
		</div>
		<!-- /.container-fluid -->
	</nav>


    <div id="main-block" class="container main-block">
        <div class="row title">
          <div class="col-md-12">
            <div class='page-header'>
              
              <h1>REST Example</h1>
            </div>
          </div>
        </div>
        <div class="row">
            
            <div class="col-md-12">
                <p><em>Help us document this example! Click the blue pencil icon in the upper right to edit this page.</em></p>
<h2>CommentDAO</h2>
<pre><code>package org.superbiz.rest.dao;

import org.superbiz.rest.model.Comment;
import org.superbiz.rest.model.Post;

import javax.ejb.EJB;
import javax.ejb.Stateless;
import java.util.Collections;
import java.util.List;

@Stateless
public class CommentDAO extends DAO {
    @EJB
    private DAO dao;

    public List&lt;Comment&gt; list(long postId) {
        Post post = dao.find(Post.class, postId);
        if (post == null) {
            throw new IllegalArgumentException(&quot;post with id &quot; + postId + &quot; not found&quot;);
        }
        return Collections.unmodifiableList(post.getComments());
    }

    public Comment create(String author, String content, long postId) {
        Post post = dao.find(Post.class, postId);
        if (post == null) {
            throw new IllegalArgumentException(&quot;post with id &quot; + postId + &quot; not found&quot;);
        }

        Comment comment = new Comment();
        comment.setAuthor(author);
        comment.setContent(content);
        dao.create(comment);
        comment.setPost(post);
        return comment;
    }

    public void delete(long id) {
        dao.delete(Comment.class, id);
    }

    public Comment update(long id, String author, String content) {
        Comment comment = dao.find(Comment.class, id);
        if (comment == null) {
            throw new IllegalArgumentException(&quot;comment with id &quot; + id + &quot; not found&quot;);
        }

        comment.setAuthor(author);
        comment.setContent(content);
        return dao.update(comment);
    }
}
</code></pre>
<h2>DAO</h2>
<pre><code>package org.superbiz.rest.dao;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import java.util.List;

/**
 * Simply maps the entitymanager.
 * It simplifies refactoring (unitName change) and wraps some logic (limited queries).
 *
 */
@Stateless
public class DAO {
    @PersistenceContext(unitName = &quot;blog&quot;)
    private EntityManager em;

    public &lt;E&gt; E create(E e) {
        em.persist(e);
        return e;
    }

    public &lt;E&gt; E update(E e) {
        return em.merge(e);
    }

    public &lt;E&gt; void delete(Class&lt;E&gt; clazz, long id) {
        em.remove(em.find(clazz, id));
    }

    public &lt;E&gt; E find(Class&lt;E&gt; clazz, long id) {
        return em.find(clazz, id);
    }

    public &lt;E&gt; List&lt;E&gt; find(Class&lt;E&gt; clazz, String query, int min, int max) {
        return queryRange(em.createQuery(query, clazz), min, max).getResultList();
    }

    public &lt;E&gt; List&lt;E&gt; namedFind(Class&lt;E&gt; clazz, String query, int min, int max) {
        return queryRange(em.createNamedQuery(query, clazz), min, max).getResultList();
    }

    private static Query queryRange(Query query, int min, int max) {
        if (max &gt;= 0) {
            query.setMaxResults(max);
        }
        if (min &gt;= 0) {
            query.setFirstResult(min);
        }
        return query;
    }
}
</code></pre>
<h2>PostDAO</h2>
<pre><code>package org.superbiz.rest.dao;

import org.superbiz.rest.model.Post;
import org.superbiz.rest.model.User;

import javax.ejb.EJB;
import javax.ejb.Stateless;
import java.util.List;

@Stateless
public class PostDAO {
    @EJB
    private DAO dao;

    public Post create(String title, String content, long userId) {
        User user = dao.find(User.class, userId);
        Post post = new Post();
        post.setTitle(title);
        post.setContent(content);
        post.setUser(user);
        return dao.create(post);
    }

    public Post find(long id) {
        return dao.find(Post.class, id);
    }

    public List&lt;Post&gt; list(int first, int max) {
        return dao.namedFind(Post.class, &quot;post.list&quot;, first, max);
    }

    public void delete(long id) {
        dao.delete(Post.class, id);
    }

    public Post update(long id, long userId, String title, String content) {
        User user = dao.find(User.class, userId);
        if (user == null) {
            throw new IllegalArgumentException(&quot;user id &quot; + id + &quot; not found&quot;);
        }

        Post post = dao.find(Post.class, id);
        if (post == null) {
            throw new IllegalArgumentException(&quot;post id &quot; + id + &quot; not found&quot;);
        }

        post.setTitle(title);
        post.setContent(content);
        post.setUser(user);
        return dao.update(post);
    }
}
</code></pre>
<h2>UserDAO</h2>
<pre><code>package org.superbiz.rest.dao;

import org.superbiz.rest.model.User;

import javax.ejb.EJB;
import javax.ejb.Stateless;
import java.util.List;

@Stateless
public class UserDAO {
    @EJB
    private DAO dao;

    public User create(String name, String pwd, String mail) {
        User user = new User();
        user.setFullname(name);
        user.setPassword(pwd);
        user.setEmail(mail);
        return dao.create(user);
    }

    public List&lt;User&gt; list(int first, int max) {
        return dao.namedFind(User.class, &quot;user.list&quot;, first, max);
    }

    public User find(long id) {
        return dao.find(User.class, id);
    }

    public void delete(long id) {
        dao.delete(User.class, id);
    }

    public User update(long id, String name, String pwd, String mail) {
        User user = dao.find(User.class, id);
        if (user == null) {
            throw new IllegalArgumentException(&quot;setUser id &quot; + id + &quot; not found&quot;);
        }

        user.setFullname(name);
        user.setPassword(pwd);
        user.setEmail(mail);
        return dao.update(user);
    }
}
</code></pre>
<h2>Comment</h2>
<pre><code>package org.superbiz.rest.model;

import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.Lob;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;

@Entity
@NamedQueries({
        @NamedQuery(name = &quot;comment.list&quot;, query = &quot;select c from Comment c&quot;)
}
</code></pre>
<h2>DatedModel</h2>
<pre><code>package org.superbiz.rest.model;

import javax.persistence.MappedSuperclass;
import javax.persistence.PrePersist;
import java.util.Date;

@MappedSuperclass
public abstract class DatedModel extends Model {
    private Date created;

    @PrePersist
    public void create() {
        created = new Date();
    }

    public Date getCreated() {
        return created;
    }

    public void setCreated(Date created) {
        this.created = created;
    }
}
</code></pre>
<h2>Model</h2>
<pre><code>package org.superbiz.rest.model;

import javax.persistence.Access;
import javax.persistence.AccessType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.MappedSuperclass;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;

@MappedSuperclass
@Access(AccessType.FIELD)
@XmlAccessorType(XmlAccessType.FIELD)
public abstract class Model {

    @Id
    @GeneratedValue
    protected long id;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }
}
</code></pre>
<h2>Post</h2>
<pre><code>package org.superbiz.rest.model;

import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Lob;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import javax.xml.bind.annotation.XmlRootElement;
import java.util.ArrayList;
import java.util.List;

@Entity
@NamedQueries({
        @NamedQuery(name = &quot;post.list&quot;, query = &quot;select p from Post p&quot;)
}
</code></pre>
<h2>User</h2>
<pre><code>package org.superbiz.rest.model;

import javax.persistence.Entity;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;
import javax.xml.bind.annotation.XmlRootElement;

@Entity
@NamedQueries({
        @NamedQuery(name = &quot;user.list&quot;, query = &quot;select u from User u&quot;)
}
</code></pre>
<h2>CommentService</h2>
<pre><code>package org.superbiz.rest.service;

import org.superbiz.rest.dao.CommentDAO;
import org.superbiz.rest.model.Comment;

import javax.ejb.EJB;
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 java.util.List;

@Path(&quot;/api/comment&quot;)
@Produces({&quot;text/xml&quot;, &quot;application/json&quot;})
public class CommentService {
    @EJB
    private CommentDAO commentDao;

    @Path(&quot;/create&quot;)
    @PUT
    public Comment create(@QueryParam(&quot;author&quot;) String author,
                          @QueryParam(&quot;content&quot;) String content,
                          @QueryParam(&quot;postId&quot;) long postId) {
        return commentDao.create(author, content, postId);
    }

    @Path(&quot;/list/{postId}&quot;)
    @GET
    public List&lt;Comment&gt; list(@PathParam(&quot;postId&quot;) long postId) {
        return commentDao.list(postId);
    }

    @Path(&quot;/delete/{id}&quot;)
    @DELETE
    public void delete(@PathParam(&quot;id&quot;) long id) {
        commentDao.delete(id);
    }

    @Path(&quot;/update/{id}&quot;)
    @POST
    public Comment update(@PathParam(&quot;id&quot;) long id,
                          @QueryParam(&quot;author&quot;) String author,
                          @QueryParam(&quot;content&quot;) String content) {
        return commentDao.update(id, author, content);
    }
}
</code></pre>
<h2>PostService</h2>
<pre><code>package org.superbiz.rest.service;

import org.superbiz.rest.dao.PostDAO;
import org.superbiz.rest.model.Post;

import javax.ejb.EJB;
import javax.ws.rs.DELETE;
import javax.ws.rs.DefaultValue;
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 java.util.List;

@Path(&quot;/api/post&quot;)
@Produces({&quot;text/xml&quot;, &quot;application/json&quot;})
public class PostService {
    @EJB
    private PostDAO dao;

    @Path(&quot;/create&quot;)
    @PUT
    public Post create(@QueryParam(&quot;title&quot;) String title,
                       @QueryParam(&quot;content&quot;) String content,
                       @QueryParam(&quot;userId&quot;) long userId) {
        return dao.create(title, content, userId);
    }

    @Path(&quot;/list&quot;)
    @GET
    public List&lt;Post&gt; list(@QueryParam(&quot;first&quot;) @DefaultValue(&quot;0&quot;) int first,
                           @QueryParam(&quot;max&quot;) @DefaultValue(&quot;20&quot;) int max) {
        return dao.list(first, max);
    }

    @Path(&quot;/show/{id}&quot;)
    @GET
    public Post show(@PathParam(&quot;id&quot;) long id) {
        return dao.find(id);
    }

    @Path(&quot;/delete/{id}&quot;)
    @DELETE
    public void delete(@PathParam(&quot;id&quot;) long id) {
        dao.delete(id);
    }

    @Path(&quot;/update/{id}&quot;)
    @POST
    public Post update(@PathParam(&quot;id&quot;) long id,
                       @QueryParam(&quot;userId&quot;) long userId,
                       @QueryParam(&quot;title&quot;) String title,
                       @QueryParam(&quot;content&quot;) String content) {
        return dao.update(id, userId, title, content);
    }
}
</code></pre>
<h2>UserService</h2>
<pre><code>package org.superbiz.rest.service;

import org.superbiz.rest.dao.UserDAO;
import org.superbiz.rest.model.User;

import javax.ejb.EJB;
import javax.ws.rs.DELETE;
import javax.ws.rs.DefaultValue;
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 java.util.List;

@Path(&quot;/api/user&quot;)
@Produces({&quot;text/xml&quot;, &quot;application/json&quot;})
public class UserService {
    @EJB
    private UserDAO dao;

    @Path(&quot;/create&quot;)
    @PUT
    public User create(@QueryParam(&quot;name&quot;) String name,
                       @QueryParam(&quot;pwd&quot;) String pwd,
                       @QueryParam(&quot;mail&quot;) String mail) {
        return dao.create(name, pwd, mail);
    }

    @Path(&quot;/list&quot;)
    @GET
    public List&lt;User&gt; list(@QueryParam(&quot;first&quot;) @DefaultValue(&quot;0&quot;) int first,
                           @QueryParam(&quot;max&quot;) @DefaultValue(&quot;20&quot;) int max) {
        return dao.list(first, max);
    }

    @Path(&quot;/show/{id}&quot;)
    @GET
    public User show(@PathParam(&quot;id&quot;) long id) {
        return dao.find(id);
    }

    @Path(&quot;/delete/{id}&quot;)
    @DELETE
    public void delete(@PathParam(&quot;id&quot;) long id) {
        dao.delete(id);
    }

    @Path(&quot;/update/{id}&quot;)
    @POST
    public User update(@PathParam(&quot;id&quot;) long id,
                       @QueryParam(&quot;name&quot;) String name,
                       @QueryParam(&quot;pwd&quot;) String pwd,
                       @QueryParam(&quot;mail&quot;) String mail) {
        return dao.update(id, name, pwd, mail);
    }
}
</code></pre>
<h2>persistence.xml</h2>
<pre><code>&lt;persistence version=&quot;2.0&quot;
             xmlns=&quot;http://java.sun.com/xml/ns/persistence&quot;
             xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
             xsi:schemaLocation=&quot;http://java.sun.com/xml/ns/persistence
                       http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd&quot;&gt;
  &lt;persistence-unit name=&quot;blog&quot;&gt;
    &lt;jta-data-source&gt;My DataSource&lt;/jta-data-source&gt;
    &lt;non-jta-data-source&gt;My Unmanaged DataSource&lt;/non-jta-data-source&gt;
    &lt;class&gt;org.superbiz.rest.model.User&lt;/class&gt;
    &lt;class&gt;org.superbiz.rest.model.Post&lt;/class&gt;
    &lt;class&gt;org.superbiz.rest.model.Comment&lt;/class&gt;
    &lt;class&gt;org.superbiz.rest.model.Model&lt;/class&gt;
    &lt;class&gt;org.superbiz.rest.model.DatedModel&lt;/class&gt;
    &lt;properties&gt;
      &lt;property name=&quot;openjpa.jdbc.SynchronizeMappings&quot; value=&quot;buildSchema(ForeignKeys=true)&quot;/&gt;
    &lt;/properties&gt;
  &lt;/persistence-unit&gt;
&lt;/persistence&gt;
</code></pre>
<h2>web.xml</h2>
<pre><code>&lt;web-app xmlns=&quot;http://java.sun.com/xml/ns/javaee&quot;
         xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
         xsi:schemaLocation=&quot;http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd&quot;
         metadata-complete=&quot;false&quot;
         version=&quot;2.5&quot;&gt;

  &lt;display-name&gt;OpenEJB REST Example&lt;/display-name&gt;
&lt;/web-app&gt;
</code></pre>
<h2>UserDaoTest</h2>
<pre><code>packagenull
}
</code></pre>
<h2>UserServiceTest</h2>
<pre><code>packagenull
}
</code></pre>
            </div>
            
        </div>
    </div>
<footer>
		<div class="container">
			<div class="row">
				<div class="col-sm-6 text-center-mobile">
					<h3 class="white">Be simple.  Be certified. Be Tomcat.</h3>
					<h5 class="light regular light-white">"A good application in a good server"</h5>
					<ul class="social-footer">
						<li><a href="https://www.facebook.com/ApacheTomEE/"><i class="fa fa-facebook"></i></a></li>
						<li><a href="https://twitter.com/apachetomee"><i class="fa fa-twitter"></i></a></li>
						<li><a href="https://plus.google.com/communities/105208241852045684449"><i class="fa fa-google-plus"></i></a></li>
					</ul>
				</div>
				<div class="col-sm-6 text-center-mobile">
					<div class="row opening-hours">
						<div class="col-sm-3 text-center-mobile">
							<h5><a href="../../latest/docs/" class="white">Documentation</a></h5>
							<ul class="list-unstyled">
								<li><a href="../../latest/docs/admin/configuration/index.html" class="regular light-white">How to configure</a></li>
								<li><a href="../../latest/docs/admin/file-layout.html" class="regular light-white">Dir. Structure</a></li>
								<li><a href="../../latest/docs/developer/testing/index.html" class="regular light-white">Testing</a></li>
								<li><a href="../../latest/docs/admin/cluster/index.html" class="regular light-white">Clustering</a></li>
							</ul>
						</div>
						<div class="col-sm-3 text-center-mobile">
							<h5><a href="../../latest/examples/" class="white">Examples</a></h5>
							<ul class="list-unstyled">
								<li><a href="../../latest/examples/simple-cdi-interceptor.html" class="regular light-white">CDI Interceptor</a></li>
								<li><a href="../../latest/examples/rest-cdi.html" class="regular light-white">REST with CDI</a></li>
								<li><a href="../../latest/examples/ejb-examples.html" class="regular light-white">EJB</a></li>
								<li><a href="../../latest/examples/jsf-managedBean-and-ejb.html" class="regular light-white">JSF</a></li>
							</ul>
						</div>
						<div class="col-sm-3 text-center-mobile">
							<h5><a href="../../community/index.html" class="white">Community</a></h5>
							<ul class="list-unstyled">
								<li><a href="../../community/contributors.html" class="regular light-white">Contributors</a></li>
								<li><a href="../../community/social.html" class="regular light-white">Social</a></li>
								<li><a href="../../community/sources.html" class="regular light-white">Sources</a></li>
							</ul>
						</div>
						<div class="col-sm-3 text-center-mobile">
							<h5><a href="../../security/index.html" class="white">Security</a></h5>
							<ul class="list-unstyled">
								<li><a href="http://apache.org/security" target="_blank" class="regular light-white">Apache Security</a></li>
								<li><a href="http://apache.org/security/projects.html" target="_blank" class="regular light-white">Security Projects</a></li>
								<li><a href="http://cve.mitre.org" target="_blank" class="regular light-white">CVE</a></li>
							</ul>
						</div>
					</div>
				</div>
			</div>
			<div class="row bottom-footer text-center-mobile">
				<div class="col-sm-12 light-white">
					<p>Copyright &copy; 1999-2016 The Apache Software Foundation, Licensed under the Apache License, Version 2.0. Apache TomEE, TomEE, Apache, the Apache feather logo, and the Apache TomEE project logo are trademarks of The Apache Software Foundation. All other marks mentioned may be trademarks or registered trademarks of their respective owners.</p>
				</div>
			</div>
		</div>
	</footer>
	<!-- Holder for mobile navigation -->
	<div class="mobile-nav">
        <ul>
          <li><a hef="../../latest/docs/admin/index.html">Administrators</a>
          <li><a hef="../../latest/docs/developer/index.html">Developers</a>
          <li><a hef="../../latest/docs/advanced/index.html">Advanced</a>
          <li><a hef="../../community/index.html">Community</a>
        </ul>
		<a href="#" class="close-link"><i class="arrow_up"></i></a>
	</div>
	<!-- Scripts -->
	<script src="../../js/jquery-1.11.1.min.js"></script>
	<script src="../../js/owl.carousel.min.js"></script>
	<script src="../../js/bootstrap.min.js"></script>
	<script src="../../js/wow.min.js"></script>
	<script src="../../js/typewriter.js"></script>
	<script src="../../js/jquery.onepagenav.js"></script>
	<script src="../../js/tree.jquery.js"></script>
	<script src="../../js/highlight.pack.js"></script>
    <script src="../../js/main.js"></script>
		</body>

</html>

