package org.jboss.seam.security.permission; import java.io.Serializable; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import javax.persistence.Entity; import javax.persistence.EntityManager; import org.jboss.seam.Component; import org.jboss.seam.Seam; import org.jboss.seam.annotations.security.permission.Identifier; import org.jboss.seam.core.Expressions; import org.jboss.seam.core.Expressions.ValueExpression; import org.jboss.seam.persistence.PersistenceProvider; import org.jboss.seam.util.Strings; /** * An Identifier strategy for entity-based permission checks * * @author Shane Bryzak */ public class EntityIdentifierStrategy implements IdentifierStrategy, Serializable { private static final long serialVersionUID = 12456789L; private transient ValueExpression<EntityManager> entityManager; private transient PersistenceProvider persistenceProvider; private Map<Class <?>,String> identifierNames = new ConcurrentHashMap<Class <?>,String>(); public void init() { if (persistenceProvider == null) { persistenceProvider = (PersistenceProvider) Component.getInstance(PersistenceProvider.class, true); } if (entityManager == null) { entityManager = Expressions.instance().createValueExpression("#{entityManager}", EntityManager.class); } } public EntityIdentifierStrategy() { init(); } public boolean canIdentify(Class<?> targetClass) { return targetClass.isAnnotationPresent(Entity.class); } public String getIdentifier(Object target) { if(persistenceProvider == null) init(); Object persProviderId = persistenceProvider.getId(target, lookupEntityManager()).toString(); return String.format("%s:%s", getIdentifierName(target.getClass()), persProviderId); } private String getIdentifierName(Class<? extends Object> cls) { if (!identifierNames.containsKey(cls)) { String name = null; if (cls.isAnnotationPresent(Identifier.class)) { Identifier identifier = cls.getAnnotation(Identifier.class); if ( !Strings.isEmpty(identifier.name()) ) { name = identifier.name(); } } if (name == null) { name = Seam.getComponentName(cls); } if (name == null) { name = cls.getName().substring(cls.getName().lastIndexOf('.') + 1); } identifierNames.put(cls, name); return name; } return identifierNames.get(cls); } private EntityManager lookupEntityManager() { if(entityManager == null) init(); return entityManager.getValue(); } }