/** * Creates an <code>XMLObject</code> from an element. * * @param objElem an Object element * @throws MarshalException if there is an error when unmarshalling */ public DOMXMLObject(Element objElem, XMLCryptoContext context, Provider provider) throws MarshalException { // unmarshal attributes this.encoding = DOMUtils.getAttributeValue(objElem, "Encoding"); Attr attr = objElem.getAttributeNodeNS(null, "Id"); if (attr != null) { this.id = attr.getValue(); objElem.setIdAttributeNode(attr, true); } else { this.id = null; } this.mimeType = DOMUtils.getAttributeValue(objElem, "MimeType"); NodeList nodes = objElem.getChildNodes(); int length = nodes.getLength(); List content = new ArrayList(length); for (int i = 0; i < length; i++) { Node child = nodes.item(i); if (child.getNodeType() == Node.ELEMENT_NODE) { Element childElem = (Element) child; String tag = childElem.getLocalName(); if (tag.equals("Manifest")) { content.add(new DOMManifest(childElem, context, provider)); continue; } else if (tag.equals("SignatureProperties")) { content.add(new DOMSignatureProperties(childElem)); continue; } else if (tag.equals("X509Data")) { content.add(new DOMX509Data(childElem)); continue; } // @@@FIXME: check for other dsig structures } content.add(new javax.xml.crypto.dom.DOMStructure(child)); } if (content.isEmpty()) { this.content = Collections.EMPTY_LIST; } else { this.content = Collections.unmodifiableList(content); } }
/** * Creates a <code>DOMReference</code> from an element. * * @param refElem a Reference element */ public DOMReference(Element refElem, XMLCryptoContext context) throws MarshalException { // unmarshal Transforms, if specified Element nextSibling = DOMUtils.getFirstChildElement(refElem); List transforms = new ArrayList(5); if (nextSibling.getLocalName().equals("Transforms")) { Element transformElem = DOMUtils.getFirstChildElement(nextSibling); while (transformElem != null) { transforms.add(new DOMTransform(transformElem, context)); transformElem = DOMUtils.getNextSiblingElement(transformElem); } nextSibling = DOMUtils.getNextSiblingElement(nextSibling); } // unmarshal DigestMethod Element dmElem = nextSibling; this.digestMethod = DOMDigestMethod.unmarshal(dmElem); // unmarshal DigestValue try { Element dvElem = DOMUtils.getNextSiblingElement(dmElem); this.digestValue = Base64.decode(dvElem); } catch (Base64DecodingException bde) { throw new MarshalException(bde); } // unmarshal attributes this.uri = DOMUtils.getAttributeValue(refElem, "URI"); this.id = DOMUtils.getAttributeValue(refElem, "Id"); this.type = DOMUtils.getAttributeValue(refElem, "Type"); this.here = refElem.getAttributeNodeNS(null, "URI"); this.refElem = refElem; if (transforms.isEmpty()) { this.transforms = Collections.EMPTY_LIST; } else { this.transforms = Collections.unmodifiableList(transforms); } this.appliedTransforms = Collections.EMPTY_LIST; this.allTransforms = transforms; this.appliedTransformData = null; }
/** * Creates a <code>DOMSignatureProperty</code> from an element. * * @param propElem a SignatureProperty element */ public DOMSignatureProperty(Element propElem) throws MarshalException { // unmarshal attributes target = DOMUtils.getAttributeValue(propElem, "Target"); if (target == null) { throw new MarshalException("target cannot be null"); } id = DOMUtils.getAttributeValue(propElem, "Id"); NodeList nodes = propElem.getChildNodes(); int length = nodes.getLength(); List content = new ArrayList(length); for (int i = 0; i < length; i++) { content.add(new javax.xml.crypto.dom.DOMStructure(nodes.item(i))); } if (content.isEmpty()) { throw new MarshalException("content cannot be empty"); } else { this.content = Collections.unmodifiableList(content); } }
private void unmarshalParams(Element curXPathElem) throws MarshalException { List<XPathType> list = new ArrayList<XPathType>(); while (curXPathElem != null) { String xPath = curXPathElem.getFirstChild().getNodeValue(); String filterVal = DOMUtils.getAttributeValue(curXPathElem, "Filter"); if (filterVal == null) { throw new MarshalException("filter cannot be null"); } XPathType.Filter filter = null; if (filterVal.equals("intersect")) { filter = XPathType.Filter.INTERSECT; } else if (filterVal.equals("subtract")) { filter = XPathType.Filter.SUBTRACT; } else if (filterVal.equals("union")) { filter = XPathType.Filter.UNION; } else { throw new MarshalException("Unknown XPathType filter type" + filterVal); } NamedNodeMap attributes = curXPathElem.getAttributes(); if (attributes != null) { int length = attributes.getLength(); Map<String, String> namespaceMap = new HashMap<String, String>(length); for (int i = 0; i < length; i++) { Attr attr = (Attr) attributes.item(i); String prefix = attr.getPrefix(); if (prefix != null && prefix.equals("xmlns")) { namespaceMap.put(attr.getLocalName(), attr.getValue()); } } list.add(new XPathType(xPath, filter, namespaceMap)); } else { list.add(new XPathType(xPath, filter)); } curXPathElem = DOMUtils.getNextSiblingElement(curXPathElem); } this.params = new XPathFilter2ParameterSpec(list); }