/* * XAdES4j - A Java library for generation and verification of XAdES signatures. * Copyright (C) 2010 Luis Goncalves. * * XAdES4j 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 3 of the License, or any later version. * * XAdES4j 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 XAdES4j. If not, see <http://www.gnu.org/licenses/>. */ package xades4j.properties.data; import xades4j.utils.DataGetterImpl; import xades4j.utils.DataGetter; import com.google.inject.Inject; import java.util.Collection; import java.util.HashMap; import java.util.Map; import java.util.Set; import xades4j.properties.AllDataObjsTimeStampProperty; import xades4j.properties.ArchiveTimeStampProperty; import xades4j.properties.CertificateValuesProperty; import xades4j.properties.CompleteCertificateRefsProperty; import xades4j.properties.RevocationValuesProperty; import xades4j.properties.SigAndRefsTimeStampProperty; import xades4j.properties.SignatureTimeStampProperty; import xades4j.properties.SigningCertificateProperty; /** * * @author Luís */ public class PropertiesDataObjectsStructureVerifier { /**/ private static final Map<Class<? extends PropertyDataObject>, PropertyDataObjectStructureVerifier> structureVerifiers; static { structureVerifiers = new HashMap<Class<? extends PropertyDataObject>, PropertyDataObjectStructureVerifier>(10); structureVerifiers.put(CommitmentTypeData.class, new CommitmentTypeDataStructureVerifier()); structureVerifiers.put(DataObjectFormatData.class, new DataObjectFormatDataStructureVerifier()); structureVerifiers.put(IndividualDataObjsTimeStampData.class, new IndividualDataObjsTimeStampDataStructureVerifier()); structureVerifiers.put(AllDataObjsTimeStampData.class, new BaseXAdESTimeStampDataStructureVerifier(AllDataObjsTimeStampProperty.PROP_NAME)); structureVerifiers.put(SignatureProdPlaceData.class, new SignatureProdPlaceDataStructureVerifier()); structureVerifiers.put(SigningCertificateData.class, new BaseCertRefsDataStructureVerifier(SigningCertificateProperty.PROP_NAME)); structureVerifiers.put(SigningTimeData.class, new SigningTimeDataStructureVerifier()); structureVerifiers.put(SignerRoleData.class, new SignerRoleDataStructureVerifier()); structureVerifiers.put(SignaturePolicyData.class, new SignaturePolicyDataStructureVerifier()); structureVerifiers.put(SignatureTimeStampData.class, new BaseXAdESTimeStampDataStructureVerifier(SignatureTimeStampProperty.PROP_NAME)); structureVerifiers.put(CompleteCertificateRefsData.class, new BaseCertRefsDataStructureVerifier(CompleteCertificateRefsProperty.PROP_NAME)); structureVerifiers.put(CompleteRevocationRefsData.class, new CompleteRevocationRefsDataStructureVerifier()); structureVerifiers.put(SigAndRefsTimeStampData.class, new BaseXAdESTimeStampDataStructureVerifier(SigAndRefsTimeStampProperty.PROP_NAME)); structureVerifiers.put(CertificateValuesData.class, new BaseEncapsulatedPKIDataStructureVerifier(CertificateValuesProperty.PROP_NAME)); structureVerifiers.put(RevocationValuesData.class, new BaseEncapsulatedPKIDataStructureVerifier(RevocationValuesProperty.PROP_NAME)); structureVerifiers.put(ArchiveTimeStampData.class, new BaseXAdESTimeStampDataStructureVerifier(ArchiveTimeStampProperty.PROP_NAME)); structureVerifiers.put(GenericDOMData.class, new GenericDOMDataStructureVerifier()); } /**/ /**/ private final Set<CustomPropertiesDataObjsStructureVerifier> customGlobalVerifiers; @Inject public PropertiesDataObjectsStructureVerifier( Set<CustomPropertiesDataObjsStructureVerifier> customVerifiers) { this.customGlobalVerifiers = customVerifiers; } public void verifiyPropertiesDataStructure( SigAndDataObjsPropertiesData propsData) throws PropertyDataStructureException { verifiyPropertiesDataStructure(propsData.getSigProps()); verifiyPropertiesDataStructure(propsData.getDataObjProps()); } public void verifiyPropertiesDataStructure( Collection<PropertyDataObject> propsData) throws PropertyDataStructureException { for (PropertyDataObject propData : propsData) { getVerifier(propData).verifyStructure(propData); } if (customGlobalVerifiers.isEmpty()) return; DataGetter<PropertyDataObject> dataGetter = new DataGetterImpl<PropertyDataObject>(propsData); for (CustomPropertiesDataObjsStructureVerifier customVer : customGlobalVerifiers) { customVer.verifiy(dataGetter); } } /** * Gets a structure verifier for the given property data object. If no verifier * is found in the map, the property data object's type is check for the appropriate * annotation. * * The structure verifiers aren't configured through the profiles because a * structure verifier has a very tight relation with the corresponding data * object (when one is used, the other is necessarily used too). The property * verifiers are different because the developer may or may not want to support * a given property in a profile, even if the unmarshaller produces the corresponding * data objects. */ private static PropertyDataObjectStructureVerifier getVerifier( PropertyDataObject propData) throws PropertyDataStructureException { PropertyDataObjectStructureVerifier v = structureVerifiers.get(propData.getClass()); if (v != null) return v; PropDataStructVerifier verifierAnnot = propData.getClass().getAnnotation(PropDataStructVerifier.class); if (null == verifierAnnot || null == verifierAnnot.value()) throw new PropertyDataStructureVerifierNotAvailableException(propData.getClass().getSimpleName()); try { v = verifierAnnot.value().newInstance(); structureVerifiers.put(propData.getClass(), v); return v; } catch (InstantiationException ex) { } catch (IllegalAccessException ex) { } throw new PropertyDataStructureException("cannot create data structure verifier", propData.getClass().getSimpleName()); } }