Package org.apache.openejb.assembler.classic

Source Code of org.apache.openejb.assembler.classic.DataSourceDefinitionGlobalJPATest$EmfHolder

/*
* 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.assembler.classic;

import org.apache.commons.dbcp.DelegatingConnection;
import org.apache.commons.dbcp.managed.ManagedConnection;
import org.apache.openejb.jee.jpa.unit.Persistence;
import org.apache.openejb.junit.ApplicationComposer;
import org.apache.openejb.resource.jdbc.dbcp.BasicManagedDataSource;
import org.apache.openejb.testing.Configuration;
import org.apache.openejb.testing.Module;
import org.hsqldb.jdbc.JDBCConnection;
import org.junit.Test;
import org.junit.runner.RunWith;

import javax.annotation.sql.DataSourceDefinition;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.persistence.Entity;
import javax.persistence.EntityManagerFactory;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.PersistenceUnit;
import javax.sql.DataSource;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

import static org.hamcrest.core.IsInstanceOf.instanceOf;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThat;

@RunWith(ApplicationComposer.class)
public class DataSourceDefinitionGlobalJPATest {

    @EJB
    private EmfHolder holder;

    @Module
    public Class<?>[] app() throws Exception {
        return new Class<?>[]{EmfHolder.class};
    }

    @Configuration // useless but add another datasource so resolution should be more tricky, name before d
    public Properties config() {
        final Properties p = new Properties();
        p.put("cczczcz", "new://Resource?type=DataSource");
        p.put("cczczcz.JdbcDriver", "org.hsqldb.jdbcDriver");
        p.put("cczczcz.JdbcUrl", "jdbc:hsqldb:mem:cczczcz");
        return p;
    }

    @Module
    public Persistence persistence() {
        final org.apache.openejb.jee.jpa.unit.PersistenceUnit unit = new org.apache.openejb.jee.jpa.unit.PersistenceUnit("jpa-global-dsdef-unit");
        unit.addClass(IdEntity.class);
        unit.setProperty("openjpa.jdbc.SynchronizeMappings", "buildSchema(ForeignKeys=true)");
        unit.getProperties().setProperty("openjpa.RuntimeUnenhancedClasses", "supported");
        unit.setJtaDataSource("java:app/foo");
        unit.setExcludeUnlistedClasses(true);

        final Persistence persistence = new Persistence(unit);
        persistence.setVersion("2.0");
        return persistence;
    }

    @DataSourceDefinition(
        name = "java:app/foo",
        className = "org.hsqldb.jdbc.JDBCDataSource",
        user = "sa",
        password = "",
        url = "jdbc:hsqldb:mem:dsdjpa"
    )
    @Stateless
    public static class EmfHolder {
        @PersistenceUnit
        private EntityManagerFactory emf;

        public EntityManagerFactory getEmf() {
            return emf;
        }
    }

    @Entity
    public static class IdEntity {
        @Id
        @GeneratedValue
        private long id;

        public long getId() {
            return id;
        }

        public void setId(final long id) {
            this.id = id;
        }
    }

    @Test
    public void check() throws Exception {
        final EntityManagerFactory emf = holder.getEmf();
        assertThat(emf, instanceOf(ReloadableEntityManagerFactory.class));
        final ReloadableEntityManagerFactory remf = (ReloadableEntityManagerFactory) emf;
        final DataSource ds = remf.info().getJtaDataSource();
        check(ds, "dsdjpa");
    }

    private void check(final DataSource ds, final String name) throws SQLException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        // the first "cast part" is not important, we just want to check the jdbc url is ok
        assertThat(ds, instanceOf(BasicManagedDataSource.class));
        final BasicManagedDataSource dbcp = (BasicManagedDataSource) ds;
        final Connection connection = dbcp.getConnection();
        assertThat(connection, instanceOf(ManagedConnection.class));
        final ManagedConnection mc = (ManagedConnection) connection;
        final Method getInnermostDelegateInternal = DelegatingConnection.class.getDeclaredMethod("getInnermostDelegateInternal");
        getInnermostDelegateInternal.setAccessible(true);
        final Connection delegate = (Connection) getInnermostDelegateInternal.invoke(mc);
        assertThat(delegate, instanceOf(JDBCConnection.class));
        final Method getURL = JDBCConnection.class.getDeclaredMethod("getURL");
        getURL.setAccessible(true);
        assertEquals("jdbc:hsqldb:mem:" + name, getURL.invoke(delegate));
    }
}
TOP

Related Classes of org.apache.openejb.assembler.classic.DataSourceDefinitionGlobalJPATest$EmfHolder

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.