/*
* Copyright [2014] [Christian Loehnert, krampenschiesser@gmail.com]
* Licensed 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 de.ks.persistence.transaction;
import javax.persistence.EntityManager;
import java.util.Deque;
import java.util.LinkedList;
import java.util.Optional;
public class TransactionProvider {
public static final TransactionProvider instance = new TransactionProvider();
protected final ThreadLocal<Deque<BaseTransaction>> transactions = ThreadLocal.withInitial(LinkedList::new);
protected TransactionProvider() {
//
}
public SimpleTransaction beginTransaction(String name) {
BaseTransaction baseTransaction = new BaseTransaction(name);
transactions.get().add(baseTransaction);
return baseTransaction;
}
public void removeTransaction(String txName) {
BaseTransaction tx = transactions.get().stream().filter(t -> t.getName().equals(txName)).findFirst().get();
tx.getResources().forEach(r -> r.close());
transactions.get().remove(tx);
}
public Optional<SimpleTransaction> getCurrentTransaction() {
return Optional.ofNullable(transactions.get().peekLast());
}
public void registerEntityManager(EntityManager em) {
BaseTransaction tx = transactions.get().peekLast();
if (tx != null) {
registerEMResource(tx, em);
}
}
public void registerResource(TransactionResource resource) {
BaseTransaction tx = transactions.get().peekLast();
if (tx != null) {
tx.registerResource(resource);
}
}
protected void registerEMResource(BaseTransaction tx, EntityManager em) {
tx.registerResource(new EntityManagerResource(em));
}
}