package at.asitplus.eidas.specific.modules.authmodule_eIDASv2.service; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import javax.annotation.PostConstruct; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.stereotype.Service; import at.asitplus.eidas.specific.modules.authmodule_eIDASv2.Constants; import at.asitplus.eidas.specific.modules.authmodule_eIDASv2.DAO.ERnBeIDData; import at.asitplus.eidas.specific.modules.authmodule_eIDASv2.exception.eIDASAttributeException; import at.asitplus.eidas.specific.modules.authmodule_eIDASv2.exception.eIDPostProcessingException; import at.asitplus.eidas.specific.modules.authmodule_eIDASv2.handler.INationaleIDPostProcessor; import at.asitplus.eidas.specific.modules.authmodule_eIDASv2.utils.eIDASResponseUtils; import at.gv.egiz.eaaf.core.impl.data.Trible; @Service public class EIDPostProcessingService implements IeIDPostProcessingService{ private static final Logger log = LoggerFactory.getLogger(EIDPostProcessingService.class); @Autowired private ApplicationContext context; private List handlers = new ArrayList(); @PostConstruct private void initialize() { log.debug("Initialize eID PostProcessing-Service ... "); Map postProcessors = context.getBeansOfType(INationaleIDPostProcessor.class); Iterator> iterator = postProcessors.entrySet().iterator(); while (iterator.hasNext()) { Entry el = iterator.next(); log.debug("Find eID-PostProcessor with name: " + el.getKey()); handlers.add(el.getValue()); } log.trace("Sorting eID-PostProcessors on priority ... "); Collections.sort(handlers, new Comparator() { @Override public int compare(INationaleIDPostProcessor thisAuthModule, INationaleIDPostProcessor otherAuthModule) { int thisOrder = thisAuthModule.getPriority(); int otherOrder = otherAuthModule.getPriority(); return (thisOrder < otherOrder ? 1 : (thisOrder == otherOrder ? 0 : -1)); } }); log.info("# " + handlers.size() + " eID PostProcessing services are registrated"); } @Override public ERnBeIDData postProcess(Map eIDASAttrMap) throws eIDPostProcessingException, eIDASAttributeException { //extract citizen country from eIDAS unique identifier Object eIdentifierObj = eIDASAttrMap.get(Constants.eIDAS_ATTR_PERSONALIDENTIFIER); if (eIdentifierObj == null || !(eIdentifierObj instanceof String)) throw new eIDASAttributeException(Constants.eIDAS_ATTR_PERSONALIDENTIFIER); Trible eIdentifier = eIDASResponseUtils.parseEidasPersonalIdentifier((String)eIdentifierObj); String citizenCountry = eIdentifier.getFirst(); if (StringUtils.isEmpty(citizenCountry)) log.info("No CountryCode for eID PostProcessor. Default-PostProcessor will be used"); for (INationaleIDPostProcessor el : handlers) { if (el.canHandle(citizenCountry)) { log.debug("Post-Process eIDAS eID from " + citizenCountry + " by using: " + el.getName()); return el.postProcess(eIDASAttrMap); } } log.error("NO eID PostProcessor FOUND. Looks like a depentency problem!"); throw new eIDPostProcessingException("internal.00", null); } }