/*******************************************************************************
* 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 java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import com.google.inject.Inject;
import net.enilink.komma.em.internal.behaviours.IEntityManagerAware;
import net.enilink.komma.em.util.UnitOfWork;
import net.enilink.komma.core.IEntity;
import net.enilink.komma.core.IEntityDecorator;
import net.enilink.komma.core.IEntityManager;
import net.enilink.komma.core.KommaException;
public abstract class ThreadLocalEntityManager extends DelegatingEntityManager {
private ThreadLocal<IEntityManager> delegate = new ThreadLocal<IEntityManager>();
private IEntityDecorator managerInjector = new IEntityDecorator() {
@Override
public void decorate(IEntity entity) {
((IEntityManagerAware) entity)
.initEntityManager(ThreadLocalEntityManager.this);
}
};
private List<IEntityDecorator> decorators = new CopyOnWriteArrayList<IEntityDecorator>();
@Inject
protected UnitOfWork uow;
public void addDecorator(IEntityDecorator decorator) {
decorators.add(decorator);
if (delegate.get() != null) {
delegate.get().addDecorator(decorator);
}
}
@Override
public void close() {
IEntityManager manager = delegate.get();
if (manager != null) {
manager.close();
delegate.remove();
}
}
abstract protected IEntityManager initialValue();
public IEntityManager getDelegate() {
IEntityManager manager = delegate.get();
if (manager == null || !manager.isOpen()) {
if (!uow.isActive()) {
throw new KommaException("No active unit of work found.");
}
manager = initialValue();
for (IEntityDecorator decorator : decorators) {
manager.addDecorator(decorator);
}
manager.addDecorator(managerInjector);
uow.addCloseable(this);
delegate.set(manager);
}
return manager;
}
@Override
public boolean isOpen() {
IEntityManager manager = delegate.get();
return (manager != null) ? manager.isOpen() : false;
}
@Override
public void removeDecorator(IEntityDecorator decorator) {
decorators.remove(decorator);
if (delegate.get() != null) {
delegate.get().removeDecorator(decorator);
}
}
@Override
public int hashCode() {
return delegate.hashCode();
}
@Override
public boolean equals(Object obj) {
return this == obj;
}
}