On 2001.10.31 13:34 Stephane Hillion wrote:
> > From what you said it sounds like it is not possible and batik won't
> let me
> > do it.
> > I could not repeat the npe, it must be a combination of a number of
> > factors.

I found out that the npe occurs when I serialize the document to an object
stream and then read it back.
I have attached the code that displays the two problems.
import java.io.*;
import java.util.*;

import org.apache.batik.dom.svg.SVGDOMImplementation;
import org.apache.batik.dom.util.DOMUtilities;

import org.w3c.dom.*;
import org.w3c.dom.svg.SVGSVGElement;
import org.w3c.dom.svg.SVGDocument;

public class DOMImport {
    static String svgNS = SVGDOMImplementation.SVG_NAMESPACE_URI;

    public static void main(String[] args) {
        Document doc = null;
        try {
            InputStream is = new FileInputStream("foo.xml");
            javax.xml.parsers.DocumentBuilderFactory fact =
              javax.xml.parsers.DocumentBuilderFactory.newInstance();
            fact.setNamespaceAware(true);
            doc = fact. newDocumentBuilder().parse(is);
        } catch (Exception e) {
            e.printStackTrace();
        }
        Element root = null;
        root = doc.getDocumentElement();

        DOMImplementation impl =
          SVGDOMImplementation.getDOMImplementation();
        Document svgDocument = impl.createDocument(svgNS, "svg", null);
        Element svgRoot = svgDocument.getDocumentElement();

        System.out.println("trying with DOMUtilities.importNode()");
        try {
            Document svgDoc1 = getSVGDocument1(root, "xmlns");
            SVGSVGElement svg = ((SVGDocument) svgDoc1).getRootElement();
            Node newsvg = svgDocument.importNode(svg, true);
            svgRoot.appendChild(newsvg);
        } catch (Throwable e) {
            e.printStackTrace();
        }

        System.out.println("trying with DOMUtilities.importNode()");
        try {
            Document svgDoc1 = getSVGDocument1(root, "xmlns:svg");
            SVGSVGElement svg = ((SVGDocument) svgDoc1).getRootElement();
            Node newsvg = svgDocument.importNode(svg, true);
            svgRoot.appendChild(newsvg);
        } catch (Throwable e) {
            e.printStackTrace();
        }

        System.out.println("trying with modified importNode()");
        try {
            Document svgDoc2 = getSVGDocument2(root, "xmlns");
            SVGSVGElement svg = ((SVGDocument) svgDoc2).getRootElement();
            Node newsvg = svgDocument.importNode(svg, true);
            svgRoot.appendChild(newsvg);
        } catch (Throwable e) {
            e.printStackTrace();
        }

        System.out.println("trying with modified importNode()");
        try {
            Document svgDoc2 = getSVGDocument2(root, "xmlns:svg");
            SVGSVGElement svg = ((SVGDocument) svgDoc2).getRootElement();
            Node newsvg = svgDocument.importNode(svg, true);
            svgRoot.appendChild(newsvg);
        } catch (Throwable e) {
            e.printStackTrace();
        }

        // this is causes an npe when importing the node
        try {
            Document svgDoc2 = getSVGDocument2(root, "xmlns");

            ObjectOutputStream tempstream = new ObjectOutputStream(
                                              new BufferedOutputStream(new FileOutputStream("temp.ser")));
            tempstream.writeObject(svgDoc2);
            tempstream.close();
            File temp = new File("temp.ser");
            System.out.println("page serialized to: " + temp.length());
            temp = null;
            ObjectInputStream in = new ObjectInputStream(
                                     new BufferedInputStream(new FileInputStream("temp.ser")));
            svgDoc2 = (Document) in.readObject();
            in.close();

            SVGSVGElement svg = ((SVGDocument) svgDoc2).getRootElement();
            Element view = svgDocument.createElementNS(svgNS, "svg");
            Node newsvg = svgDocument.importNode(svg, true);
            view.appendChild(newsvg);
            svgRoot.appendChild(view);
        } catch (Throwable e) {
            e.printStackTrace();
        }

        try {
            PrintWriter writer = new PrintWriter(System.out);
            DOMUtilities.writeDocument(svgDocument, writer);
            writer.flush();
        } catch (Exception e) {
            e.printStackTrace();
        }

        System.exit(0);
    }

    static Document getSVGDocument1(Element ele, String attr) {
        Document doc;

        NodeList childs = ele.getChildNodes();
        for (int i = 0; i < childs.getLength(); i++) {
            Node obj = childs.item(i);
            if (obj instanceof Element) {
                //System.out.println(obj.getNodeName());
                Element rootEle = (Element) obj;
                String space = rootEle.getAttribute(attr);
                if (svgNS.equals(space)) {
                    try {
                        doc = javax.xml.parsers.DocumentBuilderFactory.newInstance().
                              newDocumentBuilder().newDocument();
                        Node node = doc.importNode(obj, true);
                        doc.appendChild(node);
                        DOMImplementation impl =
                          SVGDOMImplementation.getDOMImplementation();
                        // due to namespace problem attributes are not cloned
                        doc = DOMUtilities.deepCloneDocument(doc, impl);

                        return doc;
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                } else {
                    doc = getSVGDocument1(rootEle, attr);
                    if (doc != null) {
                        return doc;
                    }
                }
            }
        }
        return null;
    }

    static Document getSVGDocument2(Element ele, String attr) {
        Document doc;

        NodeList childs = ele.getChildNodes();
        for (int i = 0; i < childs.getLength(); i++) {
            Node obj = childs.item(i);
            if (obj instanceof Element) {
                //System.out.println(obj.getNodeName());
                Element rootEle = (Element) obj;
                String space = rootEle.getAttribute(attr);
                if (svgNS.equals(space)) {
                    try {
                        doc = javax.xml.parsers.DocumentBuilderFactory.newInstance().
                              newDocumentBuilder().newDocument();
                        Node node = doc.importNode(obj, true);
                        doc.appendChild(node);
                        DOMImplementation impl =
                          SVGDOMImplementation.getDOMImplementation();
                        // due to namespace problem attributes are not cloned
                        doc = deepCloneDocument(doc, impl);

                        return doc;
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                } else {
                    doc = getSVGDocument2(rootEle, attr);
                    if (doc != null) {
                        return doc;
                    }
                }
            }
        }
        return null;
    }

    public static Document deepCloneDocument(Document doc,
            DOMImplementation impl) {
        Element root = doc.getDocumentElement();
        Document result =
          impl.createDocument(svgNS, root.getNodeName(), null);
        Element rroot = result.getDocumentElement();
        boolean before = true;
        for (Node n = doc.getFirstChild(); n != null;
                n = n.getNextSibling()) {
            if (n == root) {
                before = false;
                if (root.hasAttributes()) {
                    NamedNodeMap attr = root.getAttributes();
                    int len = attr.getLength();
                    for (int i = 0; i < len; i++) {
                        rroot.setAttributeNode(
                          (Attr) result.importNode(attr.item(i),
                                                   true));
                    }
                }
                for (Node c = root.getFirstChild(); c != null;
                        c = c.getNextSibling()) {
                    rroot.appendChild(result.importNode(c, true));
                }
            } else {
                if (n.getNodeType() != Node.DOCUMENT_TYPE_NODE) {
                    if (before) {
                        result.insertBefore(result.importNode(n, true),
                                            rroot);
                    } else {
                        result.appendChild(result.importNode(n, true));
                    }
                }
            }
        }
        return result;
    }

}

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to