package eu.europa.ec.markt.dss.signature.xades;
import java.io.IOException;
import javax.xml.crypto.dsig.XMLSignature;
import org.apache.xml.security.c14n.CanonicalizationException;
import org.apache.xml.security.c14n.InvalidCanonicalizerException;
import org.apache.xml.security.signature.XMLSignatureInput;
import org.apache.xml.security.transforms.InvalidTransformException;
import org.apache.xml.security.transforms.Transform;
import org.apache.xml.security.transforms.TransformationException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import eu.europa.ec.markt.dss.DSSXMLUtils;
import eu.europa.ec.markt.dss.exception.DSSException;
import eu.europa.ec.markt.dss.parameter.DSSTransform;
import eu.europa.ec.markt.dss.signature.DSSDocument;
/**
* This class implement the logic of {@code Transforms.TRANSFORM_XPATH}.
* // TODO (06/12/2014): Can be easily adapted to support more transformations
* <p/>
* DISCLAIMER: Project owner DG-MARKT.
*
* @author <a href="mailto:dgmarkt.Project-DSS@arhs-developments.com">ARHS Developments</a>
* @version $Revision: 1016 $ - $Date: 2011-06-17 15:30:45 +0200 (Fri, 17 Jun 2011) $
*/
class DSSTransformXPath {
private Document document;
private DSSTransform dssTransform;
public DSSTransformXPath(final DSSTransform dssTransform) {
this.dssTransform = dssTransform;
document = DSSXMLUtils.buildDOM();
final Element transformDom = document.createElementNS(XMLSignature.XMLNS, SignatureBuilder.DS_TRANSFORM);
document.appendChild(transformDom);
SignatureBuilder.createTransform(document, dssTransform, transformDom);
}
public byte[] transform(final DSSDocument input) throws DSSException {
try {
final String dssTransformAlgorithm = dssTransform.getAlgorithm();
final NodeList childNodes = document.getFirstChild().getChildNodes();
final Transform transformObject = new Transform(document, dssTransformAlgorithm, childNodes);
final byte[] bytes = input.getBytes();
final XMLSignatureInput xmlSignatureInput = new XMLSignatureInput(bytes);
final XMLSignatureInput xmlSignatureInputOut = transformObject.performTransform(xmlSignatureInput);
return xmlSignatureInputOut.getBytes();
} catch (TransformationException e) {
throw new DSSException(e);
} catch (InvalidTransformException e) {
throw new DSSException(e);
} catch (InvalidCanonicalizerException e) {
throw new DSSException(e);
} catch (CanonicalizationException e) {
throw new DSSException(e);
} catch (IOException e) {
throw new DSSException(e);
}
}
public byte[] transform(final Node input) throws DSSException {
try {
final String dssTransformAlgorithm = dssTransform.getAlgorithm();
final NodeList childNodes = document.getFirstChild().getChildNodes();
final Transform transformObject = new Transform(document, dssTransformAlgorithm, childNodes);
final XMLSignatureInput xmlSignatureInput = new XMLSignatureInput(input);
final XMLSignatureInput xmlSignatureInputOut = transformObject.performTransform(xmlSignatureInput);
return xmlSignatureInputOut.getBytes();
} catch (TransformationException e) {
throw new DSSException(e);
} catch (InvalidTransformException e) {
throw new DSSException(e);
} catch (InvalidCanonicalizerException e) {
throw new DSSException(e);
} catch (CanonicalizationException e) {
throw new DSSException(e);
} catch (IOException e) {
throw new DSSException(e);
}
}
}