01: /*
02: * Copyright 2006 Sun Microsystems, Inc. All Rights Reserved.
03: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
04: *
05: * This code is free software; you can redistribute it and/or modify it
06: * under the terms of the GNU General Public License version 2 only, as
07: * published by the Free Software Foundation. Sun designates this
08: * particular file as subject to the "Classpath" exception as provided
09: * by Sun in the LICENSE file that accompanied this code.
10: *
11: * This code is distributed in the hope that it will be useful, but WITHOUT
12: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14: * version 2 for more details (a copy is included in the LICENSE file that
15: * accompanied this code).
16: *
17: * You should have received a copy of the GNU General Public License version
18: * 2 along with this work; if not, write to the Free Software Foundation,
19: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20: *
21: * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
22: * CA 95054 USA or visit www.sun.com if you need additional information or
23: * have any questions.
24: */
25:
26: package com.sun.xml.internal.bind.v2.runtime;
27:
28: import java.util.HashSet;
29: import java.util.Set;
30:
31: import javax.xml.XMLConstants;
32:
33: import org.w3c.dom.Attr;
34: import org.w3c.dom.NamedNodeMap;
35: import org.w3c.dom.Node;
36:
37: /**
38: * Post-init action for {@link MarshallerImpl} that incorporate the in-scope namespace bindings
39: * from a DOM node.
40: *
41: * TODO: do we really need this? think about a better way to put this logic back into marshaller.
42: *
43: * @author Kohsuke Kawaguchi
44: */
45: final class DomPostInitAction implements Runnable {
46:
47: private final Node node;
48: private final XMLSerializer serializer;
49:
50: DomPostInitAction(Node node, XMLSerializer serializer) {
51: this .node = node;
52: this .serializer = serializer;
53: }
54:
55: // declare the currently in-scope namespace bindings
56: public void run() {
57: Set<String> declaredPrefixes = new HashSet<String>();
58: for (Node n = node; n != null
59: && n.getNodeType() == Node.ELEMENT_NODE; n = n
60: .getParentNode()) {
61: NamedNodeMap atts = n.getAttributes();
62: if (atts == null)
63: continue; // broken DOM. but be graceful.
64: for (int i = 0; i < atts.getLength(); i++) {
65: Attr a = (Attr) atts.item(i);
66: String nsUri = a.getNamespaceURI();
67: if (nsUri == null
68: || !nsUri
69: .equals(XMLConstants.XMLNS_ATTRIBUTE_NS_URI))
70: continue; // not a namespace declaration
71: String prefix = a.getLocalName();
72: if (prefix == null)
73: continue; // broken DOM. skip to be safe
74: if (prefix.equals("xmlns")) {
75: prefix = "";
76: }
77: String value = a.getValue();
78: if (value == null)
79: continue; // broken DOM. skip to be safe
80: if (declaredPrefixes.add(prefix)) {
81: serializer.addInscopeBinding(value, prefix);
82: }
83: }
84: }
85: }
86: }
|