eu.europa.esig.dss.tsl.function.converter.TrustServiceEquivalenceConverter Maven / Gradle / Ivy
/**
* DSS - Digital Signature Services
* Copyright (C) 2015 European Commission, provided under the CEF programme
*
* This file is part of the "DSS - Digital Signature Services" project.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
package eu.europa.esig.dss.tsl.function.converter;
import eu.europa.esig.dss.model.tsl.CertificateContentEquivalence;
import eu.europa.esig.dss.model.tsl.Condition;
import eu.europa.esig.dss.model.tsl.QCStatementOids;
import eu.europa.esig.dss.model.tsl.ServiceEquivalence;
import eu.europa.esig.dss.model.tsl.ServiceTypeASi;
import eu.europa.esig.dss.model.timedependent.MutableTimeDependentValues;
import eu.europa.esig.dss.tsl.dto.condition.CompositeCondition;
import eu.europa.esig.dss.tsl.dto.condition.QCStatementCondition;
import eu.europa.esig.dss.utils.Utils;
import eu.europa.esig.trustedlist.jaxb.ecc.CriteriaListType;
import eu.europa.esig.trustedlist.jaxb.ecc.QualifierType;
import eu.europa.esig.trustedlist.jaxb.mra.CertificateContentReferenceEquivalenceType;
import eu.europa.esig.trustedlist.jaxb.mra.CertificateContentReferencesEquivalenceListType;
import eu.europa.esig.trustedlist.jaxb.mra.QualifierEquivalenceListType;
import eu.europa.esig.trustedlist.jaxb.mra.QualifierEquivalenceType;
import eu.europa.esig.trustedlist.jaxb.mra.TrustServiceEquivalenceHistoryInstanceType;
import eu.europa.esig.trustedlist.jaxb.mra.TrustServiceEquivalenceHistoryType;
import eu.europa.esig.trustedlist.jaxb.mra.TrustServiceEquivalenceInformationType;
import eu.europa.esig.trustedlist.jaxb.mra.TrustServiceTSLQualificationExtensionEquivalenceListType;
import eu.europa.esig.trustedlist.jaxb.mra.TrustServiceTSLStatusEquivalenceListType;
import eu.europa.esig.trustedlist.jaxb.mra.TrustServiceTSLStatusEquivalenceType;
import eu.europa.esig.trustedlist.jaxb.mra.TrustServiceTSLStatusList;
import eu.europa.esig.trustedlist.jaxb.mra.TrustServiceTSLTypeEquivalenceListType;
import eu.europa.esig.trustedlist.jaxb.mra.TrustServiceTSLTypeListType;
import eu.europa.esig.trustedlist.jaxb.mra.TrustServiceTSLTypeType;
import eu.europa.esig.trustedlist.jaxb.tsl.AdditionalServiceInformationType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
/**
* This class is used to extract MRA equivalence scheme for a Trusted List
*
*/
public class TrustServiceEquivalenceConverter implements Function> {
private static final Logger LOG = LoggerFactory.getLogger(TrustServiceEquivalenceConverter.class);
/** The used {@code CriteriaListTypeConverter} */
private final CriteriaListConverter criteriaConverter = new CriteriaListConverter();
/**
* Default constructor instantiating a CriteriaListTypeConverter
*/
public TrustServiceEquivalenceConverter() {
// empty
}
@Override
public MutableTimeDependentValues apply(TrustServiceEquivalenceInformationType t) {
final MutableTimeDependentValues result = new MutableTimeDependentValues<>();
ServiceEquivalence serviceEquivalence = new ServiceEquivalence.ServiceEquivalenceBuilder()
.setLegalInfoIdentifier(t.getTrustServiceLegalIdentifier())
.setStartDate(t.getTrustServiceEquivalenceStatusStartingTime().toGregorianCalendar().getTime())
.setStatus(t.getTrustServiceEquivalenceStatus())
.setTypeAsiEquivalence(getTypeASiEquivalence(t.getTrustServiceTSLTypeEquivalenceList()))
.setStatusEquivalence(getStatusEquivalence(t.getTrustServiceTSLStatusEquivalenceList()))
.setCertificateContentEquivalences(getCertificateEquivalence(t.getCertificateContentReferencesEquivalenceList()))
.setQualifierEquivalence(getQualifierEquivalence(t.getTrustServiceTSLQualificationExtensionEquivalenceList()))
.build();
result.addOldest(serviceEquivalence);
Date oldestStartDate = serviceEquivalence.getStartDate();
// TODO : review lists nesting
for (TrustServiceEquivalenceHistoryType trustServiceEquivalenceHistory : t.getTrustServiceEquivalenceHistory()) {
for (TrustServiceEquivalenceHistoryInstanceType h : trustServiceEquivalenceHistory.getTrustServiceEquivalenceHistoryInstance()) {
ServiceEquivalence historyServiceEquivalence = new ServiceEquivalence.ServiceEquivalenceBuilder()
.setLegalInfoIdentifier(serviceEquivalence.getLegalInfoIdentifier())
.setStartDate(h.getTrustServiceEquivalenceStatusStartingTime().toGregorianCalendar().getTime())
.setEndDate(oldestStartDate)
.setStatus(h.getTrustServiceEquivalenceStatus())
.setTypeAsiEquivalence(getTypeASiEquivalence(h.getTrustServiceTSLTypeEquivalenceList()))
.setStatusEquivalence(getStatusEquivalence(h.getTrustServiceTSLStatusEquivalenceList()))
.setCertificateContentEquivalences(getCertificateEquivalence(h.getCertificateContentReferencesEquivalenceList()))
.setQualifierEquivalence(getQualifierEquivalence(h.getTrustServiceTSLQualificationExtensionEquivalenceList()))
.build();
result.addOldest(historyServiceEquivalence);
oldestStartDate = historyServiceEquivalence.getStartDate();
}
}
return result;
}
private Map getTypeASiEquivalence(TrustServiceTSLTypeEquivalenceListType serviceTSLTypeEquivalenceList) {
if (serviceTSLTypeEquivalenceList != null) {
TrustServiceTSLTypeListType expected = serviceTSLTypeEquivalenceList.getTrustServiceTSLTypeListPointedParty();
TrustServiceTSLTypeListType substitute = serviceTSLTypeEquivalenceList.getTrustServiceTSLTypeListPointingParty();
List expectedServiceTSLTypes = expected.getTrustServiceTSLType();
List substituteServiceTSLTypes = substitute.getTrustServiceTSLType();
Map typeAsiEquivalence = new HashMap<>();
for (TrustServiceTSLTypeType expectedTypeASI : expectedServiceTSLTypes) {
ServiceTypeASi staExpected = getServiceTypeASi(expectedTypeASI);
for (TrustServiceTSLTypeType substituteTypeASI : substituteServiceTSLTypes) {
ServiceTypeASi staSubstitute = getServiceTypeASi(substituteTypeASI);
typeAsiEquivalence.put(staExpected, staSubstitute);
}
}
return typeAsiEquivalence;
}
return null;
}
private ServiceTypeASi getServiceTypeASi(TrustServiceTSLTypeType expectedTypeASI) {
ServiceTypeASi sta = new ServiceTypeASi();
sta.setType(expectedTypeASI.getServiceTypeIdentifier());
AdditionalServiceInformationType additionalServiceInformation = expectedTypeASI.getAdditionalServiceInformation();
if (additionalServiceInformation != null && additionalServiceInformation.getURI() != null) {
sta.setAsi(additionalServiceInformation.getURI().getValue());
}
return sta;
}
private Map, List> getStatusEquivalence(TrustServiceTSLStatusEquivalenceListType serviceTSLStatusEquivalenceList) {
Map, List> statusEquivalenceMap = new HashMap<>();
TrustServiceTSLStatusEquivalenceType validEquivalences = serviceTSLStatusEquivalenceList.getTrustServiceTSLStatusValidEquivalence();
extractEquivalences(validEquivalences, statusEquivalenceMap);
TrustServiceTSLStatusEquivalenceType invalidEquivalences = serviceTSLStatusEquivalenceList.getTrustServiceTSLStatusInvalidEquivalence();
extractEquivalences(invalidEquivalences, statusEquivalenceMap);
return statusEquivalenceMap;
}
private void extractEquivalences(TrustServiceTSLStatusEquivalenceType statusEquivalence, Map, List> statusEquivalenceMap) {
if (statusEquivalence != null) {
TrustServiceTSLStatusList serviceTSLStatusListExpected = statusEquivalence.getTrustServiceTSLStatusListPointedParty();
List expected = serviceTSLStatusListExpected.getServiceStatus();
TrustServiceTSLStatusList serviceTSLStatusListSubstitute = statusEquivalence.getTrustServiceTSLStatusListPointingParty();
List substitute = serviceTSLStatusListSubstitute.getServiceStatus();
statusEquivalenceMap.put(expected, substitute);
}
}
private List getCertificateEquivalence(CertificateContentReferencesEquivalenceListType certificateContentEquivalenceList) {
if (certificateContentEquivalenceList != null
&& Utils.isCollectionNotEmpty(certificateContentEquivalenceList.getCertificateContentReferenceEquivalence())) {
List certificateContentEquivalences = new ArrayList<>();
for (CertificateContentReferenceEquivalenceType certEquiv : certificateContentEquivalenceList.getCertificateContentReferenceEquivalence()) {
CriteriaListType expected = certEquiv.getCertificateContentDeclarationPointedParty();
CriteriaListType substitute = certEquiv.getCertificateContentDeclarationPointingParty();
Condition condition = criteriaConverter.apply(substitute);
CertificateContentEquivalence equiv = new CertificateContentEquivalence();
equiv.setContext(certEquiv.getCertificateContentReferenceEquivalenceContext());
equiv.setCondition(criteriaConverter.apply(expected));
equiv.setContentReplacement(getQCStatementOids(condition));
certificateContentEquivalences.add(equiv);
}
return certificateContentEquivalences;
}
return null;
}
private QCStatementOids getQCStatementOids(Condition condition) {
QCStatementOids result = new QCStatementOids();
List qcStatementIds = new ArrayList<>();
List qcTypeIds = new ArrayList<>();
List qcCClegislations = new ArrayList<>();
List qcStatementIdsToRemove = new ArrayList<>();
List qcTypeIdsToRemove = new ArrayList<>();
List qcCClegislationsToRemove = new ArrayList<>();
if (condition instanceof CompositeCondition) {
CompositeCondition composite = (CompositeCondition) condition;
switch (composite.getMatchingCriteriaIndicator()) {
case ALL:
for (Condition childCondition : composite.getChildren()) {
populateFromChild(childCondition, qcStatementIds, qcTypeIds, qcCClegislations,
qcStatementIdsToRemove, qcTypeIdsToRemove, qcCClegislationsToRemove);
}
break;
case AT_LEAST_ONE:
if (composite.getChildren().size() > 1) {
LOG.info("First equivalence condition is used out of '{}'!", composite.getChildren().size());
}
Condition firstCondition = composite.getChildren().get(0);
populateFromChild(firstCondition, qcStatementIds, qcTypeIds, qcCClegislations,
qcStatementIdsToRemove, qcTypeIdsToRemove, qcCClegislationsToRemove);
break;
case NONE:
for (Condition childCondition : composite.getChildren()) {
// Reversed lists for NONE
populateFromChild(childCondition, qcStatementIdsToRemove, qcTypeIdsToRemove, qcCClegislationsToRemove,
qcStatementIds, qcTypeIds, qcCClegislations);
}
break;
default:
LOG.warn("Unsupported assert {}", composite.getMatchingCriteriaIndicator());
}
}
if (condition instanceof QCStatementCondition) {
QCStatementCondition qcCondition = (QCStatementCondition) condition;
String oid = qcCondition.getOid();
if (Utils.isStringNotEmpty(oid)) {
qcStatementIds.add(oid);
}
String type = qcCondition.getType();
if (Utils.isStringNotEmpty(type)) {
qcTypeIds.add(type);
}
String legislation = qcCondition.getLegislation();
if (Utils.isStringNotEmpty(legislation)) {
qcCClegislations.add(legislation);
}
}
result.setQcStatementIds(qcStatementIds);
result.setQcTypeIds(qcTypeIds);
result.setQcCClegislations(qcCClegislations);
result.setQcStatementIdsToRemove(qcStatementIdsToRemove);
result.setQcTypeIdsToRemove(qcTypeIdsToRemove);
result.setQcCClegislationsToRemove(qcCClegislationsToRemove);
return result;
}
private void populateFromChild(Condition condition, List qcStatementIds, List qcTypeIds, List qcCClegislations,
List qcStatementIdsToRemove, List qcTypeIdsToRemove, List qcCClegislationsToRemove) {
QCStatementOids conditionResult = getQCStatementOids(condition);
for (String conditionQCStatementId : conditionResult.getQcStatementIds()) {
if (!qcStatementIds.contains(conditionQCStatementId)) {
qcStatementIds.add(conditionQCStatementId);
}
}
for (String conditionQCTypeId : conditionResult.getQcTypeIds()) {
if (!qcTypeIds.contains(conditionQCTypeId)) {
qcTypeIds.add(conditionQCTypeId);
}
}
for (String conditionQcCClegislation : conditionResult.getQcCClegislations()) {
if (!qcCClegislations.contains(conditionQcCClegislation)) {
qcCClegislations.add(conditionQcCClegislation);
}
}
for (String childQCStatementId : conditionResult.getQcStatementIdsToRemove()) {
if (!qcStatementIdsToRemove.contains(childQCStatementId)) {
qcStatementIdsToRemove.add(childQCStatementId);
}
}
for (String childQCTypeId : conditionResult.getQcTypeIdsToRemove()) {
if (!qcTypeIdsToRemove.contains(childQCTypeId)) {
qcTypeIdsToRemove.add(childQCTypeId);
}
}
for (String childQcCClegislation : conditionResult.getQcCClegislationsToRemove()) {
if (!qcCClegislationsToRemove.contains(childQcCClegislation)) {
qcCClegislationsToRemove.add(childQcCClegislation);
}
}
}
private Map getQualifierEquivalence(TrustServiceTSLQualificationExtensionEquivalenceListType qualificationExtensionEquivalenceListType) {
if (qualificationExtensionEquivalenceListType != null
&& Utils.isCollectionNotEmpty(qualificationExtensionEquivalenceListType.getQualifierEquivalenceList())) {
Map qualifierEquivalenceMap = new HashMap<>();
for (QualifierEquivalenceListType qualifierEquivalenceList : qualificationExtensionEquivalenceListType.getQualifierEquivalenceList()) {
List qualifierEquivalence = qualifierEquivalenceList.getQualifierEquivalence();
for (QualifierEquivalenceType qualifierEquivalenceType : qualifierEquivalence) {
QualifierType qualifierExpected = qualifierEquivalenceType.getQualifierPointedParty();
QualifierType qualifierSubstitute = qualifierEquivalenceType.getQualifierPointingParty();
qualifierEquivalenceMap.put(qualifierExpected.getUri(), qualifierSubstitute.getUri());
}
}
return qualifierEquivalenceMap;
}
return null;
}
}