| /** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| package org.apache.openejb.util; |
| |
| import org.apache.openejb.api.Proxy; |
| import org.apache.openejb.jee.EjbJar; |
| import org.apache.openejb.jee.SingletonBean; |
| import org.apache.openejb.jee.StatelessBean; |
| import org.apache.openejb.jee.jpa.unit.Persistence; |
| import org.apache.openejb.jee.jpa.unit.PersistenceUnit; |
| import org.apache.openejb.junit.ApplicationComposer; |
| import org.apache.openejb.testing.Configuration; |
| import org.apache.openejb.testing.Module; |
| import org.junit.After; |
| import org.junit.Before; |
| import org.junit.Test; |
| import org.junit.runner.RunWith; |
| |
| import javax.ejb.EJB; |
| import javax.ejb.EJBException; |
| import javax.ejb.Singleton; |
| import javax.ejb.Stateless; |
| import javax.persistence.Entity; |
| import javax.persistence.EntityManager; |
| import javax.persistence.GeneratedValue; |
| import javax.persistence.Id; |
| import javax.persistence.NamedQueries; |
| import javax.persistence.NamedQuery; |
| import javax.persistence.NoResultException; |
| import javax.persistence.PersistenceContext; |
| import java.lang.reflect.InvocationHandler; |
| import java.lang.reflect.Method; |
| import java.util.Collection; |
| import java.util.HashMap; |
| import java.util.Map; |
| import java.util.Properties; |
| |
| import static org.junit.Assert.assertEquals; |
| import static org.junit.Assert.assertNotNull; |
| import static org.junit.Assert.assertTrue; |
| import static org.junit.Assert.fail; |
| |
| @RunWith(ApplicationComposer.class) |
| public class DynamicEJBImplTest { |
| |
| private static volatile boolean initDone = false; |
| |
| @EJB |
| private UserDAO dao; |
| @EJB |
| private UtilBean util; |
| @EJB |
| private UserDAOChild child; |
| @EJB |
| private DynamicCustomProxy custom; |
| |
| @Test |
| public void custom() { |
| assertEquals("method = foo", custom.foo()); |
| } |
| |
| @Before |
| public void initDatabaseIfNotDone() { |
| if (!initDone) { |
| util.init(); |
| initDone = true; |
| } |
| } |
| |
| @After |
| public void checkAll() { |
| final Collection<User> users = dao.findAll(); |
| assertEquals(10, users.size()); |
| } |
| |
| @Test |
| public void simple() { |
| final User user = dao.findById(1); |
| assertNotNull(user); |
| assertEquals(1, user.getId()); |
| } |
| |
| @Test |
| public void findAll() { |
| final Collection<User> users = dao.findAll(); |
| assertEquals(10, users.size()); |
| } |
| |
| @Test |
| public void pagination() { |
| Collection<User> users = dao.findAll(0, 5); |
| assertEquals(5, users.size()); |
| |
| users = dao.findAll(6, 1); |
| assertEquals(1, users.size()); |
| assertEquals(7, users.iterator().next().getId()); |
| } |
| |
| @Test |
| public void persist() { |
| final User u = new User(); |
| dao.save(u); |
| assertNotNull(u.getId()); |
| util.remove(u); |
| } |
| |
| @Test |
| public void remove() { |
| final User u = new User(); |
| dao.save(u); |
| assertNotNull(u.getId()); |
| dao.delete(u); |
| java.util.logging.Logger.getLogger(this.getClass().getName()).info("Expecting a SEVERE javax.persistence.NoResultException"); |
| try { |
| dao.findById(u.getId()); |
| fail(); |
| } catch (final EJBException ee) { |
| assertTrue(ee.getCause() instanceof NoResultException); |
| } |
| } |
| |
| @Test |
| public void merge() { |
| final User u = new User(); |
| u.setInfo("one"); |
| dao.save(u); |
| assertEquals("one", u.getInfo()); |
| assertNotNull(u.getId()); |
| |
| u.setInfo("another one"); |
| dao.update(u); |
| assertEquals("another one", u.getInfo()); |
| |
| dao.delete(u); |
| } |
| |
| @Test |
| public void oneCriteria() { |
| final Collection<User> users = dao.findByName("foo"); |
| assertEquals(4, users.size()); |
| for (final User user : users) { |
| assertEquals("foo", user.getName()); |
| } |
| } |
| |
| @Test |
| public void twoCriteria() { |
| final Collection<User> users = dao.findByNameAndInfo("bar-1", "1"); |
| assertEquals(1, users.size()); |
| |
| final User user = users.iterator().next(); |
| assertEquals("bar-1", user.getName()); |
| assertEquals("1", user.getInfo()); |
| } |
| |
| @Test |
| public void checkInjections() { |
| final UserDAO injection = util.getDao(); |
| assertNotNull(injection); |
| assertEquals(10, injection.findAll().size()); |
| } |
| |
| @Test |
| public void query() { |
| final Map<String, String> params = new HashMap<String, String>(); |
| params.put("name", "foo"); |
| |
| Collection<User> users = dao.namedQuery("dynamic-ejb-impl-test.query", params, 0, 100); |
| assertEquals(4, users.size()); |
| |
| users = dao.namedQuery("dynamic-ejb-impl-test.query", params); |
| assertEquals(4, users.size()); |
| |
| users = dao.namedQuery("dynamic-ejb-impl-test.query", params, 0, 2); |
| assertEquals(2, users.size()); |
| |
| users = dao.namedQuery("dynamic-ejb-impl-test.query", 0, 2, params); |
| assertEquals(2, users.size()); |
| |
| users = dao.namedQuery("dynamic-ejb-impl-test.all"); |
| assertEquals(10, users.size()); |
| |
| params.remove("name"); |
| params.put("info", "0"); |
| users = dao.query("SELECT u FROM DynamicEJBImplTest$User AS u WHERE u.info LIKE :info", params); |
| assertEquals(4, users.size()); |
| } |
| |
| @Test |
| public void inheritance() { |
| final Map<String, String> params = new HashMap<String, String>(); |
| params.put("name", "foo"); |
| |
| Collection<User> users = child.namedQuery("dynamic-ejb-impl-test.query", params, 0, 100); |
| assertEquals(4, users.size()); |
| |
| users = child.namedQuery("dynamic-ejb-impl-test.query", params); |
| assertEquals(4, users.size()); |
| |
| users = child.namedQuery("dynamic-ejb-impl-test.query", params, 0, 2); |
| assertEquals(2, users.size()); |
| |
| users = child.namedQuery("dynamic-ejb-impl-test.query", 0, 2, params); |
| assertEquals(2, users.size()); |
| |
| users = child.namedQuery("dynamic-ejb-impl-test.all"); |
| assertEquals(10, users.size()); |
| |
| params.remove("name"); |
| params.put("info", "0"); |
| users = child.query("SELECT u FROM DynamicEJBImplTest$User AS u WHERE u.info LIKE :info", params); |
| assertEquals(4, users.size()); |
| } |
| |
| @Stateless |
| @PersistenceContext(name = "pu") |
| public static interface UserDAO { |
| |
| User findById(long id); |
| |
| Collection<User> findByName(String name); |
| |
| Collection<User> findByNameAndInfo(String name, String info); |
| |
| Collection<User> findAll(); |
| |
| Collection<User> findAll(int first, int max); |
| |
| Collection<User> namedQuery(String name, Map<String, ?> params, int first, int max); |
| |
| Collection<User> namedQuery(String name, int first, int max, Map<String, ?> params); |
| |
| Collection<User> namedQuery(String name, Map<String, ?> params); |
| |
| Collection<User> namedQuery(String name); |
| |
| Collection<User> query(String value, Map<String, ?> params); |
| |
| void save(User u); |
| |
| void delete(User u); |
| |
| User update(User u); |
| } |
| |
| @Stateless |
| @PersistenceContext(name = "pu") |
| public static interface UserDAOChild extends UserDAO { |
| // just inherited methods |
| } |
| |
| @NamedQueries({ |
| @NamedQuery(name = "dynamic-ejb-impl-test.query", query = "SELECT u FROM DynamicEJBImplTest$User AS u WHERE u.name LIKE :name"), |
| @NamedQuery(name = "dynamic-ejb-impl-test.all", query = "SELECT u FROM DynamicEJBImplTest$User AS u") |
| }) |
| @Entity |
| public static class User { |
| |
| @Id |
| @GeneratedValue |
| private long id; |
| private String name; |
| private String info; |
| |
| public User() { |
| } |
| |
| public long getId() { |
| return id; |
| } |
| |
| public void setId(final long id) { |
| this.id = id; |
| } |
| |
| public String getName() { |
| return name; |
| } |
| |
| public void setName(final String name) { |
| this.name = name; |
| } |
| |
| public String getInfo() { |
| return info; |
| } |
| |
| public void setInfo(final String info) { |
| this.info = info; |
| } |
| |
| @Override |
| public String toString() { |
| return "User{info='" + info + '\'' + ", name='" + name + '\'' + ", id=" + id + '}'; |
| } |
| } |
| |
| @Singleton |
| public static class UtilBean { |
| |
| public UtilBean() { |
| } |
| |
| @PersistenceContext |
| private EntityManager em; |
| @EJB |
| private UserDAO dao; |
| |
| public void init() { |
| for (int i = 0; i < 10; i++) { |
| final User u = new User(); |
| if (i % 3 == 0) { |
| u.setName("foo"); |
| } else { |
| u.setName("bar-" + i); |
| } |
| u.setInfo(Integer.toString(i % 3)); |
| em.persist(u); |
| } |
| } |
| |
| public UserDAO getDao() { |
| return dao; |
| } |
| |
| public void remove(final User u) { |
| em.remove(em.find(u.getClass(), u.getId())); |
| } |
| } |
| |
| public static class Handler implements InvocationHandler { |
| |
| public Handler() { |
| } |
| |
| @Override |
| public Object invoke(final Object proxy, final Method method, final Object[] args) throws Throwable { |
| return "method = " + method.getName(); |
| } |
| } |
| |
| @Singleton |
| @Proxy(Handler.class) |
| public static interface DynamicCustomProxy { |
| |
| public String foo(); |
| } |
| |
| @Configuration |
| public Properties config() { |
| final Properties p = new Properties(); |
| p.put("dynamicEjbDatabase", "new://Resource?type=DataSource"); |
| p.put("dynamicEjbDatabase.JdbcDriver", "org.hsqldb.jdbcDriver"); |
| p.put("dynamicEjbDatabase.JdbcUrl", "jdbc:hsqldb:mem:bval"); |
| return p; |
| } |
| |
| @Module |
| public EjbJar app() throws Exception { |
| final EjbJar ejbJar = new EjbJar("dynamic"); |
| ejbJar.addEnterpriseBean(new SingletonBean(UtilBean.class)); |
| ejbJar.addEnterpriseBean(new SingletonBean(DynamicCustomProxy.class)); |
| ejbJar.addEnterpriseBean(new StatelessBean(UserDAO.class)); |
| ejbJar.addEnterpriseBean(new StatelessBean(UserDAOChild.class)); |
| return ejbJar; |
| } |
| |
| @Module |
| public Persistence persistence() { |
| final PersistenceUnit unit = new PersistenceUnit("pu"); |
| unit.addClass(User.class); |
| unit.setProperty("openjpa.jdbc.SynchronizeMappings", "buildSchema(ForeignKeys=true)"); |
| unit.setExcludeUnlistedClasses(true); |
| |
| final Persistence persistence = new Persistence(unit); |
| persistence.setVersion("2.0"); |
| return persistence; |
| } |
| } |