Java XML Transform getTransformParameterSpec(final Node transformNode, final String namespacePrefix)

Here you can find the source of getTransformParameterSpec(final Node transformNode, final String namespacePrefix)

Description

Recupera los parámetros de una transformación.

License

Open Source License

Parameter

Parameter Description
transformNode Nodo de transformación.
namespacePrefix Prefijo del espacio de nombres XML

Exception

Parameter Description
InvalidAlgorithmParameterException Cuando no se especifiquen correctamente losparámnetros de las transformaciones XPATH y XPATH2.

Return

Parámetros de la transformación.

Declaration

private static TransformParameterSpec getTransformParameterSpec(final Node transformNode,
        final String namespacePrefix) throws InvalidAlgorithmParameterException 

Method Source Code

//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&oacute;n. Si no existe el atributo de algoritmo, se devuelve {@code null}.
     * @param transformNode
     *        Nodo de transformaci&oacute;n.
     * @return Algoritmo de transformaci&oacute;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;
    }
}

Related

  1. getTransformerFactory()
  2. getTransformerFactory()
  3. getTransformerFactory()
  4. getTransformerFactory()
  5. getTransformerTemplate(javax.xml.transform.Source xsltSource)
  6. getTransforms(List list)
  7. getXmlSecureTransform()
  8. getXmlSecureTransformerFactory()
  9. getXmlTransformer()