/*******************************************************************************
* 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.internal;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArraySet;
import net.enilink.komma.core.IEntity;
import net.enilink.komma.core.IEntityDecorator;
import net.enilink.komma.core.IEntityManager;
import net.enilink.komma.core.IReference;
import net.enilink.komma.em.internal.behaviours.IEntityManagerAware;
import com.google.inject.Inject;
public class DecoratingEntityManager extends AbstractEntityManager {
private CopyOnWriteArraySet<IEntityDecorator> decorators;
@Inject
IEntityManager sharedManager;
@Inject
public DecoratingEntityManager(Set<IEntityDecorator> decorators) {
this.decorators = new CopyOnWriteArraySet<IEntityDecorator>(decorators);
}
@Override
public void addDecorator(IEntityDecorator decorator) {
decorators.add(decorator);
}
@Override
protected IEntity createBeanForClass(IReference resource, Class<?> type) {
IEntity bean = super.createBeanForClass(resource, type);
return decorate(bean);
}
public <T> T decorate(T entity) {
if (entity instanceof IEntity) {
((IEntityManagerAware) entity).initEntityManager(sharedManager);
for (IEntityDecorator decorator : decorators) {
decorator.decorate((IEntity) entity);
}
}
return entity;
}
@Override
public boolean hasDecorator(IEntityDecorator decorator) {
return decorators.contains(decorator);
}
@Override
public void removeDecorator(IEntityDecorator decorator) {
decorators.remove(decorator);
}
}