/*******************************************************************************
* Copyright (c) 2009, 2010 Fraunhofer IWU and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Fraunhofer IWU - initial API and implementation
*******************************************************************************/
package net.enilink.komma.em;
import net.enilink.komma.core.KommaException;
import net.enilink.komma.dm.IDataManager;
import net.enilink.komma.dm.IDataManagerFactory;
import net.enilink.komma.em.util.UnitOfWork;
import com.google.inject.Inject;
public class ThreadLocalDataManager extends DelegatingDataManager {
@Inject
protected IDataManagerFactory dmFactory;
@Inject
protected UnitOfWork uow;
private ThreadLocal<IDataManager> delegate = new ThreadLocal<IDataManager>();
@Override
public void close() {
IDataManager manager = delegate.get();
if (manager != null) {
manager.close();
delegate.remove();
}
}
protected IDataManager initialValue() {
return dmFactory.get();
}
@Override
public IDataManager getDelegate() {
IDataManager manager = delegate.get();
if (manager == null || !manager.isOpen()) {
if (!uow.isActive()) {
throw new KommaException("No active unit of work found.");
}
manager = initialValue();
uow.addCloseable(this);
delegate.set(manager);
}
return manager;
}
@Override
public boolean isOpen() {
IDataManager manager = delegate.get();
return (manager != null) ? manager.isOpen() : false;
}
}