Here you can find the source of getTransformParameterSpec(final Node transformNode, final String namespacePrefix)
Parameter | Description |
---|---|
transformNode | Nodo de transformación. |
namespacePrefix | Prefijo del espacio de nombres XML |
Parameter | Description |
---|---|
InvalidAlgorithmParameterException | Cuando no se especifiquen correctamente losparámnetros de las transformaciones XPATH y XPATH2. |
private static TransformParameterSpec getTransformParameterSpec(final Node transformNode, final String namespacePrefix) throws InvalidAlgorithmParameterException
//package com.java2s; /* Copyright (C) 2011 [Gobierno de Espana] * This file is part of "Cliente @Firma". * "Cliente @Firma" is free software; you can redistribute it and/or modify it under the terms of: * - the GNU General Public License as published by the Free Software Foundation; * either version 2 of the License, or (at your option) any later version. * - or The European Software License; either version 1.1 or (at your option) any later version. * Date: 11/01/11//from w ww. j av a 2 s. c o m * You may contact the copyright holder at: soporte.afirma5@mpt.es */ import java.security.InvalidAlgorithmParameterException; import java.util.Collections; import javax.xml.crypto.dsig.Transform; import javax.xml.crypto.dsig.XMLSignature; import javax.xml.crypto.dsig.spec.TransformParameterSpec; import javax.xml.crypto.dsig.spec.XPathFilter2ParameterSpec; import javax.xml.crypto.dsig.spec.XPathFilterParameterSpec; import javax.xml.crypto.dsig.spec.XPathType; import javax.xml.crypto.dsig.spec.XPathType.Filter; import org.w3c.dom.Node; import org.w3c.dom.NodeList; public class Main { /** Recupera los parámetros de una transformación. En el caso * de las transformaciones XPATH y XPATH2, se devolveran los * parámetros especificados y, en las transformacion Base64, * Enveloped y de Canonicalización (que no reciben parámetros) * se devolverá {@code null}, al igual que cuando no se reconozca el * tipo de transformación. * @param transformNode Nodo de transformación. * @param namespacePrefix Prefijo del espacio de nombres XML * @return Parámetros de la transformación. * @throws InvalidAlgorithmParameterException * Cuando no se especifiquen correctamente los * parámnetros de las transformaciones XPATH y XPATH2. */ private static TransformParameterSpec getTransformParameterSpec(final Node transformNode, final String namespacePrefix) throws InvalidAlgorithmParameterException { TransformParameterSpec params = null; final String algorithm = getTransformAlgorithm(transformNode); // Comprobamos que la transformacion sea de tipo XPATH o XPATH2, unicos // casos en los que // la transformacion recibe parametros if (algorithm != null && (Transform.XPATH.equals(algorithm) || Transform.XPATH2.equals(algorithm))) { // Si es una transformacion XPATH solo tenemos que recoger el cuerpo if (Transform.XPATH.equals(algorithm)) { final NodeList xpathTransforms = transformNode.getChildNodes(); for (int i = 0; i < xpathTransforms.getLength(); i++) { final Node xpathTransformNode = xpathTransforms.item(i); // Probamos a encontrar un nodo XPath sin namespace y con el // namespace indicado if ("XPath".equals(xpathTransformNode.getNodeName()) //$NON-NLS-1$ || (namespacePrefix + ":XPath").equals(xpathTransformNode.getNodeName())) { //$NON-NLS-1$ if (namespacePrefix == null || namespacePrefix.isEmpty()) { params = new XPathFilterParameterSpec(xpathTransformNode.getTextContent()); } else { params = new XPathFilterParameterSpec(xpathTransformNode.getTextContent(), Collections.singletonMap(namespacePrefix, XMLSignature.XMLNS)); } break; } } if (params == null) { throw new InvalidAlgorithmParameterException( "No se ha indicado un cuerpo para una transformacion XPATH declarada"); //$NON-NLS-1$ } } // Si la transformacion es XPATH2 debemos tomar el cuerpo y el // subtipo else if (Transform.XPATH2.equals(algorithm)) { final NodeList xpathTransforms = transformNode.getChildNodes(); for (int i = 0; i < xpathTransforms.getLength(); i++) { final Node xpathTransformNode = xpathTransforms.item(i); if ("XPath".equals(xpathTransformNode.getNodeName()) //$NON-NLS-1$ || (namespacePrefix + ":XPath").equals(xpathTransformNode.getNodeName())) { //$NON-NLS-1$ Filter filter; final Node filterNode = xpathTransformNode.getAttributes().getNamedItem("Filter"); //$NON-NLS-1$ if (filterNode != null) { final String filterName = filterNode.getNodeValue(); if (filterName.equals("subtract")) { //$NON-NLS-1$ filter = Filter.SUBTRACT; } else if (filterName.equals("intersect")) { //$NON-NLS-1$ filter = Filter.INTERSECT; } else if (filterName.equals("union")) { //$NON-NLS-1$ filter = Filter.UNION; } else { throw new InvalidAlgorithmParameterException( "El subtipo '" + filterName + "' de la transformacion XPATH2 no es valido"); //$NON-NLS-1$ //$NON-NLS-2$ } } else { throw new InvalidAlgorithmParameterException( "No se ha declarado un subtipo para la transformacion XPATH2"); //$NON-NLS-1$ } params = new XPathFilter2ParameterSpec(Collections .singletonList(new XPathType(xpathTransformNode.getTextContent(), filter))); break; } } if (params == null) { throw new InvalidAlgorithmParameterException( "No se ha indicado un cuerpo para una transformacion XPATH2 declarada"); //$NON-NLS-1$ } } } return params; } /** Recupera el identificador del algoritmo de un nodo de * transformación. Si no existe el atributo de algoritmo, se devuelve {@code null}. * @param transformNode * Nodo de transformación. * @return Algoritmo de transformación. */ private static String getTransformAlgorithm(final Node transformNode) { if (transformNode == null) { return null; } final Node algorithmNode = transformNode.getAttributes().getNamedItem("Algorithm"); //$NON-NLS-1$ if (algorithmNode != null) { return algorithmNode.getNodeValue(); } return null; } }