package org.jboss.seam.security.management.picketlink;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.event.Observes;
import javax.enterprise.inject.spi.AnnotatedType;
import javax.enterprise.inject.spi.BeanManager;
import javax.enterprise.inject.spi.Extension;
import javax.enterprise.inject.spi.ProcessAnnotatedType;
import javax.persistence.Entity;
import org.jboss.seam.security.annotations.management.IdentityEntity;
import org.picketlink.idm.impl.configuration.metadata.IdentityStoreConfigurationMetaDataImpl;
/**
* A convenience class for setting JpaIdentityStore configuration options.
*
* @author Shane Bryzak
*/
@ApplicationScoped
public class JpaIdentityStoreConfiguration extends IdentityStoreConfiguration implements Extension {
private Class<?> identityClass;
private Class<?> credentialClass;
private Class<?> relationshipClass;
private Class<?> roleTypeClass;
private Class<?> attributeClass;
public <X> void processAnnotatedType(@Observes ProcessAnnotatedType<X> event,
final BeanManager beanManager) {
if (event.getAnnotatedType().isAnnotationPresent(Entity.class)) {
AnnotatedType<X> type = event.getAnnotatedType();
if (type.isAnnotationPresent(IdentityEntity.class)) {
IdentityEntity a = type.getAnnotation(IdentityEntity.class);
switch(a.value()) {
case IDENTITY_OBJECT:
identityClass = type.getJavaClass();
break;
case IDENTITY_CREDENTIAL:
credentialClass = type.getJavaClass();
break;
case IDENTITY_RELATIONSHIP:
relationshipClass = type.getJavaClass();
break;
case IDENTITY_ATTRIBUTE:
attributeClass = type.getJavaClass();
break;
case IDENTITY_ROLE_NAME:
roleTypeClass = type.getJavaClass();
break;
}
}
}
}
@Override
public String getId() {
return (super.getId() == null) ? "jpa" : super.getId();
}
/**
* If the identityStoreClass hasn't been set, then return JpaIdentityStore by default.
*/
@Override
public Class<?> getIdentityStoreClass() {
return (super.getIdentityStoreClass() == null) ? JpaIdentityStore.class : super.getIdentityStoreClass();
}
public Class<?> getIdentityClass() {
return identityClass;
}
public void setIdentityClass(Class<?> identityClass) {
this.identityClass = identityClass;
}
public Class<?> getCredentialClass() {
return credentialClass;
}
public void setCredentialClass(Class<?> credentialClass) {
this.credentialClass = credentialClass;
}
public Class<?> getRelationshipClass() {
return relationshipClass;
}
public void setRelationshipClass(Class<?> relationshipClass) {
this.relationshipClass = relationshipClass;
}
public Class<?> getRoleTypeClass() {
return roleTypeClass;
}
public void setRoleTypeClass(Class<?> roleTypeClass) {
this.roleTypeClass = roleTypeClass;
}
public Class<?> getAttributeClass() {
return attributeClass;
}
public void setAttributeClass(Class<?> attributeClass) {
this.attributeClass = attributeClass;
}
public void doConfigure(IdentityStoreConfigurationMetaDataImpl store) {
Map<String, List<String>> options = new HashMap<String, List<String>>();
if (identityClass != null) {
options.put(JpaIdentityStore.OPTION_IDENTITY_CLASS_NAME, createOptionList(identityClass.getName()));
}
if (credentialClass != null) {
options.put(JpaIdentityStore.OPTION_CREDENTIAL_CLASS_NAME, createOptionList(credentialClass.getName()));
}
if (relationshipClass != null) {
options.put(JpaIdentityStore.OPTION_RELATIONSHIP_CLASS_NAME, createOptionList(relationshipClass.getName()));
}
if (roleTypeClass != null) {
options.put(JpaIdentityStore.OPTION_ROLE_TYPE_CLASS_NAME, createOptionList(roleTypeClass.getName()));
}
if (attributeClass != null) {
options.put(JpaIdentityStore.OPTION_ATTRIBUTE_CLASS_NAME, createOptionList(attributeClass.getName()));
}
store.setOptions(options);
}
public boolean isConfigured() {
return identityClass != null;
}
private List<String> createOptionList(String... values) {
List<String> vals = new ArrayList<String>();
for (String v : values)
vals.add(v);
return vals;
}
}