/* | |
* TestClassSequenceFactory.java | |
* | |
* Created on October 6, 2006, 12:21 PM | |
* | |
* To change this template, choose Tools | Template Manager | |
* and open the template in the editor. | |
*/ | |
/* | |
* 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.openjpa.persistence.jdbc.schema; | |
import java.sql.Connection; | |
import java.sql.SQLException; | |
import java.sql.Statement; | |
import java.util.*; | |
import javax.sql.DataSource; | |
import org.apache.openjpa.jdbc.conf.JDBCConfiguration; | |
import org.apache.openjpa.jdbc.conf.JDBCConfigurationImpl; | |
import org.apache.openjpa.jdbc.kernel.ClassTableJDBCSeq; | |
import org.apache.openjpa.jdbc.meta.ClassMapping; | |
import org.apache.openjpa.kernel.Broker; | |
import org.apache.openjpa.kernel.Seq; | |
import org.apache.openjpa.lib.conf.ConfigurationProvider; | |
import org.apache.openjpa.lib.conf.Configurations; | |
import org.apache.openjpa.persistence.jdbc.common.apps.*; | |
import java.lang.annotation.Annotation; | |
import junit.framework.*; | |
import javax.persistence.EntityManager; | |
import javax.persistence.EntityManagerFactory; | |
import org.apache.openjpa.persistence.OpenJPAEntityManagerFactory; | |
import org.apache.openjpa.persistence.OpenJPAEntityManager; | |
import org.apache.openjpa.persistence.jdbc.kernel.BaseJDBCTest; | |
public class TestClassSequenceFactory extends BaseJDBCTest{ | |
private static Map _sysprops = new HashMap(); | |
Broker _broker; | |
/** Creates a new instance of TestClassSequenceFactory */ | |
public TestClassSequenceFactory() { | |
} | |
public TestClassSequenceFactory(String test) { | |
super(test); | |
} | |
public void setUp() | |
throws Exception { | |
JDBCConfiguration conf = new JDBCConfigurationImpl(); | |
conf.fromProperties(getProperties()); | |
if (!adjustConfiguration(conf)) | |
return; | |
String driver = conf.getConnectionDriverName().toLowerCase(); | |
String [] sql = null; | |
if (driver.indexOf("oracle") >= 0) { | |
sql = new String []{ | |
"create sequence seqa_seq", | |
"create sequence seqb_seq" | |
}; | |
} | |
if (sql == null) | |
return; | |
DataSource ds = conf.getDataSource2(null); | |
Connection c = ds.getConnection(); | |
Statement s = null; | |
try { | |
s = c.createStatement(); | |
for (int i = 0; i < sql.length; i++) { | |
try { | |
s.execute(sql[i]); | |
} catch (SQLException sqe) { | |
} | |
} | |
} finally { | |
if (s != null) | |
try { | |
s.close(); | |
} catch (Exception e) { | |
} | |
} | |
_broker = getBrokerFactory().newBroker(); | |
} | |
/** | |
* Tests that all sequence numbers are unique and in order. | |
*/ | |
public void testSequence() | |
throws Exception { | |
Set set = new HashSet(); | |
JDBCConfiguration conf = new JDBCConfigurationImpl(); | |
conf.fromProperties(getProperties()); | |
if (!adjustConfiguration(conf)) | |
return; | |
Thread t1 = new UpdateThread(set, conf); | |
Thread t2 = new UpdateThread(set, conf); | |
t1.start(); | |
t2.start(); | |
t1.join(); | |
t2.join(); | |
assertEquals(102, set.size()); | |
} | |
public void testExtensions() | |
throws Exception { | |
JDBCConfiguration conf = new JDBCConfigurationImpl(); | |
conf.fromProperties(getProperties()); | |
if (!adjustConfiguration(conf)) | |
return; | |
ClassMapping aMapping = conf.getMappingRepositoryInstance(). | |
getMapping(SeqA.class, null, true); | |
ClassMapping bMapping = conf.getMappingRepositoryInstance(). | |
getMapping(SeqB.class, null, true); | |
ClassMapping cMapping = conf.getMappingRepositoryInstance(). | |
getMapping(SeqC.class, null, true); | |
DataSource ds = conf.getDataSource2(null); | |
// hold a and c and start b | |
Seq seq = conf.getSequenceInstance(); | |
long aid = ((Long) seq.next(_broker, aMapping)).longValue(); | |
for (int i = 0; i < 5; i++) | |
seq.next(_broker, bMapping); | |
assertEquals(new Long(aid + 1), seq.next(_broker, aMapping)); | |
assertEquals(new Long(aid + 2), seq.next(_broker, cMapping)); | |
} | |
/** | |
* Pass in a mutable configuration | |
* <p/> | |
* return true if useable. | |
*/ | |
private boolean adjustConfiguration(JDBCConfiguration conf) { | |
String driver = conf.getConnectionDriverName(); | |
if (driver == null) | |
return false; | |
driver = driver.toLowerCase(); | |
if (driver.indexOf("oracle") >= 0) { | |
conf.setSequence(ClassTableJDBCSeq.class.getName()); | |
return true; | |
} | |
return false; | |
} | |
public static void main(String[] args) { | |
// main(); | |
} | |
private class UpdateThread | |
extends Thread { | |
private JDBCConfiguration _conf; | |
private Set _set = null; | |
public UpdateThread(Set set, JDBCConfiguration conf) { | |
_set = set; | |
_conf = conf; | |
} | |
public void run() { | |
DataSource ds = _conf.getDataSource2(null); | |
try { | |
Seq seq = _conf.getSequenceInstance(); | |
ClassMapping mapping = _conf.getMappingRepositoryInstance(). | |
getMapping(SeqA.class, null, true); | |
for (int i = 0; i < 51; i++) | |
_set.add(seq.next(_broker, mapping)); | |
} catch (Exception e) { | |
throw new RuntimeException(e.getMessage()); | |
} | |
} | |
} | |
} |