import eu.europa.esig.dss.DomUtils; //导入方法依赖的package包/类
@Override
public List findSignatureScope(final XAdESSignature xadesSignature) {
final List result = new ArrayList();
final Set unsignedObjects = new HashSet();
unsignedObjects.addAll(xadesSignature.getSignatureObjects());
final Set signedObjects = new HashSet();
final List signatureReferences = xadesSignature.getSignatureReferences();
for (final Element signatureReference : signatureReferences) {
final String type = DomUtils.getValue(signatureReference, "@Type");
if (xadesSignature.getXPathQueryHolder().XADES_SIGNED_PROPERTIES.equals(type)) {
continue;
}
final String uri = DomUtils.getValue(signatureReference, "@URI");
final List transformations = getTransformationNames(signatureReference);
if (Utils.isStringBlank(uri)) {
// self contained document
result.add(new XmlRootSignatureScope(transformations));
} else if (uri.startsWith("#")) {
// internal reference
final boolean xPointerQuery = XPointerResourceResolver.isXPointerQuery(uri, true);
if (xPointerQuery) {
final String id = DSSXMLUtils.getIDIdentifier(signatureReference);
final XPointerSignatureScope xPointerSignatureScope = new XPointerSignatureScope(id, uri);
result.add(xPointerSignatureScope);
continue;
}
final String xmlIdOfSignedElement = uri.substring(1);
final String xPathString = XPathQueryHolder.XPATH_OBJECT + "[@Id='" + xmlIdOfSignedElement + "']";
Element signedElement = DomUtils.getElement(xadesSignature.getSignatureElement(), xPathString);
if (signedElement != null) {
if (unsignedObjects.remove(signedElement)) {
signedObjects.add(signedElement);
result.add(new XmlElementSignatureScope(xmlIdOfSignedElement, transformations));
}
} else {
signedElement = DomUtils.getElement(xadesSignature.getSignatureElement().getOwnerDocument().getDocumentElement(),
"//*" + "[@Id='" + xmlIdOfSignedElement + "']");
if (signedElement != null) {
final String namespaceURI = signedElement.getNamespaceURI();
if ((namespaceURI == null) || (!XAdESNamespaces.exists(namespaceURI) && !namespaceURI.equals(XMLSignature.XMLNS))) {
signedObjects.add(signedElement);
result.add(new XmlElementSignatureScope(xmlIdOfSignedElement, transformations));
}
}
}
} else {
// detached file
result.add(new FullSignatureScope(DSSUtils.decodeUrl(uri)));
}
}
return result;
}