/**
* LICENCIA LGPL:
*
* Esta librería es Software Libre; Usted puede redistribuirlo y/o modificarlo
* bajo los términos de la GNU Lesser General Public License (LGPL)
* tal y como ha sido publicada por la Free Software Foundation; o
* bien la versión 2.1 de la Licencia, o (a su elección) cualquier versión posterior.
*
* Esta librería se distribuye con la esperanza de que sea útil, pero SIN NINGUNA
* GARANTÍA; tampoco las implícitas garantías de MERCANTILIDAD o ADECUACIÓN A UN
* PROPÓSITO PARTICULAR. Consulte la GNU Lesser General Public License (LGPL) para más
* detalles
*
* Usted debe recibir una copia de la GNU Lesser General Public License (LGPL)
* junto con esta librería; si no es así, escriba a la Free Software Foundation Inc.
* 51 Franklin Street, 5º Piso, Boston, MA 02110-1301, USA.
*
*/
package es.mityc.firmaJava.policy;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import es.mityc.firmaJava.libreria.ConstantesXADES;
import es.mityc.firmaJava.libreria.utilidades.NombreNodo;
import es.mityc.firmaJava.libreria.xades.XAdESSchemas;
import es.mityc.firmaJava.libreria.xades.elementos.SignaturePolicyIdentifier;
import es.mityc.firmaJava.libreria.xades.errores.InvalidInfoNodeException;
import es.mityc.firmaJava.libreria.xades.errores.PolicyException;
/**
* @author Ministerio de Industria, Turismo y Comercio
* @version 1.0
*/
public class UtilidadPolitica {
public static void escribePolicy(Element nodoFirma, String namespaceDS, String namespaceXAdES, XAdESSchemas schema, SignaturePolicyIdentifier spi) throws PolicyException {
// Buscar el nodo SignedSignatureProperties para añadirle la política
NodeList list = nodoFirma.getElementsByTagNameNS(schema.getSchemaUri(), ConstantesXADES.SIGNED_SIGNATURE_PROPERTIES);
if ((list.getLength() != 1) || (list.item(0).getNodeType() != Node.ELEMENT_NODE)) {
throw new PolicyException("No hay nodo SignedSignatureProperties claro al que aplicar la política");
}
// Crea el nodo de política
Element policy;
try {
policy = spi.createElement(nodoFirma.getOwnerDocument(), namespaceDS, namespaceXAdES);
} catch (InvalidInfoNodeException ex) {
throw new PolicyException("Error en la creación de la política:" + ex.getMessage(), ex);
}
NombreNodo SIGNING_TIME = new NombreNodo(schema.getSchemaUri(), ConstantesXADES.SIGNING_TIME);
NombreNodo SIGNING_CERTIFICATE = new NombreNodo(schema.getSchemaUri(), ConstantesXADES.SIGNING_CERTIFICATE);
NombreNodo SIGNATURE_POLICY_IDENTIFIER = new NombreNodo(schema.getSchemaUri(), ConstantesXADES.SIGNATURE_POLICY_IDENTIFIER);
// busca la posición donde poner el nodo
Element signedSignatureProperties = (Element)list.item(0);
Node node = signedSignatureProperties.getFirstChild();
while (node != null) {
if (node.getNodeType() != Node.ELEMENT_NODE)
throw new PolicyException("Error en el formato de SignedSignatureProperties");
NombreNodo nombre = new NombreNodo(node.getNamespaceURI(), node.getLocalName());
if ((!nombre.equals(SIGNING_TIME)) && (!nombre.equals(SIGNING_CERTIFICATE)))
break;
node = node.getNextSibling();
}
// Si existe un nodo policy, lo sustituyes
if ((node != null) && (SIGNATURE_POLICY_IDENTIFIER.equals(new NombreNodo(node.getNamespaceURI(), node.getLocalName())))) {
signedSignatureProperties.replaceChild(policy, node);
} else {
signedSignatureProperties.insertBefore(policy, node);
}
}
}