package org.apereo.cas.mgmt.services.web.factory;
import org.apereo.cas.authentication.principal.DefaultPrincipalAttributesRepository;
import org.apereo.cas.authentication.principal.PrincipalAttributesRepository;
import org.apereo.cas.authentication.principal.cache.AbstractPrincipalAttributesRepository;
import org.apereo.cas.authentication.principal.cache.CachingPrincipalAttributesRepository;
import org.apereo.cas.mgmt.services.web.beans.RegisteredServiceAttributeReleasePolicyEditBean;
import org.apereo.cas.mgmt.services.web.beans.RegisteredServiceEditBean;
import org.apereo.services.persondir.support.merger.IAttributeMerger;
import org.apereo.services.persondir.support.merger.MultivaluedAttributeMerger;
import org.apereo.services.persondir.support.merger.NoncollidingAttributeAdder;
import org.apereo.services.persondir.support.merger.ReplacingAttributeAdder;
/**
* Default mapper for converting {@link PrincipalAttributesRepository} to/from {@link RegisteredServiceEditBean.ServiceData}.
*
* @author Daniel Frett
* @since 4.2
*/
public class DefaultPrincipalAttributesRepositoryMapper implements PrincipalAttributesRepositoryMapper {
@Override
public void mapPrincipalRepository(final PrincipalAttributesRepository pr, final RegisteredServiceEditBean.ServiceData bean) {
final RegisteredServiceAttributeReleasePolicyEditBean attrPolicyBean = bean.getAttrRelease();
if (pr instanceof DefaultPrincipalAttributesRepository) {
attrPolicyBean.setAttrOption(RegisteredServiceAttributeReleasePolicyEditBean.Types.DEFAULT);
} else if (pr instanceof AbstractPrincipalAttributesRepository) {
attrPolicyBean.setAttrOption(RegisteredServiceAttributeReleasePolicyEditBean.Types.CACHED);
final AbstractPrincipalAttributesRepository cc = (AbstractPrincipalAttributesRepository) pr;
attrPolicyBean.setCachedExpiration(cc.getExpiration());
attrPolicyBean.setCachedTimeUnit(cc.getTimeUnit());
final IAttributeMerger merger = cc.getMergingStrategy() != null ? cc.getMergingStrategy().getAttributeMerger() : null;
if (merger != null) {
if (merger instanceof NoncollidingAttributeAdder) {
attrPolicyBean.setMergingStrategy(RegisteredServiceAttributeReleasePolicyEditBean
.AttributeMergerTypes.ADD);
} else if (merger instanceof MultivaluedAttributeMerger) {
attrPolicyBean.setMergingStrategy(RegisteredServiceAttributeReleasePolicyEditBean
.AttributeMergerTypes.MULTIVALUED);
} else if (merger instanceof ReplacingAttributeAdder) {
attrPolicyBean.setMergingStrategy(RegisteredServiceAttributeReleasePolicyEditBean
.AttributeMergerTypes.REPLACE);
}
}
}
}
@Override
public PrincipalAttributesRepository toPrincipalRepository(final RegisteredServiceEditBean.ServiceData data) {
final RegisteredServiceAttributeReleasePolicyEditBean attrRelease = data.getAttrRelease();
final RegisteredServiceAttributeReleasePolicyEditBean.Types attrType = attrRelease.getAttrOption();
if (attrType == RegisteredServiceAttributeReleasePolicyEditBean.Types.CACHED) {
final CachingPrincipalAttributesRepository r = new CachingPrincipalAttributesRepository(
attrRelease.getCachedTimeUnit().toUpperCase(),
attrRelease.getCachedExpiration());
switch (attrRelease.getMergingStrategy()) {
case ADD:
r.setMergingStrategy(AbstractPrincipalAttributesRepository.MergingStrategy.ADD);
break;
case MULTIVALUED:
r.setMergingStrategy(AbstractPrincipalAttributesRepository.MergingStrategy.MULTIVALUED);
break;
case REPLACE:
r.setMergingStrategy(AbstractPrincipalAttributesRepository.MergingStrategy.REPLACE);
break;
default:
r.setMergingStrategy(AbstractPrincipalAttributesRepository.MergingStrategy.NONE);
break;
}
return r;
}
if (attrType == RegisteredServiceAttributeReleasePolicyEditBean.Types.DEFAULT) {
return new DefaultPrincipalAttributesRepository();
}
return null;
}
}