+++ /dev/null
-package com.axyus.signature.pes.verifier;\r
-\r
-import com.axyus.signature.pes.CertificateContainer;\r
-import com.axyus.signature.pes.verifier.SignatureTypeCalculator.SignatureAnexInfo;\r
-import com.axyus.signature.pes.verifier.SignatureVerifier.UnverifiableSignatureException;\r
-import com.axyus.signature.pes.verifier.SimplePesInformation.BordereauInfo;\r
-import com.axyus.signature.pes.verifier.SimplePesInformation.EntetePesInfo;\r
-import com.axyus.signature.utils.DomUtils;\r
-import java.io.CharConversionException;\r
-import java.io.File;\r
-import java.io.FileInputStream;\r
-import java.io.IOException;\r
-import java.net.URISyntaxException;\r
-import java.net.URL;\r
-import java.security.InvalidAlgorithmParameterException;\r
-import java.security.KeyStoreException;\r
-import java.security.NoSuchAlgorithmException;\r
-import java.security.cert.CRLException;\r
-import java.security.cert.CertificateException;\r
-import java.util.ArrayList;\r
-import java.util.HashMap;\r
-import java.util.Map;\r
-import java.util.logging.Level;\r
-import java.util.logging.Logger;\r
-import javax.xml.XMLConstants;\r
-import javax.xml.parsers.ParserConfigurationException;\r
-import javax.xml.transform.Source;\r
-import javax.xml.transform.TransformerException;\r
-import javax.xml.transform.dom.DOMSource;\r
-import javax.xml.transform.stream.StreamSource;\r
-import javax.xml.validation.Schema;\r
-import javax.xml.validation.SchemaFactory;\r
-import org.apache.xpath.XPathAPI;\r
-import org.w3c.dom.Document;\r
-import org.w3c.dom.Element;\r
-import org.w3c.dom.Node;\r
-import org.w3c.dom.NodeList;\r
-import org.xml.sax.InputSource;\r
-import org.xml.sax.SAXException;\r
-import org.xml.sax.SAXParseException;\r
-import org.xml.sax.helpers.DefaultHandler;\r
-\r
-/**\r
- * @author CBO\r
- * @TODO : Gérer correctement les exceptions...\r
- */\r
-public class PesAllerAnalyser {\r
-\r
- private File pesFile;\r
- private Document pesDocument;\r
- private Node namespaceElement;\r
- private SimplePesInformation simplePesInformation;\r
- private SignatureVerifier signatureVerifier;\r
- private Map<Element, SignatureVerifierResult> signaturesVerifierResults;\r
- private boolean doSchemaValidation = false;\r
- private boolean schemaOK = false;\r
- private URL schemaUrl = null;\r
- private ArrayList<SAXParseException> saxParseExceptionsList;\r
- static final String JAXP_SCHEMA_LANGUAGE =\r
- "http://java.sun.com/xml/jaxp/properties/schemaLanguage";\r
- static final String W3C_XML_SCHEMA =\r
- "http://www.w3.org/2001/XMLSchema";\r
- static final String JAXP_SCHEMA_SOURCE =\r
- "http://java.sun.com/xml/jaxp/properties/schemaSource";\r
-\r
- public PesAllerAnalyser(File pesFile) {\r
- this.pesFile = pesFile;\r
- }\r
-\r
- public SimplePesInformation getSimpleInformation() {\r
- return simplePesInformation;\r
- }\r
-\r
- public void computeSimpleInformation() throws InvalidPesAllerFileException {\r
- try {\r
- SimplePesInformation workingSimplePesInformation = new SimplePesInformation();\r
- workingSimplePesInformation.setPesFile(pesFile);\r
- workingSimplePesInformation.setPesDocument(getDocument());\r
- NodeList sigs = XPathAPI.selectNodeList(getDocument(), "/n:PES_Aller/EnTetePES", getNamespaceNode());\r
- if (sigs.getLength() == 1) {\r
- org.w3c.dom.Element element = (org.w3c.dom.Element) sigs.item(0);\r
- workingSimplePesInformation.setEntetePesInfo(new EntetePesInfo(\r
- getFirstChildElementVAttribute(element, "DteStr"), getFirstChildElementVAttribute(element, "IdPost"),\r
- getFirstChildElementVAttribute(element, "IdColl"), getFirstChildElementVAttribute(element, "CodCol"),\r
- getFirstChildElementVAttribute(element, "CodBud"), getFirstChildElementVAttribute(element, "LibelleColBud")));\r
- } else if (sigs.getLength() < 1) {\r
- throw new InvalidPesAllerFileException("données d'entête PES introuvable");\r
- } else {\r
- throw new InvalidPesAllerFileException("données d'entête PES incohérentes");\r
- }\r
- // Recherche des bordereaux :\r
- // @TODO : cas des bordereaux de recette...\r
-\r
- sigs = XPathAPI.selectNodeList(getDocument(), "/n:PES_Aller/PES_RecetteAller/Bordereau/BlocBordereau", getNamespaceNode());\r
- for (int i = 0; i < sigs.getLength(); i++) {\r
- org.w3c.dom.Element element = (org.w3c.dom.Element) sigs.item(i);\r
-\r
- workingSimplePesInformation.addBordereau(new BordereauInfo(\r
- getFirstChildElementVAttribute(element, "IdBord"), getFirstChildElementVAttribute(element, "Exer"), getFirstChildElementVAttribute(element, "MtBordHT"), ((org.w3c.dom.Element) element).getAttribute("Id"), ((org.w3c.dom.Element) element.getParentNode()).getAttribute("Id")));\r
- }\r
-\r
-\r
- sigs = XPathAPI.selectNodeList(getDocument(), "/n:PES_Aller/PES_DepenseAller/Bordereau/BlocBordereau", getNamespaceNode());\r
- for (int i = 0; i < sigs.getLength(); i++) {\r
- org.w3c.dom.Element element = (org.w3c.dom.Element) sigs.item(i);\r
-\r
- workingSimplePesInformation.addBordereau(new BordereauInfo(\r
- getFirstChildElementVAttribute(element, "IdBord"), getFirstChildElementVAttribute(element, "Exer"), getFirstChildElementVAttribute(element, "MtBordHT"), ((org.w3c.dom.Element) element).getAttribute("Id"), ((org.w3c.dom.Element) element.getParentNode()).getAttribute("Id")));\r
- }\r
- // Recherche des signatures :\r
- sigs = XPathAPI.selectNodeList(getDocument(), "//ds:Signature", getNamespaceNode());\r
- for (int i = 0; i < sigs.getLength(); i++) {\r
- org.w3c.dom.Element element = (org.w3c.dom.Element) sigs.item(i);\r
- workingSimplePesInformation.addSignatureElement(element);\r
- }\r
-\r
-\r
- GeneralSignaturePesData generalSignaturePesData = new GeneralSignaturePesData();\r
- Node nodeTmp = XPathAPI.selectSingleNode(getDocument(), "/n:PES_Aller/PES_DepenseAller/EnTeteDepense", getNamespaceNode());\r
- if (nodeTmp != null) {\r
- generalSignaturePesData.setEnteteDepenseValue(getFirstChildElementVAttribute((org.w3c.dom.Element) nodeTmp, "InfoDematerialisee"));\r
- }\r
-\r
- nodeTmp = XPathAPI.selectSingleNode(getDocument(), "/n:PES_Aller/PES_RecetteAller/EnTeteRecette", getNamespaceNode());\r
- if (nodeTmp != null) {\r
- generalSignaturePesData.setEnTeteRecetteValue(getFirstChildElementVAttribute((org.w3c.dom.Element) nodeTmp, "InfoDematerialisee"));\r
- }\r
-\r
- nodeTmp = XPathAPI.selectSingleNode(getDocument(), "/n:PES_Aller", getNamespaceNode());\r
- if (nodeTmp != null) {\r
- generalSignaturePesData.setIdPesAller(((org.w3c.dom.Element) nodeTmp).getAttribute("Id"));\r
- }\r
- workingSimplePesInformation.getEntetePesInfo().setGeneralSignaturePesData(generalSignaturePesData);\r
-\r
- simplePesInformation = workingSimplePesInformation;\r
- } catch (CharConversionException cce) {\r
- throw new InvalidPesAllerFileException("Fichier Xml non valide", cce);\r
- } catch (SAXException saxe) {\r
- throw new InvalidPesAllerFileException("Fichier Xml non valide", saxe);\r
- } catch (TransformerException te) {\r
- throw new InvalidPesAllerFileException("Fichier Xml non valide", te);\r
- } catch (IOException ioe) {\r
- throw new UnExpectedException(ioe);\r
- } catch (ParserConfigurationException pce) {\r
- throw new UnExpectedException(pce);\r
- }\r
- }\r
-\r
- public Map<Element, SignatureVerifierResult> getSignaturesVerificationResults() {\r
- return signaturesVerifierResults;\r
- }\r
-\r
- public void computeSignaturesVerificationResults() throws InvalidPesAllerFileException {\r
- try {\r
- Map<Element, SignatureVerifierResult> workingSignatureVerifierResult = new HashMap<Element, SignatureVerifierResult>();\r
- for (Element signatureElement : getSimpleInformation().getSignatureElements()) {\r
-\r
- SignatureVerifierResult signatureVerifierResult = getSignatureVerifier().process(signatureElement, null);\r
- workingSignatureVerifierResult.put(signatureElement, signatureVerifierResult);\r
-\r
- }\r
- signaturesVerifierResults = workingSignatureVerifierResult;\r
- } catch (IOException ioe) {\r
- throw new UnExpectedException(ioe);\r
- } catch (CertificateException ce) {\r
- throw new UnExpectedException(ce);\r
- } catch (KeyStoreException kse) {\r
- throw new UnExpectedException(kse);\r
- } catch (CRLException crle) {\r
- throw new UnExpectedException(crle);\r
- } catch (NoSuchAlgorithmException nsae) {\r
- throw new UnExpectedException(nsae);\r
- } catch (InvalidAlgorithmParameterException iape) {\r
- throw new UnExpectedException(iape);\r
- }\r
- }\r
-\r
- public void computeSignaturesTypeVerification() {\r
- SignatureTypeCalculator signatureTypeCalculator = new SignatureTypeCalculator(simplePesInformation, signaturesVerifierResults);\r
- signatureTypeCalculator.verifAllBordereauxSigned();\r
- for (Element element : simplePesInformation.getSignatureElements()) {\r
- \r
- SignatureVerifierResult signatureVerifierResult= signaturesVerifierResults.get(element);\r
- if(signatureVerifierResult.getUnverifiableSignatureException() == null ){\r
- signatureVerifierResult.setSignatureAnexInfo(new SignatureAnexInfo(signatureTypeCalculator.process(element)));\r
- signatureVerifierResult.setListeBordereauxNonSignes(signatureTypeCalculator.getListeBordereauxNonSignes());\r
- signatureVerifierResult.setSignatureGlobalePresente(signatureTypeCalculator.isSignatureGlobalePresente());\r
- }\r
- }\r
- }\r
-\r
- public SignatureVerifier getSignatureVerifier() throws IOException, CertificateException, KeyStoreException, CRLException, NoSuchAlgorithmException, InvalidAlgorithmParameterException {\r
- if (signatureVerifier == null) {\r
- //signatureVerifier = new SignatureVerifier(new ZipUrlTrustStore(this.getClass().getResource("/com/axyus/signature/pes/certs.zip")),new ZipUrlTrustStore(this.getClass().getResource("/com/axyus/signature/pes/certsInter.zip")));\r
- signatureVerifier = new SignatureVerifier(CertificateContainer.fromZipURL(this.getClass().getResource("/com/axyus/signature/pes/certs.zip")), CertificateContainer.fromZipURL(this.getClass().getResource("/com/axyus/signature/pes/certsInter.zip")));\r
- }\r
- return signatureVerifier;\r
- }\r
-\r
- private Document getDocument() throws ParserConfigurationException, SAXException, IOException {\r
-\r
- ValidatorErrorHandler handler = null;\r
- if (pesDocument == null) {\r
- setSchemaOK(true);\r
- javax.xml.parsers.DocumentBuilderFactory dbf = javax.xml.parsers.DocumentBuilderFactory.newInstance();\r
- javax.xml.parsers.DocumentBuilder db;\r
- dbf.setAttribute(\r
- "http://apache.org/xml/features/dom/defer-node-expansion",\r
- Boolean.TRUE);\r
- dbf.setValidating(false);\r
- dbf.setNamespaceAware(true);\r
- dbf.setAttribute("http://xml.org/sax/features/namespaces", Boolean.TRUE);\r
-\r
- if (isDoSchemaValidation() && getSchemaUrl() != null) {\r
-\r
- setSaxParseExceptionsList(new ArrayList<SAXParseException>());\r
-\r
- SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);\r
- Schema schema = sf.newSchema(getSchemaUrl());\r
-\r
- dbf.setSchema(schema);\r
-\r
- db = dbf.newDocumentBuilder();\r
- handler = new ValidatorErrorHandler();\r
- db.setErrorHandler(handler);\r
- } else {\r
-\r
- db = dbf.newDocumentBuilder();\r
- }\r
- pesDocument = db.parse(new InputSource(new FileInputStream(pesFile)));\r
- if (isDoSchemaValidation() && getSchemaUrl() != null) {\r
- setSchemaOK(!handler.validationError);\r
- }\r
- }\r
-\r
- return pesDocument;\r
-\r
- }\r
-\r
- public Node getNamespaceNode() throws ParserConfigurationException, SAXException, IOException {\r
- if (namespaceElement == null) {\r
- namespaceElement = DomUtils.createXMLDSigAndPesNamespaceNode(getDocument());\r
- }\r
- return namespaceElement;\r
- }\r
-\r
- private String getFirstChildElementVAttribute(Element element, String elementName) {\r
- return DomUtils.getFCEA(element, elementName, "V");\r
- }\r
-\r
- /**\r
- * @return the schemaOK\r
- */\r
- public boolean isSchemaOK() {\r
- return schemaOK;\r
- }\r
-\r
- /**\r
- * @param schemaOK the schemaOK to set\r
- */\r
- public void setSchemaOK(boolean schemaOK) {\r
- this.schemaOK = schemaOK;\r
- }\r
-\r
- /**\r
- * @return the doSchemaValidation\r
- */\r
- public boolean isDoSchemaValidation() {\r
- return doSchemaValidation;\r
- }\r
-\r
- /**\r
- * @param doSchemaValidation the doSchemaValidation to set\r
- */\r
- public void setDoSchemaValidation(boolean doSchemaValidation) {\r
- this.doSchemaValidation = doSchemaValidation;\r
- }\r
-\r
- /**\r
- * @return the schemaUrl\r
- */\r
- public URL getSchemaUrl() {\r
- return schemaUrl;\r
- }\r
-\r
- /**\r
- * @param schemaUrl the schemaUrl to set\r
- */\r
- public void setSchemaUrl(URL schemaUrl) {\r
- this.schemaUrl = schemaUrl;\r
- }\r
-\r
- /**\r
- * @return the saxParseExceptionsList\r
- */\r
- public ArrayList<SAXParseException> getSaxParseExceptionsList() {\r
- return saxParseExceptionsList;\r
- }\r
-\r
- /**\r
- * @param saxParseExceptionsList the saxParseExceptionsList to set\r
- */\r
- public void setSaxParseExceptionsList(ArrayList<SAXParseException> saxParseExceptionsList) {\r
- this.saxParseExceptionsList = saxParseExceptionsList;\r
- }\r
-\r
- public static class InvalidPesAllerFileException extends Exception {\r
-\r
- public InvalidPesAllerFileException(String message) {\r
- super(message);\r
- }\r
-\r
- public InvalidPesAllerFileException(Throwable cause) {\r
- super(cause);\r
- }\r
-\r
- public InvalidPesAllerFileException(String message, Throwable cause) {\r
- super(message, cause);\r
- }\r
- }\r
-\r
- private class ValidatorErrorHandler extends DefaultHandler {\r
-\r
- public boolean validationError = false;\r
-\r
- @Override\r
- public void error(SAXParseException exception)\r
- throws SAXException {\r
-\r
- System.err.println("error :" + exception + " line " + exception.getLineNumber());\r
-\r
- // Pour pallier a pb idiot dans Xemelios\r
- if (getSaxParseExceptionsList().isEmpty()) {\r
- if (exception.getLineNumber() == 1) {\r
- return;\r
- }\r
-\r
- }\r
-\r
- validationError = true;\r
- getSaxParseExceptionsList().add(exception);\r
- }\r
-\r
- @Override\r
- public void fatalError(SAXParseException exception)\r
- throws SAXException {\r
-\r
- System.err.println("Fatal error :" + exception + " line " + exception.getLineNumber());\r
-\r
- // exception.print();\r
- // Pour pallier a pb idiot dans Xemelios\r
-// if (getSaxParseExceptionsList().isEmpty()) {\r
-// if (exception.getLineNumber() == 1) {\r
-// return;\r
-// }\r
-// }\r
- validationError = true;\r
- getSaxParseExceptionsList().add(exception);\r
- }\r
-\r
- @Override\r
- public void warning(SAXParseException exception)\r
- throws SAXException {\r
- System.err.println("Warning : " + exception + " line " + exception.getLineNumber());\r
-\r
- }\r
- }\r
-}\r